Should we enable this by default?  My primary concern in the review is not
making things like this require expert tuning.  If it is expected to be
necessary, which Gallatin@ makes a case for, let’s toggle it on by default.

On Mon, May 3, 2021 at 10:56 AM Mark Johnston <ma...@freebsd.org> wrote:

> The branch main has been updated by markj:
>
> URL:
> https://cgit.FreeBSD.org/src/commit/?id=64881da478071431a2d9e62613997a5772c56cdf
>
> commit 64881da478071431a2d9e62613997a5772c56cdf
> Author:     Sai Rajesh Tallamraju <stall...@netapp.com>
> AuthorDate: 2021-05-03 17:45:00 +0000
> Commit:     Mark Johnston <ma...@freebsd.org>
> CommitDate: 2021-05-03 17:47:14 +0000
>
>     ixgbe: Restore AIM support
>
>     AIM (adaptive interrupt moderation) was part of BSD11 driver. Upon
> IFLIB
>     migration, AIM feature got lost. Re-introducing AIM back into IFLIB
>     based IXGBE driver.
>
>     One caveat is that in BSD11 driver, a queue comprises both Rx and Tx
>     ring. Starting from BSD12, Rx and Tx have their own queues and rings.
>     Also, IRQ is now only configured for Rx side. So, when AIM is
>     re-enabled, we should now consider only Rx stats for configuring EITR
>     register in contrast to BSD11 where Rx and Tx stats were considered to
>     manipulate EITR register.
>
>     Reviewed by:    gallatin, markj
>     Sponsored by:   NetApp, Inc.
>     MFC after:      2 weeks
>     Differential Revision:  https://reviews.freebsd.org/D27344
> ---
>  sys/dev/ixgbe/if_ix.c | 73
> +++++++++++++++++++++++++++++++++++++++++++++++++++
>  sys/dev/ixgbe/ixgbe.h |  1 +
>  2 files changed, 74 insertions(+)
>
> diff --git a/sys/dev/ixgbe/if_ix.c b/sys/dev/ixgbe/if_ix.c
> index 489e891cf509..fbe4f1df38ca 100644
> --- a/sys/dev/ixgbe/if_ix.c
> +++ b/sys/dev/ixgbe/if_ix.c
> @@ -347,6 +347,16 @@ static int ixgbe_enable_rss = 1;
>  SYSCTL_INT(_hw_ix, OID_AUTO, enable_rss, CTLFLAG_RDTUN,
> &ixgbe_enable_rss, 0,
>      "Enable Receive-Side Scaling (RSS)");
>
> +/*
> + * AIM: Adaptive Interrupt Moderation
> + * which means that the interrupt rate
> + * is varied over time based on the
> + * traffic for that interrupt vector
> + */
> +static int ixgbe_enable_aim = FALSE;
> +SYSCTL_INT(_hw_ix, OID_AUTO, enable_aim, CTLFLAG_RWTUN,
> &ixgbe_enable_aim, 0,
> +    "Enable adaptive interrupt moderation");
> +
>  #if 0
>  /* Keep running tab on them for sanity check */
>  static int ixgbe_total_ports;
> @@ -2100,6 +2110,60 @@ fail:
>         return (error);
>  } /* ixgbe_if_msix_intr_assign */
>
> +static inline void
> +ixgbe_perform_aim(struct adapter *adapter, struct ix_rx_queue *que)
> +{
> +       uint32_t newitr = 0;
> +       struct rx_ring *rxr = &que->rxr;
> +
> +       /*
> +        * Do Adaptive Interrupt Moderation:
> +        *  - Write out last calculated setting
> +        *  - Calculate based on average size over
> +        *    the last interval.
> +        */
> +       if (que->eitr_setting) {
> +               IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(que->msix),
> +                   que->eitr_setting);
> +       }
> +
> +       que->eitr_setting = 0;
> +       /* Idle, do nothing */
> +       if (rxr->bytes == 0) {
> +               return;
> +       }
> +
> +       if ((rxr->bytes) && (rxr->packets)) {
> +               newitr = (rxr->bytes / rxr->packets);
> +       }
> +
> +       newitr += 24; /* account for hardware frame, crc */
> +       /* set an upper boundary */
> +       newitr = min(newitr, 3000);
> +
> +       /* Be nice to the mid range */
> +       if ((newitr > 300) && (newitr < 1200)) {
> +               newitr = (newitr / 3);
> +       } else {
> +               newitr = (newitr / 2);
> +       }
> +
> +       if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
> +               newitr |= newitr << 16;
> +       } else {
> +               newitr |= IXGBE_EITR_CNT_WDIS;
> +       }
> +
> +       /* save for next interrupt */
> +       que->eitr_setting = newitr;
> +
> +       /* Reset state */
> +       rxr->bytes = 0;
> +       rxr->packets = 0;
> +
> +       return;
> +}
> +
>  /*********************************************************************
>   * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
>   **********************************************************************/
> @@ -2117,6 +2181,11 @@ ixgbe_msix_que(void *arg)
>         ixgbe_disable_queue(adapter, que->msix);
>         ++que->irqs;
>
> +       /* Check for AIM */
> +       if (adapter->enable_aim) {
> +               ixgbe_perform_aim(adapter, que);
> +       }
> +
>         return (FILTER_SCHEDULE_THREAD);
>  } /* ixgbe_msix_que */
>
> @@ -2575,6 +2644,10 @@ ixgbe_add_device_sysctls(if_ctx_t ctx)
>             adapter, 0, ixgbe_sysctl_advertise, "I",
>             IXGBE_SYSCTL_DESC_ADV_SPEED);
>
> +       adapter->enable_aim = ixgbe_enable_aim;
> +       SYSCTL_ADD_INT(ctx_list, child, OID_AUTO, "enable_aim", CTLFLAG_RW,
> +           &adapter->enable_aim, 0, "Interrupt Moderation");
> +
>  #ifdef IXGBE_DEBUG
>         /* testing sysctls (for all devices) */
>         SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "power_state",
> diff --git a/sys/dev/ixgbe/ixgbe.h b/sys/dev/ixgbe/ixgbe.h
> index 30dd1d5368fb..31d5cc41c066 100644
> --- a/sys/dev/ixgbe/ixgbe.h
> +++ b/sys/dev/ixgbe/ixgbe.h
> @@ -408,6 +408,7 @@ struct adapter {
>
>         /* Info about the interface */
>         int                     advertise;  /* link speeds */
> +       int                     enable_aim; /* adaptive interrupt
> moderation */
>         bool                    link_active;
>         u16                     num_segs;
>         u32                     link_speed;
> _______________________________________________
> dev-commits-src-main@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
> To unsubscribe, send any mail to "
> dev-commits-src-main-unsubscr...@freebsd.org"
>
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to