On Wed, 14 Aug 2013 14:31:21 +0400 Andrey Vagin <avagin@xxxxxxxxxx> 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); > 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) -- To unsubscribe from this list: send the line "unsubscribe cgroups" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html