From mboxrd@z Thu Jan 1 00:00:00 1970 From: Florian Fainelli Subject: Re: [PATCH net-next] net: phy: mdio-boardinfo: Allow recursive mdiobus_register() Date: Wed, 18 Apr 2018 17:14:36 -0700 Message-ID: <5966673b-f091-a180-71b1-96d35f845e17@gmail.com> References: <1524096047-16823-1-git-send-email-andrew@lunn.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Cc: netdev , Vivien Didelot To: Andrew Lunn , David Miller Return-path: Received: from mail-wr0-f193.google.com ([209.85.128.193]:40216 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752391AbeDSAOq (ORCPT ); Wed, 18 Apr 2018 20:14:46 -0400 Received: by mail-wr0-f193.google.com with SMTP id v60-v6so9234380wrc.7 for ; Wed, 18 Apr 2018 17:14:45 -0700 (PDT) In-Reply-To: <1524096047-16823-1-git-send-email-andrew@lunn.ch> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: On 04/18/2018 05:00 PM, Andrew Lunn wrote: > mdiobus_register will search for any mdiobus board info registered for > the bus being registered. If found, it will probe devices on the bus. > That device, if for example it is an ethernet switch, may then try to > register an mdio bus. Thus we need to allow recursive calls to > mdiobus_register. > > Holding the mdio_board_lock will cause a deadlock during this > recursion. Release the lock and use list_for_each_entry_safe. > > Signed-off-by: Andrew Lunn > --- > drivers/net/phy/mdio-boardinfo.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/phy/mdio-boardinfo.c b/drivers/net/phy/mdio-boardinfo.c > index 1861f387820d..863496fa5d13 100644 > --- a/drivers/net/phy/mdio-boardinfo.c > +++ b/drivers/net/phy/mdio-boardinfo.c > @@ -30,17 +30,20 @@ void mdiobus_setup_mdiodev_from_board_info(struct mii_bus *bus, > struct mdio_board_info *bi)) > { > struct mdio_board_entry *be; > + struct mdio_board_entry *tmp; > struct mdio_board_info *bi; > int ret; > > mutex_lock(&mdio_board_lock); Don't you need to drop that lock here? > - list_for_each_entry(be, &mdio_board_list, list) { > + list_for_each_entry_safe(be, tmp, &mdio_board_list, list) { > bi = &be->board_info; > > if (strcmp(bus->id, bi->bus_id)) > continue; > > + mutex_unlock(&mdio_board_lock); > ret = cb(bus, bi); > + mutex_lock(&mdio_board_lock); > if (ret) > continue; > And conversely drop the unlock from the end of this function? Also, would you rather target "net" for this change since this appears to be a bug fix? -- Florian