Hi,

this fixes the logic kaweth uses to deal with ENOMEM from
usb_submit_urb(). Using the interrupt endpoint's completion
handller is longer an option because automagic resubmission
has been removed. Thus we use workqueues which can be delayed
so that kswapd can do its job and can use GFP_NOIO which is much
likelier to succeed.

        Regards
                Oliver

You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


[EMAIL PROTECTED], 2003-06-24 22:57:52+02:00, [EMAIL PROTECTED]
  - change handling of ENOMEM to deal with removal of interrupt
    autoresubmission


 kaweth.c |   67 +++++++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 53 insertions(+), 14 deletions(-)


diff -Nru a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c
--- a/drivers/usb/net/kaweth.c  Tue Jun 24 22:59:14 2003
+++ b/drivers/usb/net/kaweth.c  Tue Jun 24 22:59:14 2003
@@ -217,8 +217,10 @@
        __u32 status;
        int end;
        int removed;
-       int suspend_lowmem;
+       int suspend_lowmem_rx;
+       int suspend_lowmem_ctrl;
        int linkstate;
+       struct work_struct lowmem_work;
 
        struct usb_device *dev;
        struct net_device *net;
@@ -477,14 +479,29 @@
 /****************************************************************
        int_callback
 *****************************************************************/
+
+static void kaweth_resubmit_int_urb(struct kaweth_device *kaweth, int mf)
+{
+       int status;
+
+       status = usb_submit_urb (kaweth->irq_urb, mf);
+       if (unlikely(status == -ENOMEM)) {
+               kaweth->suspend_lowmem_ctrl = 1;
+               schedule_delayed_work(&kaweth->lowmem_work, HZ/4);
+       } else {
+               kaweth->suspend_lowmem_ctrl = 0;
+       }
+
+       if (status)
+               err ("can't resubmit intr, %s-%s, status %d",
+                               kaweth->dev->bus->bus_name,
+                               kaweth->dev->devpath, status);
+}
+
 static void int_callback(struct urb *u, struct pt_regs *regs)
 {
        struct kaweth_device *kaweth = u->context;
-       int act_state, status;
-
-       /* we abuse the interrupt urb for rebsubmitting under low memory saving a 
timer */
-       if (kaweth->suspend_lowmem)
-               kaweth_resubmit_rx_urb(kaweth, GFP_ATOMIC);
+       int act_state;
 
        switch (u->status) {
        case 0:                 /* success */
@@ -508,13 +525,24 @@
                kaweth->linkstate = act_state;
        }
 resubmit:
-       status = usb_submit_urb (u, SLAB_ATOMIC);
-       if (status)
-               err ("can't resubmit intr, %s-%s, status %d",
-                               kaweth->dev->bus->bus_name,
-                               kaweth->dev->devpath, status);
+       kaweth_resubmit_int_urb(kaweth, GFP_ATOMIC);
+}
+
+static void kaweth_resubmit_tl(void *d)
+{
+       struct kaweth_device *kaweth = (struct kaweth_device *)d;
+
+       if (kaweth->status | KAWETH_STATUS_CLOSING)
+               return;
+
+       if (kaweth->suspend_lowmem_rx)
+               kaweth_resubmit_rx_urb(kaweth, GFP_NOIO);
+
+       if (kaweth->suspend_lowmem_ctrl)
+               kaweth_resubmit_int_urb(kaweth, GFP_NOIO);
 }
 
+
 /****************************************************************
  *     kaweth_resubmit_rx_urb
  ****************************************************************/
@@ -534,11 +562,13 @@
        kaweth->rx_urb->transfer_dma = kaweth->rxbufferhandle;
 
        if((result = usb_submit_urb(kaweth->rx_urb, mem_flags))) {
-               if (result == -ENOMEM)
-                       kaweth->suspend_lowmem = 1;
+               if (result == -ENOMEM) {
+                       kaweth->suspend_lowmem_rx = 1;
+                       schedule_delayed_work(&kaweth->lowmem_work, HZ/4);
+               }
                kaweth_err("resubmitting rx_urb %d failed", result);
        } else {
-               kaweth->suspend_lowmem = 0;
+               kaweth->suspend_lowmem_rx = 0;
        }
 
        return result;
@@ -667,6 +697,13 @@
        usb_unlink_urb(kaweth->irq_urb);
        usb_unlink_urb(kaweth->rx_urb);
 
+       flush_scheduled_work();
+
+       /* a scheduled work may have resubmitted,
+          we hit them again */
+       usb_unlink_urb(kaweth->irq_urb);
+       usb_unlink_urb(kaweth->rx_urb);
+
        kaweth->status &= ~KAWETH_STATUS_CLOSING;
 
        return 0;
@@ -1076,6 +1113,8 @@
        kaweth->net->mtu = le16_to_cpu(kaweth->configuration.segment_size);
 
        memset(&kaweth->stats, 0, sizeof(kaweth->stats));
+
+       INIT_WORK(&kaweth->lowmem_work, kaweth_resubmit_tl, (void *)kaweth);
 
        SET_MODULE_OWNER(netdev);
 

===================================================================


This BitKeeper patch contains the following changesets:
1.1988
## Wrapped with gzip_uu ##


begin 664 bkpatch10522
M'XL(`*.[^#X``ZU6^T_C.!#^.?XK1KOBKF7[B)U7'RI:#CBH6"B"HI5.)T5I
MXK91\V`=AX*N][_?.$D++"V[QUU5)8['\\W,-Y^=?(3;C(N>ED;A/1?D(YRE
MF>QI.([S@">MA.>+/&ZE8H:VZS1%6WN>QKQ=.K3'@O.LO?"67,YC+F:<X+HK
M3_IS0'/6TVC+V,S(QSO>TZY/3F^_'%X3,AC`T=Q+9OR&2Q@,R&3Q.<AYU%J(
MU)NKD*N-><5TG5+*+-VP;&JM6,<PS!6U]4F`PX`YW>G$[I(RJ<];LG\)9>@V
M,[EMAIL PROTECTED]'(.M=--A!CD&[EMAIL PROTECTED];;68"[EMAIL PROTECTED]>$3A:9.?H/_
MGO\1\:$)?N$%>`VB,)E!.H63R]'%R07(%`+N1;`,[EMAIL PROTECTED]'XG
MT1_`RV4J>)9/XC#+PC0AYX`U6N3JB6[2_)<_0G1/)P=;:@R$(B9KY]FDTD'+
M?RK7U+M,7QFL0XV5;=L!U4UOXGO4"NS.&YR^0$VX?(&LNF<RW7+,[HH97<H*
M*>WRV*ZL]V?]ELA^E'6A.:8:;[-.H3E'_UYQ9O<G%&<9T*3F_ZBY.`W":<@#
MB-)9Z+\4VI/XEJE8P+><YSQ#497<CZ`IEL4?57*ULPWO4-PQ8SI0,E0W1C04
M.61Y=L>3P(W29<QC5SSTM\[[4D1]Y4C17\NDR'U9).]6XVJ=FL)UIM,%VB5_
MDDQZ$JN_3\,`RL3=:B-)%\.XN9C4*H3*'/#[T.>P7SXVU$Z$>%HG?U5Y(6">
M]1%:*X<P`&3&K3`1#VJE:_,@%-_41$/YJ[*F4,N3*%SPZ+&V=AY`L^Q&O0X8
M0EO[;JD?(U&$T3)_SH,\XIAJY#WRH"BZ]LO:\QD3#3C[HVVJV'\#CS+^$Q%T
MM5A5I[(MDZRC$QY&4/O@>\FO$M8$*FI$`_:RYE[6J(B!O>!#`]<_A4$^FP>3
M/"LN;N+%?(L=+W>>8KN*V"<JAV.S8X"%W>PXJNN*?L^7KEK#^^38HE19+6H!
MM8BVJ[WK1I[^?N4>CD<7PZ,*_BUMR*A6S.\'1>[EMAIL PROTECTED]"]:"_9G)#>LG2
M"LX/OYZ,S]R;\>'X]L8]^C*Z&5Z>*J8%E[E(7CM^OT_JFU8^92T>7E5\.1J.
MZC]"4[W?AK>[EMAIL PROTECTED]:5=-P299AH.;>[EMAIL PROTECTED]'3`10X51`)%\+NY">;ND)Q[6TGZ7
MME&OQY:I#H9A>7L[$"I\:-M=<(@VC?)L[JYC5L%*MMK[X,'&4IZ3L?>([_![
MOMD!D@<H9GQ!+_'ECAM"SGD,WLP+$]AO$TV="VK#)XMG+&Z.!97ZCA5E'XM$
[EMAIL PROTECTED]'([=KZ/K\QU\O-9P`RH5UTL;(FX^W;`T?Y'E\<"R+8,ROTO^
)`2%Z1``Z"@``
`
end



-------------------------------------------------------
This SF.Net email is sponsored by: INetU
Attention Web Developers & Consultants: Become An INetU Hosting Partner.
Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission!
INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to