Reputation: 1063
Im looking at this macro from the linux kernel which has to do with handling cpu-specific variables
#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? (Since the kernel is the one doing the preemption)
Upvotes: 0
Views: 2240
Reputation: 8657
Why do we disable preemption?
To avoid having the thread preempted and rescheduled on a different processor core.
Isnt preemption something that cant happen when you are in the kernel?
This was true when there was still a big kernel lock. Having one global lock means that if you block in-kernel, no other thread may enter the kernel. Now, with the more fine-grained locking, sleeping in the kernel is possible. Linux can be configured at build-time for other preemption models, e.g. CONFIG_PREEMPT
.
While your normal desktop kernel is probably configured with CONFIG_PREEMPT_VOLUNTARY
, some distributions also ship CONFIG_PREEMPT
as a separate low-latency kernel package, e.g. for audio use. For real-time use cases, The preempt_rt patchset even makes most spinlocks preemptible (hence the name).
Upvotes: 3