Messages in this thread | | | Date | Fri, 22 Mar 2013 12:55:51 -0700 | From | Andi Kleen <> | Subject | racy jump label users |
| |
Jason,
I noticed that a lot of the jump label users are racy, because they implement something like this
static void sched_feat_disable(int i) { if (static_key_enabled(&sched_feat_keys[i])) static_key_slow_dec(&sched_feat_keys[i]); }
static void sched_feat_enable(int i) { if (!static_key_enabled(&sched_feat_keys[i])) static_key_slow_inc(&sched_feat_keys[i]); }
with no extra locking, controlled by sysfs. If two CPUs do this in parallel the reference can be set multiple times, which gives very unexpected semantics for a sysfs boolean.
Most likely you need a static_key_slow_setstate() that does the check and set inside the jump label lock.
I understand that for inside kernel use reference counts are the right semantics, but they are not so good for sysfs interfaces.
-Andi
-- ak@linux.intel.com -- Speaking for myself only
| |