Received: by 2002:a25:b323:0:0:0:0:0 with SMTP id l35csp1607244ybj; Fri, 20 Sep 2019 13:17:19 -0700 (PDT) X-Google-Smtp-Source: APXvYqyWhBcxDdWbDRTjNVyAGSoxzw4OCGK7zZGstdD/MPF4/hzXVDtHSPtmoPWvJX6WnzPbdqQv X-Received: by 2002:a17:906:3298:: with SMTP id 24mr18638347ejw.136.1569010639358; Fri, 20 Sep 2019 13:17:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569010639; cv=none; d=google.com; s=arc-20160816; b=oJJU+HTVnTCh3JfdVAhH2PHf/J0IY7c0c5oC1iMwBn5IB+m44meFlD14KYFqf+GKL1 uy0iLOy4od9I58PBJcDetaz9+LrPh3m5zDplTaFOXIzzH55rwb/SoIpgmjAXKWkpJIEg i5zY0eOSVh6nq3pG3HbQSHBDWZQ/oebZeFLe8GdfZn3mdlmNwZtOQHVGIQDUl5BO6KHe MP7gk0Xr9Q+D65HsJXAIryO4+pXzc+/PDSLqXHRWNWpqUlyWFj8I7SDLCq3Sc+mXMT6J 6a3Yb9URZ55HoF0x6vwzXnPAREbISNf1BksVJKimi5Mh5qkaA6A/buyXS2VxjT13rgRM Wn4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=Uthm0NVSatpGzejpwytukZhQkZfdoJT0X274Nll+hm4=; b=Rxstn+hr5veqCJ9jObhmCDhCnDZIrZd4/1uUUNc9Dk9UXYb7MV2jPjAuEhAJ0FHzHi bxUo/yiMffyKNgNmXrNEqQmaDgUIRRZtUvNLHbgxZbJR67ahsgla5wTvTuyB9CoIlPF/ PflpMHd54aEwPuVSZ/y8xz8MEvT7IFBGWf4PvrwzK1qGrfteRcwDgzaBW7jPrtu7b7xp ioO346bBxfyGyWMaUCetK/KNY09HKr6qefPNRhUVCvXWs/ssqVNuqzKca/dKNYAaJpX4 e4ZlJzuGf6kmk/YZsPtijIHrzSxkXzPlFaNydQp+9xBcO3kDaFILUzThXbq5k4HxPGRT fxRQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a54si2040442edc.333.2019.09.20.13.16.55; Fri, 20 Sep 2019 13:17:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387669AbfITOLV (ORCPT + 99 others); Fri, 20 Sep 2019 10:11:21 -0400 Received: from relay.sw.ru ([185.231.240.75]:59458 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387615AbfITOLV (ORCPT ); Fri, 20 Sep 2019 10:11:21 -0400 Received: from [172.16.24.104] by relay.sw.ru with esmtp (Exim 4.92.2) (envelope-from ) id 1iBJct-0006XP-IK; Fri, 20 Sep 2019 17:11:11 +0300 Subject: Re: [PATCH] mm, memcg: assign shrinker_map before kvfree To: Cyrill Gorcunov , LKML Cc: Linux MM , Johannes Weiner , Michal Hocko , Vladimir Davydov References: <20190920122907.GG2507@uranus.lan> From: Kirill Tkhai Message-ID: <8a4b5293-6f79-2a5d-4ac8-f8fc17f13b6e@virtuozzo.com> Date: Fri, 20 Sep 2019 17:11:00 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: <20190920122907.GG2507@uranus.lan> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 20.09.2019 15:29, Cyrill Gorcunov wrote: > Currently there is a small gap between fetching pointer, calling > kvfree and assign its value to nil. In current callgraph it is > not a problem (since memcg_free_shrinker_maps is running from > memcg_alloc_shrinker_maps and mem_cgroup_css_free only) still > this looks suspicious and we can easily eliminate the gap at all. > > Cc: Johannes Weiner > Cc: Michal Hocko > Cc: Vladimir Davydov > Cc: Kirill Tkhai > Signed-off-by: Cyrill Gorcunov > --- > mm/memcontrol.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: linux-tip.git/mm/memcontrol.c > =================================================================== > --- linux-tip.git.orig/mm/memcontrol.c > +++ linux-tip.git/mm/memcontrol.c > @@ -364,9 +364,9 @@ static void memcg_free_shrinker_maps(str > for_each_node(nid) { > pn = mem_cgroup_nodeinfo(memcg, nid); > map = rcu_dereference_protected(pn->shrinker_map, true); > + rcu_assign_pointer(pn->shrinker_map, NULL); > if (map) > kvfree(map); > - rcu_assign_pointer(pn->shrinker_map, NULL); > } > } The current scheme is following. We allocate shrinker_map in css_online, while normal freeing happens in css_free. The NULLifying of pointer is needed in case of "abnormal freeing", when memcg_free_shrinker_maps() is called from memcg_alloc_shrinker_maps(). The NULLifying guarantees, we won't free pn->shrinker_map twice. There are no races or problems with kvfree() and rcu_assign_pointer() order, because of nobody can reference shrinker_map before memcg is online. In case of this rcu_assign_pointer() confuses, we may just remove is from the function, and call it only on css_free. Something like the below: diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 1c4c08b45e44..454303c3aa0f 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -372,7 +372,6 @@ static void memcg_free_shrinker_maps(struct mem_cgroup *memcg) map = rcu_dereference_protected(pn->shrinker_map, true); if (map) kvfree(map); - rcu_assign_pointer(pn->shrinker_map, NULL); } } @@ -389,7 +388,6 @@ static int memcg_alloc_shrinker_maps(struct mem_cgroup *memcg) for_each_node(nid) { map = kvzalloc(sizeof(*map) + size, GFP_KERNEL); if (!map) { - memcg_free_shrinker_maps(memcg); ret = -ENOMEM; break; }