On 06/30, Oleg Nesterov wrote: > > may be someting like this or this ...
for (;;) { int intr = 0; spin_lock_irq(&q->lock); if (signal_pending_state(state, current)) { /* see the comment in prepare_to_wait_event() */ list_del_init(&wait->entry); intr = 1; } else { if (likely(list_empty(&wait->entry))) { __add_wait_queue_entry_tail(q, wait); SetPageWaiters(page); } set_current_state(state); } spin_unlock_irq(&q->lock); bit_is_set = test_bit(bit_nr, &page->flags); if (behavior == DROP) put_page(page); if (!bit_is_set) { if (behavior != EXCLUSIVE) break; if (!test_and_set_bit_lock(bit_nr, &page->flags)) break; } if (intr) { ret = -EINTR; break; } io_schedule(); if (behavior == DROP) { /* * We can no longer safely access page->flags: * even if CONFIG_MEMORY_HOTREMOVE is not enabled, * there is a risk of waiting forever on a page reused * for something that keeps it locked indefinitely. * But best check for -EINTR before breaking. */ if (signal_pending_state(state, current)) ret = -EINTR; break; } } Oleg.