* usbnet: PM related fixes
@ 2012-06-13 4:20 Ming Lei
[not found] ` <1339561217-18151-1-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
2012-06-13 4:20 ` [PATCH 3/3] usbnet: handle remote wakeup asap Ming Lei
0 siblings, 2 replies; 7+ messages in thread
From: Ming Lei @ 2012-06-13 4:20 UTC (permalink / raw)
To: David S. Miller, Greg Kroah-Hartman; +Cc: Oliver Neukum, netdev, linux-usb
Hi David,
The 3 patches fix some PM related problems.
Sorry for sending them after the cleanup patches since I found them just
after sending out the cleanup patches.
drivers/net/usb/usbnet.c | 47 +++++++++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 17 deletions(-)
^ permalink raw reply [flat|nested] 7+ messages in thread[parent not found: <1339561217-18151-1-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>]
* [PATCH 1/3] usbnet: clear OPEN flag in failure path [not found] ` <1339561217-18151-1-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> @ 2012-06-13 4:20 ` Ming Lei 2012-06-13 4:20 ` [PATCH 2/3] usbnet: decrease suspend count if returning -EBUSY for runtime suspend Ming Lei 1 sibling, 0 replies; 7+ messages in thread From: Ming Lei @ 2012-06-13 4:20 UTC (permalink / raw) To: David S. Miller, Greg Kroah-Hartman Cc: Oliver Neukum, netdev-u79uwXL29TY76Z2rM5mHXA, linux-usb-u79uwXL29TY76Z2rM5mHXA, Ming Lei, stable-u79uwXL29TY76Z2rM5mHXA Without clearing OPEN flag in failure path, runtime or system resume may submit interrupt/rx URB and start tx queue mistakenly on a interface in DOWN state. Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Signed-off-by: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> --- drivers/net/usb/usbnet.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index ac2e493..f06cf9b 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -793,11 +793,13 @@ int usbnet_open (struct net_device *net) if (info->manage_power) { retval = info->manage_power(dev, 1); if (retval < 0) - goto done; + goto done_manage_power_error; usb_autopm_put_interface(dev->intf); } return retval; +done_manage_power_error: + clear_bit(EVENT_DEV_OPEN, &dev->flags); done: usb_autopm_put_interface(dev->intf); done_nopm: -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] usbnet: decrease suspend count if returning -EBUSY for runtime suspend [not found] ` <1339561217-18151-1-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> 2012-06-13 4:20 ` [PATCH 1/3] usbnet: clear OPEN flag in failure path Ming Lei @ 2012-06-13 4:20 ` Ming Lei 1 sibling, 0 replies; 7+ messages in thread From: Ming Lei @ 2012-06-13 4:20 UTC (permalink / raw) To: David S. Miller, Greg Kroah-Hartman Cc: Oliver Neukum, netdev-u79uwXL29TY76Z2rM5mHXA, linux-usb-u79uwXL29TY76Z2rM5mHXA, Ming Lei, stable-u79uwXL29TY76Z2rM5mHXA This patch decreases dev->suspend_count in the -EBUSY failure path of usbnet_suspend. Without the change, the later runtime suspend will do nothing except for increasing dev->suspend_count. Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Signed-off-by: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> --- drivers/net/usb/usbnet.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index f06cf9b..9bfa775 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -1508,6 +1508,7 @@ int usbnet_suspend (struct usb_interface *intf, pm_message_t message) spin_lock_irq(&dev->txq.lock); /* don't autosuspend while transmitting */ if (dev->txq.qlen && PMSG_IS_AUTO(message)) { + dev->suspend_count--; spin_unlock_irq(&dev->txq.lock); return -EBUSY; } else { -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] usbnet: handle remote wakeup asap 2012-06-13 4:20 usbnet: PM related fixes Ming Lei [not found] ` <1339561217-18151-1-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> @ 2012-06-13 4:20 ` Ming Lei [not found] ` <1339561217-18151-4-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> 1 sibling, 1 reply; 7+ messages in thread From: Ming Lei @ 2012-06-13 4:20 UTC (permalink / raw) To: David S. Miller, Greg Kroah-Hartman Cc: Oliver Neukum, netdev, linux-usb, Ming Lei, stable If usbnet is resumed by remote wakeup, generally there are some packets comming to be handled, so allocate and submit rx URBs in usbnet_resume to avoid delays introduced by tasklet. Otherwise, usbnet may have been runtime suspended before the usbnet_bh is executed to schedule Rx URBs. Without the patch, usbnet can't recieve any packets from peer in runtime suspend state if runtime PM is enabled and autosuspend_delay is set as zero. Cc: stable@vger.kernel.org Signed-off-by: Ming Lei <ming.lei@canonical.com> --- drivers/net/usb/usbnet.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 9bfa775..4911efa 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -1201,6 +1201,21 @@ deferred: } EXPORT_SYMBOL_GPL(usbnet_start_xmit); +static void rx_alloc_submit(struct usbnet *dev, gfp_t flags) +{ + struct urb *urb; + int i; + + /* don't refill the queue all at once */ + for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) { + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (urb != NULL) { + if (rx_submit(dev, urb, flags) == -ENOLINK) + return; + } + } +} + /*-------------------------------------------------------------------------*/ // tasklet (work deferred from completions, in_irq) or timer @@ -1240,26 +1255,14 @@ static void usbnet_bh (unsigned long param) !timer_pending (&dev->delay) && !test_bit (EVENT_RX_HALT, &dev->flags)) { int temp = dev->rxq.qlen; - int qlen = RX_QLEN (dev); - - if (temp < qlen) { - struct urb *urb; - int i; - - // don't refill the queue all at once - for (i = 0; i < 10 && dev->rxq.qlen < qlen; i++) { - urb = usb_alloc_urb (0, GFP_ATOMIC); - if (urb != NULL) { - if (rx_submit (dev, urb, GFP_ATOMIC) == - -ENOLINK) - return; - } - } + + if (temp < RX_QLEN(dev)) { + rx_alloc_submit(dev, GFP_ATOMIC); if (temp != dev->rxq.qlen) netif_dbg(dev, link, dev->net, "rxqlen %d --> %d\n", temp, dev->rxq.qlen); - if (dev->rxq.qlen < qlen) + if (dev->rxq.qlen < RX_QLEN(dev)) tasklet_schedule (&dev->bh); } if (dev->txq.qlen < TX_QLEN (dev)) @@ -1565,6 +1568,13 @@ int usbnet_resume (struct usb_interface *intf) spin_unlock_irq(&dev->txq.lock); if (test_bit(EVENT_DEV_OPEN, &dev->flags)) { + /* handle remote wakeup ASAP */ + if (!dev->wait && + netif_device_present(dev->net) && + !timer_pending(&dev->delay) && + !test_bit(EVENT_RX_HALT, &dev->flags)) + rx_alloc_submit(dev, GFP_KERNEL); + if (!(dev->txq.qlen >= TX_QLEN(dev))) netif_tx_wake_all_queues(dev->net); tasklet_schedule (&dev->bh); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
[parent not found: <1339561217-18151-4-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>]
* Re: [PATCH 3/3] usbnet: handle remote wakeup asap [not found] ` <1339561217-18151-4-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> @ 2012-06-15 2:22 ` Ming Lei 2012-06-17 23:22 ` David Miller 0 siblings, 1 reply; 7+ messages in thread From: Ming Lei @ 2012-06-15 2:22 UTC (permalink / raw) To: David S. Miller, Greg Kroah-Hartman Cc: Oliver Neukum, netdev-u79uwXL29TY76Z2rM5mHXA, linux-usb-u79uwXL29TY76Z2rM5mHXA, Ming Lei, stable-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 1587 bytes --] On Wed, Jun 13, 2012 at 12:20 PM, Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> wrote: > If usbnet is resumed by remote wakeup, generally there are > some packets comming to be handled, so allocate and submit > rx URBs in usbnet_resume to avoid delays introduced by tasklet. > Otherwise, usbnet may have been runtime suspended before the > usbnet_bh is executed to schedule Rx URBs. > > Without the patch, usbnet can't recieve any packets from peer > in runtime suspend state if runtime PM is enabled and > autosuspend_delay is set as zero. > > Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > Signed-off-by: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> > --- > drivers/net/usb/usbnet.c | 42 ++++++++++++++++++++++++++---------------- > 1 file changed, 26 insertions(+), 16 deletions(-) > > diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c > index 9bfa775..4911efa 100644 > --- a/drivers/net/usb/usbnet.c > +++ b/drivers/net/usb/usbnet.c > @@ -1201,6 +1201,21 @@ deferred: > } > EXPORT_SYMBOL_GPL(usbnet_start_xmit); > > +static void rx_alloc_submit(struct usbnet *dev, gfp_t flags) > +{ > + struct urb *urb; > + int i; > + > + /* don't refill the queue all at once */ > + for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) { > + urb = usb_alloc_urb(0, GFP_ATOMIC); David, sorry, the 'GFP_ATOMIC' above should be 'flags', so could you take the fixed version from attachment? Or could you do it by your self? Thanks, -- Ming Lei [-- Attachment #2: 0003-usbnet-handle-remote-wakeup-asap.patch --] [-- Type: application/octet-stream, Size: 2933 bytes --] From 29155e82eacac23e8fe6c29f2a65d7e4170ba086 Mon Sep 17 00:00:00 2001 From: Ming Lei <ming.lei@canonical.com> Date: Wed, 13 Jun 2012 10:40:17 +0800 Subject: [PATCH 3/3] usbnet: handle remote wakeup asap If usbnet is resumed by remote wakeup, generally there are some packets comming to be handled, so allocate and submit rx URBs in usbnet_resume to avoid delays introduced by tasklet. Otherwise, usbnet may have been runtime suspended before the usbnet_bh is executed to schedule Rx URBs. Without the patch, usbnet can't recieve any packets from peer in runtime suspend state if runtime PM is enabled and autosuspend_delay is set as zero. Cc: stable@vger.kernel.org Signed-off-by: Ming Lei <ming.lei@canonical.com> --- drivers/net/usb/usbnet.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 9bfa775..4911efa 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -1201,6 +1201,21 @@ deferred: } EXPORT_SYMBOL_GPL(usbnet_start_xmit); +static void rx_alloc_submit(struct usbnet *dev, gfp_t flags) +{ + struct urb *urb; + int i; + + /* don't refill the queue all at once */ + for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) { + urb = usb_alloc_urb(0, flags); + if (urb != NULL) { + if (rx_submit(dev, urb, flags) == -ENOLINK) + return; + } + } +} + /*-------------------------------------------------------------------------*/ // tasklet (work deferred from completions, in_irq) or timer @@ -1240,26 +1255,14 @@ static void usbnet_bh (unsigned long param) !timer_pending (&dev->delay) && !test_bit (EVENT_RX_HALT, &dev->flags)) { int temp = dev->rxq.qlen; - int qlen = RX_QLEN (dev); - - if (temp < qlen) { - struct urb *urb; - int i; - - // don't refill the queue all at once - for (i = 0; i < 10 && dev->rxq.qlen < qlen; i++) { - urb = usb_alloc_urb (0, GFP_ATOMIC); - if (urb != NULL) { - if (rx_submit (dev, urb, GFP_ATOMIC) == - -ENOLINK) - return; - } - } + + if (temp < RX_QLEN(dev)) { + rx_alloc_submit(dev, GFP_ATOMIC); if (temp != dev->rxq.qlen) netif_dbg(dev, link, dev->net, "rxqlen %d --> %d\n", temp, dev->rxq.qlen); - if (dev->rxq.qlen < qlen) + if (dev->rxq.qlen < RX_QLEN(dev)) tasklet_schedule (&dev->bh); } if (dev->txq.qlen < TX_QLEN (dev)) @@ -1565,6 +1568,13 @@ int usbnet_resume (struct usb_interface *intf) spin_unlock_irq(&dev->txq.lock); if (test_bit(EVENT_DEV_OPEN, &dev->flags)) { + /* handle remote wakeup ASAP */ + if (!dev->wait && + netif_device_present(dev->net) && + !timer_pending(&dev->delay) && + !test_bit(EVENT_RX_HALT, &dev->flags)) + rx_alloc_submit(dev, GFP_KERNEL); + if (!(dev->txq.qlen >= TX_QLEN(dev))) netif_tx_wake_all_queues(dev->net); tasklet_schedule (&dev->bh); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] usbnet: handle remote wakeup asap 2012-06-15 2:22 ` Ming Lei @ 2012-06-17 23:22 ` David Miller [not found] ` <20120617.162233.868029041800646826.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: David Miller @ 2012-06-17 23:22 UTC (permalink / raw) To: ming.lei; +Cc: gregkh, oneukum, netdev, linux-usb, stable From: Ming Lei <ming.lei@canonical.com> Date: Fri, 15 Jun 2012 10:22:16 +0800 > David, sorry, the 'GFP_ATOMIC' above should be 'flags', so could > you take the fixed version from attachment? Or could you do it by > your self? You are rushing this patch submission if you are finding such errors right after you post the patch. Take your time and properly audit your work, then resubmit your entire series again once it is really ready. ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <20120617.162233.868029041800646826.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>]
* Re: [PATCH 3/3] usbnet: handle remote wakeup asap [not found] ` <20120617.162233.868029041800646826.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> @ 2012-06-18 1:55 ` Ming Lei 0 siblings, 0 replies; 7+ messages in thread From: Ming Lei @ 2012-06-18 1:55 UTC (permalink / raw) To: David Miller Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, oneukum-l3A5Bk7waGM, netdev-u79uwXL29TY76Z2rM5mHXA, linux-usb-u79uwXL29TY76Z2rM5mHXA, stable-u79uwXL29TY76Z2rM5mHXA On Mon, Jun 18, 2012 at 7:22 AM, David Miller <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> wrote: > From: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> > Date: Fri, 15 Jun 2012 10:22:16 +0800 > >> David, sorry, the 'GFP_ATOMIC' above should be 'flags', so could >> you take the fixed version from attachment? Or could you do it by >> your self? > > You are rushing this patch submission if you are finding such > errors right after you post the patch. > > Take your time and properly audit your work, then resubmit your > entire series again once it is really ready. Good suggestion, I will check the patches again and test them further. Thanks, -- Ming Lei -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-06-18 1:55 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-13 4:20 usbnet: PM related fixes Ming Lei
[not found] ` <1339561217-18151-1-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
2012-06-13 4:20 ` [PATCH 1/3] usbnet: clear OPEN flag in failure path Ming Lei
2012-06-13 4:20 ` [PATCH 2/3] usbnet: decrease suspend count if returning -EBUSY for runtime suspend Ming Lei
2012-06-13 4:20 ` [PATCH 3/3] usbnet: handle remote wakeup asap Ming Lei
[not found] ` <1339561217-18151-4-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
2012-06-15 2:22 ` Ming Lei
2012-06-17 23:22 ` David Miller
[not found] ` <20120617.162233.868029041800646826.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2012-06-18 1:55 ` Ming Lei
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).