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