Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp5400664imb; Thu, 7 Mar 2019 15:01:42 -0800 (PST) X-Google-Smtp-Source: APXvYqwU/TStCLal/PCZNcUs3nPOj1S8y6CNxW1viFzrBzc6UFZM2MS6/u7TA/XnjZqHqYS1Soa1 X-Received: by 2002:a17:902:900a:: with SMTP id a10mr15672134plp.183.1551999702021; Thu, 07 Mar 2019 15:01:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551999702; cv=none; d=google.com; s=arc-20160816; b=AnqPxWM3I7IvmfcNtfkaVXrwEJCJTw8wMvf1gGVLssYEnnsg00CGgwu6f9dm5uPkMP wE9vMCgERvViRWZ6i8x7XyVWo+WVsDAdcCaQ+FGdOFNAgw73rW305ROWIJk7Y8x1QrQi Ql0zb2t1Vxo2jHgrjuHtZoag+niC+C64SRckI3dTPvLIK7KlZUHajBXWSfZU/q2TMKG8 tR3gWawNaa/GXXizQa4jxBZ1ok+NR+oA6dSv9ld9TLIV0SlgSwwrhN3IAz9vYytolfdG zo5bJ6dBy/Mc1qZ5E6T116yhvFosHgtOiARyW5PS1viImRJ8FrgyccYHl3ULVPFOt217 66lg== 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:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=SQTP2I1IGTAHWCfjeZNx8sn2B6cnWOl+ZJBV9SuBK5k=; b=IHtbuqRu4cJcYRZNcY9mXE7Ewwyk5KIEWSdViqMrBpz1KaKRndoFg7o3pN3i1m2LJO ofwbt4ogrX/OO0HPjl7hbBBBU+aadQubcy4aEK2sbW4rnx0CgnfvHXTiRTIaylWmg2De OhraPBE1mJEoDp7/BNs4gqo76kiBQpRnFmBFpoAI4OaqW1ApN24ftnRsAxn6vnf6pmQu e/2pApJG1WP2cjpprihR+XuMHNzmLDhnvC7FElPElc7IceCgsa+uRB8J3i22BMV2X2Fj QnsRAijmyrMcmyJzHLzoZdgs68g4P/k49G9rHE4W8ecTgNHWXz3BrURos3R916aGoHJZ FAeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=os1d9NLE; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l84si5502380pfi.35.2019.03.07.15.01.26; Thu, 07 Mar 2019 15:01:42 -0800 (PST) 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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=os1d9NLE; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726360AbfCGXAm (ORCPT + 99 others); Thu, 7 Mar 2019 18:00:42 -0500 Received: from mail-pf1-f193.google.com ([209.85.210.193]:33361 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726243AbfCGXAl (ORCPT ); Thu, 7 Mar 2019 18:00:41 -0500 Received: by mail-pf1-f193.google.com with SMTP id i19so12611006pfd.0 for ; Thu, 07 Mar 2019 15:00:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SQTP2I1IGTAHWCfjeZNx8sn2B6cnWOl+ZJBV9SuBK5k=; b=os1d9NLEH5YF0msLsK9q6RDbE3XUiJPCFohANPKSxtyy1x/weqPxw5h9t+FkSwtb+9 saeQFtoUHoBKFJasOMziLWJlyrqai9AU7rUCxmaiyWN5dE7t1mi2fYabAXmOvFRwbK/v dH9lNacjzQFRf+ia+gZQGZm8ZmRvl3FRXnt9eYMPesZ5xe6i/oC+USIAcfXUri7eXDCV bMWVeR5OD3oIIWdgoP/mz2x/zWuhPgEhzIJ1NiBqqtmSMCpZpsWbCakalGsqdNT/htmf dE7pCH1s6pZXaYOsvVhNaz6SWXisByM0sEPp9jVJEFN7bbWPi0Urx7ssMWxDxyGmVT3X jPlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SQTP2I1IGTAHWCfjeZNx8sn2B6cnWOl+ZJBV9SuBK5k=; b=UtqVFykYIZ656AdwegDiULSopc+kLR7SaxR8yn0q8Wp1f/rkMOI7x3U/i5bmMRlcQB 81Kbnbj3sINSdefb+iafuwDdtmZWsSBrSEJlnUOlJzyI/XpVLB9VBMXgtmgiRPGfXRLB ejeaKUY1Dd+LjHL6BcVS+lKbezhi3BQeIUHjh87n4pXRAg+X9bIueDdWkMnUH4ceYJoa BvvjAlA0l9Gb4jbD9VIB308L6ybVXn89NfFt0cU5ujrelGoHO0EVLy5Sukza7R9MGLle qnf8hekpRQt7eqt7bo68Iq0r3670rk7uWfIm1OwD14XTddnMBzRnZZnRnGXPMOOAC4LJ n+5g== X-Gm-Message-State: APjAAAU92XAVbMvTIA4wcMufC8NOBClh4Vv7bx568cUg9c/C9XAU1MRB sNX+z0frI4DCQ8L5PmmzHiA= X-Received: by 2002:a63:4e1d:: with SMTP id c29mr13842615pgb.433.1551999640819; Thu, 07 Mar 2019 15:00:40 -0800 (PST) Received: from tower.thefacebook.com ([2620:10d:c090:200::2:d18b]) by smtp.gmail.com with ESMTPSA id i126sm11864806pfb.15.2019.03.07.15.00.39 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 07 Mar 2019 15:00:40 -0800 (PST) From: Roman Gushchin X-Google-Original-From: Roman Gushchin To: linux-mm@kvack.org, kernel-team@fb.com Cc: linux-kernel@vger.kernel.org, Tejun Heo , Rik van Riel , Johannes Weiner , Michal Hocko , Roman Gushchin Subject: [PATCH 3/5] mm: release memcg percpu data prematurely Date: Thu, 7 Mar 2019 15:00:31 -0800 Message-Id: <20190307230033.31975-4-guro@fb.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190307230033.31975-1-guro@fb.com> References: <20190307230033.31975-1-guro@fb.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org To reduce the memory footprint of a dying memory cgroup, let's release massive percpu data (vmstats_percpu) as early as possible, and use atomic counterparts instead. A dying cgroup can remain in the dying state for quite a long time, being pinned in memory by any reference. For example, if a page mlocked by some other cgroup, is charged to the dying cgroup, it won't go away until the page will be released. A dying memory cgroup can have some memory activity (e.g. dirty pages can be flushed after cgroup removal), but in general it's not expected to be very active in comparison to living cgroups. So reducing the memory footprint by releasing percpu data and switching over to atomics seems to be a good trade off. Signed-off-by: Roman Gushchin --- include/linux/memcontrol.h | 4 ++++ mm/memcontrol.c | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 8ac04632002a..569337514230 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -275,6 +275,10 @@ struct mem_cgroup { /* memory.stat */ struct memcg_vmstats_percpu __rcu /* __percpu */ *vmstats_percpu; + struct memcg_vmstats_percpu __percpu *vmstats_percpu_offlined; + + /* used to release non-used percpu memory */ + struct rcu_head rcu; MEMCG_PADDING(_pad2_); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 8f3cac02221a..8c55954e6f23 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4469,7 +4469,7 @@ static void __mem_cgroup_free(struct mem_cgroup *memcg) for_each_node(node) free_mem_cgroup_per_node_info(memcg, node); - free_percpu(memcg->vmstats_percpu); + WARN_ON_ONCE(memcg->vmstats_percpu != NULL); kfree(memcg); } @@ -4612,6 +4612,26 @@ static int mem_cgroup_css_online(struct cgroup_subsys_state *css) return 0; } +static void mem_cgroup_free_percpu(struct rcu_head *rcu) +{ + struct mem_cgroup *memcg = container_of(rcu, struct mem_cgroup, rcu); + + free_percpu(memcg->vmstats_percpu_offlined); + WARN_ON_ONCE(memcg->vmstats_percpu); + + css_put(&memcg->css); +} + +static void mem_cgroup_offline_percpu(struct mem_cgroup *memcg) +{ + memcg->vmstats_percpu_offlined = (struct memcg_vmstats_percpu __percpu*) + rcu_dereference(memcg->vmstats_percpu); + rcu_assign_pointer(memcg->vmstats_percpu, NULL); + + css_get(&memcg->css); + call_rcu(&memcg->rcu, mem_cgroup_free_percpu); +} + static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) { struct mem_cgroup *memcg = mem_cgroup_from_css(css); @@ -4638,6 +4658,8 @@ static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) drain_all_stock(memcg); mem_cgroup_id_put(memcg); + + mem_cgroup_offline_percpu(memcg); } static void mem_cgroup_css_released(struct cgroup_subsys_state *css) -- 2.20.1