Linus Torvalds writes: (Summary) wrote:
So I just committed that trivial patch, because I think it's right, but more importantly because I think I found a real and non-trivial fundamental problem.
fundamental problem.
The reason I found it is actually that I was thinking about this patch, and how the WQ_FLAG_EXCLUSIVE ordering matters. And I don't really think the WQ_FLAG_EXCLUSIVE ordering matters all that much, but just *thinking* about it made me realize that the code is broken.
is broken.
In particular, this caller:
In particular, this caller:
int __lock_page_killable(struct page *__page)
[...]
So how about just this fairly trivial patch?So I just committed that trivial patch, because I think it's right, but more importantly because I think I found a real and non-trivial fundamental problem.
fundamental problem.
The reason I found it is actually that I was thinking about this patch, and how the WQ_FLAG_EXCLUSIVE ordering matters. And I don't really think the WQ_FLAG_EXCLUSIVE ordering matters all that much, but just *thinking* about it made me realize that the code is broken.
is broken.
In particular, this caller:
In particular, this caller:
int __lock_page_killable(struct page *__page)
{ struct page *page = compound_head(__page); But that bit - by definition, that's the whole point - means that the waking side only wakes up *one* waiter.