From patchwork Wed Mar 4 02:20:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shakeel Butt X-Patchwork-Id: 11419109 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F2613924 for ; Wed, 4 Mar 2020 02:21:24 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id B53AC2073B for ; Wed, 4 Mar 2020 02:21:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TZwFCinu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B53AC2073B Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id EE7626B0005; Tue, 3 Mar 2020 21:21:23 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id E96DE6B0006; Tue, 3 Mar 2020 21:21:23 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D5FF46B0007; Tue, 3 Mar 2020 21:21:23 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0096.hostedemail.com [216.40.44.96]) by kanga.kvack.org (Postfix) with ESMTP id BA8CF6B0005 for ; Tue, 3 Mar 2020 21:21:23 -0500 (EST) Received: from smtpin29.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 9EF188248047 for ; Wed, 4 Mar 2020 02:21:23 +0000 (UTC) X-FDA: 76556078046.29.idea23_4651c31bd0900 X-Spam-Summary: 2,0,0,304df2136fc7a612,d41d8cd98f00b204,3orbfxggkcdgmbueyyfvaiiafy.wigfchor-ggepuwe.ila@flex--shakeelb.bounces.google.com,,RULES_HIT:41:69:152:355:379:541:800:960:973:988:989:1260:1277:1313:1314:1345:1437:1516:1518:1535:1544:1593:1594:1711:1730:1747:1777:1792:2393:2559:2562:2898:3138:3139:3140:3141:3142:3152:3354:3865:3866:3867:3868:3870:3872:4041:4117:4321:5007:6119:6261:6653:7903:9592:9969:10004:11026:11233:11473:11658:11914:12043:12291:12296:12297:12438:12555:12683:12895:12986:13184:13229:14181:14394:14659:14721:21063:21080:21444:21451:21627:21790:21795:21990:30029:30051:30054:30056:30070,0,RBL:209.85.215.202:@flex--shakeelb.bounces.google.com:.lbl8.mailshell.net-66.100.201.100 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fp,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:23,LUA_SUMMARY:none X-HE-Tag: idea23_4651c31bd0900 X-Filterd-Recvd-Size: 6709 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by imf31.hostedemail.com (Postfix) with ESMTP for ; Wed, 4 Mar 2020 02:21:23 +0000 (UTC) Received: by mail-pg1-f202.google.com with SMTP id w8so339070pgr.2 for ; Tue, 03 Mar 2020 18:21:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=+xah7E//6pVRKdaZXmFI1T6nfuFUo9iVXUkHyM4jmQo=; b=TZwFCinuj11xZdNvspmekDI0x79O/EQihOSSmxMSVxtrpfdyMQkBRLLvD95CEFCzpX LLJPxfEnWDkieQxh7QIxWxbToGfC+DMpLfbgM4udxeAy8K5yQHCP1k4fD6xZVxK51r2m uCNK6OZd3TSqEautzdRJCITCLeqff8iyKCZFyG01AxM0dPjwy0pwIyjdDBheYzwyIB3M b21oYiHUF7a9PAjanaiCpWH4aFMeYD4jjLh872JSJ0BGqqi1PHtAr+BikLaErcxfrWv+ U1c2HZsQTLpu4Y39JF9rjKug9K9KM/Wd6WgOrSRcCsD9Dn0Qs8DAYqL4Shs4nsmMLQXh vgFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=+xah7E//6pVRKdaZXmFI1T6nfuFUo9iVXUkHyM4jmQo=; b=Q4Fc9OJk+pquU/v8S0Q3gh0+DqqHN7d1r65q7zb4PKt2yNXl5wMzNVV103LJWHjjf1 YBaT3eXyfd6dZEvMFEhBaeZ0Bn3YfSGWN2zK8aVXHd5DuJVTpBjXni7jwzfAk2spQbYY AYdHmSlaGJrtzgajpgbZzkFu2cMPdNrxaX5KHrbtc6Ipq/OaLc9RJcJ6lLy1GtCr0Fwl uJRlwUtm6Njrd5Ok748bKsm0zE2tg6bzyo5jbpe+T8LDopGkl/ymmROazxlJyT6eVZHH DuJ3tO0knJ4JaTz3st9Xc/OLry7PWy3wLGToqS6//Mn5yUYGjqw9cmgWzGmZKs5pV2JS 3fRQ== X-Gm-Message-State: ANhLgQ2IC81SohOyVbwjHeVHwvs1VXcrLms/7OEk24acB95uOfXyLfAa WJBWmMRH3zvCaph2sC6JFFtEnrmlZfBMTA== X-Google-Smtp-Source: ADFU+vu8OtgDgAEEtoJCrBqXEjW+PtdPObK6IdK9ihXt3F3QrY5fhSy5oyuvRqAnRLJJE4WOR6O7U3lAP9UJDA== X-Received: by 2002:a63:731c:: with SMTP id o28mr418425pgc.139.1583288481764; Tue, 03 Mar 2020 18:21:21 -0800 (PST) Date: Tue, 3 Mar 2020 18:20:58 -0800 Message-Id: <20200304022058.248270-1-shakeelb@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.25.0.265.gbab2e86ba0-goog Subject: [PATCH] memcg: optimize memory.numa_stat like memory.stat From: Shakeel Butt To: Johannes Weiner , Roman Gushchin Cc: Michal Hocko , Andrew Morton , linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Shakeel Butt X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Currently reading memory.numa_stat traverses the underlying memcg tree multiple times to accumulate the stats to present the hierarchical view of the memcg tree. However the kernel already maintains the hierarchical view of the stats and use it in memory.stat. Just use the same mechanism in memory.numa_stat as well. I ran a simple benchmark which reads root_mem_cgroup's memory.numa_stat file in the presense of 10000 memcgs. The results are: Without the patch: $ time cat /dev/cgroup/memory/memory.numa_stat > /dev/null real 0m0.700s user 0m0.001s sys 0m0.697s With the patch: $ time cat /dev/cgroup/memory/memory.numa_stat > /dev/null real 0m0.001s user 0m0.001s sys 0m0.000s Signed-off-by: Shakeel Butt Signed-off-by: Shakeel Butt Reviewed-by: Andrew Morton Signed-off-by: Andrew Morton Acked-by: Johannes Weiner --- mm/memcontrol.c | 52 +++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 63bb6a2aab81..d5485fa8a345 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -3614,32 +3614,40 @@ static int mem_cgroup_move_charge_write(struct cgroup_subsys_state *css, #define LRU_ALL ((1 << NR_LRU_LISTS) - 1) static unsigned long mem_cgroup_node_nr_lru_pages(struct mem_cgroup *memcg, - int nid, unsigned int lru_mask) + int nid, unsigned int lru_mask, bool tree) { struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); unsigned long nr = 0; enum lru_list lru; + unsigned long (*page_state)(struct lruvec *lruvec, + enum node_stat_item idx); VM_BUG_ON((unsigned)nid >= nr_node_ids); + page_state = tree ? lruvec_page_state : lruvec_page_state_local; + for_each_lru(lru) { if (!(BIT(lru) & lru_mask)) continue; - nr += lruvec_page_state_local(lruvec, NR_LRU_BASE + lru); + nr += page_state(lruvec, NR_LRU_BASE + lru); } return nr; } static unsigned long mem_cgroup_nr_lru_pages(struct mem_cgroup *memcg, - unsigned int lru_mask) + unsigned int lru_mask, + bool tree) { unsigned long nr = 0; enum lru_list lru; + unsigned long (*page_state)(struct mem_cgroup *memcg, int idx); + + page_state = tree ? memcg_page_state : memcg_page_state_local; for_each_lru(lru) { if (!(BIT(lru) & lru_mask)) continue; - nr += memcg_page_state_local(memcg, NR_LRU_BASE + lru); + nr += page_state(memcg, NR_LRU_BASE + lru); } return nr; } @@ -3659,34 +3667,28 @@ static int memcg_numa_stat_show(struct seq_file *m, void *v) }; const struct numa_stat *stat; int nid; - unsigned long nr; struct mem_cgroup *memcg = mem_cgroup_from_seq(m); for (stat = stats; stat < stats + ARRAY_SIZE(stats); stat++) { - nr = mem_cgroup_nr_lru_pages(memcg, stat->lru_mask); - seq_printf(m, "%s=%lu", stat->name, nr); - for_each_node_state(nid, N_MEMORY) { - nr = mem_cgroup_node_nr_lru_pages(memcg, nid, - stat->lru_mask); - seq_printf(m, " N%d=%lu", nid, nr); - } + seq_printf(m, "%s=%lu", stat->name, + mem_cgroup_nr_lru_pages(memcg, stat->lru_mask, + false)); + for_each_node_state(nid, N_MEMORY) + seq_printf(m, " N%d=%lu", nid, + mem_cgroup_node_nr_lru_pages(memcg, nid, + stat->lru_mask, false)); seq_putc(m, '\n'); } for (stat = stats; stat < stats + ARRAY_SIZE(stats); stat++) { - struct mem_cgroup *iter; - - nr = 0; - for_each_mem_cgroup_tree(iter, memcg) - nr += mem_cgroup_nr_lru_pages(iter, stat->lru_mask); - seq_printf(m, "hierarchical_%s=%lu", stat->name, nr); - for_each_node_state(nid, N_MEMORY) { - nr = 0; - for_each_mem_cgroup_tree(iter, memcg) - nr += mem_cgroup_node_nr_lru_pages( - iter, nid, stat->lru_mask); - seq_printf(m, " N%d=%lu", nid, nr); - } + + seq_printf(m, "hierarchical_%s=%lu", stat->name, + mem_cgroup_nr_lru_pages(memcg, stat->lru_mask, + true)); + for_each_node_state(nid, N_MEMORY) + seq_printf(m, " N%d=%lu", nid, + mem_cgroup_node_nr_lru_pages(memcg, nid, + stat->lru_mask, true)); seq_putc(m, '\n'); }