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 683CCC433F5 for ; Mon, 20 Dec 2021 08:59:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F08CF6B0080; Mon, 20 Dec 2021 03:59:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id EB8EF6B0081; Mon, 20 Dec 2021 03:59:36 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D81ED6B0088; Mon, 20 Dec 2021 03:59:36 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id C75726B0080 for ; Mon, 20 Dec 2021 03:59:36 -0500 (EST) Received: from smtpin15.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 83E3889088 for ; Mon, 20 Dec 2021 08:59:36 +0000 (UTC) X-FDA: 78937574352.15.95FA65C Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) by imf08.hostedemail.com (Postfix) with ESMTP id 4F798160043 for ; Mon, 20 Dec 2021 08:59:30 +0000 (UTC) Received: by mail-pj1-f52.google.com with SMTP id z9-20020a17090a7b8900b001b13558eadaso10543397pjc.4 for ; Mon, 20 Dec 2021 00:59:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yE80mqiok0lBzQsvKCygl5SYuh3BGa/YlTAclAjawz8=; b=5QnugMkys/poSZA1IKOgp4SijtJnmKugtOMzsBN9jYA+6Z0EpInS6OEOwjGpZE9lm6 Cd3DzkWRKCqOuKYxI7ctrrljdBKxyWZTzRrvB8lXiPPb+fF9vcLMS1hGuUC8LHccbdro 7zgZpkH2DAeWVENROfQjmtPTQ1HWwo0PQ0gBkIiidfqFmhCldj5HNSKTEG8VpkEz282a j9Amvh0kck1RfVZmMZKMuEDghBgFc/GTQkYI8jhoQSXb8D5hO2/ioZ+oCcZJ5mahJdP+ 0S9pDuxt/0SVZSQVPu98eZ/laGtc7YHS+GnfW3n2s1e5eN9HlzEcLEDiz7OE9BdlFPWP mEkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yE80mqiok0lBzQsvKCygl5SYuh3BGa/YlTAclAjawz8=; b=rzBzkDbs8wbjVSqR8stwIG9orwQVpsa3/hle+XStJA6+FYzVToH+10fYeDVz8bQpGQ EYXU/y/Nr7dg41dDxR39WX0oWFVSQ6qvh9pg+g7gKsOlYK/5rK/JK5Ud9N2K3nOEOA3L N5mA0dudU0AkOn/ecRg6dkv60Ior5axcVR8lLUs10lj9NnI40Nosa1rySm7rxHhglhvf gd8K1MM/iVtt87nT3Xvgnucgkdr3WHSRxn8wiKLuFSeGU6Z9mjdaWyDXpUZJuuwCzfCG 8K62Sdu+CXpqKnXwKnmobjMkv5bYNF9J2U7lIjCy27U+RZm6zrrxwyqV+UIuV3xTqoKa txxA== X-Gm-Message-State: AOAM530iPdSEVdrkaxdkFIe6OS8rHhzYRU8WKmbug3GzzIW69zthpoPC 6OMn5TlS795KMaomi11JGMxp8Q== X-Google-Smtp-Source: ABdhPJxfH0Ud5oQiLWFf+MqrfeoLK9vxT10TK2i7+PWqU8pkkWY7mGtNkvu1INqXv62BdWiuWM9qYw== X-Received: by 2002:a17:90a:9907:: with SMTP id b7mr27395923pjp.137.1639990775170; Mon, 20 Dec 2021 00:59:35 -0800 (PST) Received: from localhost.localdomain ([61.120.150.70]) by smtp.gmail.com with ESMTPSA id m11sm18441647pfk.27.2021.12.20.00.59.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Dec 2021 00:59:34 -0800 (PST) From: Muchun Song To: willy@infradead.org, akpm@linux-foundation.org, hannes@cmpxchg.org, mhocko@kernel.org, vdavydov.dev@gmail.com, shakeelb@google.com, guro@fb.com, shy828301@gmail.com, alexs@kernel.org, richard.weiyang@gmail.com, david@fromorbit.com, trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, jaegeuk@kernel.org, chao@kernel.org, kari.argillander@gmail.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-nfs@vger.kernel.org, zhengqi.arch@bytedance.com, duanxiongchun@bytedance.com, fam.zheng@bytedance.com, smuchun@gmail.com, Muchun Song Subject: [PATCH v5 13/16] mm: memcontrol: reuse memory cgroup ID for kmem ID Date: Mon, 20 Dec 2021 16:56:46 +0800 Message-Id: <20211220085649.8196-14-songmuchun@bytedance.com> X-Mailer: git-send-email 2.21.0 (Apple Git-122) In-Reply-To: <20211220085649.8196-1-songmuchun@bytedance.com> References: <20211220085649.8196-1-songmuchun@bytedance.com> MIME-Version: 1.0 X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 4F798160043 X-Stat-Signature: 5irjeudp6e8b3wd4dxqik8b3wrom3uqy Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=bytedance-com.20210112.gappssmtp.com header.s=20210112 header.b=5QnugMky; spf=pass (imf08.hostedemail.com: domain of songmuchun@bytedance.com designates 209.85.216.52 as permitted sender) smtp.mailfrom=songmuchun@bytedance.com; dmarc=pass (policy=none) header.from=bytedance.com X-HE-Tag: 1639990770-726734 Content-Transfer-Encoding: quoted-printable 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: There are two idrs being used by memory cgroup, one is for kmem ID, another is for memory cgroup ID. The maximum ID of both is 64Ki. Both of them can limit the total number of memory cgroups. Actually, we can reuse memory cgroup ID for kmem ID to simplify the code. Signed-off-by: Muchun Song --- include/linux/memcontrol.h | 1 + mm/memcontrol.c | 46 ++++++++--------------------------------= ------ 2 files changed, 9 insertions(+), 38 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 3fc437162add..7b472f805d77 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -56,6 +56,7 @@ struct mem_cgroup_reclaim_cookie { #ifdef CONFIG_MEMCG =20 #define MEM_CGROUP_ID_SHIFT 16 +#define MEM_CGROUP_ID_MIN 1 #define MEM_CGROUP_ID_MAX USHRT_MAX =20 struct mem_cgroup_id { diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 28d6d2564f9d..04f75055f518 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -348,23 +348,6 @@ static void memcg_reparent_objcgs(struct mem_cgroup = *memcg, } =20 /* - * This will be used as a shrinker list's index. - * The main reason for not using cgroup id for this: - * this works better in sparse environments, where we have a lot of mem= cgs, - * but only a few kmem-limited. - */ -static DEFINE_IDA(memcg_cache_ida); - -/* - * MAX_SIZE should be as large as the number of cgrp_ids. Ideally, we co= uld get - * this constant directly from cgroup, but it is understandable that thi= s is - * better kept as an internal representation in cgroup.c. In any case, t= he - * cgrp_id space is not getting any smaller, and we don't have to necess= arily - * increase ours as well if it increases. - */ -#define MEMCG_CACHES_MAX_SIZE MEM_CGROUP_ID_MAX - -/* * A lot of the calls to the cache allocation functions are expected to = be * inlined by the compiler. Since the calls to memcg_slab_pre_alloc_hook= () are * conditional to this static branch, we'll have to allow modules that d= oes @@ -3528,10 +3511,12 @@ static u64 mem_cgroup_read_u64(struct cgroup_subs= ys_state *css, } =20 #ifdef CONFIG_MEMCG_KMEM +#define MEM_CGROUP_KMEM_ID_MIN -1 +#define MEM_CGROUP_ID_DIFF (MEM_CGROUP_ID_MIN - MEM_CGROUP_KMEM_ID_MIN) + static int memcg_online_kmem(struct mem_cgroup *memcg) { struct obj_cgroup *objcg; - int memcg_id; =20 if (cgroup_memory_nokmem) return 0; @@ -3539,22 +3524,16 @@ static int memcg_online_kmem(struct mem_cgroup *m= emcg) if (unlikely(mem_cgroup_is_root(memcg))) return 0; =20 - memcg_id =3D ida_alloc_max(&memcg_cache_ida, MEMCG_CACHES_MAX_SIZE - 1, - GFP_KERNEL); - if (memcg_id < 0) - return memcg_id; - objcg =3D obj_cgroup_alloc(); - if (!objcg) { - ida_free(&memcg_cache_ida, memcg_id); + if (!objcg) return -ENOMEM; - } + objcg->memcg =3D memcg; rcu_assign_pointer(memcg->objcg, objcg); =20 static_branch_enable(&memcg_kmem_enabled_key); =20 - memcg->kmemcg_id =3D memcg_id; + memcg->kmemcg_id =3D memcg->id.id - MEM_CGROUP_ID_DIFF; =20 return 0; } @@ -3562,7 +3541,6 @@ static int memcg_online_kmem(struct mem_cgroup *mem= cg) static void memcg_offline_kmem(struct mem_cgroup *memcg) { struct mem_cgroup *parent; - int kmemcg_id; =20 if (cgroup_memory_nokmem) return; @@ -3577,20 +3555,12 @@ static void memcg_offline_kmem(struct mem_cgroup = *memcg) memcg_reparent_objcgs(memcg, parent); =20 /* - * memcg_reparent_list_lrus() can change memcg->kmemcg_id. - * Cache it to local @kmemcg_id. - */ - kmemcg_id =3D memcg->kmemcg_id; - - /* * After we have finished memcg_reparent_objcgs(), all list_lrus * corresponding to this cgroup are guaranteed to remain empty. * The ordering is imposed by list_lru_node->lock taken by * memcg_reparent_list_lrus(). */ memcg_reparent_list_lrus(memcg, parent); - - ida_free(&memcg_cache_ida, kmemcg_id); } #else static int memcg_online_kmem(struct mem_cgroup *memcg) @@ -5043,7 +5013,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void) return ERR_PTR(error); =20 memcg->id.id =3D idr_alloc(&mem_cgroup_idr, NULL, - 1, MEM_CGROUP_ID_MAX, + MEM_CGROUP_ID_MIN, MEM_CGROUP_ID_MAX, GFP_KERNEL); if (memcg->id.id < 0) { error =3D memcg->id.id; @@ -5071,7 +5041,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void) spin_lock_init(&memcg->event_list_lock); memcg->socket_pressure =3D jiffies; #ifdef CONFIG_MEMCG_KMEM - memcg->kmemcg_id =3D -1; + memcg->kmemcg_id =3D MEM_CGROUP_KMEM_ID_MIN; INIT_LIST_HEAD(&memcg->objcg_list); #endif #ifdef CONFIG_CGROUP_WRITEBACK --=20 2.11.0