Re: [RFC 0/2] Reenable might_sleep() checks for might_fault() when atomic
From: David Hildenbrand <hidden>
Date: 2014-11-27 16:50:00
Also in:
linux-arch, lkml
From: David Hildenbrand [mailto:dahi@linux.vnet.ibm.com]quoted
quoted
From: David Hildenbrand ...quoted
Although it might not be optimal, but keeping a separate counter for pagefault_disable() as part of the preemption counter seems to be the only doable thing right now. I am not sure if a completely separated counter is even possible, increasing the size of thread_info.What about adding (say) 0x10000 for the more restrictive test? DavidYou mean as part of the preempt counter? The current layout (on my branch) is * PREEMPT_MASK: 0x000000ff * SOFTIRQ_MASK: 0x0000ff00 * HARDIRQ_MASK: 0x000f0000 * NMI_MASK: 0x00100000 * PREEMPT_ACTIVE: 0x00200000 I would have added * PAGEFAULT_MASK: 0x03C00000I'm not sure where you'd need to add the bits. I think the above works because disabling 'HARDIRQ' implicitly disables 'SOFTIRQ' and 'PREEMPT' (etc), so if 256+ threads disable PREEMPT everything still works.
AFAIK 256+ levels of preempt will break the system :) Therefore with CONFIG_DEBUG_PREEMPT we verify that we don't have any over/underflows. But such bugs can only be found with CONFIG_DEBUG_PREEMPT enabled.
So if disabling pagefaults implies that pre-emption is disabled (but SOFTIRQ is still allowed) then you need to insert your bit(s) between 0xff00 and 0x00ff. OTOH if disabling pre-emption implies that pagefaults are disabled then you'd need to use the lsb and change all the above values. Which makes me think that 'PREEMPT_ACTIVE' isn't right at all. Two threads disabling NMIs (or 32 disabling HARDIRQ) won't DTRT.
With threads you mean levels? This is a per thread information.
OTOH I'm only guessing at how this is used. David