Module Name: src Committed By: knakahara Date: Wed Jul 24 10:15:23 UTC 2019
Modified Files: src/sys/arch/x86/pci: if_vmx.c Log Message: refactor: unify vmxnet3_start_locked and vmxnet_transmit_locked To generate a diff of this commit: cvs rdiff -u -r1.38 -r1.39 src/sys/arch/x86/pci/if_vmx.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/arch/x86/pci/if_vmx.c diff -u src/sys/arch/x86/pci/if_vmx.c:1.38 src/sys/arch/x86/pci/if_vmx.c:1.39 --- src/sys/arch/x86/pci/if_vmx.c:1.38 Wed Jul 24 10:13:14 2019 +++ src/sys/arch/x86/pci/if_vmx.c Wed Jul 24 10:15:23 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vmx.c,v 1.38 2019/07/24 10:13:14 knakahara Exp $ */ +/* $NetBSD: if_vmx.c,v 1.39 2019/07/24 10:15:23 knakahara Exp $ */ /* $OpenBSD: if_vmx.c,v 1.16 2014/01/22 06:04:17 brad Exp $ */ /* @@ -19,7 +19,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.38 2019/07/24 10:13:14 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.39 2019/07/24 10:15:23 knakahara Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -2756,17 +2756,17 @@ vmxnet3_txq_encap(struct vmxnet3_txqueue return (0); } -void -vmxnet3_start_locked(struct ifnet *ifp) +#define VMXNET3_TX_START 1 +#define VMXNET3_TX_TRANSMIT 2 +static inline void +vmxnet3_tx_common_locked(struct ifnet *ifp, struct vmxnet3_txqueue *txq, int txtype) { struct vmxnet3_softc *sc; - struct vmxnet3_txqueue *txq; struct vmxnet3_txring *txr; struct mbuf *m_head; int tx; sc = ifp->if_softc; - txq = &sc->vmx_txq[0]; txr = &txq->vxtxq_cmd_ring; tx = 0; @@ -2777,14 +2777,20 @@ vmxnet3_start_locked(struct ifnet *ifp) return; for (;;) { - IFQ_POLL(&ifp->if_snd, m_head); + if (txtype == VMXNET3_TX_START) + IFQ_POLL(&ifp->if_snd, m_head); + else + m_head = pcq_peek(txq->vxtxq_interq); if (m_head == NULL) break; if (vmxnet3_txring_avail(txr) < VMXNET3_TX_MAXSEGS) break; - IFQ_DEQUEUE(&ifp->if_snd, m_head); + if (txtype == VMXNET3_TX_START) + IFQ_DEQUEUE(&ifp->if_snd, m_head); + else + m_head = pcq_get(txq->vxtxq_interq); if (m_head == NULL) break; @@ -2802,6 +2808,18 @@ vmxnet3_start_locked(struct ifnet *ifp) txq->vxtxq_watchdog = VMXNET3_WATCHDOG_TIMEOUT; } +void +vmxnet3_start_locked(struct ifnet *ifp) +{ + struct vmxnet3_softc *sc; + struct vmxnet3_txqueue *txq; + + sc = ifp->if_softc; + txq = &sc->vmx_txq[0]; + + vmxnet3_tx_common_locked(ifp, txq, VMXNET3_TX_START); +} + void vmxnet3_start(struct ifnet *ifp) @@ -2842,45 +2860,8 @@ vmxnet3_select_txqueue(struct ifnet *ifp void vmxnet3_transmit_locked(struct ifnet *ifp, struct vmxnet3_txqueue *txq) { - struct vmxnet3_softc *sc; - struct vmxnet3_txring *txr; - struct mbuf *m_head; - int tx; - - sc = ifp->if_softc; - txr = &txq->vxtxq_cmd_ring; - tx = 0; - - VMXNET3_TXQ_LOCK_ASSERT(txq); - - if ((ifp->if_flags & IFF_RUNNING) == 0 || - sc->vmx_link_active == 0) - return; - - for (;;) { - m_head = pcq_peek(txq->vxtxq_interq); - if (m_head == NULL) - break; - if (vmxnet3_txring_avail(txr) < VMXNET3_TX_MAXSEGS) - break; - - m_head = pcq_get(txq->vxtxq_interq); - if (m_head == NULL) - break; - - if (vmxnet3_txq_encap(txq, &m_head) != 0) { - if (m_head != NULL) - m_freem(m_head); - break; - } - - tx++; - bpf_mtap(ifp, m_head, BPF_D_OUT); - } - - if (tx > 0) - txq->vxtxq_watchdog = VMXNET3_WATCHDOG_TIMEOUT; + vmxnet3_tx_common_locked(ifp, txq, VMXNET3_TX_TRANSMIT); } int