From patchwork Fri Aug 17 09:00:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oscar Salvador X-Patchwork-Id: 10568549 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E408A139A for ; Fri, 17 Aug 2018 09:00:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D2F352B03F for ; Fri, 17 Aug 2018 09:00:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C63812B045; Fri, 17 Aug 2018 09:00:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3F3042B03F for ; Fri, 17 Aug 2018 09:00:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 208156B0750; Fri, 17 Aug 2018 05:00:27 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 1B78D6B0766; Fri, 17 Aug 2018 05:00:27 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 058CC6B0768; Fri, 17 Aug 2018 05:00:26 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wm0-f70.google.com (mail-wm0-f70.google.com [74.125.82.70]) by kanga.kvack.org (Postfix) with ESMTP id 987A46B0766 for ; Fri, 17 Aug 2018 05:00:26 -0400 (EDT) Received: by mail-wm0-f70.google.com with SMTP id p3-v6so3974159wmc.7 for ; Fri, 17 Aug 2018 02:00:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=HgGRrJWJGXklKxYx7FB74hjJfmuXFq2Z33rZBcVarRg=; b=MFKcWvwSdUhy1OL/6zwqfPsXWrf4IWGwQoao/aVThr7+vWaPLUOENm/noKLZWXUIaU sKPO/9+BbYlGOyCTgPYOARlo0SIiLxxH1zln45vui6//TdzYF54WhDYNAk1H7Ro6/bAQ l6kylqFDLQGZnRCn8llvnOG2EQJn3s+y2VoCkFE5zw6OQFt0mog3H0BmEJoCENFefMDx OUb1ZIxpeY4XnWXh8puAhqxPBQ45C+zjUHrHZVbf9p/+ZiFeHDbCnqLVQWHn2luxBWJj jhvjOasmiBpaaALMx+czk1nUpAei2NzpGfyp43j7FunxW4lwUhTMZSjVmOS/MI5wB+KY YO+A== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Gm-Message-State: AOUpUlEp3DrggORAVwVpEBPhYo0pbLP2zqiTVQeTo+MlLiRcCiJssn7M VWdS/Njq51zgQnssHSjIQCVJWi4IhOgRfV8pT0VNlkLT2nuhgzY4m7ns4s0Z1g6PuGy07N3UmVM KaQgQoU43MlUG3JpyVhpZS1ogVLeSGTpTdI8jazrRtPxWO1FKRqHCsSRMHirSgH9ZolU3nz7cib LgkwD4tiz6NhNiB3jHrzn8uz9FLhx4EzhAnUE0TukO0XPDLVOt11cVQ8zcc9ZHrlAPOezUYaeQQ n7KpUnpATb1A9lAlkYeAtS9PdLoup360aN0poUM0hKbozO05tFcBjboPuZasUBd8l+xcGiuakT5 I4fupnlYYMotKF+gXWcCNjjpiAOTGNKp6+y3T1fCQvcwlKK0FoTxbkCvaF6MCNfrkSn0ZAMrzw= = X-Received: by 2002:a5d:6892:: with SMTP id h18-v6mr21278994wru.108.1534496426135; Fri, 17 Aug 2018 02:00:26 -0700 (PDT) X-Received: by 2002:a5d:6892:: with SMTP id h18-v6mr21278950wru.108.1534496425270; Fri, 17 Aug 2018 02:00:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534496425; cv=none; d=google.com; s=arc-20160816; b=TvbJN4nBhdjIzM4t4kSXRpvv9ieSeAslHX9L7WtoeW4SrrH/Ahlhus0zAcXHLHC0vk ecccTkgxzu2OG00VfpiT1yB9QyaFKTw1Z+vypg8jeSGTQYHVZBo+aOS5XoYNy2SC9N0O ptWKmcOIZfsuXsN6xG+JbLCqb0+i1X9maGzyAhuKP7sLhFM0iQDxYJ6L1d0Ca0U/ooC1 FRJ5Xfz7H7hCsEsjvqROKxGFVdp7im8b7s2NXhYNKeoMTSmUX0j7oUktt+K6sMEVA1Hc zYoCw+r6sTToQCTsPNcxwzO8Jqbn6NeEZ1WKBeYbBvGshbYU7zV354RI1xImAzbjmUeB hFGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=HgGRrJWJGXklKxYx7FB74hjJfmuXFq2Z33rZBcVarRg=; b=hsWT3saHF4kvbKgqW2OlFDU/aEztrX1Yag0wllsEcvqm6aXn4BQDxe9TsHZbTeqIjc NPeB8kInqItTWGhk6YuBP+GTwOkGdVgVH9YDLVutGTxSsbR8gfBJwVOtnC8fPKNNL/9g Yuz8kE9n0EsuDAQZipNsGl/n9ps+gV8e6vIn0XGEgnoHm1aIbCz6bwarpyW6ygFyginM 1IcBvZ81tby/qjXc0b+cCqzyZQ+peyg23ppYCmBiKivBELMNitUxCKeB3H3qf/oMQX4z Bm8AhygpiIA7o6kSQprrXqP4Gpp07y7xkmiEuUTsE9rvk/Q6eNXhLlHHy/PK/Wz4lFfI HBBA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id x15-v6sor779002wmh.68.2018.08.17.02.00.25 for (Google Transport Security); Fri, 17 Aug 2018 02:00:25 -0700 (PDT) Received-SPF: pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Google-Smtp-Source: AA+uWPwWDnj2UfVUO0MHbRYcXJg/4nGX6MeIsQVdZF4viPYrzfyjZVuVUBwywZRBReLBe1pXaXxdMA== X-Received: by 2002:a1c:8952:: with SMTP id l79-v6mr17261749wmd.7.1534496424962; Fri, 17 Aug 2018 02:00:24 -0700 (PDT) Received: from techadventures.net (techadventures.net. [62.201.165.239]) by smtp.gmail.com with ESMTPSA id 199-v6sm8209192wmp.37.2018.08.17.02.00.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Aug 2018 02:00:23 -0700 (PDT) Received: from d104.suse.de (nat.nue.novell.com [195.135.221.2]) by techadventures.net (Postfix) with ESMTPA id 76CE7124937; Fri, 17 Aug 2018 11:00:21 +0200 (CEST) From: Oscar Salvador To: akpm@linux-foundation.org Cc: mhocko@suse.com, vbabka@suse.cz, dan.j.williams@intel.com, yasu.isimatu@gmail.com, jonathan.cameron@huawei.com, david@redhat.com, Pavel.Tatashin@microsoft.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Oscar Salvador Subject: [PATCH v4 3/4] mm/memory_hotplug: Define nodemask_t as a stack variable Date: Fri, 17 Aug 2018 11:00:16 +0200 Message-Id: <20180817090017.17610-4-osalvador@techadventures.net> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180817090017.17610-1-osalvador@techadventures.net> References: <20180817090017.17610-1-osalvador@techadventures.net> 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: X-Virus-Scanned: ClamAV using ClamSMTP From: Oscar Salvador Currently, unregister_mem_sect_under_nodes() tries to allocate a nodemask_t in order to check whithin the loop which nodes have already been unlinked, so we do not repeat the operation on them. NODEMASK_ALLOC calls kmalloc() if NODES_SHIFT > 8, otherwise it just declares a nodemask_t variable whithin the stack. Since kmalloc() can fail, we actually check whether NODEMASK_ALLOC failed or not, and we return -ENOMEM accordingly. remove_memory_section() does not check for the return value though. It is pretty rare that such a tiny allocation can fail, but if it does, we will be left with dangled symlinks under /sys/devices/system/node/, since the mem_blk's directories will be removed no matter what unregister_mem_sect_under_nodes() returns. One way to solve this is to check whether unlinked_nodes is NULL or not. In the case it is not, we can just use it as before, but if it is NULL, we can just skip the node_test_and_set check, and call sysfs_remove_link() unconditionally. This is harmless as sysfs_remove_link() backs off somewhere down the chain in case the link has already been removed. This method was presented in v3 of the path [1]. But since the maximum number of nodes we can have is 1024, when NODES_SHIFT = 10, that gives us a nodemask_t of 128 bytes. Although everything depends on how deep the stack is, I think we can afford to define the nodemask_t variable whithin the stack. That simplifies the code, and we do not need to worry about untested error code paths. If we see that this causes troubles with the stack, we can always return to [1]. [1] https://patchwork.kernel.org/patch/10566673/ Signed-off-by: Oscar Salvador Reviewed-by: Pavel Tatashin --- drivers/base/node.c | 16 ++++++---------- include/linux/node.h | 5 ++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/drivers/base/node.c b/drivers/base/node.c index dd3bdab230b2..6b8c9b4537c9 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -449,35 +449,31 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg) } /* unregister memory section under all nodes that it spans */ -int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, +void unregister_mem_sect_under_nodes(struct memory_block *mem_blk, unsigned long phys_index) { - NODEMASK_ALLOC(nodemask_t, unlinked_nodes, GFP_KERNEL); + nodemask_t unlinked_nodes; unsigned long pfn, sect_start_pfn, sect_end_pfn; - if (!unlinked_nodes) - return -ENOMEM; - nodes_clear(*unlinked_nodes); + nodes_clear(unlinked_nodes); sect_start_pfn = section_nr_to_pfn(phys_index); sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1; for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { - int nid; + int nid = get_nid_for_pfn(pfn); - nid = get_nid_for_pfn(pfn); if (nid < 0) continue; if (!node_online(nid)) continue; - if (node_test_and_set(nid, *unlinked_nodes)) + if (node_test_and_set(nid, unlinked_nodes)) continue; + sysfs_remove_link(&node_devices[nid]->dev.kobj, kobject_name(&mem_blk->dev.kobj)); sysfs_remove_link(&mem_blk->dev.kobj, kobject_name(&node_devices[nid]->dev.kobj)); } - NODEMASK_FREE(unlinked_nodes); - return 0; } int link_mem_sections(int nid, unsigned long start_pfn, unsigned long end_pfn) diff --git a/include/linux/node.h b/include/linux/node.h index 257bb3d6d014..1203378e596a 100644 --- a/include/linux/node.h +++ b/include/linux/node.h @@ -72,7 +72,7 @@ extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); extern int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg); -extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, +extern void unregister_mem_sect_under_nodes(struct memory_block *mem_blk, unsigned long phys_index); #ifdef CONFIG_HUGETLBFS @@ -105,10 +105,9 @@ static inline int register_mem_sect_under_node(struct memory_block *mem_blk, { return 0; } -static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, +static inline void unregister_mem_sect_under_nodes(struct memory_block *mem_blk, unsigned long phys_index) { - return 0; } static inline void register_hugetlbfs_with_node(node_registration_func_t reg,