On Thu, Nov 26, 2015 at 07:08:11PM +0100, Marcin Wojtas wrote: > In the actual RX processing, there is same error path for both descriptor > ring refilling and building skb fails. This is not correct, because after > successful refill, the ring is already updated with newly allocated > buffer. Then, in case of build_skb() fail, hitherto code left the original > buffer unmapped. > > This patch fixes above situation by swapping error check of skb build with > DMA-unmap of original buffer. > > Signed-off-by: Marcin Wojtas <mw@xxxxxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> # v4.2+ > Fixes a84e32894191 ("net: mvneta: fix refilling for Rx DMA buffers") > --- > drivers/net/ethernet/marvell/mvneta.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > Acked-by: Simon Guinot <simon.guinot@xxxxxxxxxxxx> Thanks, Simon > diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c > index 0c3d923..62cf971 100644 > --- a/drivers/net/ethernet/marvell/mvneta.c > +++ b/drivers/net/ethernet/marvell/mvneta.c > @@ -1580,12 +1580,16 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, > } > > skb = build_skb(data, pp->frag_size > PAGE_SIZE ? 0 : pp->frag_size); > - if (!skb) > - goto err_drop_frame; > > + /* After refill old buffer has to be unmapped regardless > + * the skb is successfully built or not. > + */ > dma_unmap_single(dev->dev.parent, phys_addr, > MVNETA_RX_BUF_SIZE(pp->pkt_size), DMA_FROM_DEVICE); > > + if (!skb) > + goto err_drop_frame; > + > rcvd_pkts++; > rcvd_bytes += rx_bytes; > > -- > 1.8.3.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Attachment:
signature.asc
Description: Digital signature