On 2014-02-21 06:25, Tim Harvey wrote:
> The combination of r35942 and r35952 causes an issue where eth_schedule_poll()
> can be called from a different CPU between the call to napi_complete() and the
> setting of cur_index which can break the rx ring accounting and cause ethernet
> latency and/or ethernet stalls.  The issue can be easilly created by adding
> a couple of artificial delays such as:
> 
> @@ -715,6 +715,7 @@ static int eth_poll(struct napi_struct *napi, int budget)
> 
>       if (!received) {
>               napi_complete(napi);
> +udelay(1000);
>               enable_irq(IRQ_CNS3XXX_SW_R0RXC);
>       }
> 
> @@ -727,6 +728,7 @@ static int eth_poll(struct napi_struct *napi, int budget)
>       rx_ring->cur_index = i;
> 
>       wmb();
> +udelay(1000);
>       enable_rx_dma(sw);
> 
>       return received;
> 
> This patch moves the setting of cur_index back up where it needs to be and
> addresses the original corner case that r35942 was trying to catch in an
> improved fashion by checking to see if the rx descriptor ring has become
> full before interrupts were re-enabled so that a poll can be scheduled again
> and avoid an rx stall caused by rx interrupts ceasing to fire again.
> 
> Signed-off-by: Tim Harvey <[email protected]>
Applied in r39761

Thanks,

- Felix
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to