]> xenbits.xensource.com Git - people/royger/freebsd.git/commitdiff
iflib: Allow drivers to determine which queue to TX on
authorEric Joyner <erj@FreeBSD.org>
Thu, 29 Jul 2021 23:24:14 +0000 (16:24 -0700)
committerEric Joyner <erj@FreeBSD.org>
Tue, 8 Mar 2022 00:10:27 +0000 (16:10 -0800)
Adds a new function pointer to struct if_txrx in order to allow
drivers to set their own function that will determine which queue
a packet should be sent on.

Since this includes a kernel ABI change, bump the __FreeBSD_version
as well.

(This motivation behind this is to allow the driver to examine the
UP in the VLAN tag and determine which queue to TX on based on
that, in support of HW TX traffic shaping.)

Signed-off-by: Eric Joyner <erj@FreeBSD.org>
Reviewed by: kbowling@, stallamr@netapp.com
Tested by: jeffrey.e.pieper@intel.com
Sponsored by: Intel Corporation
Differential Revision: https://reviews.freebsd.org/D31485

(cherry picked from commit 213e91399b7998554d787bb290109ebe602aa279)

sys/net/iflib.c
sys/net/iflib.h
sys/sys/param.h

index 81cb66738454c79f506d899b0dbf1873c7e93715..aba3baaa1e50fbf7edb62c7d1f53ca9ed8249d8b 100644 (file)
@@ -209,6 +209,7 @@ struct iflib_ctx {
 #define isc_rxd_refill ifc_txrx.ift_rxd_refill
 #define isc_rxd_flush ifc_txrx.ift_rxd_flush
 #define isc_legacy_intr ifc_txrx.ift_legacy_intr
+#define isc_txq_select ifc_txrx.ift_txq_select
        eventhandler_tag ifc_vlan_attach_event;
        eventhandler_tag ifc_vlan_detach_event;
        struct ether_addr ifc_mac;
@@ -4127,11 +4128,14 @@ iflib_if_transmit(if_t ifp, struct mbuf *m)
        MPASS(m->m_nextpkt == NULL);
        /* ALTQ-enabled interfaces always use queue 0. */
        qidx = 0;
-       if ((NTXQSETS(ctx) > 1) && M_HASHTYPE_GET(m) && !ALTQ_IS_ENABLED(&ifp->if_snd))
+       /* Use driver-supplied queue selection method if it exists */
+       if (ctx->isc_txq_select)
+               qidx = ctx->isc_txq_select(ctx->ifc_softc, m);
+       /* If not, use iflib's standard method */
+       else if ((NTXQSETS(ctx) > 1) && M_HASHTYPE_GET(m) && !ALTQ_IS_ENABLED(&ifp->if_snd))
                qidx = QIDX(ctx, m);
-       /*
-        * XXX calculate buf_ring based on flowid (divvy up bits?)
-        */
+
+       /* Set TX queue */
        txq = &ctx->ifc_txqs[qidx];
 
 #ifdef DRIVER_BACKPRESSURE
index fcf96215d3981202f88a2f8de2aae880871a55ea..42cab766a2fa07ccbc4f46f7afc00b71552bcd34 100644 (file)
@@ -187,6 +187,7 @@ typedef struct if_txrx {
        void (*ift_rxd_refill) (void * , if_rxd_update_t iru);
        void (*ift_rxd_flush) (void *, uint16_t qsidx, uint8_t flidx, qidx_t pidx);
        int (*ift_legacy_intr) (void *);
+       qidx_t (*ift_txq_select) (void *, struct mbuf *);
 } *if_txrx_t;
 
 typedef struct if_softc_ctx {
@@ -396,6 +397,16 @@ typedef enum {
  */
 #define IFLIB_PSEUDO_ETHER     0x80000
 
+/* The following IFLIB_FEATURE_* defines are for driver modules to determine
+ * what features this version of iflib supports. They shall be defined to the
+ * first __FreeBSD_version that introduced the feature.
+ */
+/*
+ * Driver can set its own TX queue selection function
+ * as ift_txq_select in struct if_txrx
+ */
+#define IFLIB_FEATURE_QUEUE_SELECT     1300527
+
 /*
  * These enum values are used in iflib_needs_restart to indicate to iflib
  * functions whether or not the interface needs restarting when certain events
index 86ad3d3a4cfc73c56c11eed5f0cda06abaa04bc6..1d2f1154e65560127fffa8dd79fdb21595352af5 100644 (file)
@@ -60,7 +60,7 @@
  *             in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1300526      /* Master, propagated to newvers */
+#define __FreeBSD_version 1300527      /* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,