From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 871F7E75452 for ; Tue, 3 Oct 2023 11:50:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 249BE8D0068; Tue, 3 Oct 2023 07:50:08 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1F9AF8D0003; Tue, 3 Oct 2023 07:50:08 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0C2118D0068; Tue, 3 Oct 2023 07:50:08 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id F0D7D8D0003 for ; Tue, 3 Oct 2023 07:50:07 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id A5A161402BD for ; Tue, 3 Oct 2023 11:50:07 +0000 (UTC) X-FDA: 81303981654.07.372CAC4 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by imf29.hostedemail.com (Postfix) with ESMTP id C0B0612001E for ; Tue, 3 Oct 2023 11:50:04 +0000 (UTC) Authentication-Results: imf29.hostedemail.com; dkim=pass header.d=suse.com header.s=susede1 header.b=lG3T7cPF; spf=pass (imf29.hostedemail.com: domain of mhocko@suse.com designates 195.135.220.29 as permitted sender) smtp.mailfrom=mhocko@suse.com; dmarc=pass (policy=quarantine) header.from=suse.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1696333805; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=qfhBTjtqZ1w+rEZSeLMsz30Wmz7KFxJaJmOo6kihjq8=; b=auu27O6asCnPgX/gcTkfCAEr7+/U22hQAn0+w/eexsF7E9bpt6AKpr9BvnbndtYzlwHcbt YgEezftMlhuR8zEBynI4IhTZj7oDLRl1fkerhzxPgFiLjfqRVf4X0W+xzgYnvP4Y9N5JpR rB7O0/hDZw/Nv/u9mlIx1BFMPTLoZYg= ARC-Authentication-Results: i=1; imf29.hostedemail.com; dkim=pass header.d=suse.com header.s=susede1 header.b=lG3T7cPF; spf=pass (imf29.hostedemail.com: domain of mhocko@suse.com designates 195.135.220.29 as permitted sender) smtp.mailfrom=mhocko@suse.com; dmarc=pass (policy=quarantine) header.from=suse.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1696333805; a=rsa-sha256; cv=none; b=BLjnlTpXtspWQwZ22BICIjotgcIxCpemOuDyMKwm9EGpdR3h3EtB0gr1i/8hEqbDnzZnKE cgKRNO1nzdJx3kHXd0n1xnIoT2CrXYfd14i2lY/bVNcStE5MjqoSCCibzUxRpJeqhGy8nx bSSrfFBy0pEaUy7VntgDBvHu/j5JrJI= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 7ED931F893; Tue, 3 Oct 2023 11:50:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1696333802; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=qfhBTjtqZ1w+rEZSeLMsz30Wmz7KFxJaJmOo6kihjq8=; b=lG3T7cPF94enFMo7dJXXGhFEIumBrGIKh1kJNwPUkk2GvNjZFgO2dFLZQ2FZFgK07D07D9 1wT7sIzJH7pMG4V6Ln7ip2CHtX484aS6dnTElPoScUbd7bZgwBLpJzsvae5BpDjNLVVA/q SSxDF9kaw2+Kmf/KSVPpF6CFUgkMWxI= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 4ED2F139F9; Tue, 3 Oct 2023 11:50:02 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id +Ii9Eur/G2V0CgAAMHmgww (envelope-from ); Tue, 03 Oct 2023 11:50:02 +0000 Date: Tue, 3 Oct 2023 13:50:01 +0200 From: Michal Hocko To: Nhat Pham Cc: akpm@linux-foundation.org, riel@surriel.com, hannes@cmpxchg.org, roman.gushchin@linux.dev, shakeelb@google.com, muchun.song@linux.dev, tj@kernel.org, lizefan.x@bytedance.com, shuah@kernel.org, mike.kravetz@oracle.com, yosryahmed@google.com, fvdl@google.com, linux-mm@kvack.org, kernel-team@meta.com, linux-kernel@vger.kernel.org, cgroups@vger.kernel.org Subject: Re: [PATCH v3 1/3] memcontrol: add helpers for hugetlb memcg accounting Message-ID: References: <20231003001828.2554080-1-nphamcs@gmail.com> <20231003001828.2554080-2-nphamcs@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20231003001828.2554080-2-nphamcs@gmail.com> X-Rspamd-Queue-Id: C0B0612001E X-Rspam-User: X-Stat-Signature: qi9qxggicfnc6murpg6jf3iqe4suqp18 X-Rspamd-Server: rspam01 X-HE-Tag: 1696333804-405859 X-HE-Meta: U2FsdGVkX19OHxL0n2w2ejSXxhXIwSSLONW7kFpH+/G4WoXE8rC/YH5yggZgtcGd1I81Yfz/1I3S89wjaKJZ6IcgSMYwkODP5GVz/2T3fkr8farFU0TQFqxREfH6XKfdEdQUrPq/xPNFSvzUry9vVcjLGASqeLtJ8TVDXgb9jfBAaMP8TnLued84WzuZJ9/NGoPuYsey64LbfYsLqibHznjcWX2w+jXpKubqbqT0FhwbHWvzcxuXTT08XTUFMbvy8QJOYErxDj0AinTegz1eqs44u9yVlU7lr0KftI7WscNCXvfkaE0eeeqMfCRw81pvnwRaLWb4wPslMgc5liGKaZf/xoUarD2YmbqiKO43cjHOCf/CvafPWXKBLZ2zQOrYf3eqilXGFWDhqGKkESQYiE/TEGg9/FIBw+tmd/vFH+dIHjC4Snu521Qjazl9gPBOc+8vXgmJd7PQZ3VA26PSVbRjq+lJK4K0Xq1+WFw+q2gPZ4kf0GnP2XrR17GeqW85Kbj0KskigqnBJ1ZSk8smtd6PXnoZNZrpnKuY+LNspVZ55jw9vFPlQ6m2lA2+4U0NmsdjCgpaV3Pa+52X650CzMcIKZa4fkjGkKAkmJfw7Q86zxSdULG6CM6qd8Whh17m7SwxCMp1yRySEqv12nu4flSsWezo+/4ZRa2j/IfvEUKBBAQh3g5JHlXejzHe5btauWzGFyZMyHNHZ3p21AhLdGeJwCVSW6F0UTUFLuCuGZWk/SzATatWkaa9BuDU4AovSqNloL598KqVBunPDzMpoAnKgkzNl8MGGzR6/0Tj/7tbOZcWU1Ua8GrTPGwFp7eChkiHKZYK86smuFDbWNpu6fpxc1IHs3AGvgyXjeAm3PPKuSqETBf5kJd9VfQUwR2O6SDB+rvlPIt/tsKk9PhEHoNBVMMF1EvEIyyorJSDkGprBTfdicxIzJOMJ5t6mD50ecn1FukJyyTP8h9++r6 rsFTrzHW ALbFSQ8D8nEg8zIUxT1ph8eiz3E0cxoiAWUiYaR6GRcUpNSI/10hMjfHV0MHRv2H3ARxtSP92U/VBCIWuNg4Z2soZj2ukWgyIabzxOI35X7TN/PF1BQFMRTBR0CHTIR856mfO+v5Nmx5cmo2qweHzrU5Usergrt3YJEDOoB2c6mifrKIBW+xoemHjbJmfLaLS234NJLWId46A7/Fa/PkA/9dSGx6+bQlfCagoRkh6aOihCxM= 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: On Mon 02-10-23 17:18:26, Nhat Pham wrote: > This patch exposes charge committing and cancelling as parts of the > memory controller interface. These functionalities are useful when the > try_charge() and commit_charge() stages have to be separated by other > actions in between (which can fail). One such example is the new hugetlb > accounting behavior in the following patch. > > The patch also adds a helper function to obtain a reference to the > current task's memcg. > > Signed-off-by: Nhat Pham OK, makes sense. Acked-by: Michal Hocko Usually we prefer to have newly introduced functions along with their users but I do understand that this split just makes it easier to review the main patch for the feature. > --- > include/linux/memcontrol.h | 21 ++++++++++++++ > mm/memcontrol.c | 59 ++++++++++++++++++++++++++++++-------- > 2 files changed, 68 insertions(+), 12 deletions(-) > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h > index e0cfab58ab71..42bf7e9b1a2f 100644 > --- a/include/linux/memcontrol.h > +++ b/include/linux/memcontrol.h > @@ -653,6 +653,8 @@ static inline bool mem_cgroup_below_min(struct mem_cgroup *target, > page_counter_read(&memcg->memory); > } > > +void mem_cgroup_commit_charge(struct folio *folio, struct mem_cgroup *memcg); > + > int __mem_cgroup_charge(struct folio *folio, struct mm_struct *mm, gfp_t gfp); > > /** > @@ -704,6 +706,8 @@ static inline void mem_cgroup_uncharge_list(struct list_head *page_list) > __mem_cgroup_uncharge_list(page_list); > } > > +void mem_cgroup_cancel_charge(struct mem_cgroup *memcg, unsigned int nr_pages); > + > void mem_cgroup_migrate(struct folio *old, struct folio *new); > > /** > @@ -760,6 +764,8 @@ struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); > > struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm); > > +struct mem_cgroup *get_mem_cgroup_from_current(void); > + > struct lruvec *folio_lruvec_lock(struct folio *folio); > struct lruvec *folio_lruvec_lock_irq(struct folio *folio); > struct lruvec *folio_lruvec_lock_irqsave(struct folio *folio, > @@ -1245,6 +1251,11 @@ static inline bool mem_cgroup_below_min(struct mem_cgroup *target, > return false; > } > > +static inline void mem_cgroup_commit_charge(struct folio *folio, > + struct mem_cgroup *memcg) > +{ > +} > + > static inline int mem_cgroup_charge(struct folio *folio, > struct mm_struct *mm, gfp_t gfp) > { > @@ -1269,6 +1280,11 @@ static inline void mem_cgroup_uncharge_list(struct list_head *page_list) > { > } > > +static inline void mem_cgroup_cancel_charge(struct mem_cgroup *memcg, > + unsigned int nr_pages) > +{ > +} > + > static inline void mem_cgroup_migrate(struct folio *old, struct folio *new) > { > } > @@ -1306,6 +1322,11 @@ static inline struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm) > return NULL; > } > > +static inline struct mem_cgroup *get_mem_cgroup_from_current(void) > +{ > + return NULL; > +} > + > static inline > struct mem_cgroup *mem_cgroup_from_css(struct cgroup_subsys_state *css) > { > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index d1a322a75172..0219befeae38 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -1086,6 +1086,27 @@ struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm) > } > EXPORT_SYMBOL(get_mem_cgroup_from_mm); > > +/** > + * get_mem_cgroup_from_current - Obtain a reference on current task's memcg. > + */ > +struct mem_cgroup *get_mem_cgroup_from_current(void) > +{ > + struct mem_cgroup *memcg; > + > + if (mem_cgroup_disabled()) > + return NULL; > + > +again: > + rcu_read_lock(); > + memcg = mem_cgroup_from_task(current); > + if (!css_tryget(&memcg->css)) { > + rcu_read_unlock(); > + goto again; > + } > + rcu_read_unlock(); > + return memcg; > +} > + > static __always_inline bool memcg_kmem_bypass(void) > { > /* Allow remote memcg charging from any context. */ > @@ -2873,7 +2894,12 @@ static inline int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask, > return try_charge_memcg(memcg, gfp_mask, nr_pages); > } > > -static inline void cancel_charge(struct mem_cgroup *memcg, unsigned int nr_pages) > +/** > + * mem_cgroup_cancel_charge() - cancel an uncommitted try_charge() call. > + * @memcg: memcg previously charged. > + * @nr_pages: number of pages previously charged. > + */ > +void mem_cgroup_cancel_charge(struct mem_cgroup *memcg, unsigned int nr_pages) > { > if (mem_cgroup_is_root(memcg)) > return; > @@ -2898,6 +2924,22 @@ static void commit_charge(struct folio *folio, struct mem_cgroup *memcg) > folio->memcg_data = (unsigned long)memcg; > } > > +/** > + * mem_cgroup_commit_charge - commit a previously successful try_charge(). > + * @folio: folio to commit the charge to. > + * @memcg: memcg previously charged. > + */ > +void mem_cgroup_commit_charge(struct folio *folio, struct mem_cgroup *memcg) > +{ > + css_get(&memcg->css); > + commit_charge(folio, memcg); > + > + local_irq_disable(); > + mem_cgroup_charge_statistics(memcg, folio_nr_pages(folio)); > + memcg_check_events(memcg, folio_nid(folio)); > + local_irq_enable(); > +} > + > #ifdef CONFIG_MEMCG_KMEM > /* > * The allocated objcg pointers array is not accounted directly. > @@ -6105,7 +6147,7 @@ static void __mem_cgroup_clear_mc(void) > > /* we must uncharge all the leftover precharges from mc.to */ > if (mc.precharge) { > - cancel_charge(mc.to, mc.precharge); > + mem_cgroup_cancel_charge(mc.to, mc.precharge); > mc.precharge = 0; > } > /* > @@ -6113,7 +6155,7 @@ static void __mem_cgroup_clear_mc(void) > * we must uncharge here. > */ > if (mc.moved_charge) { > - cancel_charge(mc.from, mc.moved_charge); > + mem_cgroup_cancel_charge(mc.from, mc.moved_charge); > mc.moved_charge = 0; > } > /* we must fixup refcnts and charges */ > @@ -7020,20 +7062,13 @@ void mem_cgroup_calculate_protection(struct mem_cgroup *root, > static int charge_memcg(struct folio *folio, struct mem_cgroup *memcg, > gfp_t gfp) > { > - long nr_pages = folio_nr_pages(folio); > int ret; > > - ret = try_charge(memcg, gfp, nr_pages); > + ret = try_charge(memcg, gfp, folio_nr_pages(folio)); > if (ret) > goto out; > > - css_get(&memcg->css); > - commit_charge(folio, memcg); > - > - local_irq_disable(); > - mem_cgroup_charge_statistics(memcg, nr_pages); > - memcg_check_events(memcg, folio_nid(folio)); > - local_irq_enable(); > + mem_cgroup_commit_charge(folio, memcg); > out: > return ret; > } > -- > 2.34.1 -- Michal Hocko SUSE Labs