nis*_*h_s 7 linux timer linux-kernel
嗨,大家好,在对我们的一些驱动程序(在powerpc目标上)进行SMP移植时,我们观察到了一些行为,我需要你们这些行为来解释一下:
在UP系统上执行local_irq_disable()时,jiffies倾向于冻结,即计数停止递增.这是预期的吗?我认为递减中断是'内部'并且不应该受local_irq_disable调用的影响,因为我预计它会禁用本地IRQ中断处理(外部中断).系统当然也会在执行local_irq_enable()jiffies计数跳转时冻结,它似乎补偿了local_irq_disable()和enable()调用之间的"时间间隔".
在SMP系统(具有2个e500核心的P2020)上执行相同操作,结果令人惊讶.首先,用于执行此测试的模块总是在核心1上执行.此外,它有时看不到冻结'jiffies'计数器,有时我们看到它确实冻结了.再次在冻结计数的情况下,在执行local_irq_enable()之后它往往会跳转.我不知道为什么会这样.我们是否知道在SMP的情况下两个核心都运行一个计划计时器,所以在某些情况下我们看不到冻结的jiffie计数或者它只是在核心0上?
此外,由于内核定时器依赖于'jiffies' - 这意味着如果local_irq_disable()已经完成,我们的内核定时器都不会触发?在SMP系统的其中一个核心上完成这种情况会是什么情况?
还有很多其他问题,但我想这些问题足以开始就同样的问题进行一般性的讨论:)
TIA
NS
来自实验的更多评论.
我此时的理解是,由于内核定时器依赖于'jiffies'来触发,因此当我发出local_irq_save()时,它们实际上不会在UP系统上触发.事实上,我们的一些代码是基于这样的假设:当我发出local_irq_save()时,它保证了本地处理器和内核定时器上的中断保护.
然而,在SMP系统上执行相同的实验,即使两个核都执行local_irq_save(),jiffies也不会停止递增,系统也不会冻结.这怎么可能 ?LINUX是否使用其他机制来触发SMP系统中的定时器中断或可能使用IPI?这也打破了我们的假设,即local_irq_disable将保护系统免受至少在同一核心上运行的内核定时器的影响.
我们如何编写一个对异步事件(即中断和内核定时器)安全的代码,并且对UP和SMP都有效.
local_irq_disable 仅禁用当前内核上的中断,因此,当您是单核时,所有内容都被禁用(包括计时器中断),这就是 jiffies 不更新的原因。在 SMP 上运行时,有时您会碰巧禁用更新 jiffies 的核心上的中断,有时则不会。这通常不是问题,因为中断应该仅在很短的时间内被禁用,并且所有计划的计时器将在中断再次启用后触发。
您如何知道您的模块始终在核心 1 上运行?在当前版本的内核上,它甚至可能同时在多个内核上运行(也就是说,如果您没有强制它不要这样做)。
| 归档时间: |
|
| 查看次数: |
5083 次 |
| 最近记录: |