Module Name: src Committed By: jdolecek Date: Mon Apr 6 18:23:21 UTC 2020
Modified Files: src/sys/arch/xen/xen: if_xennet_xenbus.c Log Message: convert to IFEF_MPSAFE, also enable interrupt handler without biglock no performance difference observed compared to version before change, for neither UP nor MP DomU To generate a diff of this commit: cvs rdiff -u -r1.105 -r1.106 src/sys/arch/xen/xen/if_xennet_xenbus.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/xen/xen/if_xennet_xenbus.c diff -u src/sys/arch/xen/xen/if_xennet_xenbus.c:1.105 src/sys/arch/xen/xen/if_xennet_xenbus.c:1.106 --- src/sys/arch/xen/xen/if_xennet_xenbus.c:1.105 Mon Apr 6 16:43:34 2020 +++ src/sys/arch/xen/xen/if_xennet_xenbus.c Mon Apr 6 18:23:21 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_xennet_xenbus.c,v 1.105 2020/04/06 16:43:34 jdolecek Exp $ */ +/* $NetBSD: if_xennet_xenbus.c,v 1.106 2020/04/06 18:23:21 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -81,7 +81,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.105 2020/04/06 16:43:34 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.106 2020/04/06 18:23:21 jdolecek Exp $"); #include "opt_xen.h" #include "opt_nfs_boot.h" @@ -194,8 +194,8 @@ struct xennet_xenbus_softc { grant_ref_t sc_tx_ring_gntref; grant_ref_t sc_rx_ring_gntref; - kmutex_t sc_tx_lock; /* protects free TX list, TX ring, and ifp */ - kmutex_t sc_rx_lock; /* protects free RX list, RX ring, and rxreql */ + kmutex_t sc_tx_lock; /* protects free TX list, TX ring */ + kmutex_t sc_rx_lock; /* protects free RX list, RX ring, rxreql */ struct xennet_txreq sc_txreqs[NET_TX_RING_SIZE]; struct xennet_rxreq sc_rxreqs[NET_RX_RING_SIZE]; SLIST_HEAD(,xennet_txreq) sc_txreq_head; /* list of free TX requests */ @@ -234,7 +234,6 @@ static int xennet_init(struct ifnet *); static void xennet_stop(struct ifnet *, int); static void xennet_start(struct ifnet *); static int xennet_ioctl(struct ifnet *, u_long, void *); -static void xennet_watchdog(struct ifnet *); static bool xennet_xenbus_suspend(device_t dev, const pmf_qual_t *); static bool xennet_xenbus_resume (device_t dev, const pmf_qual_t *); @@ -363,11 +362,10 @@ xennet_xenbus_attach(device_t parent, de ifp->if_softc = sc; ifp->if_start = xennet_start; ifp->if_ioctl = xennet_ioctl; - ifp->if_watchdog = xennet_watchdog; ifp->if_init = xennet_init; ifp->if_stop = xennet_stop; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_timer = 0; + ifp->if_extflags = IFEF_MPSAFE; ifp->if_snd.ifq_maxlen = uimax(ifqmaxlen, NET_TX_RING_SIZE * 2); ifp->if_capabilities = IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_IPv4_Tx @@ -535,8 +533,8 @@ xennet_xenbus_resume(device_t dev, const goto abort_resume; aprint_verbose_dev(dev, "using event channel %d\n", sc->sc_evtchn); - sc->sc_ih = xen_intr_establish_xname(-1, &xen_pic, sc->sc_evtchn, IST_LEVEL, - IPL_NET, &xennet_handler, sc, false, device_xname(dev)); + sc->sc_ih = xen_intr_establish_xname(-1, &xen_pic, sc->sc_evtchn, + IST_LEVEL, IPL_NET, &xennet_handler, sc, true, device_xname(dev)); KASSERT(sc->sc_ih != NULL); return true; @@ -849,7 +847,6 @@ again: /* set new event and check for race with rsp_cons update */ sc->sc_tx_ring.sring->rsp_event = resp_prod + ((sc->sc_tx_ring.sring->req_prod - resp_prod) >> 1) + 1; - ifp->if_timer = 0; xen_wmb(); if (resp_prod != sc->sc_tx_ring.sring->rsp_prod) goto again; @@ -906,18 +903,6 @@ again: #ifdef XENNET_DEBUG_DUMP xennet_hex_dump(pktp, rx->status, "r", rx->id); #endif - if ((ifp->if_flags & IFF_PROMISC) == 0) { - struct ether_header *eh = pktp; - if (ETHER_IS_MULTICAST(eh->ether_dhost) == 0 && - memcmp(CLLADDR(ifp->if_sadl), eh->ether_dhost, - ETHER_ADDR_LEN) != 0) { - DPRINTFN(XEDB_EVENT, - ("xennet_handler bad dest\n")); - /* packet not for us */ - xennet_rx_free_req(sc, req); - continue; - } - } MGETHDR(m, M_DONTWAIT, MT_DATA); if (__predict_false(m == NULL)) { printf("%s: rx no mbuf\n", ifp->if_xname); @@ -984,7 +969,7 @@ void xennet_start(struct ifnet *ifp) { struct xennet_xenbus_softc *sc = ifp->if_softc; - struct mbuf *m, *new_m; + struct mbuf *m; netif_tx_request_t *txreq; RING_IDX req_prod; paddr_t pa; @@ -994,11 +979,6 @@ xennet_start(struct ifnet *ifp) mutex_enter(&sc->sc_tx_lock); - if ((ifp->if_flags & IFF_RUNNING) == 0) { - mutex_exit(&sc->sc_tx_lock); - return; - } - rnd_add_uint32(&sc->sc_rnd_source, sc->sc_tx_ring.req_prod_pvt); xennet_tx_complete(sc); @@ -1011,7 +991,7 @@ xennet_start(struct ifnet *ifp) if (__predict_false(req == NULL)) { break; } - IFQ_POLL(&ifp->if_snd, m); + IFQ_DEQUEUE(&ifp->if_snd, m); if (m == NULL) break; @@ -1043,11 +1023,13 @@ xennet_start(struct ifnet *ifp) if (m->m_pkthdr.len != m->m_len || (pa ^ (pa + m->m_pkthdr.len - 1)) & PTE_4KFRAME) { + struct mbuf *new_m; MGETHDR(new_m, M_DONTWAIT, MT_DATA); if (__predict_false(new_m == NULL)) { printf("%s: cannot allocate new mbuf\n", device_xname(sc->sc_dev)); + m_freem(m); break; } if (m->m_pkthdr.len > MHLEN) { @@ -1057,12 +1039,14 @@ xennet_start(struct ifnet *ifp) DPRINTF(("%s: no mbuf cluster\n", device_xname(sc->sc_dev))); m_freem(new_m); + m_freem(m); break; } } m_copydata(m, 0, m->m_pkthdr.len, mtod(new_m, void *)); new_m->m_len = new_m->m_pkthdr.len = m->m_pkthdr.len; + m_freem(m); if ((new_m->m_flags & M_EXT) != 0) { pa = new_m->m_ext.ext_paddr; @@ -1074,27 +1058,17 @@ xennet_start(struct ifnet *ifp) KASSERT(new_m->m_data == M_BUFADDR(new_m)); pa += M_BUFOFFSET(new_m); } - if (__predict_false(xengnt_grant_access( - sc->sc_xbusd->xbusd_otherend_id, - xpmap_ptom_masked(pa), - GNTMAP_readonly, &req->txreq_gntref) != 0)) { - m_freem(new_m); - break; - } - /* we will be able to send new_m */ - IFQ_DEQUEUE(&ifp->if_snd, m); - m_freem(m); m = new_m; - } else { - if (__predict_false(xengnt_grant_access( - sc->sc_xbusd->xbusd_otherend_id, - xpmap_ptom_masked(pa), - GNTMAP_readonly, &req->txreq_gntref) != 0)) { - break; - } - /* we will be able to send m */ - IFQ_DEQUEUE(&ifp->if_snd, m); } + + if (__predict_false(xengnt_grant_access( + sc->sc_xbusd->xbusd_otherend_id, + xpmap_ptom_masked(pa), + GNTMAP_readonly, &req->txreq_gntref) != 0)) { + m_freem(m); + break; + } + MCLAIM(m, &sc->sc_ethercom.ec_tx_mowner); KASSERT(((pa ^ (pa + m->m_pkthdr.len - 1)) & PTE_4KFRAME) == 0); @@ -1131,10 +1105,8 @@ xennet_start(struct ifnet *ifp) bpf_mtap(ifp, m, BPF_D_OUT); } - if (do_notify) { + if (do_notify) hypervisor_notify_via_evtchn(sc->sc_evtchn); - ifp->if_timer = 5; - } mutex_exit(&sc->sc_tx_lock); @@ -1148,16 +1120,15 @@ xennet_ioctl(struct ifnet *ifp, u_long c #ifdef XENNET_DEBUG struct xennet_xenbus_softc *sc = ifp->if_softc; #endif - int s, error = 0; + int error = 0; - s = splnet(); + KASSERT(IFNET_LOCKED(ifp)); DPRINTFN(XEDB_FOLLOW, ("%s: xennet_ioctl()\n", device_xname(sc->sc_dev))); error = ether_ioctl(ifp, cmd, data); if (error == ENETRESET) error = 0; - splx(s); DPRINTFN(XEDB_FOLLOW, ("%s: xennet_ioctl() returning %d\n", device_xname(sc->sc_dev), error)); @@ -1165,21 +1136,16 @@ xennet_ioctl(struct ifnet *ifp, u_long c return error; } -void -xennet_watchdog(struct ifnet *ifp) -{ - DPRINTFN(XEDB_FOLLOW, ("%s: xennet_watchdog\n", ifp->if_xname)); -} - int xennet_init(struct ifnet *ifp) { struct xennet_xenbus_softc *sc = ifp->if_softc; + KASSERT(IFNET_LOCKED(ifp)); + DPRINTFN(XEDB_FOLLOW, ("%s: xennet_init()\n", device_xname(sc->sc_dev))); - mutex_enter(&sc->sc_tx_lock); if ((ifp->if_flags & IFF_RUNNING) == 0) { mutex_enter(&sc->sc_rx_lock); sc->sc_rx_ring.sring->rsp_event = @@ -1189,8 +1155,7 @@ xennet_init(struct ifnet *ifp) hypervisor_notify_via_evtchn(sc->sc_evtchn); } ifp->if_flags |= IFF_RUNNING; - ifp->if_timer = 0; - mutex_exit(&sc->sc_tx_lock); + return 0; } @@ -1199,9 +1164,9 @@ xennet_stop(struct ifnet *ifp, int disab { struct xennet_xenbus_softc *sc = ifp->if_softc; - mutex_enter(&sc->sc_tx_lock); + IFNET_LOCK(ifp); ifp->if_flags &= ~IFF_RUNNING; - mutex_exit(&sc->sc_tx_lock); + IFNET_UNLOCK(ifp); hypervisor_mask_event(sc->sc_evtchn); }