Messages in this thread |  | | Date | Fri, 1 Nov 2013 15:24:04 +0100 | From | Peter Zijlstra <> | Subject | Re: [PATCH -tip] fix race between stop_two_cpus and stop_cpus |
| |
On Fri, Nov 01, 2013 at 01:44:24PM +0000, Mel Gorman wrote: > Ok, I see your point now but still wonder if this is too specialised > for what we are trying to do. Could it have been done with a read-write > semaphore with the global stop_cpus taking it for write and stop_two_cpus > taking it for read?
rwsem for read is still global state.. That said it should be fairly easy to use lglock for this.
Or write it with spinlocks like:
DEFINE_PER_CPU(spinlock_t, local_lock); DEFINE_PER_CPU(int, have_global); spinlock_t global_lock;
void local_lock(void) { preempt_disable(); spin_lock(this_cpu_ptr(&local_lock)); if (spin_is_locked(&global_lock)) { spin_unlock(this_cpu_ptr(&local_lock)); spin_lock(&global_lock); this_cpu_write(have_global, true); spin_lock(this_cpu_ptr(&local_lock)); } }
void local_unlock(void) { spin_unlock(this_cpu_ptr(&local_lock)); if (this_cpu_read(have_global)) { this_cpu_write(have_global, false); spin_unlock(&global_lock); } }
void global_lock(void) { int cpu;
spin_lock(&global_lock); for_each_possible_cpu(cpu) spin_unlock_wait(&per_cpu(local_lock, cpu)); }
void global_unlock(void) { spin_unlock(&global_lock); }
Or possibly make the global_lock a mutex, plenty variants possible.
|  |