Message ID | 20210614150846.4111871-6-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/10] driver core: Pull required checks into driver_probe_device() | expand |
On Mon, Jun 14, 2021 at 05:08:41PM +0200, Christoph Hellwig wrote: > From: Jason Gunthorpe <jgg@nvidia.com> > > This is intended as a replacement API for device_bind_driver(). It has at > least the following benefits: > > - Internal locking. Few of the users of device_bind_driver() follow the > locking rules > > - Calls device driver probe() internally. Notably this means that devm > support for probe works correctly as probe() error will call > devres_release_all() > > - struct device_driver -> dev_groups is supported > > - Simplified calling convention, no need to manually call probe(). > > The general usage is for situations that already know what driver to bind > and need to ensure the bind is synchronized with other logic. Call > device_driver_attach() after device_add(). > > If probe() returns a failure then this will be preserved up through to the > error return of device_driver_attach(). > > Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> > Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
On Mon, Jun 14 2021, Christoph Hellwig <hch@lst.de> wrote: > From: Jason Gunthorpe <jgg@nvidia.com> > > This is intended as a replacement API for device_bind_driver(). It has at > least the following benefits: > > - Internal locking. Few of the users of device_bind_driver() follow the > locking rules > > - Calls device driver probe() internally. Notably this means that devm > support for probe works correctly as probe() error will call > devres_release_all() > > - struct device_driver -> dev_groups is supported > > - Simplified calling convention, no need to manually call probe(). > > The general usage is for situations that already know what driver to bind > and need to ensure the bind is synchronized with other logic. Call > device_driver_attach() after device_add(). > > If probe() returns a failure then this will be preserved up through to the > error return of device_driver_attach(). > > Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/base/base.h | 1 - > drivers/base/dd.c | 3 +++ > include/linux/device.h | 2 ++ > 3 files changed, 5 insertions(+), 1 deletion(-) Reviewed-by: Cornelia Huck <cohuck@redhat.com>
diff --git a/drivers/base/base.h b/drivers/base/base.h index e5f9b7e656c3..404db83ee5ec 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -152,7 +152,6 @@ extern int driver_add_groups(struct device_driver *drv, const struct attribute_group **groups); extern void driver_remove_groups(struct device_driver *drv, const struct attribute_group **groups); -int device_driver_attach(struct device_driver *drv, struct device *dev); void device_driver_detach(struct device *dev); extern char *make_class_name(const char *name, struct kobject *kobj); diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 8c65673e344c..aab47c0b356f 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -471,6 +471,8 @@ static void driver_sysfs_remove(struct device *dev) * (It is ok to call with no other effort from a driver's probe() method.) * * This function must be called with the device lock held. + * + * Callers should prefer to use device_driver_attach() instead. */ int device_bind_driver(struct device *dev) { @@ -1063,6 +1065,7 @@ int device_driver_attach(struct device_driver *drv, struct device *dev) return -EAGAIN; return ret; } +EXPORT_SYMBOL_GPL(device_driver_attach); static void __driver_attach_async_helper(void *_dev, async_cookie_t cookie) { diff --git a/include/linux/device.h b/include/linux/device.h index f1a00040fa53..d8b9c9e7d493 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -845,6 +845,8 @@ static inline void *dev_get_platdata(const struct device *dev) * Manual binding of a device to driver. See drivers/base/bus.c * for information on use. */ +int __must_check device_driver_attach(struct device_driver *drv, + struct device *dev); int __must_check device_bind_driver(struct device *dev); void device_release_driver(struct device *dev); int __must_check device_attach(struct device *dev);