Re: [PATCH 2/3] driver core: Add NUMA-node awareness to the synchronous probe path
From: Danilo Krummrich
Date: Sat Jan 17 2026 - 09:03:13 EST
On Wed Jan 7, 2026 at 6:55 PM CET, Jinhui Guo wrote:
> @@ -808,6 +894,8 @@ static int __driver_probe_device(const struct device_driver *drv, struct device
> return ret;
> }
>
> +DEFINE_NUMA_WRAPPER(__driver_probe_device, const struct device_driver *, struct device *)
> +
> /**
> * driver_probe_device - attempt to bind device & driver together
> * @drv: driver to bind a device to
> @@ -844,6 +932,8 @@ static int driver_probe_device(const struct device_driver *drv, struct device *d
> return ret;
> }
>
> +DEFINE_NUMA_WRAPPER(driver_probe_device, const struct device_driver *, struct device *)
> +
> static inline bool cmdline_requested_async_probing(const char *drv_name)
> {
> bool async_drv;
> @@ -1000,6 +1090,8 @@ static int __device_attach_driver_scan(struct device_attach_data *data,
> return ret;
> }
>
> +DEFINE_NUMA_WRAPPER(__device_attach_driver_scan, struct device_attach_data *, bool *)
Why define three different wrappers? To me it looks like we should easily get
away with a single wrapper for __driver_probe_device(), which could just be
__driver_probe_device_node().
__device_attach_driver_scan() already has this information (i.e. we can check if
need_async == NULL). Additionally, we can change the signature of
driver_probe_device() to
static int driver_probe_device(const struct device_driver *drv, struct device *dev, bool async)
This reduces complexity a lot, since it gets us rid of DEFINE_NUMA_WRAPPER() and
EXEC_ON_NUMA_NODE() macros.
> static void __device_attach_async_helper(void *_dev, async_cookie_t cookie)
> {
> struct device *dev = _dev;
> @@ -1055,7 +1147,9 @@ static int __device_attach(struct device *dev, bool allow_async)
> .want_async = false,
> };
>
> - ret = __device_attach_driver_scan(&data, &async);
> + ret = EXEC_ON_NUMA_NODE(dev_to_node(dev),
> + __device_attach_driver_scan,
> + &data, &async);
> }
> out_unlock:
> device_unlock(dev);
> @@ -1142,7 +1236,9 @@ int device_driver_attach(const struct device_driver *drv, struct device *dev)
> int ret;
>
> __device_driver_lock(dev, dev->parent);
> - ret = __driver_probe_device(drv, dev);
> + ret = EXEC_ON_NUMA_NODE(dev_to_node(dev),
> + __driver_probe_device,
> + drv, dev);
> __device_driver_unlock(dev, dev->parent);
>
> /* also return probe errors as normal negative errnos */
> @@ -1231,7 +1327,9 @@ static int __driver_attach(struct device *dev, void *data)
> }
>
> __device_driver_lock(dev, dev->parent);
> - driver_probe_device(drv, dev);
> + EXEC_ON_NUMA_NODE(dev_to_node(dev),
> + driver_probe_device,
> + drv, dev);
> __device_driver_unlock(dev, dev->parent);
>
> return 0;
> --
> 2.20.1