Module Name: src Committed By: rin Date: Tue May 11 01:30:30 UTC 2021
Modified Files: src/sys/dev/pci/ixgbe: ix_txrx.c Log Message: Call bus_dmamap_unload(9) via ixgbe_dmamap_unload(), before freeing DMA buffer. Also, when the buffer is already freed, do not call bus_dmamap_unload(9) (no resource leaks with this change). Otherwise, MMU fault occurs for some bus_dma(9) implementations. With this fix, X550-T1 and X540-T1 work fine on alpha (at least DS10 with PCI-PCIe reverse bridge). Discussed with msaitoh. Thanks! To generate a diff of this commit: cvs rdiff -u -r1.71 -r1.72 src/sys/dev/pci/ixgbe/ix_txrx.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/ixgbe/ix_txrx.c diff -u src/sys/dev/pci/ixgbe/ix_txrx.c:1.71 src/sys/dev/pci/ixgbe/ix_txrx.c:1.72 --- src/sys/dev/pci/ixgbe/ix_txrx.c:1.71 Fri Apr 30 06:55:32 2021 +++ src/sys/dev/pci/ixgbe/ix_txrx.c Tue May 11 01:30:30 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ix_txrx.c,v 1.71 2021/04/30 06:55:32 msaitoh Exp $ */ +/* $NetBSD: ix_txrx.c,v 1.72 2021/05/11 01:30:30 rin Exp $ */ /****************************************************************************** @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ix_txrx.c,v 1.71 2021/04/30 06:55:32 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ix_txrx.c,v 1.72 2021/05/11 01:30:30 rin Exp $"); #include "opt_inet.h" #include "opt_inet6.h" @@ -1766,16 +1766,17 @@ ixgbe_rx_discard(struct rx_ring *rxr, in if (rbuf->fmp != NULL) {/* Partial chain ? */ bus_dmamap_sync(rxr->ptag->dt_dmat, rbuf->pmap, 0, rbuf->buf->m_pkthdr.len, BUS_DMASYNC_POSTREAD); + ixgbe_dmamap_unload(rxr->ptag, rbuf->pmap); m_freem(rbuf->fmp); rbuf->fmp = NULL; rbuf->buf = NULL; /* rbuf->buf is part of fmp's chain */ } else if (rbuf->buf) { bus_dmamap_sync(rxr->ptag->dt_dmat, rbuf->pmap, 0, rbuf->buf->m_pkthdr.len, BUS_DMASYNC_POSTREAD); + ixgbe_dmamap_unload(rxr->ptag, rbuf->pmap); m_free(rbuf->buf); rbuf->buf = NULL; } - ixgbe_dmamap_unload(rxr->ptag, rbuf->pmap); rbuf->flags = 0;