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 538AAC3ABBC for ; Tue, 6 May 2025 22:56:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 93C5D6B008C; Tue, 6 May 2025 18:56:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8C4106B0092; Tue, 6 May 2025 18:56:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 78CAE6B0093; Tue, 6 May 2025 18:56:00 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 58C816B008C for ; Tue, 6 May 2025 18:56:00 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 1BC37C0110 for ; Tue, 6 May 2025 22:56:01 +0000 (UTC) X-FDA: 83413992522.27.9EE8BB7 Received: from out-181.mta0.migadu.com (out-181.mta0.migadu.com [91.218.175.181]) by imf07.hostedemail.com (Postfix) with ESMTP id 6E35640006 for ; Tue, 6 May 2025 22:55:59 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=iSjtP7kZ; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf07.hostedemail.com: domain of shakeel.butt@linux.dev designates 91.218.175.181 as permitted sender) smtp.mailfrom=shakeel.butt@linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1746572159; a=rsa-sha256; cv=none; b=Nz8egzR406+LJOsxKu0PO60JQMyDUOT0Hy+pnyMTpwfYCQfKkCl2svyatffKh+0jv1/QPZ qLWKpDGV5QTVbXzqF015YS3lLCUfN/1KEnl17iEJTm76CH0zVJcCfhw4sNas+hEWzTLW6m hHVYKG+knn90xneWLukuXHQqTjJTjuQ= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=iSjtP7kZ; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf07.hostedemail.com: domain of shakeel.butt@linux.dev designates 91.218.175.181 as permitted sender) smtp.mailfrom=shakeel.butt@linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1746572159; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=j+q7Zfy+PEXSZi9n40T4a1BJaXa9SzRLJNKzWtXA3xc=; b=P2R/0APjmRxTQEhLc0hRU5Ba2PP3f5Xngtqfbr2BRX6YjV9aWGiJJKGqWVvEHx33VJMVqF qYj05DehnAa/WoomYtN5+Kd+gdcnhyCGu/PEii5u2i6daXfsbsRTb4q0Fpa47m9Gb3xdwX wbaufPOLAOl6+caP8ReWHsVcW6OYF64= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1746572157; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=j+q7Zfy+PEXSZi9n40T4a1BJaXa9SzRLJNKzWtXA3xc=; b=iSjtP7kZmALU52Zfo7EVlqEX0JO2Oj2pl4FpW9j/rJu6q6ZogQsaII5F4yOR+xPnStVBow Do6Xap5yivv1BYV9ZPq5gQU1UcSsj9p3rNtvl9Ze+LY/iy4fYdceo216vtENZt0fHMHMri UIDbkO9EGdVSYdZhnYFnvchYBg5RGg8= From: Shakeel Butt To: Andrew Morton Cc: Johannes Weiner , Michal Hocko , Roman Gushchin , Muchun Song , Alexei Starovoitov , Vlastimil Babka , Sebastian Andrzej Siewior , Jakub Kicinski , Eric Dumazet , linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, netdev@vger.kernel.org, Meta kernel team Subject: [PATCH 1/4] memcg: simplify consume_stock Date: Tue, 6 May 2025 15:55:30 -0700 Message-ID: <20250506225533.2580386-2-shakeel.butt@linux.dev> In-Reply-To: <20250506225533.2580386-1-shakeel.butt@linux.dev> References: <20250506225533.2580386-1-shakeel.butt@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Rspamd-Queue-Id: 6E35640006 X-Rspam-User: X-Rspamd-Server: rspam07 X-Stat-Signature: e1iu7sm8sdpff45f8reno5nkpco77pft X-HE-Tag: 1746572159-845718 X-HE-Meta: U2FsdGVkX1+zwerpntRN7iuAXd706cf3Hwb7Zyamo/pmW2llmfX2Dhrz9x/1BQuUoEBvZmdCmu7l+frvqt0nK6pStGWwkz8tkU0s8iErx8EhXsdTjc4OHF6SCMR24W39IgNGVOygGOXFtTfS89lqK0RKDSrJt4vHAN3x/jPHdSBg3RITHQpbkidE2hIRWbgtVnvTZ7WSK+HGW1ySom6DRj6c/ni9kKFHHACk6tg5g9+v67mCqDWikid6FwPGXd1JUCsi7aeCYr9oESnwtGGA9FLgfSwQluKyNm5w1SXeN4N/wXvg+iS6Kra4x/j1ibmSALIBnF4e0t0p9ygaXYktbUkV4JoDygjNzB86ljmNDxbSHLuEZGX+Sacx5b3zQSAzXDVDr4b+Reba794zDzq/DatWI4aqUxIkfTAeNv6auI4NsmP/1h2b+dVU4+4cl/s2lIOt4zO3qP1uQ/yBH/GRwiTp7v9qvdrUa4gpwzH/h0RzV7dnrZh9Nsl2RdBCvMaq9QeGvnPcdStJ8Cl0EI8ZW3P8kY0DdLK8VJaETFRYSyyunzHo1yTDIP12zRUkr8s270y+wm32n4Ba0Yg7zLaXWQ+Gp8lRsxzy8Gg9A6fa6fbHog7k4j9uoaJ8Tkx05n2tieUbmSmfxJGBLre53a45SKsxy1Ct2dJKrLYR4ALfAAjScbjcj7qaUkN/0KgvaK2eKQ6c5Zd1znm+hMc0CbI0NNSc8AbnAvgzLT7Wv1SguI1sl4GjNdMaSavEAmQCO69Z5ZnxPqfBXxbyeps+rBzllkK9/wUSUvzuCZVo28iXdE/AYwiAPqVbQSNBfqy2XjP2oxaVBixngBXqTnjzAV9XZ+cTm4mOp9dH4MH0oF2hK1ZFys3UrZHX3pkl2WPPrcEVhmk9C5cMNfe5cXD9CJ/1WFAVqww1DgsC3GDdHtW60jVNx82kp5y0J6fylv4aJKQ0VM+nHnMc+LyEpvi1gft 5Orq2y11 xR80CJsjmafxmGjxTxn39JV1sJWL5so4e0N80JPUs0L6rYJrn8V/IGyD53ax/pidvSGS0JTw4aIbIbb1BkL/OMuF8R70ZkF45iS4jPafzEPN6RJrtJrba0Hgv5ZAoffzE1kCsSA3KfMWWgtH6iTDRHooKqiiPsrH6GZOmKupphdRy0VL//E183dH37doRX/nA0DQbPB3pEMcfkI9rI3M3N1dUZAAciFx0cMUX 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: List-Subscribe: List-Unsubscribe: The consume_stock() does not need to check gfp_mask for spinning and can simply trylock the local lock to decide to proceed or fail. No need to spin at all for local lock. One of the concern raised was that on PREEMPT_RT kernels, this trylock can fail more often due to tasks having lock_lock can be preempted. This can potentially cause the task which have preempted the task having the local_lock to take the slow path of memcg charging. However this behavior will only impact the performance if memcg charging slowpath is worse than two context switches and possibly scheduling delay behavior of current code. From the network intensive workload experiment it does not seem like the case. We ran varying number of netperf clients in different cgroups on a 72 CPU machine for PREEMPT_RT config. $ netserver -6 $ netperf -6 -H ::1 -l 60 -t TCP_SENDFILE -- -m 10K number of clients | Without series | With series 6 | 38559.1 Mbps | 38652.6 Mbps 12 | 37388.8 Mbps | 37560.1 Mbps 18 | 30707.5 Mbps | 31378.3 Mbps 24 | 25908.4 Mbps | 26423.9 Mbps 30 | 22347.7 Mbps | 22326.5 Mbps 36 | 20235.1 Mbps | 20165.0 Mbps We don't see any significant performance difference for the network intensive workload with this series. Signed-off-by: Shakeel Butt --- mm/memcontrol.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index c44124ea3d08..7561e12ca0e0 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1808,16 +1808,14 @@ static bool obj_stock_flush_required(struct memcg_stock_pcp *stock, * consume_stock: Try to consume stocked charge on this cpu. * @memcg: memcg to consume from. * @nr_pages: how many pages to charge. - * @gfp_mask: allocation mask. * - * The charges will only happen if @memcg matches the current cpu's memcg - * stock, and at least @nr_pages are available in that stock. Failure to - * service an allocation will refill the stock. + * Consume the cached charge if enough nr_pages are present otherwise return + * failure. Also return failure for charge request larger than + * MEMCG_CHARGE_BATCH or if the local lock is already taken. * * returns true if successful, false otherwise. */ -static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages, - gfp_t gfp_mask) +static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages) { struct memcg_stock_pcp *stock; uint8_t stock_pages; @@ -1825,12 +1823,8 @@ static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages, bool ret = false; int i; - if (nr_pages > MEMCG_CHARGE_BATCH) - return ret; - - if (gfpflags_allow_spinning(gfp_mask)) - local_lock_irqsave(&memcg_stock.stock_lock, flags); - else if (!local_trylock_irqsave(&memcg_stock.stock_lock, flags)) + if (nr_pages > MEMCG_CHARGE_BATCH || + !local_trylock_irqsave(&memcg_stock.stock_lock, flags)) return ret; stock = this_cpu_ptr(&memcg_stock); @@ -2333,7 +2327,7 @@ static int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, unsigned long pflags; retry: - if (consume_stock(memcg, nr_pages, gfp_mask)) + if (consume_stock(memcg, nr_pages)) return 0; if (!gfpflags_allow_spinning(gfp_mask)) -- 2.47.1