【问题标题】:What will happen to the state of the tasklet when tasklet is running and hardware interrupt triggered?当 tasklet 运行并触发硬件中断时,tasklet 的状态会发生什么变化?
【发布时间】:2015-04-29 14:03:28
【问题描述】:

tasklet 执行过程中,tasklet 执行过程中触发硬件中断时,tasklet 的状态会发生什么变化?

【问题讨论】:

    标签: linux linux-kernel linux-device-driver embedded-linux


    【解决方案1】:

    Tasklet 是下半部分。它们在 softirq 上下文中运行,而不是在硬件中断上下文中。所以硬件中断总是被启用的。当在执行小任务时触发硬件中断时,它将中断小任务。然后上半部分在相应的 IRQ 堆栈上运行并确认中断。这种行为对于中断处理程序特别有用,其中必须尽快管理硬件中断,但大多数数据管理可以安全地延迟到以后的时间。实际上,tasklet 就像内核定时器一样,在软中断的上下文中(以原子模式)执行,软中断是一种在启用硬件中断的情况下执行异步任务的内核机制。

    【讨论】:

    • 对!!如果假设启用了硬中断并且 tasklet 被抢占并且 isr 快速完成它的工作。然后,在什么时候,tasklet 将被执行,因为我可能会一直收到硬中断,并且 tasklet 可能要到 重要 时间才能执行,或者可能没有机会运行。如果您说“像内核计时器”,这意味着您在谈论时钟,如果是这样,那么 tasklet 在下一个滴答之前调度,如果它直到下一个滴答才运行,那么 tasklet 会发生什么?你能详细说明一下你的观点吗?
    • tasklet 调度有一些规则:1.In the return from hardware interrupt code path 2.In the ksoftirqd kernel thread 3.In any code that explicitly checks for and executes pending softirqs, such as the networking subsystem 如果触发了太多硬件中断,是的,tasklet 有可能得不到调度。事实上这种情况可能会导致“软锁定”
    • @skaushal:我不认为,它总是在软中断上下文中运行。可能是我错了吗? ksoirqd 将在重负载下在进程上下文中调用。软中断通常在从硬中断 (do_irq) 返回时得到服务,但软中断的调用速度可能比它们被服务的速度更快。如果在处理软中断时第二次触发软中断,则会触发 ksoftirq 守护进程以处理进程上下文中的软中断。所以万一太可能中断,我会使用kso​​firqd机制。请对此有所了解!
    • @Manish:Tasklet 通常在 softirq 上下文中运行。你原来的问题是通用的,所以我的回答是通用的。您的上述评论与您最初的问题无关。我想澄清您的疑问,但无法理解您的观点。您是否有任何涉及硬中断和小任务的特定场景?我想回答这个问题。因为在很多情况下,tasklet 可能会根据情况采用不同的自旋锁变体。
    • @skaushal :不,我没有具体的场景。但是,如果您看到我最初的问题是“如果硬 irq 触发器运行 tasklet 处理程序会发生什么?”所以你的回答是“它会打断tasklet”,这正是应该发生的事情。 1)但是,如果我不断收到硬 irq,我的 tasklet 什么时候会运行。 2)虽然,tasklet被硬irq中断,但它必须在被中断之前完成最少的事情。究竟是什么时候会被打断呢? 3)如果出现“软锁定”,内核如何处理?
    【解决方案2】:

    检查tasklet_schedule函数。

    它将保存中断系统的状态并将中断恢复到之前的状态并在do_softirq操作后返回。

    【讨论】:

      【解决方案3】:

      Tasklet 在中断上下文中运行。所以小任务中的代码不应该休眠(或被中断)。如果 tasklet 被中断打断,你的系统就会崩溃。要在运行 tasklet 时防止中断,您必须使用 spinlock_irq_save() 来防止中断

      【讨论】:

      • spin_lock_irqsave() 并不总是正确的选择。这取决于您要保护的数据以及在什么情况下。更常见的是,tasklet 通过spin_lock_bh() 保护数据。
      • @Milind :如果它在中断上下文中运行。然后,它不能被其他中断抢占。它必须先完成工作,然后再提供其他服务。如果是这样,那么我的中断可能会丢失。你能纠正我吗?
      • @Andy:正如 milind 告诉我们的 spin_lock_irqsave 的用法,但您已经指出 spin_lock_bh。此 api 在锁定之前禁用软件中断,但仍然启用硬 irq。我正在开发 2.4.29,当我们使用 tasklet_schedule() 调度 tasklet 时,它会执行 local_irq_save 然后恢复,所以如果我使用 spin_lock_irqsave ,它将再次保存和恢复 tasklet_schedule 在其代码中执行的 irq。我宁愿单独选择 spin_lock。但是,Andy 提到了 spin_lock_bh(),我没有使用过这个。安迪,你能说明一下吗?
      • @Andy : 两个相同类型的 tasklet 不能同时运行,那么 lock 的用法是什么?如果不同的 tasklet 共享公共数据,我可以看到锁,但是您(安迪和 Milind)能否分享一个示例,其中数据是通过两个不同的 tasklet 共享的?其次,我们可以使用简单的 spin_lock 而不是 spin_loc_bh() 因为 tasklet 不能在同一个 cpu 上抢占另一个正在运行的 tasklet。请输入您的生命值。
      • @AndyShevchenko: 哦..在 tasklet 调度的情况下,我们禁用或启用本地 irq。所以我的行---“当我们使用 tasklet_schedule() 安排 tasklet 时,它会执行 local_irq_save 然后恢复,所以如果我使用 spin_lock_irqsave ,它将再次保存并恢复 tasklet_schedule 在代码中执行的 irq”----不正确.我可能会选择 spin_lock_irqsave 以避免运行 tasklet 的中断。我不太了解“安迪”指出的内容。谢谢大家在百忙之中抽出一些时间来回答这个问题!!
      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 2015-09-14
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多