Module Name: src Committed By: msaitoh Date: Mon Jan 20 07:19:04 UTC 2020
Modified Files: src/sys/dev/pci/ixgbe: ix_txrx.c ixgbe.h ixgbe_netbsd.c Log Message: Free jumbo mem structure correctly. Found by yamaguchi@ using with LOCKDEBUG. To generate a diff of this commit: cvs rdiff -u -r1.58 -r1.59 src/sys/dev/pci/ixgbe/ix_txrx.c cvs rdiff -u -r1.60 -r1.61 src/sys/dev/pci/ixgbe/ixgbe.h cvs rdiff -u -r1.10 -r1.11 src/sys/dev/pci/ixgbe/ixgbe_netbsd.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.58 src/sys/dev/pci/ixgbe/ix_txrx.c:1.59 --- src/sys/dev/pci/ixgbe/ix_txrx.c:1.58 Mon Dec 16 02:50:54 2019 +++ src/sys/dev/pci/ixgbe/ix_txrx.c Mon Jan 20 07:19:04 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ix_txrx.c,v 1.58 2019/12/16 02:50:54 msaitoh Exp $ */ +/* $NetBSD: ix_txrx.c,v 1.59 2020/01/20 07:19:04 msaitoh Exp $ */ /****************************************************************************** @@ -1681,6 +1681,10 @@ ixgbe_free_receive_buffers(struct rx_rin rxbuf->pmap = NULL; } } + + /* NetBSD specific. See ixgbe_netbsd.c */ + ixgbe_jcl_destroy(adapter, rxr); + if (rxr->rx_buffers != NULL) { free(rxr->rx_buffers, M_DEVBUF); rxr->rx_buffers = NULL; Index: src/sys/dev/pci/ixgbe/ixgbe.h diff -u src/sys/dev/pci/ixgbe/ixgbe.h:1.60 src/sys/dev/pci/ixgbe/ixgbe.h:1.61 --- src/sys/dev/pci/ixgbe/ixgbe.h:1.60 Mon Dec 16 02:50:54 2019 +++ src/sys/dev/pci/ixgbe/ixgbe.h Mon Jan 20 07:19:04 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ixgbe.h,v 1.60 2019/12/16 02:50:54 msaitoh Exp $ */ +/* $NetBSD: ixgbe.h,v 1.61 2020/01/20 07:19:04 msaitoh Exp $ */ /****************************************************************************** SPDX-License-Identifier: BSD-3-Clause @@ -780,6 +780,7 @@ const struct sysctlnode *ixgbe_sysctl_in /* For NetBSD */ void ixgbe_jcl_reinit(struct adapter *, bus_dma_tag_t, struct rx_ring *, int, size_t); +void ixgbe_jcl_destroy(struct adapter *, struct rx_ring *); #include "ixgbe_bypass.h" #include "ixgbe_fdir.h" Index: src/sys/dev/pci/ixgbe/ixgbe_netbsd.c diff -u src/sys/dev/pci/ixgbe/ixgbe_netbsd.c:1.10 src/sys/dev/pci/ixgbe/ixgbe_netbsd.c:1.11 --- src/sys/dev/pci/ixgbe/ixgbe_netbsd.c:1.10 Wed Sep 4 07:29:34 2019 +++ src/sys/dev/pci/ixgbe/ixgbe_netbsd.c Mon Jan 20 07:19:04 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ixgbe_netbsd.c,v 1.10 2019/09/04 07:29:34 msaitoh Exp $ */ +/* $NetBSD: ixgbe_netbsd.c,v 1.11 2020/01/20 07:19:04 msaitoh Exp $ */ /* * Copyright (c) 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -161,6 +161,22 @@ post_zalloc_err: return NULL; } +static void +ixgbe_jcl_freeall(struct adapter *adapter, struct rx_ring *rxr) +{ + ixgbe_extmem_head_t *eh = &rxr->jcl_head; + ixgbe_extmem_t *em; + bus_dma_tag_t dmat = rxr->ptag->dt_dmat; + + while ((em = ixgbe_getext(eh, 0)) != NULL) { + KASSERT(em->em_vaddr != NULL); + bus_dmamem_unmap(dmat, em->em_vaddr, em->em_size); + bus_dmamem_free(dmat, &em->em_seg, 1); + memset(em, 0, sizeof(*em)); + kmem_free(em, sizeof(*em)); + } +} + void ixgbe_jcl_reinit(struct adapter *adapter, bus_dma_tag_t dmat, struct rx_ring *rxr, int nbuf, size_t size) @@ -187,13 +203,7 @@ ixgbe_jcl_reinit(struct adapter *adapter return; /* Free all dmamem */ - while ((em = ixgbe_getext(eh, 0)) != NULL) { - KASSERT(em->em_vaddr != NULL); - bus_dmamem_unmap(dmat, em->em_vaddr, em->em_size); - bus_dmamem_free(dmat, &em->em_seg, 1); - memset(em, 0, sizeof(*em)); - kmem_free(em, sizeof(*em)); - } + ixgbe_jcl_freeall(adapter, rxr); for (i = 0; i < nbuf; i++) { if ((em = ixgbe_newext(eh, dmat, size)) == NULL) { @@ -210,6 +220,21 @@ ixgbe_jcl_reinit(struct adapter *adapter rxr->last_num_rx_desc = adapter->num_rx_desc; } +void +ixgbe_jcl_destroy(struct adapter *adapter, struct rx_ring *rxr) +{ + ixgbe_extmem_head_t *eh = &rxr->jcl_head; + + /* Free all dmamem */ + ixgbe_jcl_freeall(adapter, rxr); + + if (eh->eh_initialized) { + mutex_destroy(&eh->eh_mtx); + eh->eh_initialized = false; + } +} + + static void ixgbe_jcl_free(struct mbuf *m, void *buf, size_t size, void *arg) {