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 BCD6FC678DB for ; Tue, 7 Mar 2023 08:31:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0A3E06B0072; Tue, 7 Mar 2023 03:31:12 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 052886B0073; Tue, 7 Mar 2023 03:31:12 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E832D6B0074; Tue, 7 Mar 2023 03:31:11 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id D95F46B0072 for ; Tue, 7 Mar 2023 03:31:11 -0500 (EST) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id B0EB21A0CB6 for ; Tue, 7 Mar 2023 08:31:11 +0000 (UTC) X-FDA: 80541432342.18.DA6AED1 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by imf07.hostedemail.com (Postfix) with ESMTP id 73FF140011 for ; Tue, 7 Mar 2023 08:31:08 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf07.hostedemail.com: domain of chenjun102@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=chenjun102@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1678177870; 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: references; bh=QVSQCxg7uB4clDFeOJf9V/12f3MfRqSrcIpe/ZmBDa8=; b=mOf9b/VTtQOJaZ9hT8y/uQ4WXBd+QbWDd8cg/jHbfz0hl0svl+aO0MEUI4XKeLWdQJ6tRs /nUqH29mYYMcCU0gDCl7z3/4qvNc7nrunYQy0zB0iFn8zHa4y2FP+R2FvcOTIVJsQ+FwzH 9HYxyVR5fKnSZR2aMjkWNQsRvPxnEyc= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf07.hostedemail.com: domain of chenjun102@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=chenjun102@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1678177870; a=rsa-sha256; cv=none; b=K3FnTru5Qb166m6upANtlqumZYXZt1RWcNm1JUkjNo3QpwLE+Re3qsVcdYpO3C1vxUjD7B GnT4yrTaw8ggLQ2epEAJfeAWVqZb/3ekroGLz5tnQ6XwSbWQl8qLTaoqT5Sq0VTxmZEXuY TVxRVxD+E2kxrHh6JGgGziBGoFH8MxM= Received: from dggpemm500006.china.huawei.com (unknown [172.30.72.55]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4PW7rq1FCbzKq79; Tue, 7 Mar 2023 16:28:59 +0800 (CST) Received: from mdc.huawei.com (10.175.112.208) by dggpemm500006.china.huawei.com (7.185.36.236) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Tue, 7 Mar 2023 16:31:03 +0800 From: Chen Jun To: , , , , , , , CC: , Subject: [RFC] mm/slub: Reduce memory consumption in extreme scenarios Date: Tue, 7 Mar 2023 08:28:11 +0000 Message-ID: <20230307082811.120774-1-chenjun102@huawei.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.112.208] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To dggpemm500006.china.huawei.com (7.185.36.236) X-CFilter-Loop: Reflected X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 73FF140011 X-Stat-Signature: 6ni9965xwzstkrrt6z91h4wa71ugwjzp X-HE-Tag: 1678177868-236289 X-HE-Meta: U2FsdGVkX18fJqFT1b7iOosh/r6AWwcT1U2VfJdywI24EX28W+SgmXuvwBkRT+rw5tJQB7diPaB9WU6OQo5qbJaPXnLWIM+ZpUJd9U0V0hJwnnzyqVHAg9k1TtZJh7P9xhR0NBMRGjo+VK6bwN+A7Fu251uZprIAxJpaFp0bk5uWYN3LYODuLNIgy4CZ8AQ9gRpm/MJCa8Ht2qdhvHy3E+hFmBBKzpB6Ni2OMxXXJshwG7LuA7QhgeoX8Lr5Bcq0DWCKF5lMRVIimY5or38CVnlE/HABK/rdNr51UZmogOEXV0NZNEgPtrbvzJeMyv7v95720ACVKIFta2AmjGsNj3h7paxjsYmJmb6bszWH/nUqZVvHPuFHri3jLh33/ZiSXJMCqQag/i0NwSV5Fo2ENeKWRTHkwUoO8B80GnjhpceBuL1ic8cHGN556hl7wyQftQfONDgwIILGu/OecUoeGmmP6khhVDHUgTKn8krfQaBEHJKxWfOpEtPe8SR2jpuo/RhUMro0ynIdU8tkojFi14ju8oOhsXRTDe4wTpxVvNAmyw1IMq+qTqrYHqHq4UtBbBX5/e19GXWq/NPKxaKg6uaZsUnUS7Za0y6GDKUs34PdOGg286Zbo3tJxHBJHARQAW/KfyqCQFMG7RH2oVDwBk/M9KNfKEOTXveeIh7aYzrT2jNfkFFzjsyt+TZ7G/I0eGefA5kHDfly5PhZq97XzFp0Fm6mlcUCQy/LEjefITknW8ZZ3QuXDQW+/n+4UUiz1LwNugyevBqx8Xgl+5cs95q2GaeHZykvypMN48raUOzYQu2mazj3pHb2X00WOQc3WKQ4KnWsgYF0bvHQnQPQByyUcNenm6i0s5NcvC66i7c14SZWan5azQiSYahCWWRzjKm0nQpUAg834U8GPZ7sLmdE1LVEFu631Rudl0qe14EUDgBGgiV2IJkMmMLd1gbkI4mFjsL373fCBhi5oNE tY21uqPm dvPDuWd6NcButMar3bnogfeHKqinM5nwYKp8VKnknZnJkr6c0HqsI7Ftn8HoryAEXhFCB7FId+7Lkc/p0XB1/nTTx7/Gms2irJjDCtCATshiK5gZ9+O/GncYbRZL1NZoxOZ/+ 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: If call kmalloc_node with NO __GFP_THISNODE and node[A] with no memory. Slub will alloc a slub page which is not belong to A, and put the page to kmem_cache_node[page_to_nid(page)]. The page can not be reused at next calling, because NULL will be get from get_partical(). That make kmalloc_node consume more memory. On qemu with 4 numas and each numa has 1G memory, Write a test ko to call kmalloc_node(196, 0xd20c0, 3) for 5 * 1024 * 1024 times. cat /proc/slabinfo shows: kmalloc-256 4302317 15151808 256 32 2 : tunables.. the total objects is much more then active objects. After this patch, cat /prac/slubinfo shows: kmalloc-256 5244950 5245088 256 32 2 : tunables.. Signed-off-by: Chen Jun --- mm/slub.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/mm/slub.c b/mm/slub.c index 39327e98fce3..c0090a5de54e 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -2384,7 +2384,7 @@ static void *get_partial(struct kmem_cache *s, int node, struct partial_context searchnode = numa_mem_id(); object = get_partial_node(s, get_node(s, searchnode), pc); - if (object || node != NUMA_NO_NODE) + if (object || (node != NUMA_NO_NODE && (pc->flags & __GFP_THISNODE))) return object; return get_any_partial(s, pc); @@ -3069,6 +3069,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, struct slab *slab; unsigned long flags; struct partial_context pc; + int try_thisndoe = 0; stat(s, ALLOC_SLOWPATH); @@ -3181,8 +3182,12 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, } new_objects: - pc.flags = gfpflags; + + /* Try to get page from specific node even if __GFP_THISNODE is not set */ + if (node != NUMA_NO_NODE && !(gfpflags & __GFP_THISNODE) && try_thisnode) + pc.flags |= __GFP_THISNODE; + pc.slab = &slab; pc.orig_size = orig_size; freelist = get_partial(s, node, &pc); @@ -3190,10 +3195,16 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, goto check_new_slab; slub_put_cpu_ptr(s->cpu_slab); - slab = new_slab(s, gfpflags, node); + slab = new_slab(s, pc.flags, node); c = slub_get_cpu_ptr(s->cpu_slab); if (unlikely(!slab)) { + /* Try to get page from any other node */ + if (node != NUMA_NO_NODE && !(gfpflags & __GFP_THISNODE) && try_thisnode) { + try_thisnode = 0; + goto new_objects; + } + slab_out_of_memory(s, gfpflags, node); return NULL; } -- 2.17.1