Skip to content

Commit 56e41ee

Browse files
emuslndavem330
authored andcommitted
ionic: better dma-map error handling
Fix up a couple of small dma_addr handling issues - don't double-count dma-map-err stat in ionic_tx_map_skb() or ionic_xdp_post_frame() - return 0 on error from both ionic_tx_map_single() and ionic_tx_map_frag() and check for !dma_addr in ionic_tx_map_skb() and ionic_xdp_post_frame() - be sure to unmap buf_info[0] in ionic_tx_map_skb() error path - don't assign rx buf->dma_addr until error checked in ionic_rx_page_alloc() - remove unnecessary dma_addr_t casts Reviewed-by: Brett Creeley <[email protected]> Signed-off-by: Shannon Nelson <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a12c1e7 commit 56e41ee

File tree

1 file changed

+14
-18
lines changed

1 file changed

+14
-18
lines changed

drivers/net/ethernet/pensando/ionic/ionic_txrx.c

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ static int ionic_rx_page_alloc(struct ionic_queue *q,
129129
struct ionic_buf_info *buf_info)
130130
{
131131
struct ionic_rx_stats *stats;
132+
dma_addr_t dma_addr;
132133
struct device *dev;
133134
struct page *page;
134135

@@ -143,16 +144,17 @@ static int ionic_rx_page_alloc(struct ionic_queue *q,
143144
return -ENOMEM;
144145
}
145146

146-
buf_info->dma_addr = dma_map_page(dev, page, 0,
147-
IONIC_PAGE_SIZE, DMA_FROM_DEVICE);
148-
if (unlikely(dma_mapping_error(dev, buf_info->dma_addr))) {
147+
dma_addr = dma_map_page(dev, page, 0,
148+
IONIC_PAGE_SIZE, DMA_FROM_DEVICE);
149+
if (unlikely(dma_mapping_error(dev, dma_addr))) {
149150
__free_pages(page, 0);
150151
net_err_ratelimited("%s: %s dma map failed\n",
151152
dev_name(dev), q->name);
152153
stats->dma_map_err++;
153154
return -EIO;
154155
}
155156

157+
buf_info->dma_addr = dma_addr;
156158
buf_info->page = page;
157159
buf_info->page_offset = 0;
158160

@@ -371,10 +373,8 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
371373
stats = q_to_tx_stats(q);
372374

373375
dma_addr = ionic_tx_map_single(q, frame->data, len);
374-
if (dma_mapping_error(q->dev, dma_addr)) {
375-
stats->dma_map_err++;
376+
if (!dma_addr)
376377
return -EIO;
377-
}
378378
buf_info->dma_addr = dma_addr;
379379
buf_info->len = len;
380380
buf_info->page = page;
@@ -397,8 +397,7 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
397397
elem = ionic_tx_sg_elems(q);
398398
for (i = 0; i < sinfo->nr_frags; i++, frag++, bi++) {
399399
dma_addr = ionic_tx_map_frag(q, frag, 0, skb_frag_size(frag));
400-
if (dma_mapping_error(q->dev, dma_addr)) {
401-
stats->dma_map_err++;
400+
if (!dma_addr) {
402401
ionic_tx_desc_unmap_bufs(q, desc_info);
403402
return -EIO;
404403
}
@@ -1092,6 +1091,7 @@ static dma_addr_t ionic_tx_map_frag(struct ionic_queue *q,
10921091
net_warn_ratelimited("%s: DMA frag map failed on %s!\n",
10931092
dev_name(dev), q->name);
10941093
stats->dma_map_err++;
1094+
return 0;
10951095
}
10961096
return dma_addr;
10971097
}
@@ -1100,18 +1100,15 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
11001100
struct ionic_tx_desc_info *desc_info)
11011101
{
11021102
struct ionic_buf_info *buf_info = desc_info->bufs;
1103-
struct ionic_tx_stats *stats = q_to_tx_stats(q);
11041103
struct device *dev = q->dev;
11051104
dma_addr_t dma_addr;
11061105
unsigned int nfrags;
11071106
skb_frag_t *frag;
11081107
int frag_idx;
11091108

11101109
dma_addr = ionic_tx_map_single(q, skb->data, skb_headlen(skb));
1111-
if (dma_mapping_error(dev, dma_addr)) {
1112-
stats->dma_map_err++;
1110+
if (!dma_addr)
11131111
return -EIO;
1114-
}
11151112
buf_info->dma_addr = dma_addr;
11161113
buf_info->len = skb_headlen(skb);
11171114
buf_info++;
@@ -1120,10 +1117,8 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
11201117
nfrags = skb_shinfo(skb)->nr_frags;
11211118
for (frag_idx = 0; frag_idx < nfrags; frag_idx++, frag++) {
11221119
dma_addr = ionic_tx_map_frag(q, frag, 0, skb_frag_size(frag));
1123-
if (dma_mapping_error(dev, dma_addr)) {
1124-
stats->dma_map_err++;
1120+
if (!dma_addr)
11251121
goto dma_fail;
1126-
}
11271122
buf_info->dma_addr = dma_addr;
11281123
buf_info->len = skb_frag_size(frag);
11291124
buf_info++;
@@ -1141,7 +1136,8 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
11411136
dma_unmap_page(dev, buf_info->dma_addr,
11421137
buf_info->len, DMA_TO_DEVICE);
11431138
}
1144-
dma_unmap_single(dev, buf_info->dma_addr, buf_info->len, DMA_TO_DEVICE);
1139+
dma_unmap_single(dev, desc_info->bufs[0].dma_addr,
1140+
desc_info->bufs[0].len, DMA_TO_DEVICE);
11451141
return -EIO;
11461142
}
11471143

@@ -1155,11 +1151,11 @@ static void ionic_tx_desc_unmap_bufs(struct ionic_queue *q,
11551151
if (!desc_info->nbufs)
11561152
return;
11571153

1158-
dma_unmap_single(dev, (dma_addr_t)buf_info->dma_addr,
1154+
dma_unmap_single(dev, buf_info->dma_addr,
11591155
buf_info->len, DMA_TO_DEVICE);
11601156
buf_info++;
11611157
for (i = 1; i < desc_info->nbufs; i++, buf_info++)
1162-
dma_unmap_page(dev, (dma_addr_t)buf_info->dma_addr,
1158+
dma_unmap_page(dev, buf_info->dma_addr,
11631159
buf_info->len, DMA_TO_DEVICE);
11641160

11651161
desc_info->nbufs = 0;

0 commit comments

Comments
 (0)