Linux 内核:为什么在使用 per-CPU 变量时禁用抢占?

Linux kernel: why preemption is disabled when use per-CPU variable?

我正在查看来自 linux 内核的这个宏,它与处理 cpu-特定变量有关

#define get_cpu_var(var)                                                \
(*({                                                                    \
        preempt_disable();                                              \
        this_cpu_ptr(&var);                                             \
})) 

为什么要禁用抢占?当您在内核中时,抢占不是不能发生的事情吗? (因为内核是抢占者)

Why do we disable preemption?

避免线程在不同的处理器内核上被抢占和重新安排。

Isnt preemption something that cant happen when you are in the kernel?

当还有一个大的内核锁时,这是真的。拥有一个全局锁意味着如果你阻塞 in-kernel,则没有其他线程可以进入内核。现在,有了更多 fine-grained 锁定,就可以在内核中休眠了。 Linux 可以在 build-time 处配置为 other preemption models,例如CONFIG_PREEMPT.

虽然您的普通桌面内核可能配置有 CONFIG_PREEMPT_VOLUNTARY,但某些发行版也将 CONFIG_PREEMPT 作为单独的 low-latency 内核包提供,例如用于音频。对于 real-time 用例,preempt_rt 补丁集甚至使大多数自旋锁可抢占(因此得名)。