Module Name: src Committed By: jdolecek Date: Thu Mar 26 18:32:21 UTC 2020
Modified Files: src/sys/arch/xen/xen: if_xennet_xenbus.c Log Message: Stop using IFF_OACTIVE, just keep processing until we fill the Tx ring xennet_tx_complete() is now called only in xennet_softstart() just before processing Tx queue; xennet_handler() just schedules the softint for xennet_softstart() iff the Tx ring list is completely empty no performance changes observed XXX the detach and suspend code expects xennet_handler() to collect XXX the Tx responses, the tsleep() loop should still work since the tsleep() XXX would allow the softint to trigger; untested though To generate a diff of this commit: cvs rdiff -u -r1.94 -r1.95 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.94 src/sys/arch/xen/xen/if_xennet_xenbus.c:1.95 --- src/sys/arch/xen/xen/if_xennet_xenbus.c:1.94 Sun Mar 22 11:20:59 2020 +++ src/sys/arch/xen/xen/if_xennet_xenbus.c Thu Mar 26 18:32:21 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_xennet_xenbus.c,v 1.94 2020/03/22 11:20:59 jdolecek Exp $ */ +/* $NetBSD: if_xennet_xenbus.c,v 1.95 2020/03/26 18:32:21 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -64,11 +64,8 @@ * xennet_start() (default output routine of xennet) that schedules a softint, * xennet_softstart(). xennet_softstart() generates the requests associated * to the TX mbufs queued (see altq(9)). - * The backend's responses are processed by xennet_tx_complete(), called either - * from: - * - xennet_start() - * - xennet_handler(), during an asynchronous event notification from backend - * (similar to an IRQ). + * The backend's responses are processed by xennet_tx_complete(), called + * from xennet_softstart() * * for RX: * Purpose is to process the packets received from the outside. RX buffers @@ -84,7 +81,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.94 2020/03/22 11:20:59 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.95 2020/03/26 18:32:21 jdolecek Exp $"); #include "opt_xen.h" #include "opt_nfs_boot.h" @@ -934,7 +931,7 @@ xennet_rx_free_req(struct xennet_rxreq * /* * Process responses associated to the TX mbufs sent previously through * xennet_softstart() - * Called at splnet. + * Called at splsoftnet. */ static void xennet_tx_complete(struct xennet_xenbus_softc *sc) @@ -958,7 +955,7 @@ again: aprint_verbose_dev(sc->sc_dev, "grant still used by backend\n"); sc->sc_tx_ring.rsp_cons = i; - goto end; + return; } if (__predict_false( RING_GET_RESPONSE(&sc->sc_tx_ring, i)->status != @@ -980,11 +977,6 @@ again: xen_wmb(); if (resp_prod != sc->sc_tx_ring.sring->rsp_prod) goto again; -end: - if (ifp->if_flags & IFF_OACTIVE) { - ifp->if_flags &= ~IFF_OACTIVE; - softint_schedule(sc->sc_softintr); - } } /* @@ -1011,7 +1003,11 @@ xennet_handler(void *arg) if (sc->sc_backend_status != BEST_CONNECTED) return 1; - xennet_tx_complete(sc); + /* Poke Tx queue if we run out of Tx buffers earlier */ + mutex_enter(&sc->sc_tx_lock); + if (SLIST_EMPTY(&sc->sc_txreq_head)) + softint_schedule(sc->sc_softintr); + mutex_exit(&sc->sc_tx_lock); rnd_add_uint32(&sc->sc_rnd_source, sc->sc_tx_ring.req_prod_pvt); @@ -1162,12 +1158,6 @@ xennet_start(struct ifnet *ifp) rnd_add_uint32(&sc->sc_rnd_source, sc->sc_tx_ring.req_prod_pvt); - xennet_tx_complete(sc); - - if (__predict_false( - (ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)) - return; - /* * The Xen communication channel is much more efficient if we can * schedule batch of packets for domain0. To achieve this, we @@ -1196,12 +1186,12 @@ xennet_softstart(void *arg) int notify; int do_notify = 0; - mutex_enter(&sc->sc_tx_lock); - if (__predict_false( - (ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)) { - mutex_exit(&sc->sc_tx_lock); + if ((ifp->if_flags & IFF_RUNNING) == 0) return; - } + + xennet_tx_complete(sc); + + mutex_enter(&sc->sc_tx_lock); req_prod = sc->sc_tx_ring.req_prod_pvt; while (/*CONSTCOND*/1) { @@ -1209,7 +1199,6 @@ xennet_softstart(void *arg) req = SLIST_FIRST(&sc->sc_txreq_head); if (__predict_false(req == NULL)) { - ifp->if_flags |= IFF_OACTIVE; break; } IFQ_POLL(&ifp->if_snd, m); @@ -1280,7 +1269,6 @@ xennet_softstart(void *arg) xpmap_ptom_masked(pa), GNTMAP_readonly, &req->txreq_gntref) != 0)) { m_freem(new_m); - ifp->if_flags |= IFF_OACTIVE; break; } /* we will be able to send new_m */ @@ -1292,7 +1280,6 @@ xennet_softstart(void *arg) sc->sc_xbusd->xbusd_otherend_id, xpmap_ptom_masked(pa), GNTMAP_readonly, &req->txreq_gntref) != 0)) { - ifp->if_flags |= IFF_OACTIVE; break; } /* we will be able to send m */ @@ -1409,7 +1396,6 @@ xennet_init(struct ifnet *ifp) xennet_reset(sc); } ifp->if_flags |= IFF_RUNNING; - ifp->if_flags &= ~IFF_OACTIVE; ifp->if_timer = 0; mutex_exit(&sc->sc_rx_lock); return 0; @@ -1420,7 +1406,7 @@ xennet_stop(struct ifnet *ifp, int disab { struct xennet_xenbus_softc *sc = ifp->if_softc; - ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); + ifp->if_flags &= ~IFF_RUNNING; hypervisor_mask_event(sc->sc_evtchn); xennet_reset(sc); }