Message ID | 20160521160910.GA14945@debian-dorm (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Shuyu Wei <wsy2220@gmail.com> : [...] > 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.
On 21.05.2016 21:47, Francois Romieu wrote: > Shuyu Wei <wsy2220@gmail.com> : > [...] >> 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. As far as I understood he was referring to the dma descriptor. Lino
Lino Sanfilippo <LinoSanfilippo@gmx.de> : > On 21.05.2016 21:47, Francois Romieu wrote: > > Shuyu Wei <wsy2220@gmail.com> : > > [...] > >> 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().
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(); + *info = cpu_to_le32(FOR_EMAC | FIRST_OR_LAST_MASK | len); /* Make sure info word is set */