Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp4719130imm; Tue, 7 Aug 2018 06:19:49 -0700 (PDT) X-Google-Smtp-Source: AAOMgpeH6wsm13sTo+gKxb5AwlhC0wSnj/+2eAPjmWK0PzQ/xs4n6dnRrAShP4XtAsZg2SfYNvZR X-Received: by 2002:a62:be03:: with SMTP id l3-v6mr21708310pff.138.1533647988987; Tue, 07 Aug 2018 06:19:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1533647988; cv=none; d=google.com; s=arc-20160816; b=jKKl09+BNZz4FygAbIYzQ64g97520Z/hCb3AeMXAE0Xmf/D79viE8hHooSYyd2Nt6f 1uef9cU33ahhcan7yMt2s9zPx9Wi8idRyxxQW802YdEUvSKRoS7MZhhYH07yvQQSKN6y ywxTvXk1lLE1cbAMn58Uav9xmNTgNCzoVcuD3pSM6cWlwuX+4e5n3BGrb2yjwrOPzLXQ LBZe1oEK4tTwz1IDBp947YQ9X79760XUIgAPfLkvqcv0B1AC8SPJmxzaxUJAPXnPFrkv W9xUdN5GvOahuPaYUfbWvUSTB9DfJs+Lg2yRnMW6ClHwwOaRRNkTbgauPXxM9iej+cST i2SQ== 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:autocrypt:openpgp:from:references:cc:to:subject :arc-authentication-results; bh=yXrrW04DT73TXDnINJ6XgW6gysL+swHhJkRE1R7ZvSc=; b=epz6omonZ7Zy+mqkv9qs3oHQjrEdtbbQsI+SNl3jr8G5EB+IHcMdwuU+hS+xWqvoNT /Pf9XsCcPMmN44/+tzrlr64NQaiwEdCcWZnaXbEIn/ofkj6t5oV+t6osJuAoBZGcbfol wqz7dxlQCUXZMg7sY5Kd3WqNAWvKFpM3cgxlkWIL8MWpRYZpPyTrUqTSLpRMwLsr2INX QuKeL5riw17is24Tupx4C4Ih6X3uWe4KAfkOH7Fcrc7YCqntu2AwdI3IoKJWl3hlLSMe VqwS9vU/M4ROY322XnrgL1I8HlC6R1hj1tdpUfz1mSEPB/tRy1jfCdZxbmb/jPrT1Qww jVwg== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a18-v6si1062346plm.122.2018.08.07.06.19.34; Tue, 07 Aug 2018 06:19:48 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388939AbeHGPcx (ORCPT + 99 others); Tue, 7 Aug 2018 11:32:53 -0400 Received: from mx2.suse.de ([195.135.220.15]:40604 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727605AbeHGPcx (ORCPT ); Tue, 7 Aug 2018 11:32:53 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 5E163ACD3; Tue, 7 Aug 2018 13:18:32 +0000 (UTC) Subject: Re: [PATCH] proc: add percpu populated pages count to meminfo To: Dennis Zhou , Andrew Morton , Tejun Heo , Johannes Weiner , Christoph Lameter , Roman Gushchin Cc: kernel-team@fb.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Linux API References: <20180807005607.53950-1-dennisszhou@gmail.com> From: Vlastimil Babka Openpgp: preference=signencrypt Autocrypt: addr=vbabka@suse.cz; prefer-encrypt=mutual; keydata= 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 cqmP8roqufIAj+Ohhzs= Message-ID: <3b792413-184b-20b1-9d90-9e69f0df8cc4@suse.cz> Date: Tue, 7 Aug 2018 15:18:31 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20180807005607.53950-1-dennisszhou@gmail.com> 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 +CC linux-api On 08/07/2018 02:56 AM, Dennis Zhou wrote: > From: "Dennis Zhou (Facebook)" > > Currently, percpu memory only exposes allocation and utilization > information via debugfs. This more or less is only really useful for > understanding the fragmentation and allocation information at a > per-chunk level with a few global counters. This is also gated behind a > config. BPF and cgroup, for example, have seen an increase use causing > increased use of percpu memory. Let's make it easier for someone to > identify how much memory is being used. > > This patch adds the PercpuPopulated stat to meminfo to more easily > look up how much percpu memory is in use. This new number includes the > cost for all backing pages and not just insight at the a unit, per > chunk level. This stat includes only pages used to back the chunks > themselves excluding metadata. I think excluding metadata is fair > because the backing memory scales with the number of cpus and can > quickly outweigh the metadata. It also makes this calculation light. > > Signed-off-by: Dennis Zhou Sounds useful and cheap, so why not, I guess. > --- > fs/proc/meminfo.c | 2 ++ > include/linux/percpu.h | 2 ++ > mm/percpu.c | 29 +++++++++++++++++++++++++++++ Documentation/filesystems/proc.txt should be updated as well > 3 files changed, 33 insertions(+) > > diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c > index 2fb04846ed11..ddd5249692e9 100644 > --- a/fs/proc/meminfo.c > +++ b/fs/proc/meminfo.c > @@ -7,6 +7,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -121,6 +122,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v) > (unsigned long)VMALLOC_TOTAL >> 10); > show_val_kb(m, "VmallocUsed: ", 0ul); > show_val_kb(m, "VmallocChunk: ", 0ul); > + show_val_kb(m, "PercpuPopulated:", pcpu_nr_populated_pages()); > > #ifdef CONFIG_MEMORY_FAILURE > seq_printf(m, "HardwareCorrupted: %5lu kB\n", > diff --git a/include/linux/percpu.h b/include/linux/percpu.h > index 296bbe49d5d1..1c80be42822c 100644 > --- a/include/linux/percpu.h > +++ b/include/linux/percpu.h > @@ -149,4 +149,6 @@ extern phys_addr_t per_cpu_ptr_to_phys(void *addr); > (typeof(type) __percpu *)__alloc_percpu(sizeof(type), \ > __alignof__(type)) > > +extern int pcpu_nr_populated_pages(void); > + > #endif /* __LINUX_PERCPU_H */ > diff --git a/mm/percpu.c b/mm/percpu.c > index 0b6480979ac7..08a4341f30c5 100644 > --- a/mm/percpu.c > +++ b/mm/percpu.c > @@ -169,6 +169,14 @@ static LIST_HEAD(pcpu_map_extend_chunks); > */ > int pcpu_nr_empty_pop_pages; > > +/* > + * The number of populated pages in use by the allocator, protected by > + * pcpu_lock. This number is kept per a unit per chunk (i.e. when a page gets > + * allocated/deallocated, it is allocated/deallocated in all units of a chunk > + * and increments/decrements this count by 1). > + */ > +static int pcpu_nr_populated; It better be unsigned long, to match others. > + > /* > * Balance work is used to populate or destroy chunks asynchronously. We > * try to keep the number of populated free pages between > @@ -1232,6 +1240,7 @@ static void pcpu_chunk_populated(struct pcpu_chunk *chunk, int page_start, > > bitmap_set(chunk->populated, page_start, nr); > chunk->nr_populated += nr; > + pcpu_nr_populated += nr; > > if (!for_alloc) { > chunk->nr_empty_pop_pages += nr; > @@ -1260,6 +1269,7 @@ static void pcpu_chunk_depopulated(struct pcpu_chunk *chunk, > chunk->nr_populated -= nr; > chunk->nr_empty_pop_pages -= nr; > pcpu_nr_empty_pop_pages -= nr; > + pcpu_nr_populated -= nr; > } > > /* > @@ -2176,6 +2186,9 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, > pcpu_nr_empty_pop_pages = pcpu_first_chunk->nr_empty_pop_pages; > pcpu_chunk_relocate(pcpu_first_chunk, -1); > > + /* include all regions of the first chunk */ > + pcpu_nr_populated += PFN_DOWN(size_sum); > + > pcpu_stats_chunk_alloc(); > trace_percpu_create_chunk(base_addr); > > @@ -2745,6 +2758,22 @@ void __init setup_per_cpu_areas(void) > > #endif /* CONFIG_SMP */ > > +/* > + * pcpu_nr_populated_pages - calculate total number of populated backing pages > + * > + * This reflects the number of pages populated to back the chunks. > + * Metadata is excluded in the number exposed in meminfo as the number of > + * backing pages scales with the number of cpus and can quickly outweigh the > + * memory used for metadata. It also keeps this calculation nice and simple. > + * > + * RETURNS: > + * Total number of populated backing pages in use by the allocator. > + */ > +int pcpu_nr_populated_pages(void) Also unsigned long please. Thanks, Vlastimil > +{ > + return pcpu_nr_populated * pcpu_nr_units; > +} > + > /* > * Percpu allocator is initialized early during boot when neither slab or > * workqueue is available. Plug async management until everything is up >