diff mbox series

[1/2] usb: typec: mux: Take care of driver module reference counting

Message ID 20180919075805.61319-2-heikki.krogerus@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series mux handling fixes for usb-linus | expand

Commit Message

Heikki Krogerus Sept. 19, 2018, 7:58 a.m. UTC
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>
Acked-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 drivers/usb/typec/mux.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Comments

Sasha Levin Sept. 19, 2018, 6:58 p.m. UTC | #1
Hi,

[This is an automated email]

This commit has been processed because it contains a -stable tag.
The stable tag indicates that it's relevant for the following trees: all

The bot has tested the following trees: v4.18.8, v4.14.70, v4.9.127, v4.4.156, v3.18.122, 

v4.18.8: Failed to apply! Possible dependencies:
    93dd2112c7b2 ("usb: typec: mux: Get the mux identifier from function parameter")

v4.14.70: Failed to apply! Possible dependencies:
    93dd2112c7b2 ("usb: typec: mux: Get the mux identifier from function parameter")
    bdecb33af34f ("usb: typec: API for controlling USB Type-C Multiplexers")

v4.9.127: Failed to apply! Possible dependencies:
    93dd2112c7b2 ("usb: typec: mux: Get the mux identifier from function parameter")
    bdecb33af34f ("usb: typec: API for controlling USB Type-C Multiplexers")

v4.4.156: Failed to apply! Possible dependencies:
    93dd2112c7b2 ("usb: typec: mux: Get the mux identifier from function parameter")
    bdecb33af34f ("usb: typec: API for controlling USB Type-C Multiplexers")

v3.18.122: Failed to apply! Possible dependencies:
    93dd2112c7b2 ("usb: typec: mux: Get the mux identifier from function parameter")
    bdecb33af34f ("usb: typec: API for controlling USB Type-C Multiplexers")


Please let us know if you'd like to have this patch included in a stable tree.

--
Thanks,
Sasha
Greg Kroah-Hartman Sept. 20, 2018, 11:20 a.m. UTC | #2
On Wed, Sep 19, 2018 at 10:58:04AM +0300, Heikki Krogerus wrote:
> 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>

Why is this flagged for stable? 93dd2112c7b2 went into 4.19-rc1 and has
not been backported anywhere else.

confused,

greg k-h
Heikki Krogerus Sept. 20, 2018, 11:26 a.m. UTC | #3
On Thu, Sep 20, 2018 at 01:20:03PM +0200, Greg KH wrote:
> On Wed, Sep 19, 2018 at 10:58:04AM +0300, Heikki Krogerus wrote:
> > 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>
> 
> Why is this flagged for stable? 93dd2112c7b2 went into 4.19-rc1 and has
> not been backported anywhere else.
> 
> confused,

Sorry, it should not have the stable tag. Shall I resend these?

Thanks,
Greg Kroah-Hartman Sept. 20, 2018, 11:34 a.m. UTC | #4
On Thu, Sep 20, 2018 at 02:26:28PM +0300, Heikki Krogerus wrote:
> On Thu, Sep 20, 2018 at 01:20:03PM +0200, Greg KH wrote:
> > On Wed, Sep 19, 2018 at 10:58:04AM +0300, Heikki Krogerus wrote:
> > > 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>
> > 
> > Why is this flagged for stable? 93dd2112c7b2 went into 4.19-rc1 and has
> > not been backported anywhere else.
> > 
> > confused,
> 
> Sorry, it should not have the stable tag. Shall I resend these?

No need, I'll handle it, thanks.

greg k-h
diff mbox series

Patch

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);