PROBLEM: Bug in __pollwait() can cause select() and poll() to hang in
Hi Ray,
your bug description seems to be correct, but the fix is wrong:
If the allocation is for the 2nd page of wait queue heads, then "current->state = TASK_INTERRUPTIBLE" can lead to lost wakeups, if an fd that is stored in the first page gets ready during the allocation. Setting the state to interruptible is only permitted if a full scan of all file descriptors happens before calling schedule(). This is expensive and should be avoided.
The correct fix is current->state = TASK_RUNNING just before calling yield() in the rebalance code.
--
Manfred
Re: PROBLEM: Bug in __pollwait() can cause select() and poll() tohang in
Quoted 7 lines · Manfred Spraul
Hi Ray,
your bug description seems to be correct, but the fix is wrong:
If the allocation is for the 2nd page of wait queue heads, then "current->state=TASK_INTERRUPTIBLE" can lead to lost wakeups, if an fd that is stored in the first page gets ready during the allocation.
Hi Manfred,
Grumble. :-) Yes, I believe you are correct.
Quoted 6 lines
Setting the state to interruptible is only permitted if a full scan of all file descriptors happens before calling
schedule(). This is expensive and should be avoided.The correct fix is
current->state=TASK_RUNNINGjust before callingyield()in the rebalance code.
But doesn't this have the same kind of problem? e. g., just before calling yield() in the rebalance code we save current->state, set it to TASK_RUNNING, then restore current->state on return from yield(). If a fd becomes ready after the call to yield(), and we entered __alloc_pages() with state TASK_INTERRUPTIBLE, aren't we in exactly the same situation as described above?
Let me think about this some more.
Thanks,
Signature · 9 lines
Best Regards,
Ray
-----------------------------------------------
Ray Bryant
512-453-9679 (work) 512-507-7807 (cell)
[email protected] [email protected]
The box said: "Requires Windows 98 or better",
so I installed Linux.
-----------------------------------------------Re: PROBLEM: Bug in __pollwait() can cause select() and poll() tohang in
Quoted 10 lines · Ray Bryant
Quoted 3 lines
The correct fix is
current->state=TASK_RUNNINGjust before callingyield()in the rebalance code.But doesn't this have the same kind of problem? e. g., just before calling
yield()in the rebalance code we savecurrent->state, set it toTASK_RUNNING, then restorecurrent->stateon return fromyield(). If a fd becomes ready after the call toyield(), and we entered__alloc_pages()with stateTASK_INTERRUPTIBLE, aren't we in exactly the same situation as described above?
No, you cannot restore the task state after having set it to TASK_RUNNING.
Just leave the state at TASK_RUNNING. The (silly) code which called the page allocator in state TASK_[IN]TERRUPTIBLE will just go around its wait loop an extra time and go back to sleep. This almost always works.