Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp420801pxb; Wed, 20 Jan 2021 10:07:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJw+G7PJlIYfHZYzfTZwNU15jwJUphfjxByzxSEcRnv7l118Mx8kJkjYFo9++hOVqO+3aqQC X-Received: by 2002:a17:906:7948:: with SMTP id l8mr7005280ejo.550.1611166042454; Wed, 20 Jan 2021 10:07:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611166042; cv=none; d=google.com; s=arc-20160816; b=iawfdSgJuqvQcilpvx+oXtHMAxAkQlm/57hIVTXpr9+m33oKW1BN/xBHeBKS3Lm/QE ogEWy1gNs9S4rhH9JoB1EWCHvR4FxBy37rAH8cgYmG3b8vDuRjUdHZ+FL4wSRamI+58r tsl12rj0wfDjjHG5v69WwXwBQdQTEfpCOeSoY8WsVXTXQh5jFYLWoSZWJqJC2t+RVZea 8WRkNMUxnGC5XE5cy5KHu3KkER7yjaLqXulk0d0+PITm7Sl/U2oJeGPWzwZySz5md4t8 ogShYKvemYEhNQnhqW9jbDrmhQas7WdTmTi+Z7xynrLbdGstj6BfjPiLZ2syoZDZtAhE sZeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:date:cc:to:from:subject :message-id; bh=9zX/Yy/gqQZojrIybZxQYpSI9TlnVS1SJP0oNH0oTNI=; b=EWFUIq2tR2q/e+w5cQ011f5FEJIhGqfh0gQU01nB1a4qYXyXeNKamjYxbMmb5WtP7X zTak9Xd0JrVyK3EaSNSz8KvwwA4wshJrRInkz9CMMBGBKd/U+xb1V6Vwi+Ex+o5j3Cqc OmRA7Osq7J/YTqu2C9HIvRVntIa+ZDH3zPeYjLlobxkDpmRG+8G3L1otEJ7WPdcmAS/4 kqJMPZfFkQX/RhNAovLFruSZXZdmRPmZ/KzJDpMgGL6impPTGmPlz4gYpWNuD364RDwF ujL68EEMB947fNhc3oG47a/bZnfvuDHYSwcrQxeW96fiaSkkzk18qtuK4brExK04Z80H tPlw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n5si1139105eda.301.2021.01.20.10.06.52; Wed, 20 Jan 2021 10:07:22 -0800 (PST) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391820AbhATSFb (ORCPT + 99 others); Wed, 20 Jan 2021 13:05:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42852 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404141AbhATSE3 (ORCPT ); Wed, 20 Jan 2021 13:04:29 -0500 Received: from sipsolutions.net (s3.sipsolutions.net [IPv6:2a01:4f8:191:4433::2]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5D5C7C061575; Wed, 20 Jan 2021 10:03:26 -0800 (PST) Received: by sipsolutions.net with esmtpsa (TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.94) (envelope-from ) id 1l2HpE-009Eds-Mc; Wed, 20 Jan 2021 19:03:24 +0100 Message-ID: <85abb9009642c3a13321970c04f73cf0cf91c2e3.camel@sipsolutions.net> Subject: Re: [PATCH v2] cfg80211: avoid holding the RTNL when calling the driver From: Johannes Berg To: linux-wireless@vger.kernel.org Cc: netdev@vger.kernel.org, Oliver Neukum Date: Wed, 20 Jan 2021 19:03:23 +0100 In-Reply-To: <20210119102145.99917b8fc5d6.Iacd5916c0e01f71342159f6d419e56dc4c3f07a2@changeid> (sfid-20210119_153923_221115_D0602D5A) References: <20210119102145.99917b8fc5d6.Iacd5916c0e01f71342159f6d419e56dc4c3f07a2@changeid> (sfid-20210119_153923_221115_D0602D5A) Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.36.5 (3.36.5-2.fc32) MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-malware-bazaar: not-scanned Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Hi Oliver, Could you take a look at these bits to see if that's fine with you? I'd like to merge it through mac80211-next (pending some logistics with a conflict) > diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c > index 1447da1d5729..47c4c1182ef1 100644 > --- a/drivers/net/usb/usbnet.c > +++ b/drivers/net/usb/usbnet.c > @@ -1560,6 +1560,8 @@ void usbnet_disconnect (struct usb_interface *intf) > struct usbnet *dev; > struct usb_device *xdev; > struct net_device *net; > + const struct driver_info *info; > + void (*unregdev)(struct net_device *); > > dev = usb_get_intfdata(intf); > usb_set_intfdata(intf, NULL); > @@ -1574,7 +1576,10 @@ void usbnet_disconnect (struct usb_interface *intf) > dev->driver_info->description); > > net = dev->net; > - unregister_netdev (net); > + > + info = dev->driver_info; > + unregdev = info->unregister_netdev ?: unregister_netdev; > + unregdev(net); > > cancel_work_sync(&dev->kevent); > > @@ -1627,6 +1632,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) > int status; > const char *name; > struct usb_driver *driver = to_usb_driver(udev->dev.driver); > + int (*regdev)(struct net_device *); > > /* usbnet already took usb runtime pm, so have to enable the feature > * for usb interface, otherwise usb_autopm_get_interface may return > @@ -1646,6 +1652,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) > xdev = interface_to_usbdev (udev); > interface = udev->cur_altsetting; > > + regdev = info->register_netdev ?: register_netdev; > + > status = -ENOMEM; > > // set up our own records > @@ -1768,7 +1776,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) > } > } > > - status = register_netdev (net); > + status = regdev(net); > if (status) > goto out5; > netif_info(dev, probe, dev->net, [...] > diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c > index 9fe77556858e..b646d4295cfd 100644 > --- a/drivers/net/wireless/rndis_wlan.c > +++ b/drivers/net/wireless/rndis_wlan.c > @@ -3598,6 +3598,8 @@ static const struct driver_info bcm4320b_info = { > .stop = rndis_wlan_stop, > .early_init = bcm4320b_early_init, > .indication = rndis_wlan_indication, > + .register_netdev = cfg80211_register_netdev, > + .unregister_netdev = cfg80211_unregister_netdev, > }; > > static const struct driver_info bcm4320a_info = { > @@ -3613,6 +3615,8 @@ static const struct driver_info bcm4320a_info = { > .stop = rndis_wlan_stop, > .early_init = bcm4320a_early_init, > .indication = rndis_wlan_indication, > + .register_netdev = cfg80211_register_netdev, > + .unregister_netdev = cfg80211_unregister_netdev, > }; > > static const struct driver_info rndis_wlan_info = { > @@ -3628,6 +3632,8 @@ static const struct driver_info rndis_wlan_info = { > .stop = rndis_wlan_stop, > .early_init = unknown_early_init, > .indication = rndis_wlan_indication, > + .register_netdev = cfg80211_register_netdev, > + .unregister_netdev = cfg80211_unregister_netdev, > }; > > /*-------------------------------------------------------------------------*/ [...] > diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h > index 88a7673894d5..11e57803acf9 100644 > --- a/include/linux/usb/usbnet.h > +++ b/include/linux/usb/usbnet.h > @@ -165,6 +165,12 @@ struct driver_info { > /* rx mode change (device changes address list filtering) */ > void (*set_rx_mode)(struct usbnet *dev); > > + /* register netdev - defaults to register_netdev() */ > + int (*register_netdev)(struct net_device *dev); > + > + /* unregister netdev - defaults to unregister_netdev() */ > + void (*unregister_netdev)(struct net_device *dev); > + > /* for new devices, use the descriptor-reading code instead */ > int in; /* rx endpoint */ > int out; /* tx endpoint *