Message ID | 642c56a7da025406c36862464f5a15aba3e5340e.1678570942.git.geoff@infradead.org (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net/ps3_gelic_net: DMA related fixes | expand |
On Sat, 2023-03-11 at 21:46 +0000, Geoff Levand wrote: > The current Gelic Etherenet driver was checking the return value of its > dma_map_single call, and not using the dma_mapping_error() routine. > > Fixes runtime problems like these: > > DMA-API: ps3_gelic_driver sb_05: device driver failed to check map error > WARNING: CPU: 0 PID: 0 at kernel/dma/debug.c:1027 .check_unmap+0x888/0x8dc > > Fixes: 02c1889166b4 ("ps3: gigabit ethernet driver for PS3, take3") > Signed-off-by: Geoff Levand <geoff@infradead.org> > --- > drivers/net/ethernet/toshiba/ps3_gelic_net.c | 24 +++++++++++--------- > 1 file changed, 13 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_net.c b/drivers/net/ethernet/toshiba/ps3_gelic_net.c > index 56557fc8d18a..87d3c768286e 100644 > --- a/drivers/net/ethernet/toshiba/ps3_gelic_net.c > +++ b/drivers/net/ethernet/toshiba/ps3_gelic_net.c > @@ -325,15 +325,17 @@ static int gelic_card_init_chain(struct gelic_card *card, > > /* set up the hardware pointers in each descriptor */ > for (i = 0; i < no; i++, descr++) { > + dma_addr_t cpu_addr; > + > gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE); > - descr->bus_addr = > - dma_map_single(ctodev(card), descr, > - GELIC_DESCR_SIZE, > - DMA_BIDIRECTIONAL); > > - if (!descr->bus_addr) > + cpu_addr = dma_map_single(ctodev(card), descr, > + GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL); > + > + if (dma_mapping_error(ctodev(card), cpu_addr)) > goto iommu_error; > > + descr->bus_addr = cpu_to_be32(cpu_addr); > descr->next = descr + 1; > descr->prev = descr - 1; > } > @@ -377,6 +379,7 @@ static int gelic_card_init_chain(struct gelic_card *card, > static int gelic_descr_prepare_rx(struct gelic_card *card, > struct gelic_descr *descr) > { > + dma_addr_t cpu_addr; > int offset; > > if (gelic_descr_get_status(descr) != GELIC_DESCR_DMA_NOT_IN_USE) > @@ -398,11 +401,10 @@ static int gelic_descr_prepare_rx(struct gelic_card *card, > if (offset) > skb_reserve(descr->skb, GELIC_NET_RXBUF_ALIGN - offset); > /* io-mmu-map the skb */ > - descr->buf_addr = cpu_to_be32(dma_map_single(ctodev(card), > - descr->skb->data, > - gelic_rx_skb_size, > - DMA_FROM_DEVICE)); > - if (!descr->buf_addr) { > + cpu_addr = dma_map_single(ctodev(card), descr->skb->data, > + gelic_rx_skb_size, DMA_FROM_DEVICE); > + descr->buf_addr = cpu_to_be32(cpu_addr); > + if (dma_mapping_error(ctodev(card), cpu_addr)) { > dev_kfree_skb_any(descr->skb); > descr->skb = NULL; > dev_info(ctodev(card), > @@ -782,7 +784,7 @@ static int gelic_descr_prepare_tx(struct gelic_card *card, > > buf = dma_map_single(ctodev(card), skb->data, skb->len, DMA_TO_DEVICE); > > - if (!buf) { > + if (dma_mapping_error(ctodev(card), buf)) { > dev_err(ctodev(card), > "dma map 2 failed (%p, %i). Dropping packet\n", > skb->data, skb->len); Looks good to me. The only tweak I would make is maybe using "dma_addr" , "phys_addr" or "bus_addr" instead of "cpu_addr", however that is more cosmetic than anything else. Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
On 3/11/23 14:41, Alexander H Duyck wrote: > On Sat, 2023-03-11 at 21:46 +0000, Geoff Levand wrote: >> The current Gelic Etherenet driver was checking the return value of its >> dma_map_single call, and not using the dma_mapping_error() routine. >> >> Fixes runtime problems like these: >> >> DMA-API: ps3_gelic_driver sb_05: device driver failed to check map error >> WARNING: CPU: 0 PID: 0 at kernel/dma/debug.c:1027 .check_unmap+0x888/0x8dc >> >> Fixes: 02c1889166b4 ("ps3: gigabit ethernet driver for PS3, take3") >> Signed-off-by: Geoff Levand <geoff@infradead.org> >> --- >> drivers/net/ethernet/toshiba/ps3_gelic_net.c | 24 +++++++++++--------- >> 1 file changed, 13 insertions(+), 11 deletions(-) >> >> diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_net.c b/drivers/net/ethernet/toshiba/ps3_gelic_net.c >> index 56557fc8d18a..87d3c768286e 100644 >> --- a/drivers/net/ethernet/toshiba/ps3_gelic_net.c >> +++ b/drivers/net/ethernet/toshiba/ps3_gelic_net.c >> @@ -325,15 +325,17 @@ static int gelic_card_init_chain(struct gelic_card *card, >> >> /* set up the hardware pointers in each descriptor */ >> for (i = 0; i < no; i++, descr++) { >> + dma_addr_t cpu_addr; >> + >> gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE); >> - descr->bus_addr = >> - dma_map_single(ctodev(card), descr, >> - GELIC_DESCR_SIZE, >> - DMA_BIDIRECTIONAL); >> >> - if (!descr->bus_addr) >> + cpu_addr = dma_map_single(ctodev(card), descr, >> + GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL); >> + >> + if (dma_mapping_error(ctodev(card), cpu_addr)) >> goto iommu_error; >> >> + descr->bus_addr = cpu_to_be32(cpu_addr); >> descr->next = descr + 1; >> descr->prev = descr - 1; >> } >> @@ -377,6 +379,7 @@ static int gelic_card_init_chain(struct gelic_card *card, >> static int gelic_descr_prepare_rx(struct gelic_card *card, >> struct gelic_descr *descr) >> { >> + dma_addr_t cpu_addr; >> int offset; >> >> if (gelic_descr_get_status(descr) != GELIC_DESCR_DMA_NOT_IN_USE) >> @@ -398,11 +401,10 @@ static int gelic_descr_prepare_rx(struct gelic_card *card, >> if (offset) >> skb_reserve(descr->skb, GELIC_NET_RXBUF_ALIGN - offset); >> /* io-mmu-map the skb */ >> - descr->buf_addr = cpu_to_be32(dma_map_single(ctodev(card), >> - descr->skb->data, >> - gelic_rx_skb_size, >> - DMA_FROM_DEVICE)); >> - if (!descr->buf_addr) { >> + cpu_addr = dma_map_single(ctodev(card), descr->skb->data, >> + gelic_rx_skb_size, DMA_FROM_DEVICE); >> + descr->buf_addr = cpu_to_be32(cpu_addr); >> + if (dma_mapping_error(ctodev(card), cpu_addr)) { >> dev_kfree_skb_any(descr->skb); >> descr->skb = NULL; >> dev_info(ctodev(card), >> @@ -782,7 +784,7 @@ static int gelic_descr_prepare_tx(struct gelic_card *card, >> >> buf = dma_map_single(ctodev(card), skb->data, skb->len, DMA_TO_DEVICE); >> >> - if (!buf) { >> + if (dma_mapping_error(ctodev(card), buf)) { >> dev_err(ctodev(card), >> "dma map 2 failed (%p, %i). Dropping packet\n", >> skb->data, skb->len); > > Looks good to me. The only tweak I would make is maybe using "dma_addr" > , "phys_addr" or "bus_addr" instead of "cpu_addr", however that is more > cosmetic than anything else. Well, cpu_addr is used for cpu_to_be32(cpu_addr)... > Reviewed-by: Alexander Duyck <alexanderduyck@fb.com> Thanks for the review. -Geoff
diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_net.c b/drivers/net/ethernet/toshiba/ps3_gelic_net.c index 56557fc8d18a..87d3c768286e 100644 --- a/drivers/net/ethernet/toshiba/ps3_gelic_net.c +++ b/drivers/net/ethernet/toshiba/ps3_gelic_net.c @@ -325,15 +325,17 @@ static int gelic_card_init_chain(struct gelic_card *card, /* set up the hardware pointers in each descriptor */ for (i = 0; i < no; i++, descr++) { + dma_addr_t cpu_addr; + gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE); - descr->bus_addr = - dma_map_single(ctodev(card), descr, - GELIC_DESCR_SIZE, - DMA_BIDIRECTIONAL); - if (!descr->bus_addr) + cpu_addr = dma_map_single(ctodev(card), descr, + GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL); + + if (dma_mapping_error(ctodev(card), cpu_addr)) goto iommu_error; + descr->bus_addr = cpu_to_be32(cpu_addr); descr->next = descr + 1; descr->prev = descr - 1; } @@ -377,6 +379,7 @@ static int gelic_card_init_chain(struct gelic_card *card, static int gelic_descr_prepare_rx(struct gelic_card *card, struct gelic_descr *descr) { + dma_addr_t cpu_addr; int offset; if (gelic_descr_get_status(descr) != GELIC_DESCR_DMA_NOT_IN_USE) @@ -398,11 +401,10 @@ static int gelic_descr_prepare_rx(struct gelic_card *card, if (offset) skb_reserve(descr->skb, GELIC_NET_RXBUF_ALIGN - offset); /* io-mmu-map the skb */ - descr->buf_addr = cpu_to_be32(dma_map_single(ctodev(card), - descr->skb->data, - gelic_rx_skb_size, - DMA_FROM_DEVICE)); - if (!descr->buf_addr) { + cpu_addr = dma_map_single(ctodev(card), descr->skb->data, + gelic_rx_skb_size, DMA_FROM_DEVICE); + descr->buf_addr = cpu_to_be32(cpu_addr); + if (dma_mapping_error(ctodev(card), cpu_addr)) { dev_kfree_skb_any(descr->skb); descr->skb = NULL; dev_info(ctodev(card), @@ -782,7 +784,7 @@ static int gelic_descr_prepare_tx(struct gelic_card *card, buf = dma_map_single(ctodev(card), skb->data, skb->len, DMA_TO_DEVICE); - if (!buf) { + if (dma_mapping_error(ctodev(card), buf)) { dev_err(ctodev(card), "dma map 2 failed (%p, %i). Dropping packet\n", skb->data, skb->len);
The current Gelic Etherenet driver was checking the return value of its dma_map_single call, and not using the dma_mapping_error() routine. Fixes runtime problems like these: DMA-API: ps3_gelic_driver sb_05: device driver failed to check map error WARNING: CPU: 0 PID: 0 at kernel/dma/debug.c:1027 .check_unmap+0x888/0x8dc Fixes: 02c1889166b4 ("ps3: gigabit ethernet driver for PS3, take3") Signed-off-by: Geoff Levand <geoff@infradead.org> --- drivers/net/ethernet/toshiba/ps3_gelic_net.c | 24 +++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-)