From nobody Sat Jun 20 01:57:30 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8998DC433EF for ; Thu, 24 Mar 2022 09:24:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349208AbiCXJZz (ORCPT ); Thu, 24 Mar 2022 05:25:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37402 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232772AbiCXJZx (ORCPT ); Thu, 24 Mar 2022 05:25:53 -0400 Received: from SHSQR01.spreadtrum.com (unknown [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 049DE6A077 for ; Thu, 24 Mar 2022 02:24:08 -0700 (PDT) Received: from SHSend.spreadtrum.com (bjmbx01.spreadtrum.com [10.0.64.7]) by SHSQR01.spreadtrum.com with ESMTPS id 22O9MgKw031135 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO); Thu, 24 Mar 2022 17:22:43 +0800 (CST) (envelope-from zhaoyang.huang@unisoc.com) Received: from bj03382pcu.spreadtrum.com (10.0.74.65) by BJMBX01.spreadtrum.com (10.0.64.7) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 24 Mar 2022 17:22:43 +0800 From: "zhaoyang.huang" To: Andrew Morton , Johannes Weiner , Michal Hocko , Vladimir Davydov , ke wang , Zhaoyang Huang , , , Subject: [RFC PATCH] cgroup: introduce proportional protection on memcg Date: Thu, 24 Mar 2022 17:22:23 +0800 Message-ID: <1648113743-32622-1-git-send-email-zhaoyang.huang@unisoc.com> X-Mailer: git-send-email 1.9.1 MIME-Version: 1.0 X-Originating-IP: [10.0.74.65] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To BJMBX01.spreadtrum.com (10.0.64.7) X-MAIL: SHSQR01.spreadtrum.com 22O9MgKw031135 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Zhaoyang Huang current memcg protection via min,low,high asks for an evaluation of protected entity, which could be hard for some system. Furthermore, the usa= ge could also be various under different scenarios(imagin keep protecting 50M = when usage change from 100M to 300M), which make the protection less meaning. So we introduce the proportional protection over memcg's ever highest usage(watermark) to overcome above constraints. Signed-off-by: Zhaoyang Huang --- include/linux/page_counter.h | 3 +++ mm/memcontrol.c | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/include/linux/page_counter.h b/include/linux/page_counter.h index 6795913..7762629 100644 --- a/include/linux/page_counter.h +++ b/include/linux/page_counter.h @@ -27,6 +27,9 @@ struct page_counter { unsigned long watermark; unsigned long failcnt; =20 + /* proportional protection */ + unsigned long min_prop; + unsigned long low_prop; /* * 'parent' is placed here to be far from 'usage' to reduce * cache false sharing, as 'usage' is written mostly while diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 508bcea..937c6ce 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -6616,6 +6616,7 @@ void mem_cgroup_calculate_protection(struct mem_cgrou= p *root, { unsigned long usage, parent_usage; struct mem_cgroup *parent; + unsigned long memcg_emin, memcg_elow, parent_emin, parent_elow; =20 if (mem_cgroup_disabled()) return; @@ -6650,14 +6651,22 @@ void mem_cgroup_calculate_protection(struct mem_cgr= oup *root, =20 parent_usage =3D page_counter_read(&parent->memory); =20 + /* use proportional protect first and take 1024 as 100% */ + memcg_emin =3D READ_ONCE(memcg->memory.min_prop) ? + READ_ONCE(memcg->memory.min_prop) * READ_ONCE(memcg->memory.watermark) /= 1024 : READ_ONCE(memcg->memory.min); + memcg_elow =3D READ_ONCE(memcg->memory.low_prop) ? + READ_ONCE(memcg->memory.low_prop) * READ_ONCE(memcg->memory.watermark) /= 1024 : READ_ONCE(memcg->memory.low); + parent_emin =3D READ_ONCE(parent->memory.min_prop) ? + READ_ONCE(parent->memory.min_prop) * READ_ONCE(parent->memory.watermark)= / 1024 : READ_ONCE(parent->memory.emin); + parent_elow =3D READ_ONCE(parent->memory.low_prop) ? + READ_ONCE(parent->memory.low_prop) * READ_ONCE(parent->memory.watermark)= / 1024 : READ_ONCE(parent->memory.elow); + WRITE_ONCE(memcg->memory.emin, effective_protection(usage, parent_usage, - READ_ONCE(memcg->memory.min), - READ_ONCE(parent->memory.emin), + memcg_emin, parent_emin, atomic_long_read(&parent->memory.children_min_usage))); =20 WRITE_ONCE(memcg->memory.elow, effective_protection(usage, parent_usage, - READ_ONCE(memcg->memory.low), - READ_ONCE(parent->memory.elow), + memcg_elow, parent_elow, atomic_long_read(&parent->memory.children_low_usage))); } =20 --=20 1.9.1