diff options
Diffstat (limited to 'sys/dev')
27 files changed, 189 insertions, 66 deletions
diff --git a/sys/dev/altera/atse/if_atse.c b/sys/dev/altera/atse/if_atse.c index c84194868ec46..a355260599531 100644 --- a/sys/dev/altera/atse/if_atse.c +++ b/sys/dev/altera/atse/if_atse.c @@ -1381,7 +1381,8 @@ atse_attach(device_t dev) } ifp->if_softc = sc; if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | + IFF_NEEDSEPOCH; ifp->if_ioctl = atse_ioctl; ifp->if_transmit = atse_transmit; ifp->if_qflush = atse_qflush; diff --git a/sys/dev/ath/if_ath_rx.c b/sys/dev/ath/if_ath_rx.c index 93a1d74551910..13a42c5038d60 100644 --- a/sys/dev/ath/if_ath_rx.c +++ b/sys/dev/ath/if_ath_rx.c @@ -647,6 +647,7 @@ ath_rx_pkt(struct ath_softc *sc, struct ath_rx_status *rs, HAL_STATUS status, uint64_t tsf, int nf, HAL_RX_QUEUE qtype, struct ath_buf *bf, struct mbuf *m) { + struct epoch_tracker et; uint64_t rstamp; /* XXX TODO: make this an mbuf tag? */ struct ieee80211_rx_stats rxs; @@ -941,6 +942,7 @@ rx_accept: rxs.c_nf_ext[i] = nf; } + NET_EPOCH_ENTER(et); if (ni != NULL) { /* * Only punt packets for ampdu reorder processing for @@ -986,6 +988,7 @@ rx_accept: type = ieee80211_input_mimo_all(ic, m); m = NULL; } + NET_EPOCH_EXIT(et); /* * At this point we have passed the frame up the stack; thus diff --git a/sys/dev/beri/virtio/network/if_vtbe.c b/sys/dev/beri/virtio/network/if_vtbe.c index 5975a4a1c7f3f..03853435a9de6 100644 --- a/sys/dev/beri/virtio/network/if_vtbe.c +++ b/sys/dev/beri/virtio/network/if_vtbe.c @@ -613,7 +613,7 @@ vtbe_attach(device_t dev) ifp->if_softc = sc; if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | - IFF_MULTICAST | IFF_PROMISC); + IFF_MULTICAST | IFF_PROMISC | IFF_NEEDSEPOCH); ifp->if_capabilities = IFCAP_VLAN_MTU; ifp->if_capenable = ifp->if_capabilities; ifp->if_start = vtbe_txstart; diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c index 6199478c4b289..fab4c1bb4bb2d 100644 --- a/sys/dev/bge/if_bge.c +++ b/sys/dev/bge/if_bge.c @@ -4646,6 +4646,7 @@ bge_msi_intr(void *arg) static void bge_intr_task(void *arg, int pending) { + struct epoch_tracker et; struct bge_softc *sc; if_t ifp; uint32_t status, status_tag; @@ -4688,7 +4689,9 @@ bge_intr_task(void *arg, int pending) sc->bge_rx_saved_considx != rx_prod) { /* Check RX return ring producer/consumer. */ BGE_UNLOCK(sc); + NET_EPOCH_ENTER(et); bge_rxeof(sc, rx_prod, 0); + NET_EPOCH_EXIT(et); BGE_LOCK(sc); } if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) { diff --git a/sys/dev/dpaa/if_dtsec.c b/sys/dev/dpaa/if_dtsec.c index 2c6291b07e349..704aa22eda548 100644 --- a/sys/dev/dpaa/if_dtsec.c +++ b/sys/dev/dpaa/if_dtsec.c @@ -688,7 +688,7 @@ dtsec_attach(device_t dev) ifp->if_softc = sc; ifp->if_mtu = ETHERMTU; /* TODO: Configure */ - ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST; + ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_NEEDSEPOCH; ifp->if_init = dtsec_if_init; ifp->if_start = dtsec_if_start; ifp->if_ioctl = dtsec_if_ioctl; diff --git a/sys/dev/hyperv/netvsc/if_hn.c b/sys/dev/hyperv/netvsc/if_hn.c index e9d1b9439671a..bc96775ad5536 100644 --- a/sys/dev/hyperv/netvsc/if_hn.c +++ b/sys/dev/hyperv/netvsc/if_hn.c @@ -2362,7 +2362,8 @@ hn_attach(device_t dev) */ ifp->if_baudrate = IF_Gbps(10); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | + IFF_NEEDSEPOCH; ifp->if_ioctl = hn_ioctl; ifp->if_init = hn_init; #ifdef HN_IFSTART_SUPPORT diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index 1a5e8eeed4beb..37cf0e6bf7034 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -967,7 +967,8 @@ ndis_ifattach(struct ndis_softc *sc) if_initname(ifp, device_get_name(sc->ndis_dev), device_get_unit(sc->ndis_dev)); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | + IFF_NEEDSEPOCH; ifp->if_ioctl = ndis_ifioctl; ifp->if_start = ndis_ifstart; ifp->if_init = ndis_init; diff --git a/sys/dev/mlx4/mlx4_en/mlx4_en_rx.c b/sys/dev/mlx4/mlx4_en/mlx4_en_rx.c index c9222e1df55c4..6e588a0ca92b3 100644 --- a/sys/dev/mlx4/mlx4_en/mlx4_en_rx.c +++ b/sys/dev/mlx4/mlx4_en/mlx4_en_rx.c @@ -895,6 +895,7 @@ void mlx4_en_rx_irq(struct mlx4_cq *mcq) void mlx4_en_rx_que(void *context, int pending) { + struct epoch_tracker et; struct mlx4_en_cq *cq; struct thread *td; @@ -905,8 +906,10 @@ void mlx4_en_rx_que(void *context, int pending) sched_bind(td, cq->curr_poll_rx_cpu_id); thread_unlock(td); + NET_EPOCH_ENTER(et); while (mlx4_en_poll_rx_cq(cq, MLX4_EN_RX_BUDGET) == MLX4_EN_RX_BUDGET); + NET_EPOCH_EXIT(et); mlx4_en_arm_cq(cq->dev->if_softc, cq); } diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c index 982f76d45faa7..4edcc58cbe0b1 100644 --- a/sys/dev/netmap/netmap.c +++ b/sys/dev/netmap/netmap.c @@ -437,11 +437,13 @@ ports attached to the switch) #include <sys/socketvar.h> /* struct socket */ #include <sys/malloc.h> #include <sys/poll.h> +#include <sys/proc.h> #include <sys/rwlock.h> #include <sys/socket.h> /* sockaddrs */ #include <sys/selinfo.h> #include <sys/sysctl.h> #include <sys/jail.h> +#include <sys/epoch.h> #include <net/vnet.h> #include <net/if.h> #include <net/if_var.h> @@ -1146,9 +1148,11 @@ netmap_dtor(void *data) static void netmap_send_up(struct ifnet *dst, struct mbq *q) { + struct epoch_tracker et; struct mbuf *m; struct mbuf *head = NULL, *prev = NULL; + NET_EPOCH_ENTER(et); /* Send packets up, outside the lock; head/prev machinery * is only useful for Windows. */ while ((m = mbq_dequeue(q)) != NULL) { @@ -1160,6 +1164,7 @@ netmap_send_up(struct ifnet *dst, struct mbq *q) } if (head) nm_os_send_up(dst, NULL, head); + NET_EPOCH_EXIT(et); mbq_fini(q); } diff --git a/sys/dev/ntb/if_ntb/if_ntb.c b/sys/dev/ntb/if_ntb/if_ntb.c index 3bae01aae49d1..1e1f98a541321 100644 --- a/sys/dev/ntb/if_ntb/if_ntb.c +++ b/sys/dev/ntb/if_ntb/if_ntb.c @@ -172,7 +172,8 @@ ntb_net_attach(device_t dev) if_setinitfn(ifp, ntb_net_init); if_setsoftc(ifp, sc); - if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); + if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | + IFF_NEEDSEPOCH); if_setioctlfn(ifp, ntb_ioctl); if_settransmitfn(ifp, ntb_transmit); if_setqflushfn(ifp, ntb_qflush); diff --git a/sys/dev/otus/if_otus.c b/sys/dev/otus/if_otus.c index 23be0fcbe9056..0489b943820e3 100644 --- a/sys/dev/otus/if_otus.c +++ b/sys/dev/otus/if_otus.c @@ -1770,6 +1770,7 @@ otus_rxeof(struct usb_xfer *xfer, struct otus_data *data, struct mbufq *rxq) static void otus_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error) { + struct epoch_tracker et; struct otus_softc *sc = usbd_xfer_softc(xfer); struct ieee80211com *ic = &sc->sc_ic; struct ieee80211_frame *wh; @@ -1820,6 +1821,7 @@ tr_setup: * callback and safe to unlock. */ OTUS_UNLOCK(sc); + NET_EPOCH_ENTER(et); while ((m = mbufq_dequeue(&scrx)) != NULL) { wh = mtod(m, struct ieee80211_frame *); ni = ieee80211_find_rxnode(ic, @@ -1832,6 +1834,7 @@ tr_setup: } else (void)ieee80211_input_mimo_all(ic, m); } + NET_EPOCH_EXIT(et); #ifdef IEEE80211_SUPPORT_SUPERG ieee80211_ff_age_all(ic, 100); #endif diff --git a/sys/dev/pci/pci_host_generic.c b/sys/dev/pci/pci_host_generic.c index 5a89a19c030d3..57609a9a1ef55 100644 --- a/sys/dev/pci/pci_host_generic.c +++ b/sys/dev/pci/pci_host_generic.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> + * Copyright (c) 2015, 2020 Ruslan Bukin <br@bsdpad.com> * Copyright (c) 2014 The FreeBSD Foundation * All rights reserved. * @@ -54,21 +54,6 @@ __FBSDID("$FreeBSD$"); #include "pcib_if.h" -/* Assembling ECAM Configuration Address */ -#define PCIE_BUS_SHIFT 20 -#define PCIE_SLOT_SHIFT 15 -#define PCIE_FUNC_SHIFT 12 -#define PCIE_BUS_MASK 0xFF -#define PCIE_SLOT_MASK 0x1F -#define PCIE_FUNC_MASK 0x07 -#define PCIE_REG_MASK 0xFFF - -#define PCIE_ADDR_OFFSET(bus, slot, func, reg) \ - ((((bus) & PCIE_BUS_MASK) << PCIE_BUS_SHIFT) | \ - (((slot) & PCIE_SLOT_MASK) << PCIE_SLOT_SHIFT) | \ - (((func) & PCIE_FUNC_MASK) << PCIE_FUNC_SHIFT) | \ - ((reg) & PCIE_REG_MASK)) - /* Forward prototypes */ static uint32_t generic_pcie_read_config(device_t dev, u_int bus, u_int slot, diff --git a/sys/dev/pci/pci_host_generic.h b/sys/dev/pci/pci_host_generic.h index 5feb3a6031a03..da7d9e52adc25 100644 --- a/sys/dev/pci/pci_host_generic.h +++ b/sys/dev/pci/pci_host_generic.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> + * Copyright (c) 2015, 2020 Ruslan Bukin <br@bsdpad.com> * Copyright (c) 2015 The FreeBSD Foundation * All rights reserved. * @@ -36,6 +36,21 @@ #include "pci_if.h" +/* Assembling ECAM Configuration Address */ +#define PCIE_BUS_SHIFT 20 +#define PCIE_SLOT_SHIFT 15 +#define PCIE_FUNC_SHIFT 12 +#define PCIE_BUS_MASK 0xFF +#define PCIE_SLOT_MASK 0x1F +#define PCIE_FUNC_MASK 0x07 +#define PCIE_REG_MASK 0xFFF + +#define PCIE_ADDR_OFFSET(bus, slot, func, reg) \ + ((((bus) & PCIE_BUS_MASK) << PCIE_BUS_SHIFT) | \ + (((slot) & PCIE_SLOT_MASK) << PCIE_SLOT_SHIFT) | \ + (((func) & PCIE_FUNC_MASK) << PCIE_FUNC_SHIFT) | \ + ((reg) & PCIE_REG_MASK)) + #define MAX_RANGES_TUPLES 16 #define MIN_RANGES_TUPLES 2 diff --git a/sys/dev/pci/pci_host_generic_acpi.c b/sys/dev/pci/pci_host_generic_acpi.c index 016fa32d212fe..c5ca9ab0a1d02 100644 --- a/sys/dev/pci/pci_host_generic_acpi.c +++ b/sys/dev/pci/pci_host_generic_acpi.c @@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include <dev/pci/pcireg.h> #include <dev/pci/pcib_private.h> #include <dev/pci/pci_host_generic.h> +#include <dev/pci/pci_host_generic_acpi.h> #include <machine/cpu.h> #include <machine/bus.h> @@ -88,11 +89,6 @@ __FBSDID("$FreeBSD$"); #define PROPS_CELL_SIZE 1 #define PCI_ADDR_CELL_SIZE 2 -struct generic_pcie_acpi_softc { - struct generic_pcie_core_softc base; - ACPI_BUFFER ap_prt; /* interrupt routing table */ -}; - /* Forward prototypes */ static int generic_pcie_acpi_probe(device_t dev); @@ -233,7 +229,7 @@ pci_host_acpi_get_ecam_resource(device_t dev) return (0); } -static int +int pci_host_generic_acpi_attach(device_t dev) { struct generic_pcie_acpi_softc *sc; diff --git a/sys/dev/pci/pci_host_generic_acpi.h b/sys/dev/pci/pci_host_generic_acpi.h new file mode 100644 index 0000000000000..eb9b23094703a --- /dev/null +++ b/sys/dev/pci/pci_host_generic_acpi.h @@ -0,0 +1,47 @@ +/*- + * Copyright (C) 2018 Cavium Inc. + * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> + * Copyright (c) 2014 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Semihalf under + * the sponsorship of the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _DEV_PCI_PCI_HOST_GENERIC_ACPI_H_ +#define _DEV_PCI_PCI_HOST_GENERIC_ACPI_H_ + +struct generic_pcie_acpi_softc { + struct generic_pcie_core_softc base; + int segment; + ACPI_BUFFER ap_prt; /* interrupt routing table */ +}; + +DECLARE_CLASS(generic_pcie_acpi_driver); + +int pci_host_generic_acpi_attach(device_t dev); + +#endif /* !_DEV_PCI_PCI_HOST_GENERIC_ACPI_H_ */ diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c index 1d750c25d2337..76fa06f635858 100644 --- a/sys/dev/re/if_re.c +++ b/sys/dev/re/if_re.c @@ -2576,6 +2576,7 @@ re_intr(void *arg) static void re_int_task(void *arg, int npending) { + struct epoch_tracker et; struct rl_softc *sc; struct ifnet *ifp; u_int16_t status; @@ -2602,8 +2603,11 @@ re_int_task(void *arg, int npending) } #endif - if (status & (RL_ISR_RX_OK|RL_ISR_RX_ERR|RL_ISR_FIFO_OFLOW)) + if (status & (RL_ISR_RX_OK|RL_ISR_RX_ERR|RL_ISR_FIFO_OFLOW)) { + NET_EPOCH_ENTER(et); rval = re_rxeof(sc, NULL); + NET_EPOCH_EXIT(et); + } /* * Some chips will ignore a second TX request issued diff --git a/sys/dev/rtwn/usb/rtwn_usb_rx.c b/sys/dev/rtwn/usb/rtwn_usb_rx.c index 52415084745bf..ae61dd7b43e7c 100644 --- a/sys/dev/rtwn/usb/rtwn_usb_rx.c +++ b/sys/dev/rtwn/usb/rtwn_usb_rx.c @@ -363,6 +363,7 @@ rtwn_rx_frame(struct rtwn_softc *sc, struct mbuf *m) void rtwn_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error) { + struct epoch_tracker et; struct rtwn_usb_softc *uc = usbd_xfer_softc(xfer); struct rtwn_softc *sc = &uc->uc_sc; struct ieee80211com *ic = &sc->sc_ic; @@ -399,6 +400,7 @@ tr_setup: * ieee80211_input() because here is at the end of a USB * callback and safe to unlock. */ + NET_EPOCH_ENTER(et); while (m != NULL) { next = m->m_nextpkt; m->m_nextpkt = NULL; @@ -416,6 +418,7 @@ tr_setup: RTWN_LOCK(sc); m = next; } + NET_EPOCH_EXIT(et); break; default: /* needs it to the inactive queue due to a error. */ diff --git a/sys/dev/sbni/if_sbni.c b/sys/dev/sbni/if_sbni.c index 267001f7897dd..62b86112b26f1 100644 --- a/sys/dev/sbni/if_sbni.c +++ b/sys/dev/sbni/if_sbni.c @@ -243,7 +243,8 @@ sbni_attach(struct sbni_softc *sc, int unit, struct sbni_flags flags) ifp->if_baudrate = (csr0 & 0x01 ? 500000 : 2000000) / (1 << flags.rate); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | + IFF_NEEDSEPOCH; mtx_init(&sc->lock, ifp->if_xname, MTX_NETWORK_LOCK, MTX_DEF); callout_init_mtx(&sc->wch, &sc->lock, 0); diff --git a/sys/dev/spibus/spigen.c b/sys/dev/spibus/spigen.c index 5146b6a1a3156..7e02e68027b9e 100644 --- a/sys/dev/spibus/spigen.c +++ b/sys/dev/spibus/spigen.c @@ -325,8 +325,9 @@ spigen_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_object_reference_locked(mmap->bufobj); // kernel and userland both for (n = 0; n < pages; n++) { m[n] = vm_page_grab(mmap->bufobj, n, - VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_WIRED); - m[n]->valid = VM_PAGE_BITS_ALL; + VM_ALLOC_ZERO | VM_ALLOC_WIRED); + vm_page_valid(m[n]); + vm_page_xunbusy(m[n]); } VM_OBJECT_WUNLOCK(mmap->bufobj); pmap_qenter(mmap->kvaddr, m, pages); diff --git a/sys/dev/usb/serial/uslcom.c b/sys/dev/usb/serial/uslcom.c index 242fc5cbb3f6e..6ee72846a2269 100644 --- a/sys/dev/usb/serial/uslcom.c +++ b/sys/dev/usb/serial/uslcom.c @@ -313,6 +313,7 @@ static const STRUCT_USB_HOST_ID uslcom_devs[] = { USLCOM_DEV(SILABS, HAMLINKUSB), USLCOM_DEV(SILABS, HELICOM), USLCOM_DEV(SILABS, HUBZ), + USLCOM_DEV(SILABS, BV_AV2010_10), USLCOM_DEV(SILABS, IMS_USB_RS422), USLCOM_DEV(SILABS, INFINITY_MIC), USLCOM_DEV(SILABS, INGENI_ZIGBEE), diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index 34d7a84df8a38..bf333041fd7d8 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -4339,6 +4339,7 @@ product SILABS AC_SERV_OBD 0x8665 AC-Services OBD Interface product SILABS MMB_ZIGBEE 0x88a4 MMB Networks ZigBee product SILABS INGENI_ZIGBEE 0x88a5 Planet Innovation Ingeni ZigBee product SILABS HUBZ 0x8a2a HubZ dual ZigBee and Z-Wave +product SILABS BV_AV2010_10 0x8b34 Bitron Video AV2010/10 ZigBee USB Stick product SILABS CP2102 0xea60 SILABS USB UART product SILABS CP210X_2 0xea61 CP210x Serial product SILABS CP210X_3 0xea70 CP210x Serial diff --git a/sys/dev/usb/wlan/if_rsu.c b/sys/dev/usb/wlan/if_rsu.c index 172a915b8f3e2..d26ff9ec9ad93 100644 --- a/sys/dev/usb/wlan/if_rsu.c +++ b/sys/dev/usb/wlan/if_rsu.c @@ -2552,6 +2552,7 @@ rsu_rxeof(struct usb_xfer *xfer, struct rsu_data *data) static void rsu_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error) { + struct epoch_tracker et; struct rsu_softc *sc = usbd_xfer_softc(xfer); struct ieee80211com *ic = &sc->sc_ic; struct ieee80211_node *ni; @@ -2586,6 +2587,7 @@ tr_setup: * ieee80211_input() because here is at the end of a USB * callback and safe to unlock. */ + NET_EPOCH_ENTER(et); while (m != NULL) { next = m->m_next; m->m_next = NULL; @@ -2604,6 +2606,7 @@ tr_setup: RSU_LOCK(sc); m = next; } + NET_EPOCH_EXIT(et); break; default: /* needs it to the inactive queue due to a error. */ diff --git a/sys/dev/virtio/scsi/virtio_scsi.c b/sys/dev/virtio/scsi/virtio_scsi.c index 6f2dfbcac5a46..76a065ecb3386 100644 --- a/sys/dev/virtio/scsi/virtio_scsi.c +++ b/sys/dev/virtio/scsi/virtio_scsi.c @@ -937,7 +937,7 @@ vtscsi_cam_path_inquiry(struct vtscsi_softc *sc, struct cam_sim *sim, cpi->max_target = sc->vtscsi_max_target; cpi->max_lun = sc->vtscsi_max_lun; - cpi->initiator_id = VTSCSI_INITIATOR_ID; + cpi->initiator_id = cpi->max_target + 1; strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strlcpy(cpi->hba_vid, "VirtIO", HBA_IDLEN); diff --git a/sys/dev/virtio/scsi/virtio_scsivar.h b/sys/dev/virtio/scsi/virtio_scsivar.h index 3e4109e658709..064b1245a5655 100644 --- a/sys/dev/virtio/scsi/virtio_scsivar.h +++ b/sys/dev/virtio/scsi/virtio_scsivar.h @@ -205,11 +205,6 @@ struct vtscsi_request { #define VTSCSI_RESERVED_REQUESTS 10 /* - * Specification doesn't say, use traditional SCSI default. - */ -#define VTSCSI_INITIATOR_ID 7 - -/* * How to wait (or not) for request completion. */ #define VTSCSI_EXECUTE_ASYNC 0 diff --git a/sys/dev/vmware/vmxnet3/if_vmx.c b/sys/dev/vmware/vmxnet3/if_vmx.c index b639a926ed426..d0b0436ea25c5 100644 --- a/sys/dev/vmware/vmxnet3/if_vmx.c +++ b/sys/dev/vmware/vmxnet3/if_vmx.c @@ -23,6 +23,8 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include "opt_rss.h" + #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -46,6 +48,9 @@ __FBSDID("$FreeBSD$"); #include <net/if_media.h> #include <net/if_vlan_var.h> #include <net/iflib.h> +#ifdef RSS +#include <net/rss_config.h> +#endif #include <netinet/in_systm.h> #include <netinet/in.h> @@ -1140,8 +1145,11 @@ vmxnet3_reinit_rss_shared_data(struct vmxnet3_softc *sc) struct vmxnet3_driver_shared *ds; if_softc_ctx_t scctx; struct vmxnet3_rss_shared *rss; +#ifdef RSS + uint8_t rss_algo; +#endif int i; - + ds = sc->vmx_ds; scctx = sc->vmx_scctx; rss = sc->vmx_rss; @@ -1152,10 +1160,29 @@ vmxnet3_reinit_rss_shared_data(struct vmxnet3_softc *sc) rss->hash_func = UPT1_RSS_HASH_FUNC_TOEPLITZ; rss->hash_key_size = UPT1_RSS_MAX_KEY_SIZE; rss->ind_table_size = UPT1_RSS_MAX_IND_TABLE_SIZE; - memcpy(rss->hash_key, rss_key, UPT1_RSS_MAX_KEY_SIZE); - - for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++) - rss->ind_table[i] = i % scctx->isc_nrxqsets; +#ifdef RSS + /* + * If the software RSS is configured to anything else other than + * Toeplitz, then just do Toeplitz in "hardware" for the sake of + * the packet distribution, but report the hash as opaque to + * disengage from the software RSS. + */ + rss_algo = rss_gethashalgo(); + if (rss_algo == RSS_HASH_TOEPLITZ) { + rss_getkey(rss->hash_key); + for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++) { + rss->ind_table[i] = rss_get_indirection_to_bucket(i) % + scctx->isc_nrxqsets; + } + sc->vmx_flags |= VMXNET3_FLAG_SOFT_RSS; + } else +#endif + { + memcpy(rss->hash_key, rss_key, UPT1_RSS_MAX_KEY_SIZE); + for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++) + rss->ind_table[i] = i % scctx->isc_nrxqsets; + sc->vmx_flags &= ~VMXNET3_FLAG_SOFT_RSS; + } } static void @@ -1499,29 +1526,50 @@ vmxnet3_isc_rxd_pkt_get(void *vsc, if_rxd_info_t ri) KASSERT(rxcd->sop, ("%s: expected sop", __func__)); /* - * RSS and flow ID + * RSS and flow ID. + * Types other than M_HASHTYPE_NONE and M_HASHTYPE_OPAQUE_HASH should + * be used only if the software RSS is enabled and it uses the same + * algorithm and the hash key as the "hardware". If the software RSS + * is not enabled, then it's simply pointless to use those types. + * If it's enabled but with different parameters, then hash values will + * not match. */ ri->iri_flowid = rxcd->rss_hash; - switch (rxcd->rss_type) { - case VMXNET3_RCD_RSS_TYPE_NONE: - ri->iri_flowid = ri->iri_qsidx; - ri->iri_rsstype = M_HASHTYPE_NONE; - break; - case VMXNET3_RCD_RSS_TYPE_IPV4: - ri->iri_rsstype = M_HASHTYPE_RSS_IPV4; - break; - case VMXNET3_RCD_RSS_TYPE_TCPIPV4: - ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV4; - break; - case VMXNET3_RCD_RSS_TYPE_IPV6: - ri->iri_rsstype = M_HASHTYPE_RSS_IPV6; - break; - case VMXNET3_RCD_RSS_TYPE_TCPIPV6: - ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV6; - break; - default: - ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH; - break; +#ifdef RSS + if ((sc->vmx_flags & VMXNET3_FLAG_SOFT_RSS) != 0) { + switch (rxcd->rss_type) { + case VMXNET3_RCD_RSS_TYPE_NONE: + ri->iri_flowid = ri->iri_qsidx; + ri->iri_rsstype = M_HASHTYPE_NONE; + break; + case VMXNET3_RCD_RSS_TYPE_IPV4: + ri->iri_rsstype = M_HASHTYPE_RSS_IPV4; + break; + case VMXNET3_RCD_RSS_TYPE_TCPIPV4: + ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV4; + break; + case VMXNET3_RCD_RSS_TYPE_IPV6: + ri->iri_rsstype = M_HASHTYPE_RSS_IPV6; + break; + case VMXNET3_RCD_RSS_TYPE_TCPIPV6: + ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV6; + break; + default: + ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH; + break; + } + } else +#endif + { + switch (rxcd->rss_type) { + case VMXNET3_RCD_RSS_TYPE_NONE: + ri->iri_flowid = ri->iri_qsidx; + ri->iri_rsstype = M_HASHTYPE_NONE; + break; + default: + ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH; + break; + } } /* VLAN */ diff --git a/sys/dev/vmware/vmxnet3/if_vmxvar.h b/sys/dev/vmware/vmxnet3/if_vmxvar.h index 7e231e8924c3d..20e73af690042 100644 --- a/sys/dev/vmware/vmxnet3/if_vmxvar.h +++ b/sys/dev/vmware/vmxnet3/if_vmxvar.h @@ -113,6 +113,8 @@ struct vmxnet3_softc { struct vmxnet3_driver_shared *vmx_ds; uint32_t vmx_flags; #define VMXNET3_FLAG_RSS 0x0002 +#define VMXNET3_FLAG_SOFT_RSS 0x0004 /* Software RSS is enabled with + compatible algorithm. */ struct vmxnet3_rxqueue *vmx_rxq; struct vmxnet3_txqueue *vmx_txq; diff --git a/sys/dev/xen/netback/netback.c b/sys/dev/xen/netback/netback.c index ecc26981e2b37..1e972cd09f814 100644 --- a/sys/dev/xen/netback/netback.c +++ b/sys/dev/xen/netback/netback.c @@ -780,7 +780,7 @@ xnb_connect_comms(struct xnb_softc *xnb) xnb->evtchn, /*filter*/NULL, xnb_intr, /*arg*/xnb, - INTR_TYPE_BIO | INTR_MPSAFE, + INTR_TYPE_NET | INTR_MPSAFE, &xnb->xen_intr_handle); if (error != 0) { (void)xnb_disconnect(xnb); |
