From: kuznet@xxxxxxxxxxxxx
Date: Tue, 21 May 2002 04:41:39 +0400 (MSD)
+Two similar problems arise. An example code snippet:
+
+ struct this_needs_locking tux[NR_CPUS];
+ tux[smp_processor_id()] = some_value;
+ /* task is preempted here... */
+ something = tux[smp_processor_id()];
If you are not going to break all the kernel just make sure that
tasks preempted in the kernel do not migrate. That's all, simple & stupid.
Such rule does not even make this piece of code legal. Consider:
task1:cpu0: x = counters[smp_processor_id()];
cpu0: PREEMPT
task2:cpu0: x = counters[smp_processor_id()];
task2:cpu0: counters[smp_processor_id()] = x + 1;
cpu0: PREEMPT
task1:cpu0: counters[smp_processor_id()] = x + 1;
full garbage
But it does bring up important point, preemption people need to
fully audit entire networking.
It is totally broken by preemption the more I think about it.
At the very beginning, all the SNMP counter bumping tricks will
totally fail with preemption enabled.
|