Message ID | 20211117180309.2737514-1-f.fainelli@gmail.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [stable,4.9] net: mdio-mux: fix unbalanced put_device | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
On Wed, Nov 17, 2021 at 10:03:08AM -0800, Florian Fainelli wrote: > From: Corentin Labbe <clabbe.montjoie@gmail.com> > > commit 60f786525032432af1b7d9b8935cb12936244ccd upstream > > mdio_mux_uninit() call put_device (unconditionally) because of > of_mdio_find_bus() in mdio_mux_init. > But of_mdio_find_bus is only called if mux_bus is empty. > If mux_bus is set, mdio_mux_uninit will print a "refcount_t: underflow" > trace. > > This patch add a get_device in the other branch of "if (mux_bus)". > > Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com> > Reviewed-by: Andrew Lunn <andrew@lunn.ch> > Signed-off-by: David S. Miller <davem@davemloft.net> > Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> > --- > Note: this patch did not get any fixes tag, but it does fix issues > introduced by fdf3b78df4d2 ("mdio: mux: Correct mdio_mux_init error > path issues"). Now queued up, thanks. greg k-h
diff --git a/drivers/net/phy/mdio-mux.c b/drivers/net/phy/mdio-mux.c index 599ce24c514f..456b64248e5d 100644 --- a/drivers/net/phy/mdio-mux.c +++ b/drivers/net/phy/mdio-mux.c @@ -117,6 +117,7 @@ int mdio_mux_init(struct device *dev, } else { parent_bus_node = NULL; parent_bus = mux_bus; + get_device(&parent_bus->dev); } pb = devm_kzalloc(dev, sizeof(*pb), GFP_KERNEL); @@ -182,9 +183,7 @@ int mdio_mux_init(struct device *dev, devm_kfree(dev, pb); err_pb_kz: - /* balance the reference of_mdio_find_bus() took */ - if (!mux_bus) - put_device(&parent_bus->dev); + put_device(&parent_bus->dev); err_parent_bus: of_node_put(parent_bus_node); return ret_val; @@ -202,7 +201,6 @@ void mdio_mux_uninit(void *mux_handle) cb = cb->next; } - /* balance the reference of_mdio_find_bus() in mdio_mux_init() took */ put_device(&pb->mii_bus->dev); } EXPORT_SYMBOL_GPL(mdio_mux_uninit);