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 X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4427C433ED for ; Thu, 15 Apr 2021 03:28:24 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 69796611AB for ; Thu, 15 Apr 2021 03:28:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 69796611AB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 08F9F6B0071; Wed, 14 Apr 2021 23:28:24 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 063EE6B0072; Wed, 14 Apr 2021 23:28:23 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DFB4D6B0073; Wed, 14 Apr 2021 23:28:23 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0242.hostedemail.com [216.40.44.242]) by kanga.kvack.org (Postfix) with ESMTP id C23DF6B0071 for ; Wed, 14 Apr 2021 23:28:23 -0400 (EDT) Received: from smtpin35.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 81DBB5DFC for ; Thu, 15 Apr 2021 03:28:23 +0000 (UTC) X-FDA: 78033168486.35.0D5DD37 Received: from mail-qt1-f170.google.com (mail-qt1-f170.google.com [209.85.160.170]) by imf14.hostedemail.com (Postfix) with ESMTP id B9FD5C0007D3 for ; Thu, 15 Apr 2021 03:28:14 +0000 (UTC) Received: by mail-qt1-f170.google.com with SMTP id t11so8620949qtr.8 for ; Wed, 14 Apr 2021 20:28:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=GdhHYsB8bOsa0eVuM5ITMWOP/eGp5o+C93zFwUv80RI=; b=ZX8WWiYfe9ouAFYnUCatkW3kFti2km6xAK/jSGgTiTdTc2K18FI6zAorC7CA5wE2CN +DE70z6Pa/oY35NHF+/pTm51zbCUXPfI6VQT7lEKc8tj7AxIe/hJIBFHIwu7ejtNQ2h/ flyV+dLY/XR9dV8cVrdqZBbqZ+zbO10663BLQo5S32lrGzbJxPIDgr5gD4izz3w6/Mro 31GxQRer8ofsumn6fMeSSqdt90rRYd9Q5lQ3b74aIKYMpXtYIHAc8rO9nN3FfX4rVCXN IOB6DHt+cuKDLRa4vfSTKiPXqgzcZN4HdUYexdmER71oMsDpRviW2rKkSoYLM4wzJr+J TQ/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=GdhHYsB8bOsa0eVuM5ITMWOP/eGp5o+C93zFwUv80RI=; b=Z/ocub9wiw2CBZgRNiPTh8pnz2jROzoAu3mHurLofM0qzs1gQ3ZfrshSUOujDuA2a2 LEhFzlbzJZcgY2lADoj3zgfY2Zt9r4rkFO9bmhZYldcev5AN+rSI/TygGtOHXdCB2ef2 1b7L7k9pJhU6h+xyCotadBajHJhvoxAEDetgIwUm40BH/s03nJRHj5uDl1Qf6oB5hNpH WopenItLHyZbAmO0iOpfLzZhOrn9ggcqqMRPulIG1FjUj6bKSFuxALcM8ckB05K/pyu1 WyPkZi4Ik6P06OsqiFETsPw6EjpSTtuU+bwzrBMp95zyXObuoQsDGQXJ+r2BvbWMnW7r qNUw== X-Gm-Message-State: AOAM531GA3hvGkrTuBkIHr1opZe7u1wFpwHK/Ac2l2PnUm+pvCb37jXe qNepMbA9Gh6Y2ChtL32AfQ== X-Google-Smtp-Source: ABdhPJxrInFbxTRYLpfkrv9pzAfOYzjnKDDtaMpVgvyyk+nMwNbSCG4q4AybbdB5727ZTidhpuqDBw== X-Received: by 2002:ac8:6d0d:: with SMTP id o13mr1191320qtt.267.1618457302451; Wed, 14 Apr 2021 20:28:22 -0700 (PDT) Received: from gabell (209-6-122-159.s2973.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [209.6.122.159]) by smtp.gmail.com with ESMTPSA id r9sm943214qtf.62.2021.04.14.20.28.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Apr 2021 20:28:22 -0700 (PDT) Date: Wed, 14 Apr 2021 23:28:20 -0400 From: Masayoshi Mizuma To: Waiman Long Cc: Johannes Weiner , Michal Hocko , Vladimir Davydov , Andrew Morton , Tejun Heo , Christoph Lameter , Pekka Enberg , David Rientjes , Joonsoo Kim , Vlastimil Babka , Roman Gushchin , linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org, Shakeel Butt , Muchun Song , Alex Shi , Chris Down , Yafang Shao , Wei Yang , Xing Zhengjun Subject: Re: [PATCH v3 4/5] mm/memcg: Separate out object stock data into its own struct Message-ID: <20210415032820.coutviukiyieiysm@gabell> References: <20210414012027.5352-1-longman@redhat.com> <20210414012027.5352-5-longman@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210414012027.5352-5-longman@redhat.com> X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: B9FD5C0007D3 X-Stat-Signature: mkgr13dw95mdhuts93hhx63o8tww3dqx Received-SPF: none (gmail.com>: No applicable sender policy available) receiver=imf14; identity=mailfrom; envelope-from=""; helo=mail-qt1-f170.google.com; client-ip=209.85.160.170 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1618457294-930352 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 Tue, Apr 13, 2021 at 09:20:26PM -0400, Waiman Long wrote: > The object stock data stored in struct memcg_stock_pcp are independent > of the other page based data stored there. Separating them out into > their own struct to highlight the independency. > > Signed-off-by: Waiman Long > Acked-by: Roman Gushchin > Reviewed-by: Shakeel Butt > --- > mm/memcontrol.c | 41 ++++++++++++++++++++++++++--------------- > 1 file changed, 26 insertions(+), 15 deletions(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 539c3b632e47..69f728383efe 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -2214,17 +2214,22 @@ void unlock_page_memcg(struct page *page) > } > EXPORT_SYMBOL(unlock_page_memcg); > > -struct memcg_stock_pcp { > - struct mem_cgroup *cached; /* this never be root cgroup */ > - unsigned int nr_pages; > - > +struct obj_stock { > #ifdef CONFIG_MEMCG_KMEM > struct obj_cgroup *cached_objcg; > struct pglist_data *cached_pgdat; > unsigned int nr_bytes; > int vmstat_idx; > int vmstat_bytes; > +#else > + int dummy[0]; > #endif > +}; > + > +struct memcg_stock_pcp { > + struct mem_cgroup *cached; /* this never be root cgroup */ > + unsigned int nr_pages; > + struct obj_stock obj; > > struct work_struct work; > unsigned long flags; > @@ -2234,12 +2239,12 @@ static DEFINE_PER_CPU(struct memcg_stock_pcp, memcg_stock); > static DEFINE_MUTEX(percpu_charge_mutex); > > #ifdef CONFIG_MEMCG_KMEM > -static void drain_obj_stock(struct memcg_stock_pcp *stock); > +static void drain_obj_stock(struct obj_stock *stock); > static bool obj_stock_flush_required(struct memcg_stock_pcp *stock, > struct mem_cgroup *root_memcg); > > #else > -static inline void drain_obj_stock(struct memcg_stock_pcp *stock) > +static inline void drain_obj_stock(struct obj_stock *stock) > { > } > static bool obj_stock_flush_required(struct memcg_stock_pcp *stock, > @@ -2249,6 +2254,13 @@ static bool obj_stock_flush_required(struct memcg_stock_pcp *stock, > } > #endif > > +static inline struct obj_stock *current_obj_stock(void) > +{ > + struct memcg_stock_pcp *stock = this_cpu_ptr(&memcg_stock); > + > + return &stock->obj; > +} > + > /** > * consume_stock: Try to consume stocked charge on this cpu. > * @memcg: memcg to consume from. > @@ -2315,7 +2327,7 @@ static void drain_local_stock(struct work_struct *dummy) > local_irq_save(flags); > > stock = this_cpu_ptr(&memcg_stock); > - drain_obj_stock(stock); > + drain_obj_stock(&stock->obj); > drain_stock(stock); > clear_bit(FLUSHING_CACHED_CHARGE, &stock->flags); > > @@ -3177,13 +3189,13 @@ static inline void mod_objcg_state(struct obj_cgroup *objcg, > > static bool consume_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes) > { > - struct memcg_stock_pcp *stock; > + struct obj_stock *stock; > unsigned long flags; > bool ret = false; > > local_irq_save(flags); > > - stock = this_cpu_ptr(&memcg_stock); > + stock = current_obj_stock(); > if (objcg == stock->cached_objcg && stock->nr_bytes >= nr_bytes) { > stock->nr_bytes -= nr_bytes; > ret = true; > @@ -3194,7 +3206,7 @@ static bool consume_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes) > return ret; > } > > -static void drain_obj_stock(struct memcg_stock_pcp *stock) > +static void drain_obj_stock(struct obj_stock *stock) > { > struct obj_cgroup *old = stock->cached_objcg; > > @@ -3242,8 +3254,8 @@ static bool obj_stock_flush_required(struct memcg_stock_pcp *stock, > { > struct mem_cgroup *memcg; > > - if (stock->cached_objcg) { > - memcg = obj_cgroup_memcg(stock->cached_objcg); > + if (stock->obj.cached_objcg) { > + memcg = obj_cgroup_memcg(stock->obj.cached_objcg); > if (memcg && mem_cgroup_is_descendant(memcg, root_memcg)) > return true; > } > @@ -3253,9 +3265,8 @@ static bool obj_stock_flush_required(struct memcg_stock_pcp *stock, > > static void __refill_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes) > { > - struct memcg_stock_pcp *stock; > + struct obj_stock *stock = current_obj_stock(); > > - stock = this_cpu_ptr(&memcg_stock); > if (stock->cached_objcg != objcg) { /* reset if necessary */ > drain_obj_stock(stock); > obj_cgroup_get(objcg); > @@ -3280,7 +3291,7 @@ static void refill_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes) > static void __mod_obj_stock_state(struct obj_cgroup *objcg, > struct pglist_data *pgdat, int idx, int nr) > { > - struct memcg_stock_pcp *stock = this_cpu_ptr(&memcg_stock); > + struct obj_stock *stock = current_obj_stock(); > > if (stock->cached_objcg != objcg) { > /* Output the current data as is */ > -- > 2.18.1 > Please feel free to add: Tested-by: Masayoshi Mizuma Thanks! Masa