On 12/19/2016 03:07 PM, Linus Torvalds wrote: > +wait_queue_head_t *bit_waitqueue(void *word, int bit) > +{ > + const int __maybe_unused nid = page_to_nid(virt_to_page(word)); > + > + return __bit_waitqueue(word, bit, nid); > > No can do. Part of the problem with the old coffee was that it did that > virt_to_page() crud. That doesn't work with the virtually mapped stack.
Ahhh, got it. So, what did you have in mind? Just redirect bit_waitqueue() to the "first_online_node" waitqueues? wait_queue_head_t *bit_waitqueue(void *word, int bit) { return __bit_waitqueue(word, bit, first_online_node); } We could do some fancy stuff like only do virt_to_page() for things in the linear map, but I'm not sure we'll see much of a gain for it. None of the other waitqueue users look as pathological as the 'struct page' ones. Maybe: wait_queue_head_t *bit_waitqueue(void *word, int bit) { int nid if (word >= VMALLOC_START) /* all addrs not in linear map */ nid = first_online_node; else nid = page_to_nid(virt_to_page(word)); return __bit_waitqueue(word, bit, nid); }