On Mon, Jan 10, 2022 at 04:01:13PM +0100, 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. I appreciate your attention to details but GFP_KERNEL is legit in the reclaim path. It's been used many years in our production, e.g., page reclaim swap_writepage() frontswap_store() zswap_frontswap_store() zswap_entry_cache_alloc(GFP_KERNEL) (And I always test my changes with lockdep, kasan, DEBUG_VM, etc., no warnings ever seen from using GFP_KERNEL in the reclaim path.) > 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. Affirmative, as Vlastimil has clarified. Thanks!