* [PATCH v3 01/10] usb: typec: Take care of driver module reference counting [not found] <20180904112219.89287-1-heikki.krogerus@linux.intel.com> @ 2018-09-04 11:22 ` Heikki Krogerus 2018-09-04 11:22 ` [PATCH v3 02/10] usb: roles: Handle driver " Heikki Krogerus 1 sibling, 0 replies; 4+ messages in thread From: Heikki Krogerus @ 2018-09-04 11:22 UTC (permalink / raw) To: Hans de Goede, Greg Kroah-Hartman Cc: Andy Shevchenko, Darren Hart, platform-driver-x86, linux-usb, stable Functions typec_mux_get() and typec_switch_get() already make sure that the mux device reference count is incremented, but the same must be done to the driver module as well to prevent the drivers from being unloaded in the middle of operation. This fixes a potential "BUG: unable to handle kernel paging request at ..." from happening. Fixes: 93dd2112c7b2 ("usb: typec: mux: Get the mux identifier from function parameter") Cc: <stable@vger.kernel.org> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> --- drivers/usb/typec/mux.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/usb/typec/mux.c b/drivers/usb/typec/mux.c index ddaac63ecf12..d990aa510fab 100644 --- a/drivers/usb/typec/mux.c +++ b/drivers/usb/typec/mux.c @@ -9,6 +9,7 @@ #include <linux/device.h> #include <linux/list.h> +#include <linux/module.h> #include <linux/mutex.h> #include <linux/usb/typec_mux.h> @@ -49,8 +50,10 @@ struct typec_switch *typec_switch_get(struct device *dev) mutex_lock(&switch_lock); sw = device_connection_find_match(dev, "typec-switch", NULL, typec_switch_match); - if (!IS_ERR_OR_NULL(sw)) + if (!IS_ERR_OR_NULL(sw)) { + WARN_ON(!try_module_get(sw->dev->driver->owner)); get_device(sw->dev); + } mutex_unlock(&switch_lock); return sw; @@ -65,8 +68,10 @@ EXPORT_SYMBOL_GPL(typec_switch_get); */ void typec_switch_put(struct typec_switch *sw) { - if (!IS_ERR_OR_NULL(sw)) + if (!IS_ERR_OR_NULL(sw)) { + module_put(sw->dev->driver->owner); put_device(sw->dev); + } } EXPORT_SYMBOL_GPL(typec_switch_put); @@ -136,8 +141,10 @@ struct typec_mux *typec_mux_get(struct device *dev, const char *name) mutex_lock(&mux_lock); mux = device_connection_find_match(dev, name, NULL, typec_mux_match); - if (!IS_ERR_OR_NULL(mux)) + if (!IS_ERR_OR_NULL(mux)) { + WARN_ON(!try_module_get(mux->dev->driver->owner)); get_device(mux->dev); + } mutex_unlock(&mux_lock); return mux; @@ -152,8 +159,10 @@ EXPORT_SYMBOL_GPL(typec_mux_get); */ void typec_mux_put(struct typec_mux *mux) { - if (!IS_ERR_OR_NULL(mux)) + if (!IS_ERR_OR_NULL(mux)) { + module_put(mux->dev->driver->owner); put_device(mux->dev); + } } EXPORT_SYMBOL_GPL(typec_mux_put); -- 2.18.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 02/10] usb: roles: Handle driver reference counting [not found] <20180904112219.89287-1-heikki.krogerus@linux.intel.com> 2018-09-04 11:22 ` [PATCH v3 01/10] usb: typec: Take care of driver module reference counting Heikki Krogerus @ 2018-09-04 11:22 ` Heikki Krogerus 2018-09-06 20:59 ` Hans de Goede 1 sibling, 1 reply; 4+ messages in thread From: Heikki Krogerus @ 2018-09-04 11:22 UTC (permalink / raw) To: Hans de Goede, Greg Kroah-Hartman Cc: Andy Shevchenko, Darren Hart, platform-driver-x86, linux-usb, stable This fixes potential "BUG: unable to handle kernel paging request at ..." from happening. Fixes: fde0aa6c175a ("usb: common: Small class for USB role switches") Cc: <stable@vger.kernel.org> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> --- drivers/usb/common/roles.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/usb/common/roles.c b/drivers/usb/common/roles.c index 15cc76e22123..3d8a776e55ee 100644 --- a/drivers/usb/common/roles.c +++ b/drivers/usb/common/roles.c @@ -109,8 +109,15 @@ static void *usb_role_switch_match(struct device_connection *con, int ep, */ struct usb_role_switch *usb_role_switch_get(struct device *dev) { - return device_connection_find_match(dev, "usb-role-switch", NULL, - usb_role_switch_match); + struct usb_role_switch *sw; + + sw = device_connection_find_match(dev, "usb-role-switch", NULL, + usb_role_switch_match); + + if (!IS_ERR(sw)) + WARN_ON(!try_module_get(sw->dev.parent->driver->owner)); + + return sw; } EXPORT_SYMBOL_GPL(usb_role_switch_get); @@ -122,8 +129,10 @@ EXPORT_SYMBOL_GPL(usb_role_switch_get); */ void usb_role_switch_put(struct usb_role_switch *sw) { - if (!IS_ERR_OR_NULL(sw)) + if (!IS_ERR_OR_NULL(sw)) { put_device(&sw->dev); + module_put(sw->dev.parent->driver->owner); + } } EXPORT_SYMBOL_GPL(usb_role_switch_put); -- 2.18.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v3 02/10] usb: roles: Handle driver reference counting 2018-09-04 11:22 ` [PATCH v3 02/10] usb: roles: Handle driver " Heikki Krogerus @ 2018-09-06 20:59 ` Hans de Goede 2018-09-07 9:48 ` Heikki Krogerus 0 siblings, 1 reply; 4+ messages in thread From: Hans de Goede @ 2018-09-06 20:59 UTC (permalink / raw) To: Heikki Krogerus, Greg Kroah-Hartman Cc: Andy Shevchenko, Darren Hart, platform-driver-x86, linux-usb, stable HI, On 04-09-18 13:22, Heikki Krogerus wrote: > This fixes potential "BUG: unable to handle kernel paging > request at ..." from happening. > > Fixes: fde0aa6c175a ("usb: common: Small class for USB role switches") > Cc: <stable@vger.kernel.org> > Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> > --- > drivers/usb/common/roles.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/common/roles.c b/drivers/usb/common/roles.c > index 15cc76e22123..3d8a776e55ee 100644 > --- a/drivers/usb/common/roles.c > +++ b/drivers/usb/common/roles.c > @@ -109,8 +109,15 @@ static void *usb_role_switch_match(struct device_connection *con, int ep, > */ > struct usb_role_switch *usb_role_switch_get(struct device *dev) > { > - return device_connection_find_match(dev, "usb-role-switch", NULL, > - usb_role_switch_match); > + struct usb_role_switch *sw; > + > + sw = device_connection_find_match(dev, "usb-role-switch", NULL, > + usb_role_switch_match); > + > + if (!IS_ERR(sw)) > + WARN_ON(!try_module_get(sw->dev.parent->driver->owner)); While testing I found a bug, so sorry but this is going to need a v4, device_connection_find_match() may return NULL here, so this needs to be if (!IS_ERR_OR_NULL(sw)) to avoid an oops. Note I'm also seeing some other issues which I need to debug I will do so tomorrow morning so you may want to wait a bit with v4. Regards, Hans > + > + return sw; > } > EXPORT_SYMBOL_GPL(usb_role_switch_get); > > @@ -122,8 +129,10 @@ EXPORT_SYMBOL_GPL(usb_role_switch_get); > */ > void usb_role_switch_put(struct usb_role_switch *sw) > { > - if (!IS_ERR_OR_NULL(sw)) > + if (!IS_ERR_OR_NULL(sw)) { > put_device(&sw->dev); > + module_put(sw->dev.parent->driver->owner); > + } > } > EXPORT_SYMBOL_GPL(usb_role_switch_put); > > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v3 02/10] usb: roles: Handle driver reference counting 2018-09-06 20:59 ` Hans de Goede @ 2018-09-07 9:48 ` Heikki Krogerus 0 siblings, 0 replies; 4+ messages in thread From: Heikki Krogerus @ 2018-09-07 9:48 UTC (permalink / raw) To: Hans de Goede Cc: Greg Kroah-Hartman, Andy Shevchenko, Darren Hart, platform-driver-x86, linux-usb, stable On Thu, Sep 06, 2018 at 10:59:34PM +0200, Hans de Goede wrote: > HI, > > On 04-09-18 13:22, Heikki Krogerus wrote: > > This fixes potential "BUG: unable to handle kernel paging > > request at ..." from happening. > > > > Fixes: fde0aa6c175a ("usb: common: Small class for USB role switches") > > Cc: <stable@vger.kernel.org> > > Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> > > --- > > drivers/usb/common/roles.c | 15 ++++++++++++--- > > 1 file changed, 12 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/usb/common/roles.c b/drivers/usb/common/roles.c > > index 15cc76e22123..3d8a776e55ee 100644 > > --- a/drivers/usb/common/roles.c > > +++ b/drivers/usb/common/roles.c > > @@ -109,8 +109,15 @@ static void *usb_role_switch_match(struct device_connection *con, int ep, > > */ > > struct usb_role_switch *usb_role_switch_get(struct device *dev) > > { > > - return device_connection_find_match(dev, "usb-role-switch", NULL, > > - usb_role_switch_match); > > + struct usb_role_switch *sw; > > + > > + sw = device_connection_find_match(dev, "usb-role-switch", NULL, > > + usb_role_switch_match); > > + > > + if (!IS_ERR(sw)) > > + WARN_ON(!try_module_get(sw->dev.parent->driver->owner)); > > While testing I found a bug, so sorry but this is going to need a v4, > device_connection_find_match() may return NULL here, so this needs > to be if (!IS_ERR_OR_NULL(sw)) to avoid an oops. > > Note I'm also seeing some other issues which I need to debug I will > do so tomorrow morning so you may want to wait a bit with v4. Np. Take your time. And thanks for testing these. Cheers, -- heikki ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-09-07 9:48 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20180904112219.89287-1-heikki.krogerus@linux.intel.com>
2018-09-04 11:22 ` [PATCH v3 01/10] usb: typec: Take care of driver module reference counting Heikki Krogerus
2018-09-04 11:22 ` [PATCH v3 02/10] usb: roles: Handle driver " Heikki Krogerus
2018-09-06 20:59 ` Hans de Goede
2018-09-07 9:48 ` Heikki Krogerus
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox