Search Linux Wireless

Re: [RFC] ATH9K: infinite loop in Tasklet

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Dec 11, 2012 at 3:31 PM, Cedric VONCKEN
<cedric.voncken@xxxxxxxxx> wrote:
>         Any suggestion to fix correctly this issue ?

having a count to break out from the loop is bit hacky. I would
suggest to enable as many prints and see
why the infinite loop counts(ofcourse you can have a loop count to
figure out and break the loop).

>
>         Best regards.
>
> -----Message d'origine-----
> De : Cedric VONCKEN
> Envoyé : vendredi 7 décembre 2012 16:28
> À : 'linux-wireless@xxxxxxxxxxxxxxx'
> Objet : [RFC] ATH9K: infinite loop in Tasklet
>
>                 Dear mailling list,
>
>                 I think there is a possible infinite loop in ATH9K tasklet, and this loop block the linux kernel.
>
>          In my test based on freescale MPC8315 cpu, the Wireless card is bridged to Ethernet driver (Gianfar). When I receive data from Wifi (iperf -c xx -b50M) to Ethernet, the Gianfar NAPI poll function is never called because the ath_rx_tasklet always loops.
>
>                 In the ath_rx_tasklet(...), the "while" loops until ath_get_next_rx_buf() or ath_edma_get_next_rx_buf returns a buffer.
>
>                 If these functions always  return a buffer, this tasklet always runs. While this tasklet runs, all other tasklets are blocked.
>       To fix it I applied this patch:
>
>       --- recv.c             2012-12-07 14:30:26.000000000 +0100
>       +++ recv.c.new                2012-12-07 14:30:05.364591961 +0100
>       @@ -1067,6 +1067,7 @@
>                      u64 tsf = 0;
>                      u32 tsf_lower = 0;
>                      unsigned long flags;
>       +             int count = 150;
>
>                       if (edma)
>                                     dma_type = DMA_BIDIRECTIONAL;
>       @@ -1085,6 +1086,10 @@
>                                     if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags) && (flush == 0))
>                                                     break;
>
>       +                             if(count <= 0)
>       +                                            break;
>       +
>       +                             count --;
>                                     memset(&rs, 0, sizeof(rs));
>                                     if (edma)
>                                                     bf = ath_edma_get_next_rx_buf(sc, &rs, qtype);
>
>       I think this solution is not correct, because the tasklet is not rescheduled and we always have data in Rx buffer.
>
>                 Have you any suggestion to fix this issue correctly?
>
>                 Thanks for your help.
>
>                 Best regards.
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
thanks,
shafi
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux