Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/xen/xen Stop using IFF_OACTIVE, just keep processin...
details: https://anonhg.NetBSD.org/src/rev/0aa5f13f8f8d
branches: trunk
changeset: 970519:0aa5f13f8f8d
user: jdolecek <jdolecek%NetBSD.org@localhost>
date: Thu Mar 26 18:32:21 2020 +0000
description:
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
diffstat:
sys/arch/xen/xen/if_xennet_xenbus.c | 48 +++++++++++++-----------------------
1 files changed, 17 insertions(+), 31 deletions(-)
diffs (147 lines):
diff -r 2e4af1bfe3db -r 0aa5f13f8f8d sys/arch/xen/xen/if_xennet_xenbus.c
--- a/sys/arch/xen/xen/if_xennet_xenbus.c Thu Mar 26 18:28:09 2020 +0000
+++ b/sys/arch/xen/xen/if_xennet_xenbus.c Thu Mar 26 18:32:21 2020 +0000
@@ -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 @@
/*
* 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 @@
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 @@
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 @@
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 @@
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 @@
int notify;
int do_notify = 0;
+ if ((ifp->if_flags & IFF_RUNNING) == 0)
+ return;
+
+ xennet_tx_complete(sc);
+
mutex_enter(&sc->sc_tx_lock);
- if (__predict_false(
- (ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)) {
- mutex_exit(&sc->sc_tx_lock);
- return;
- }
req_prod = sc->sc_tx_ring.req_prod_pvt;
while (/*CONSTCOND*/1) {
@@ -1209,7 +1199,6 @@
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 @@
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 @@
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_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 @@
{
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);
}
Home |
Main Index |
Thread Index |
Old Index