On Mon, Dec 16, 2019 at 08:17:48AM -0800, Davidlohr Bueso wrote: > On Mon, 16 Dec 2019, Michal Hocko wrote: > > I am afraid that work_struct is too large to be stuffed into the struct > > page array (because of the lockdep part). > > Yeah, this needs to be done without touching struct page. > > Which is why I had done the stack allocated way in this patch, but we > cannot wait for it to complete in irq, so that's out the window. Andi > had suggested percpu allocated work items, but having played with the > idea over the weekend, I don't see how we can prevent another page being > freed on the same cpu before previous work on the same cpu is complete > (cpu0 wants to free pageA, schedules the work, in the mean time cpu0 > wants to free pageB and workerfn for pageA still hasn't been called). Why is it that we can call functions after-an-RCU-period-has-elapsed time, at returning-to-userspace time and after-exiting-hardirq-handler time easily, but the mechanism for calling a function after-we've-finished-handling-softirqs is so bloody hard to use? That's surely the major problem we need to fix.