2013/8/15 Andrew Morton > On Wed, 14 Aug 2013 14:31:21 +0400 Andrey Vagin wrote: > > > The memcg_cache_params structure contains the common part and the union, > > which represents two different types of data: one for root cashes and > > another for child caches. > > > > The size of child data is fixed. The size of the memcg_caches array is > > calculated in runtime. > > > > Currently the size of memcg_cache_params for root caches is calculated > > incorrectly, because it includes the size of parameters for child caches. > > > > ssize_t size = memcg_caches_array_size(num_groups); > > size *= sizeof(void *); > > > > size += sizeof(struct memcg_cache_params); > > > > ... > > > > --- a/mm/memcontrol.c > > +++ b/mm/memcontrol.c > > @@ -3140,7 +3140,7 @@ int memcg_update_cache_size(struct kmem_cache *s, > int num_groups) > > ssize_t size = memcg_caches_array_size(num_groups); > > > > size *= sizeof(void *); > > - size += sizeof(struct memcg_cache_params); > > + size += sizeof(offsetof(struct memcg_cache_params, > memcg_caches)); > > This looks wrong. offsetof() returns size_t, so this is equivalent to > > size += sizeof(size_t); > sizeof doesn't have to be here. I will resend this patch. Thanks. size += offsetof(struct memcg_cache_params, memcg_caches) > > s->memcg_params = kzalloc(size, GFP_KERNEL); > > if (!s->memcg_params) { > > @@ -3183,13 +3183,16 @@ int memcg_update_cache_size(struct kmem_cache > *s, int num_groups) > > int memcg_register_cache(struct mem_cgroup *memcg, struct kmem_cache *s, > > struct kmem_cache *root_cache) > > { > > - size_t size = sizeof(struct memcg_cache_params); > > + size_t size; > > > > if (!memcg_kmem_enabled()) > > return 0; > > > > - if (!memcg) > > + if (!memcg) { > > + size = offsetof(struct memcg_cache_params, memcg_caches); > > size += memcg_limited_groups_array_size * sizeof(void *); > > + } else > > + size = sizeof(struct memcg_cache_params); > > > > s->memcg_params = kzalloc(size, GFP_KERNEL); > > if (!s->memcg_params) > >