[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <DFQX56VQ3FAV.3LIDGP9F41X1U@kernel.org>
Date: Sat, 17 Jan 2026 15:03:08 +0100
From: "Danilo Krummrich" <dakr@...nel.org>
To: "Jinhui Guo" <guojinhui.liam@...edance.com>
Cc: <alexander.h.duyck@...ux.intel.com>, <alexanderduyck@...com>,
<bhelgaas@...gle.com>, <bvanassche@....org>, <dan.j.williams@...el.com>,
<gregkh@...uxfoundation.org>, <helgaas@...nel.org>, <rafael@...nel.org>,
<tj@...nel.org>, <linux-kernel@...r.kernel.org>,
<linux-pci@...r.kernel.org>
Subject: Re: [PATCH 2/3] driver core: Add NUMA-node awareness to the
synchronous probe path
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
Powered by blists - more mailing lists