On Mon, Feb 1, 2021 at 7:17 AM Vlastimil Babka <vbabka@xxxxxxx> wrote: > > On 1/29/21 7:04 PM, Yang Shi wrote: > > >> > > @@ -209,9 +214,15 @@ static int expand_one_shrinker_info(struct mem_cgroup *memcg, > >> > > if (!new) > >> > > return -ENOMEM; > >> > > > >> > > - /* Set all old bits, clear all new bits */ > >> > > - memset(new->map, (int)0xff, old_size); > >> > > - memset((void *)new->map + old_size, 0, size - old_size); > >> > > + new->map = (unsigned long *)(new + 1); > >> > > + new->nr_deferred = (void *)new->map + m_size; > >> > > >> > This better be aligned to sizeof(atomic_long_t). Can we be sure about that? > >> > >> Good point. No, if unsigned long is 32 bit on some 64 bit machines. > > > > I think we could just change map to "u64" and guarantee struct > > shrinker_info is aligned to 64 bit. > > What about changing to order, nr_deferred before map? Then the atomics are at > the beginning of allocated area, thus aligned. Yes, it works too. The rcu_head is guaranteed to have aligned at sizeof(void *). Will fix in v6.