Thread (1 message) 1 message, 1 author, 2016-05-22

Re: [PATCH v2] ethernet:arc: Fix racing of TX ring buffer

From: Francois Romieu <hidden>
Date: 2016-05-22 21:21:23
Also in: linux-rockchip

Lino Sanfilippo [off-list ref] :
On 21.05.2016 21:47, Francois Romieu wrote:
quoted
Shuyu Wei [off-list ref] :
[...]
quoted
diff --git a/drivers/net/ethernet/arc/emac_main.c b/drivers/net/ethernet/arc/emac_main.c
index a3a9392..c2447b0 100644
--- a/drivers/net/ethernet/arc/emac_main.c
+++ b/drivers/net/ethernet/arc/emac_main.c
@@ -686,6 +686,9 @@ static int arc_emac_tx(struct sk_buff *skb, struct net_device *ndev)
 
        skb_tx_timestamp(skb);
 
+       /* Make sure timestamp is set */
+       smp_wmb();
Should be dma_wmb() (see davem's message).

It's completely unrelated to SMP.
Its also completely unrelated to dma so I doubt that this is what davem meant.
It's related to dma: nobody wants the device to perform dma from memory
while the CPU is writing timestamp.

The device must enforce a commit of any network buffer memory write before
releasing control, i.e. before writing *info.

See 'git log -p --grep=dma_[rw]mb': it appears several times.
As far as I understood he was referring to the dma descriptor.
If the wmb() between *info = ... and *txbd_curr = ... is replaced by a
dma_wmb(), the device will see a consistent descriptor when if performs
a DMA read after the CPU wrote into the mailbox (arc_reg_set(..., TXPL_MASK)).

Ok, I agree on this one.

However, it doesn't help with the (SMP) requirement that no CPU sees
the txbd_curr write before *info is written by the local CPU. Afaiui
dma_wmb() is too weak for this part. If we don't want wmb() here,
it will have to be dma_wmb() + smp_wmb().

-- 
Ueimor
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help