summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhpreg@vmware.com <hpreg@vmware.com>2018-05-14 08:14:49 -0400
committerDavid S. Miller <davem@davemloft.net>2018-05-14 22:43:57 -0400
commitf3002c1374fb2367c9d8dbb28852791ef90d2bac (patch)
tree07f2fe75de5e4a5fa5ec1fafa90346c89d578f0e
parent61aeecea40afb2b89933e27cd4adb10fc2e75cfd (diff)
vmxnet3: use DMA memory barriers where required
The gen bits must be read first from (resp. written last to) DMA memory. The proper way to enforce this on Linux is to call dma_rmb() (resp. dma_wmb()). Signed-off-by: Regis Duchesne <hpreg@vmware.com> Acked-by: Ronak Doshi <doshir@vmware.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/vmxnet3/vmxnet3_drv.c22
-rw-r--r--drivers/net/vmxnet3/vmxnet3_int.h4
2 files changed, 24 insertions, 2 deletions
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index ed58685c353f..27a9bb8c9611 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -369,6 +369,11 @@ vmxnet3_tq_tx_complete(struct vmxnet3_tx_queue *tq,
369 369
370 gdesc = tq->comp_ring.base + tq->comp_ring.next2proc; 370 gdesc = tq->comp_ring.base + tq->comp_ring.next2proc;
371 while (VMXNET3_TCD_GET_GEN(&gdesc->tcd) == tq->comp_ring.gen) { 371 while (VMXNET3_TCD_GET_GEN(&gdesc->tcd) == tq->comp_ring.gen) {
372 /* Prevent any &gdesc->tcd field from being (speculatively)
373 * read before (&gdesc->tcd)->gen is read.
374 */
375 dma_rmb();
376
372 completed += vmxnet3_unmap_pkt(VMXNET3_TCD_GET_TXIDX( 377 completed += vmxnet3_unmap_pkt(VMXNET3_TCD_GET_TXIDX(
373 &gdesc->tcd), tq, adapter->pdev, 378 &gdesc->tcd), tq, adapter->pdev,
374 adapter); 379 adapter);
@@ -1103,6 +1108,11 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
1103 gdesc->txd.tci = skb_vlan_tag_get(skb); 1108 gdesc->txd.tci = skb_vlan_tag_get(skb);
1104 } 1109 }
1105 1110
1111 /* Ensure that the write to (&gdesc->txd)->gen will be observed after
1112 * all other writes to &gdesc->txd.
1113 */
1114 dma_wmb();
1115
1106 /* finally flips the GEN bit of the SOP desc. */ 1116 /* finally flips the GEN bit of the SOP desc. */
1107 gdesc->dword[2] = cpu_to_le32(le32_to_cpu(gdesc->dword[2]) ^ 1117 gdesc->dword[2] = cpu_to_le32(le32_to_cpu(gdesc->dword[2]) ^
1108 VMXNET3_TXD_GEN); 1118 VMXNET3_TXD_GEN);
@@ -1298,6 +1308,12 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
1298 */ 1308 */
1299 break; 1309 break;
1300 } 1310 }
1311
1312 /* Prevent any rcd field from being (speculatively) read before
1313 * rcd->gen is read.
1314 */
1315 dma_rmb();
1316
1301 BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2 && 1317 BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2 &&
1302 rcd->rqID != rq->dataRingQid); 1318 rcd->rqID != rq->dataRingQid);
1303 idx = rcd->rxdIdx; 1319 idx = rcd->rxdIdx;
@@ -1528,6 +1544,12 @@ rcd_done:
1528 ring->next2comp = idx; 1544 ring->next2comp = idx;
1529 num_to_alloc = vmxnet3_cmd_ring_desc_avail(ring); 1545 num_to_alloc = vmxnet3_cmd_ring_desc_avail(ring);
1530 ring = rq->rx_ring + ring_idx; 1546 ring = rq->rx_ring + ring_idx;
1547
1548 /* Ensure that the writes to rxd->gen bits will be observed
1549 * after all other writes to rxd objects.
1550 */
1551 dma_wmb();
1552
1531 while (num_to_alloc) { 1553 while (num_to_alloc) {
1532 vmxnet3_getRxDesc(rxd, &ring->base[ring->next2fill].rxd, 1554 vmxnet3_getRxDesc(rxd, &ring->base[ring->next2fill].rxd,
1533 &rxCmdDesc); 1555 &rxCmdDesc);
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h
index b379bed5f51d..a2c554f8a61b 100644
--- a/drivers/net/vmxnet3/vmxnet3_int.h
+++ b/drivers/net/vmxnet3/vmxnet3_int.h
@@ -69,12 +69,12 @@
69/* 69/*
70 * Version numbers 70 * Version numbers
71 */ 71 */
72#define VMXNET3_DRIVER_VERSION_STRING "1.4.15.0-k" 72#define VMXNET3_DRIVER_VERSION_STRING "1.4.16.0-k"
73 73
74/* Each byte of this 32-bit integer encodes a version number in 74/* Each byte of this 32-bit integer encodes a version number in
75 * VMXNET3_DRIVER_VERSION_STRING. 75 * VMXNET3_DRIVER_VERSION_STRING.
76 */ 76 */
77#define VMXNET3_DRIVER_VERSION_NUM 0x01040f00 77#define VMXNET3_DRIVER_VERSION_NUM 0x01041000
78 78
79#if defined(CONFIG_PCI_MSI) 79#if defined(CONFIG_PCI_MSI)
80 /* RSS only makes sense if MSI-X is supported. */ 80 /* RSS only makes sense if MSI-X is supported. */