On Thu, 03 May 2007 11:32:23 +1000 Nick Piggin <nickpiggin@xxxxxxxxxxxx> wrote:
void fastcall unlock_page(struct page *page)
{
+ VM_BUG_ON(!PageLocked(page));
smp_mb__before_clear_bit();
- if (!TestClearPageLocked(page))
- BUG();
- smp_mb__after_clear_bit(); - wake_up_page(page, PG_locked);
+ ClearPageLocked(page);
+ if (unlikely(test_bit(PG_waiters, &page->flags))) {
+ clear_bit(PG_waiters, &page->flags);
+ wake_up_page(page, PG_locked);
+ }
}
Why is that significantly faster than plain old wake_up_page(), which
tests waitqueue_active()?