On Tue, Jun 03, 2008 at 01:03:17AM +0200, Ingo Molnar wrote:I think optimised our unlock_page in a way that it can do a non-atomic unlock in the fastpath (no waiters) using 2 bits. In practice it was still atomic but only because other page flags operations could operate on ->flags at the same time. I still have to get around to submitting the damn thing upstream, but maybe if I bring it up here, I get the idea more reviewed :) Anyway, the algorithm goes like this: lock_page() { if (test_and_set_bit_lock(PG_locked)) lock_page_slow(); } lock_page_slow() { /* slowpath */ again: prepare_to_wait(); set_bit(PG_waiters); if (test_and_set_bit_lock(PG_locked)) { schedule(); goto again; } } wake_page_waiters() { /* slowpath */ clear_bit(PG_waiters); smp_mb__after_clear_bit(); /* order clear_bit store with wake_up_page load */ wake_up_page(PG_locked); } unlock_page() { clear_bit_unlock(PG_locked); if (unlikely(test_bit(PG_waiters))) wake_page_waiters(); } We don't require any load/store barrier in the unlock_page fastpath because the bits are in the same word, so cache coherency gives us a sequential ordering anyway. Now you notice the lock page slowpath can set bits without holding the lock, at first glance you'd think the clear_bit to unlock has to be atomic too then. But actually if we're careful, we can put them in seperate parts of the word and use the sub-word operations on x86 to avoid the atomic requirement. I'm not aware of any architecture in which operations to the same word could be out of order. Not only does this avoid all barriers (except acquire/release) in the fastpaths, but it also avoids the unconditional load of the random hash page waitqueue cacheline on unlock. Anything applicable to your problem at hand? --
| Tarkan Erimer | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| James Bottomley | Re: Announce: Linux-next (Or Andrew's dream :-)) |
| David Woodhouse | Re: [PATCH 2/3] firmware: convert korg1212 driver to use firmware loader exclusively |
| Kamalesh Babulal | Re: 2.6.24-rc8-mm1 Build Failure on S390x |
git: | |
| David Miller | [GIT]: Networking |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| KOSAKI Motohiro | [bug?] tg3: Failed to load firmware "tigon/tg3_tso.bin" |
