Messages in this thread | | | Date | Thu, 24 Aug 2006 18:28:14 +0530 | From | Srivatsa Vaddagiri <> | Subject | Re: [RFC][PATCH 3/4] (Refcount + Waitqueue) implementation for cpu_hotplug "locking" |
| |
On Thu, Aug 24, 2006 at 02:25:27PM +0200, Ingo Molnar wrote: > no. The writer first sets the global write_active flag, and _then_ goes > on to wait for all readers (if any) to get out of their critical > sections. (That's the purpose of the per-cpu waitqueue that readers use > to wake up a writer waiting for the refcount to go to 0.) > > can you still see problems with this scheme?
This can cause a deadlock sometimes, when a thread tries to take the read_lock() recursively, with a writer having come in between the two recursive reads:
Reader1 on CPU0 Writer1 on CPU1
read_lock() - success
write_lock() - blocks on Reader1 (writer_active = 1)
read_lock() - blocks on Writer1
The only way to avoid this deadlock is to either keep track of cpu_hp_lock_count per-task (like the preemption count kept per-task) or allow read_lock() to succeed if reader_count > 1 (even if writer_active = 1). The later makes the lock unduely biased towards readers.
-- Regards, vatsa - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |