On 1/10/22 16:01, Michal Hocko wrote: > On Thu 06-01-22 17:12:18, Michal Hocko wrote: >> On Tue 04-01-22 13:22:25, Yu Zhao wrote: >> > +static struct lru_gen_mm_walk *alloc_mm_walk(void) >> > +{ >> > + if (!current->reclaim_state || !current->reclaim_state->mm_walk) >> > + return kvzalloc(sizeof(struct lru_gen_mm_walk), GFP_KERNEL); > > One thing I have overlooked completely. You cannot really use GFP_KERNEL > allocation here because the reclaim context can be constrained (e.g. > GFP_NOFS). This allocation will not do any reclaim as it is PF_MEMALLOC > but I suspect that the lockdep will complain anyway. > > Also kvmalloc is not really great here. a) vmalloc path is never > executed for small objects and b) we do not really want to make a > dependency between vmalloc and the reclaim (by vmalloc -> reclaim -> > vmalloc). > > Even if we rule out vmalloc and look at kmalloc alone. Is this really > safe? I do not see any recursion prevention in the SL.B code. Maybe this > just happens to work but the dependency should be really documented so > that future SL.B changes won't break the whole scheme. Slab implementations drop all locks before calling into page allocator (thus possibly reclaim) so slab itself should be fine and I don't expect it to change. But we could eventually reach the page allocator recursively again, that's true and not great.