[PATCH v7] driver core: platform: set numa_node before platform_device_add()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Setting the devices' numa_node needs to be done in
platform_device_register_full(), because that's where the
platform device object is allocated.

Fixes: 4a60406d3592 ("driver core: platform: expose numa_node to users in sysfs")
Cc: stable@xxxxxxxxxxxxxxx
Reported-by: kernel test robot <lkp@xxxxxxxxx>
Closes: https://lore.kernel.org/oe-kbuild-all/202309122309.mbxAnAIe-lkp@xxxxxxxxx/
Signed-off-by: Jinhui Guo <guojinhui.liam@xxxxxxxxxxxxx>
---
V6 -> V7
  1. Fix bug directly by adding numa_node to struct
     platform_device_info (suggested by Rafael J. Wysocki).
  2. Remove reviewer name.

V5 -> V6:
  1. Update subject to correct function name platform_device_add().
  2. Provide a more clear and accurate description of the changes
     made in commit (suggested by Rafael J. Wysocki).
  3. Add reviewer name.

V4 -> V5:
  Add Cc: stable line and changes from the previous submited patches.

V3 -> V4:
  Refactor code to be an ACPI function call (suggested by Greg Kroah-Hartman).

V2 -> V3:
  Fix Signed-off name.

V1 -> V2:
  Fix compile error without enabling CONFIG_ACPI.
---

 drivers/acpi/acpi_platform.c    |  5 ++---
 drivers/base/platform.c         |  4 ++++
 include/linux/platform_device.h | 26 ++++++++++++++++++++++++++
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index 48d15dd785f6..1ae7449f70dc 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -168,6 +168,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
 	pdevinfo.num_res = count;
 	pdevinfo.fwnode = acpi_fwnode_handle(adev);
 	pdevinfo.properties = properties;
+	platform_devinfo_set_node(&pdevinfo, acpi_get_node(adev->handle));
 
 	if (acpi_dma_supported(adev))
 		pdevinfo.dma_mask = DMA_BIT_MASK(32);
@@ -178,11 +179,9 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
 	if (IS_ERR(pdev))
 		dev_err(&adev->dev, "platform device creation failed: %ld\n",
 			PTR_ERR(pdev));
-	else {
-		set_dev_node(&pdev->dev, acpi_get_node(adev->handle));
+	else
 		dev_dbg(&adev->dev, "created platform device %s\n",
 			dev_name(&pdev->dev));
-	}
 
 	kfree(resources);
 
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index 76bfcba25003..c733bfb26149 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -808,6 +808,7 @@ struct platform_device *platform_device_register_full(
 {
 	int ret;
 	struct platform_device *pdev;
+	int numa_node = platform_devinfo_get_node(pdevinfo);
 
 	pdev = platform_device_alloc(pdevinfo->name, pdevinfo->id);
 	if (!pdev)
@@ -841,6 +842,9 @@ struct platform_device *platform_device_register_full(
 			goto err;
 	}
 
+	if (numa_node >= 0)
+		set_dev_node(&pdev->dev, numa_node);
+
 	ret = platform_device_add(pdev);
 	if (ret) {
 err:
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
index 7a41c72c1959..78e11b79f1af 100644
--- a/include/linux/platform_device.h
+++ b/include/linux/platform_device.h
@@ -132,10 +132,36 @@ struct platform_device_info {
 		u64 dma_mask;
 
 		const struct property_entry *properties;
+
+#ifdef CONFIG_NUMA
+		int numa_node;	/* NUMA node this platform device is close to plus 1 */
+#endif
 };
 extern struct platform_device *platform_device_register_full(
 		const struct platform_device_info *pdevinfo);
 
+#ifdef CONFIG_NUMA
+static inline int platform_devinfo_get_node(const struct platform_device_info *pdevinfo)
+{
+	return pdevinfo ? pdevinfo->numa_node - 1 : NUMA_NO_NODE;
+}
+
+static inline void platform_devinfo_set_node(struct platform_device_info *pdevinfo,
+					     int node)
+{
+	pdevinfo->numa_node = node + 1;
+}
+#else
+static inline int platform_devinfo_get_node(const struct platform_device_info *pdevinfo)
+{
+	return NUMA_NO_NODE;
+}
+
+static inline void platform_devinfo_set_node(struct platform_device_info *pdevinfo,
+					     int node)
+{}
+#endif
+
 /**
  * platform_device_register_resndata - add a platform-level device with
  * resources and platform-specific data
-- 
2.20.1




[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]
  Powered by Linux