From: Jinhui Guo guojinhui.liam@bytedance.com
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@vger.kernel.org Reported-by: kernel test robot lkp@intel.com Closes: https://lore.kernel.org/oe-kbuild-all/202309122309.mbxAnAIe-lkp@intel.com/ Signed-off-by: Jinhui Guo guojinhui.liam@bytedance.com --- 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
On Mon, Jun 17, 2024 at 11:01:23AM +0800, guojinhui.liam wrote:
From: Jinhui Guo guojinhui.liam@bytedance.com
Setting the devices' numa_node needs to be done in platform_device_register_full(), because that's where the platform device object is allocated.
Why in the world is a platform device on a numa node? Are you sure you are using platform devices properly if this is an issue?
And what platform devices / drivers care about this?
Fixes: 4a60406d3592 ("driver core: platform: expose numa_node to users in sysfs") Cc: stable@vger.kernel.org Reported-by: kernel test robot lkp@intel.com
The robot reported this problem?
Closes: https://lore.kernel.org/oe-kbuild-all/202309122309.mbxAnAIe-lkp@intel.com/
That's a problem with an older version of this patch, not this one.
Signed-off-by: Jinhui Guo guojinhui.liam@bytedance.com
V6 -> V7
- Fix bug directly by adding numa_node to struct platform_device_info (suggested by Rafael J. Wysocki).
- Remove reviewer name.
V5 -> V6:
- Update subject to correct function name platform_device_add().
- Provide a more clear and accurate description of the changes made in commit (suggested by Rafael J. Wysocki).
- 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(-)
Any reason why you didn't cc the relevent maintainers here?
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
Ick, no, why? Again, platform devices should NOT care about this. If they do, they should not be a platform device.
}; 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;
Why +1?
thanks,
greg k-h
linux-stable-mirror@lists.linaro.org