On Thu 06-01-22 14:41:12, Yu Zhao wrote: > On Thu, Jan 06, 2022 at 05:12:16PM +0100, 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); > > > + > > > + return current->reclaim_state->mm_walk; > > > +} > > > + > > > +static void free_mm_walk(struct lru_gen_mm_walk *walk) > > > +{ > > > + if (!current->reclaim_state || !current->reclaim_state->mm_walk) > > > + kvfree(walk); > > > +} > > > > Do I get it right that you are allocating from the reclaim context? What > > prevents this to completely deplete the memory as the reclaim context is > > PF_MEMALLOC? > > Yes, and in general the same reason zram/zswap/etc. allocate memory in > the reclaim context: to make more free memory. I have to admit that I am not really familiar with zram/zswap but I find the concept of requiring memory to do the reclaim really problematic. > In this case, lru_gen_mm_walk is small (160 bytes); it's per direct > reclaimer; and direct reclaimers rarely come here, i.e., only when > kswapd can't keep up in terms of the aging, which is similar to the > condition where the inactive list is empty for the active/inactive > lru. Well, this is not a strong argument to be honest. Kswapd being stuck and the majority of the reclaim being done in the direct reclaim context is a situation I have seen many many times. We used to have problems with direct reclaimers throttling to prevent an over eager OOM situations. Have you considered using a pool of preallocated objects instead? -- Michal Hocko SUSE Labs