Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp764408ybt; Mon, 6 Jul 2020 23:03:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzAGU8apmwdZ/nGLtXgOyEKRiXGPonlJKDVcrBxckn7RUNTVWVs23PcyCbdmOmlO+qL20j4 X-Received: by 2002:a05:6402:21c2:: with SMTP id bi2mr59185020edb.296.1594101803614; Mon, 06 Jul 2020 23:03:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594101803; cv=none; d=google.com; s=arc-20160816; b=vfPmxS4tU17E4Mzd+aj3EgmOIanfI36Mzd88wLgE8k2VdzAVO4naUpagGfzRcqELrb YI5UdDOjjQdwD0k90/cHkFEMN4yHRSJZ2mcQe3nKrJCi+OSPdsiEpg6Q/hq5YY+j6H8Q epEFhulfFkF1CZetIQTrI1KBrgb0YAvenlJO9B+luxiqIUIl/MWPnkY2vfBJ79I47Ppb 3UGUPnit6PTp8/RUzx8zHRIFEyhqU2Qyv/zkdVWpoVU6xG1sVfavkLxtFnh1NvxmcuFo pBzALjHU/NcVwkTZw7qKVszI3hbxq7Toc730x6RA62qvh7vGukwAZXlopaDeof/jpxa6 F9SA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=j5f/M5w9xaWJ84hNd07ZTdEqxvV+mA+kxKU8/484h1Q=; b=JtssIoAgpAGjhX/GAGcQpm/5ZUYmmTterxpYbyjrB5bPB50tcksn/k+kMHSTbxS8zw iOd8ya7c5G+9pgnX4+i+JPJK+5iqueCobPGcioQHMenuOELwUmq1UvbuwQbe5o3H9GOU loh0HNUfGPdctZbGvUSImlwPAWEa74e/svaLqaleLhc9ylfvfaoD6neYoBkTRgjoHRh4 hXPq36CJ7o50+emnfWPZ4jeFfdWIosquN5ZBHeaBZrJ5ATNbqiS1mZcu1keZVfKBRt8U hn14hq3yN6sOYqWVzz03Aezobs7uP4nsD1BpOt9THjlSmvQAiYJAvwXnwiglf3UXh0PH TSng== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y7si14521229edm.24.2020.07.06.23.02.58; Mon, 06 Jul 2020 23:03:23 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728165AbgGGF7n (ORCPT + 99 others); Tue, 7 Jul 2020 01:59:43 -0400 Received: from foss.arm.com ([217.140.110.172]:49966 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727827AbgGGF7n (ORCPT ); Tue, 7 Jul 2020 01:59:43 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6489531B; Mon, 6 Jul 2020 22:59:42 -0700 (PDT) Received: from localhost.localdomain (entos-thunderx2-02.shanghai.arm.com [10.169.212.213]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id B5C823F68F; Mon, 6 Jul 2020 22:59:37 -0700 (PDT) From: Jia He To: Catalin Marinas , Will Deacon , Dan Williams , Vishal Verma , Dave Jiang Cc: Michal Hocko , Andrew Morton , Mike Rapoport , Baoquan He , Chuhong Yuan , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-nvdimm@lists.01.org, Kaly Xin , Jia He Subject: [RFC PATCH v2 2/3] device-dax: use fallback nid when numa_node is invalid Date: Tue, 7 Jul 2020 13:59:16 +0800 Message-Id: <20200707055917.143653-3-justin.he@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200707055917.143653-1-justin.he@arm.com> References: <20200707055917.143653-1-justin.he@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Previously, numa_off is set unconditionally at the end of dummy_numa_init(), even with a fake numa node. Then ACPI detects node id as NUMA_NO_NODE(-1) in acpi_map_pxm_to_node() because it regards numa_off as turning off the numa node. Hence dev_dax->target_node is NUMA_NO_NODE on arm64 with fake numa. Without this patch, pmem can't be probed as a RAM device on arm64 if SRAT table isn't present: $ndctl create-namespace -fe namespace0.0 --mode=devdax --map=dev -s 1g -a 64K kmem dax0.0: rejecting DAX region [mem 0x240400000-0x2bfffffff] with invalid node: -1 kmem: probe of dax0.0 failed with error -22 This fixes it by using fallback memory_add_physaddr_to_nid() as nid. Suggested-by: David Hildenbrand Signed-off-by: Jia He --- I noticed that on powerpc memory_add_physaddr_to_nid is not exported for module driver. Set it to RFC due to this concern. drivers/dax/kmem.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index 275aa5f87399..68e693ca6d59 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -28,20 +28,22 @@ int dev_dax_kmem_probe(struct device *dev) resource_size_t kmem_end; struct resource *new_res; const char *new_res_name; - int numa_node; + int numa_node, new_node; int rc; /* * Ensure good NUMA information for the persistent memory. - * Without this check, there is a risk that slow memory - * could be mixed in a node with faster memory, causing - * unavoidable performance issues. + * Without this check, there is a risk but not fatal that slow + * memory could be mixed in a node with faster memory, causing + * unavoidable performance issues. Furthermore, fallback node + * id can be used when numa_node is invalid. */ numa_node = dev_dax->target_node; if (numa_node < 0) { - dev_warn(dev, "rejecting DAX region %pR with invalid node: %d\n", - res, numa_node); - return -EINVAL; + new_node = memory_add_physaddr_to_nid(kmem_start); + dev_info(dev, "changing nid from %d to %d for DAX region %pR\n", + numa_node, new_node, res); + numa_node = new_node; } /* Hotplug starting at the beginning of the next block: */ @@ -100,6 +102,7 @@ static int dev_dax_kmem_remove(struct device *dev) resource_size_t kmem_start = res->start; resource_size_t kmem_size = resource_size(res); const char *res_name = res->name; + int numa_node = dev_dax->target_node; int rc; /* @@ -108,7 +111,10 @@ static int dev_dax_kmem_remove(struct device *dev) * there is no way to hotremove this memory until reboot because device * unbind will succeed even if we return failure. */ - rc = remove_memory(dev_dax->target_node, kmem_start, kmem_size); + if (numa_node < 0) + numa_node = memory_add_physaddr_to_nid(kmem_start); + + rc = remove_memory(numa_node, kmem_start, kmem_size); if (rc) { any_hotremove_failed = true; dev_err(dev, -- 2.17.1