The branch main has been updated by mav:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=90bc1cf65778aafb1f226c8fe08218cfed5e40b2

commit 90bc1cf65778aafb1f226c8fe08218cfed5e40b2
Author:     Alexander Motin <[email protected]>
AuthorDate: 2022-01-10 01:32:50 +0000
Commit:     Alexander Motin <[email protected]>
CommitDate: 2022-01-10 01:32:50 +0000

    iflib: Relax timer period from 0.5 to 0.5-0.75s.
    
    While there switch it from hardclock ticks to milliseconds.
    
    MFC after:      2 weeks
---
 sys/net/iflib.c | 56 +++++++++++++++++++++++++++-----------------------------
 1 file changed, 27 insertions(+), 29 deletions(-)

diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index 3fcab699f9e0..180b42731e1f 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -337,7 +337,6 @@ struct iflib_txq {
        uint64_t        ift_map_failed;
        uint64_t        ift_txd_encap_efbig;
        uint64_t        ift_pullups;
-       uint64_t        ift_last_timer_tick;
 
        struct mtx      ift_mtx;
        struct mtx      ift_db_mtx;
@@ -587,9 +586,9 @@ SYSCTL_INT(_net_iflib, OID_AUTO, min_tx_latency, CTLFLAG_RW,
 static int iflib_no_tx_batch = 0;
 SYSCTL_INT(_net_iflib, OID_AUTO, no_tx_batch, CTLFLAG_RW,
                   &iflib_no_tx_batch, 0, "minimize transmit latency at the 
possible expense of throughput");
-static int iflib_timer_default = 1000;
-SYSCTL_INT(_net_iflib, OID_AUTO, timer_default, CTLFLAG_RW,
-                  &iflib_timer_default, 0, "number of ticks between 
iflib_timer calls");
+static int iflib_timer_period = 500;
+SYSCTL_INT(_net_iflib, OID_AUTO, timer_period, CTLFLAG_RW,
+                  &iflib_timer_period, 0, "milliseconds between iflib_timer 
calls");
 
 
 #if IFLIB_DEBUG_COUNTERS
@@ -2393,7 +2392,6 @@ iflib_timer(void *arg)
        iflib_txq_t txq = arg;
        if_ctx_t ctx = txq->ift_ctx;
        if_softc_ctx_t sctx = &ctx->ifc_softc_ctx;
-       uint64_t this_tick = ticks;
 
        if (!(if_getdrvflags(ctx->ifc_ifp) & IFF_DRV_RUNNING))
                return;
@@ -2403,30 +2401,28 @@ iflib_timer(void *arg)
        ** can be done without the lock because its RO
        ** and the HUNG state will be static if set.
        */
-       if (this_tick - txq->ift_last_timer_tick >= iflib_timer_default) {
-               txq->ift_last_timer_tick = this_tick;
-               IFDI_TIMER(ctx, txq->ift_id);
-               if ((txq->ift_qstatus == IFLIB_QUEUE_HUNG) &&
-                   ((txq->ift_cleaned_prev == txq->ift_cleaned) ||
-                    (sctx->isc_pause_frames == 0)))
-                       goto hung;
-
-               if (txq->ift_qstatus != IFLIB_QUEUE_IDLE &&
-                   ifmp_ring_is_stalled(txq->ift_br)) {
-                       KASSERT(ctx->ifc_link_state == LINK_STATE_UP,
-                           ("queue can't be marked as hung if interface is 
down"));
-                       txq->ift_qstatus = IFLIB_QUEUE_HUNG;
-               }
-               txq->ift_cleaned_prev = txq->ift_cleaned;
-       }
+       IFDI_TIMER(ctx, txq->ift_id);
+       if ((txq->ift_qstatus == IFLIB_QUEUE_HUNG) &&
+           ((txq->ift_cleaned_prev == txq->ift_cleaned) ||
+            (sctx->isc_pause_frames == 0)))
+               goto hung;
+       if (txq->ift_qstatus != IFLIB_QUEUE_IDLE &&
+           ifmp_ring_is_stalled(txq->ift_br)) {
+               KASSERT(ctx->ifc_link_state == LINK_STATE_UP,
+                   ("queue can't be marked as hung if interface is down"));
+               txq->ift_qstatus = IFLIB_QUEUE_HUNG;
+       }
+       txq->ift_cleaned_prev = txq->ift_cleaned;
+
        /* handle any laggards */
        if (txq->ift_db_pending)
                GROUPTASK_ENQUEUE(&txq->ift_task);
 
        sctx->isc_pause_frames = 0;
-       if (if_getdrvflags(ctx->ifc_ifp) & IFF_DRV_RUNNING) 
-               callout_reset_on(&txq->ift_timer, iflib_timer_default, 
iflib_timer,
-                   txq, txq->ift_timer.c_cpu);
+       if (if_getdrvflags(ctx->ifc_ifp) & IFF_DRV_RUNNING)
+               callout_reset_sbt_on(&txq->ift_timer,
+                   iflib_timer_period * SBT_1MS, 0,
+                   iflib_timer, txq, txq->ift_timer.c_cpu, C_PREL(1));
        return;
 
  hung:
@@ -2544,8 +2540,9 @@ done:
        IFDI_INTR_ENABLE(ctx);
        txq = ctx->ifc_txqs;
        for (i = 0; i < sctx->isc_ntxqsets; i++, txq++)
-               callout_reset_on(&txq->ift_timer, iflib_timer_default, 
iflib_timer, txq,
-                       txq->ift_timer.c_cpu);
+               callout_reset_sbt_on(&txq->ift_timer,
+                   iflib_timer_period * SBT_1MS, 0,
+                   iflib_timer, txq, txq->ift_timer.c_cpu, C_PREL(1));
 
         /* Re-enable txsync/rxsync. */
        netmap_enable_all_rings(ifp);
@@ -4067,8 +4064,9 @@ _task_fn_admin(void *context)
        }
        IFDI_UPDATE_ADMIN_STATUS(ctx);
        for (txq = ctx->ifc_txqs, i = 0; i < sctx->isc_ntxqsets; i++, txq++) {
-               callout_reset_on(&txq->ift_timer, iflib_timer_default, 
iflib_timer, txq,
-                   txq->ift_timer.c_cpu);
+               callout_reset_sbt_on(&txq->ift_timer,
+                   iflib_timer_period * SBT_1MS, 0,
+                   iflib_timer, txq, txq->ift_timer.c_cpu, C_PREL(1));
        }
        IFDI_LINK_INTR_ENABLE(ctx);
        if (do_reset)
@@ -5721,7 +5719,7 @@ iflib_device_iov_add_vf(device_t dev, uint16_t vfnum, 
const nvlist_t *params)
 static int
 iflib_module_init(void)
 {
-       iflib_timer_default = hz / 2;
+
        return (0);
 }
 

Reply via email to