From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
Paul McKenney <paulmck@kernel.org>,
Matthew Wilcox <willy@infradead.org>,
Christian Benvenuti <benve@cisco.com>,
Govindarajulu Varadarajan <_govind@gmx.com>,
Dave Miller <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>,
netdev@vger.kernel.org, Jonathan Corbet <corbet@lwn.net>,
Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,
linux-doc@vger.kernel.org,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Luc Van Oostenryck <luc.vanoostenryck@gmail.com>,
Jay Cliburn <jcliburn@gmail.com>,
Chris Snook <chris.snook@gmail.com>,
Vishal Kulkarni <vishal@chelsio.com>,
Jeff Kirsher <jeffrey.t.kirsher@intel.com>,
intel-wired-lan@lists.osuosl.org,
Shannon Nelson <snelson@pensando.io>,
Pensando Drivers <drivers@pensando.io>,
Andrew Lunn <andrew@lunn.ch>,
Heiner Kallweit <hkallweit1@gmail.com>,
Russell King <linux@armlinux.org.uk>,
Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
Solarflare linux maintainers <linux-net-drivers@solarflare.com>,
Edward Cree <ecree@solarflare.com>,
Martin Habets <mhabets@solarflare.com>,
Jon Mason <jdmason@kudzu.us>, Daniel Drake <dsd@gentoo.org>,
Ulrich Kunitz <kune@deine-taler.de>,
Kalle Valo <kvalo@codeaurora.org>,
linux-wireless@vger.kernel.org, linux-usb@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Arend van Spriel <arend.vanspriel@broadcom.com>,
Franky Lin <franky.lin@broadcom.com>,
Hante Meuleman <hante.meuleman@broadcom.com>,
Chi-Hsien Lin <chi-hsien.lin@cypress.com>,
Wright Feng <wright.feng@cypress.com>,
brcm80211-dev-list.pdl@broadcom.com,
brcm80211-dev-list@cypress.com,
Stanislav Yakovlev <stas.yakovlev@gmail.com>,
Stanislaw Gruszka <stf_xl@wp.pl>,
Johannes Berg <johannes.berg@intel.com>,
Emmanuel Grumbach <emmanuel.grumbach@intel.com>,
Luca Coelho <luciano.coelho@intel.com>,
Intel Linux Wireless <linuxwifi@intel.com>,
Jouni Malinen <j@w1.fi>, Amitkumar Karwar <amitkarwar@gmail.com>,
Ganapathi Bhat <ganapathi.bhat@nxp.com>,
Xinming Hu <huxinming820@gmail.com>,
libertas-dev@lists.infradead.org,
Pascal Terjan <pterjan@google.com>,
Ping-Ke Shih <pkshih@realtek.com>
Subject: [patch V2 22/36] net: usb: kaweth: Remove last user of kaweth_control()
Date: Tue, 29 Sep 2020 22:25:31 +0200 [thread overview]
Message-ID: <20200929203501.695494860@linutronix.de> (raw)
In-Reply-To: 20200929202509.673358734@linutronix.de
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kaweth_async_set_rx_mode() invokes kaweth_contol() and has two callers:
- kaweth_open() which is invoked from preemptible context
.
- kaweth_start_xmit() which holds a spinlock and has bottom halfs disabled.
If called from kaweth_start_xmit() kaweth_async_set_rx_mode() obviously
cannot block, which means it can't call kaweth_control(). This is detected
with an in_interrupt() check.
Replace the in_interrupt() check in kaweth_async_set_rx_mode() with an
argument which is set true by the caller if the context is safe to sleep,
otherwise false.
Now kaweth_control() is only called from preemptible context which means
there is no need for GFP_ATOMIC allocations anymore. Replace it with
usb_control_msg(). Cleanup the code a bit while at it.
Finally remove kaweth_control() since the last user is gone.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/net/usb/kaweth.c | 168 ++++-------------------------------------------
1 file changed, 17 insertions(+), 151 deletions(-)
--- a/drivers/net/usb/kaweth.c
+++ b/drivers/net/usb/kaweth.c
@@ -103,10 +103,6 @@ static int kaweth_probe(
const struct usb_device_id *id /* from id_table */
);
static void kaweth_disconnect(struct usb_interface *intf);
-static int kaweth_internal_control_msg(struct usb_device *usb_dev,
- unsigned int pipe,
- struct usb_ctrlrequest *cmd, void *data,
- int len, int timeout);
static int kaweth_suspend(struct usb_interface *intf, pm_message_t message);
static int kaweth_resume(struct usb_interface *intf);
@@ -236,48 +232,6 @@ struct kaweth_device
};
/****************************************************************
- * kaweth_control
- ****************************************************************/
-static int kaweth_control(struct kaweth_device *kaweth,
- unsigned int pipe,
- __u8 request,
- __u8 requesttype,
- __u16 value,
- __u16 index,
- void *data,
- __u16 size,
- int timeout)
-{
- struct usb_ctrlrequest *dr;
- int retval;
-
- if(in_interrupt()) {
- netdev_dbg(kaweth->net, "in_interrupt()\n");
- return -EBUSY;
- }
-
- dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC);
- if (!dr)
- return -ENOMEM;
-
- dr->bRequestType = requesttype;
- dr->bRequest = request;
- dr->wValue = cpu_to_le16(value);
- dr->wIndex = cpu_to_le16(index);
- dr->wLength = cpu_to_le16(size);
-
- retval = kaweth_internal_control_msg(kaweth->dev,
- pipe,
- dr,
- data,
- size,
- timeout);
-
- kfree(dr);
- return retval;
-}
-
-/****************************************************************
* kaweth_read_configuration
****************************************************************/
static int kaweth_read_configuration(struct kaweth_device *kaweth)
@@ -531,7 +485,8 @@ static int kaweth_resubmit_rx_urb(struct
return result;
}
-static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth);
+static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth,
+ bool may_sleep);
/****************************************************************
* kaweth_usb_receive
@@ -661,7 +616,7 @@ static int kaweth_open(struct net_device
netif_start_queue(net);
- kaweth_async_set_rx_mode(kaweth);
+ kaweth_async_set_rx_mode(kaweth, true);
return 0;
err_out:
@@ -749,7 +704,7 @@ static netdev_tx_t kaweth_start_xmit(str
spin_lock_irq(&kaweth->device_lock);
- kaweth_async_set_rx_mode(kaweth);
+ kaweth_async_set_rx_mode(kaweth, false);
netif_stop_queue(net);
if (IS_BLOCKED(kaweth->status)) {
goto skip;
@@ -826,36 +781,31 @@ static void kaweth_set_rx_mode(struct ne
/****************************************************************
* kaweth_async_set_rx_mode
****************************************************************/
-static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth)
+static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth,
+ bool may_sleep)
{
- int result;
+ int ret;
__u16 packet_filter_bitmap = kaweth->packet_filter_bitmap;
kaweth->packet_filter_bitmap = 0;
if (packet_filter_bitmap == 0)
return;
- if (in_interrupt())
+ if (!may_sleep)
return;
- result = kaweth_control(kaweth,
- usb_sndctrlpipe(kaweth->dev, 0),
- KAWETH_COMMAND_SET_PACKET_FILTER,
- USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
- packet_filter_bitmap,
- 0,
- (void *)&kaweth->scratch,
- 0,
- KAWETH_CONTROL_TIMEOUT);
-
- if(result < 0) {
+ ret = usb_control_msg(kaweth->dev, usb_sndctrlpipe(kaweth->dev, 0),
+ KAWETH_COMMAND_SET_PACKET_FILTER,
+ USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+ packet_filter_bitmap, 0,
+ &kaweth->scratch, 0,
+ KAWETH_CONTROL_TIMEOUT);
+ if (ret < 0)
dev_err(&kaweth->intf->dev, "Failed to set Rx mode: %d\n",
- result);
- }
- else {
+ ret);
+ else
netdev_dbg(kaweth->net, "Set Rx mode to %d\n",
packet_filter_bitmap);
- }
}
/****************************************************************
@@ -1163,88 +1113,4 @@ static void kaweth_disconnect(struct usb
}
-// FIXME this completion stuff is a modified clone of
-// an OLD version of some stuff in usb.c ...
-struct usb_api_data {
- wait_queue_head_t wqh;
- int done;
-};
-
-/*-------------------------------------------------------------------*
- * completion handler for compatibility wrappers (sync control/bulk) *
- *-------------------------------------------------------------------*/
-static void usb_api_blocking_completion(struct urb *urb)
-{
- struct usb_api_data *awd = (struct usb_api_data *)urb->context;
-
- awd->done=1;
- wake_up(&awd->wqh);
-}
-
-/*-------------------------------------------------------------------*
- * COMPATIBILITY STUFF *
- *-------------------------------------------------------------------*/
-
-// Starts urb and waits for completion or timeout
-static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length)
-{
- struct usb_api_data awd;
- int status;
-
- init_waitqueue_head(&awd.wqh);
- awd.done = 0;
-
- urb->context = &awd;
- status = usb_submit_urb(urb, GFP_ATOMIC);
- if (status) {
- // something went wrong
- usb_free_urb(urb);
- return status;
- }
-
- if (!wait_event_timeout(awd.wqh, awd.done, timeout)) {
- // timeout
- dev_warn(&urb->dev->dev, "usb_control/bulk_msg: timeout\n");
- usb_kill_urb(urb); // remove urb safely
- status = -ETIMEDOUT;
- }
- else {
- status = urb->status;
- }
-
- if (actual_length) {
- *actual_length = urb->actual_length;
- }
-
- usb_free_urb(urb);
- return status;
-}
-
-/*-------------------------------------------------------------------*/
-// returns status (negative) or length (positive)
-static int kaweth_internal_control_msg(struct usb_device *usb_dev,
- unsigned int pipe,
- struct usb_ctrlrequest *cmd, void *data,
- int len, int timeout)
-{
- struct urb *urb;
- int retv;
- int length = 0; /* shut up GCC */
-
- urb = usb_alloc_urb(0, GFP_ATOMIC);
- if (!urb)
- return -ENOMEM;
-
- usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char*)cmd, data,
- len, usb_api_blocking_completion, NULL);
-
- retv = usb_start_wait_urb(urb, timeout, &length);
- if (retv < 0) {
- return retv;
- }
- else {
- return length;
- }
-}
-
module_usb_driver(kaweth_driver);
next prev parent reply other threads:[~2020-09-29 20:38 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-29 20:25 [patch V2 00/36] net: in_interrupt() cleanup and fixes Thomas Gleixner
2020-09-29 20:25 ` [patch V2 01/36] net: enic: Cure the enic api locking trainwreck Thomas Gleixner
2020-09-29 20:25 ` [patch V2 02/36] net: caif: Remove unused caif SPI driver Thomas Gleixner
2020-09-29 20:25 ` [patch V2 03/36] net: Add netif_rx_any_context() Thomas Gleixner
2020-09-29 20:25 ` [patch V2 04/36] net: caif: Use netif_rx_any_context() Thomas Gleixner
2020-09-29 20:25 ` [patch V2 05/36] net: atheros: Remove WARN_ON(in_interrupt()) Thomas Gleixner
2020-09-29 20:25 ` [patch V2 06/36] net: cxgb3: Cleanup in_interrupt() usage Thomas Gleixner
2020-09-29 20:25 ` [patch V2 07/36] net: cxbg4: Remove pointless in_interrupt() check Thomas Gleixner
2020-09-29 20:25 ` [patch V2 08/36] net: e100: Remove in_interrupt() usage and pointless GFP_ATOMIC allocation Thomas Gleixner
2020-09-29 20:25 ` [patch V2 09/36] net: fec_mpc52xx: Replace in_interrupt() usage Thomas Gleixner
2020-09-29 20:25 ` [patch V2 10/36] net: intel: Remove in_interrupt() warnings Thomas Gleixner
2020-09-29 20:25 ` [patch V2 11/36] net: ionic: Replace in_interrupt() usage Thomas Gleixner
2020-09-29 23:06 ` Shannon Nelson
2020-09-29 20:25 ` [patch V2 12/36] net: ionic: Remove WARN_ON(in_interrupt()) Thomas Gleixner
2020-09-29 20:25 ` [patch V2 13/36] net: mdiobus: Remove WARN_ON_ONCE(in_interrupt()) Thomas Gleixner
2020-09-29 20:25 ` [patch V2 14/36] net: natsemi: Replace in_interrupt() usage Thomas Gleixner
2020-09-29 20:25 ` [patch V2 15/36] net: sfc: " Thomas Gleixner
2020-09-29 20:25 ` [patch V2 16/36] net: sfc: Use GFP_KERNEL in efx_ef10_try_update_nic_stats() Thomas Gleixner
2020-09-30 8:00 ` Martin Habets
2020-09-29 20:25 ` [patch V2 17/36] net: sunbmac: Replace in_interrupt() usage Thomas Gleixner
2020-09-29 20:25 ` [patch V2 18/36] net: sun3lance: Remove redundant checks in interrupt handler Thomas Gleixner
2020-09-29 20:25 ` [patch V2 19/36] net: vxge: Remove in_interrupt() conditionals Thomas Gleixner
2020-09-29 20:25 ` [patch V2 20/36] net: zd1211rw: Remove ZD_ASSERT(in_interrupt()) Thomas Gleixner
2020-09-29 20:25 ` [patch V2 21/36] net: usb: kaweth: Replace kaweth_control() with usb_control_msg() Thomas Gleixner
2020-09-30 6:22 ` Greg Kroah-Hartman
2020-09-29 20:25 ` Thomas Gleixner [this message]
2020-09-29 20:25 ` [patch V2 23/36] net: usb: net1080: Remove in_interrupt() comment Thomas Gleixner
2020-09-29 20:25 ` [patch V2 24/36] net: wan/lmc: Remove lmc_trace() Thomas Gleixner
2020-09-29 20:25 ` [patch V2 25/36] net: brcmfmac: Replace in_interrupt() Thomas Gleixner
2020-09-29 20:25 ` [patch V2 26/36] net: brcmfmac: Convey execution context via argument to brcmf_netif_rx() Thomas Gleixner
2020-09-29 22:03 ` Arend Van Spriel
2020-09-29 20:25 ` [patch V2 27/36] net: brcmfmac: Convey allocation mode as argument Thomas Gleixner
2020-09-29 22:07 ` Arend Van Spriel
2020-09-29 20:25 ` [patch V2 28/36] net: ipw2x00,iwlegacy,iwlwifi: Remove in_interrupt() from debug macros Thomas Gleixner
2020-09-29 20:25 ` [patch V2 29/36] net: iwlwifi: Remove in_interrupt() from tracing macro Thomas Gleixner
2020-09-29 20:25 ` [patch V2 30/36] net: hostap: Remove in_interrupt() usage Thomas Gleixner
2020-09-29 20:25 ` [patch V2 31/36] net: mwifiex: Use netif_rx_any_context() Thomas Gleixner
2020-09-29 20:25 ` [patch V2 32/36] net: libertas libertas_tf: Remove in_interrupt() from debug macro Thomas Gleixner
2020-09-29 20:25 ` [patch V2 33/36] net: libertas: Use netif_rx_any_context() Thomas Gleixner
2020-09-29 21:53 ` James Cameron
2020-09-29 20:25 ` [patch V2 34/36] net: rtlwifi: Remove void* casts related to delayed work Thomas Gleixner
2020-09-29 20:25 ` [patch V2 35/36] net: rtlwifi: Remove in_interrupt() from debug macro Thomas Gleixner
2020-09-29 20:25 ` [patch V2 36/36] net: rtlwifi: Replace in_interrupt() for context detection Thomas Gleixner
2020-09-29 21:22 ` [patch V2 00/36] net: in_interrupt() cleanup and fixes David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200929203501.695494860@linutronix.de \
--to=tglx@linutronix.de \
--cc=_govind@gmx.com \
--cc=amitkarwar@gmail.com \
--cc=andrew@lunn.ch \
--cc=arend.vanspriel@broadcom.com \
--cc=benve@cisco.com \
--cc=bigeasy@linutronix.de \
--cc=brcm80211-dev-list.pdl@broadcom.com \
--cc=brcm80211-dev-list@cypress.com \
--cc=chi-hsien.lin@cypress.com \
--cc=chris.snook@gmail.com \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=drivers@pensando.io \
--cc=dsd@gentoo.org \
--cc=ecree@solarflare.com \
--cc=emmanuel.grumbach@intel.com \
--cc=franky.lin@broadcom.com \
--cc=ganapathi.bhat@nxp.com \
--cc=gregkh@linuxfoundation.org \
--cc=hante.meuleman@broadcom.com \
--cc=hkallweit1@gmail.com \
--cc=huxinming820@gmail.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=j@w1.fi \
--cc=jcliburn@gmail.com \
--cc=jdmason@kudzu.us \
--cc=jeffrey.t.kirsher@intel.com \
--cc=johannes.berg@intel.com \
--cc=kuba@kernel.org \
--cc=kune@deine-taler.de \
--cc=kvalo@codeaurora.org \
--cc=libertas-dev@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-net-drivers@solarflare.com \
--cc=linux-usb@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=linuxwifi@intel.com \
--cc=luc.vanoostenryck@gmail.com \
--cc=luciano.coelho@intel.com \
--cc=mchehab+huawei@kernel.org \
--cc=mhabets@solarflare.com \
--cc=netdev@vger.kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=pkshih@realtek.com \
--cc=pterjan@google.com \
--cc=snelson@pensando.io \
--cc=stas.yakovlev@gmail.com \
--cc=stf_xl@wp.pl \
--cc=tsbogend@alpha.franken.de \
--cc=vishal@chelsio.com \
--cc=willy@infradead.org \
--cc=wright.feng@cypress.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).