The branch main has been updated by kbowling:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=477e31110ab84b941e95d95d62d8339e822719bc

commit 477e31110ab84b941e95d95d62d8339e822719bc
Author:     Kevin Bowling <[email protected]>
AuthorDate: 2026-08-10 22:29:37 +0000
Commit:     Kevin Bowling <[email protected]>
CommitDate: 2026-09-06 15:41:12 +0000

    ixl: Report SR-IOV VF status
    
    Expose cached per-VF configuration through the iflib VF status method.
    Report mailbox initialization and the negotiated virtual-channel API, MAC
    address, access or trunk VLAN mode, queue resources, administrator policy,
    PF traffic permission, and fault containment.
    
    Expose per-VF malicious-driver isolation and cumulative transmit and
    receive event counts through a versioned driver.ixl extension.
    
    Track successful PCI IOV attachment separately from hardware capability.
    This lets a successfully attached but unconfigured PF return an empty
    snapshot without claiming support when PCI IOV registration was
    unavailable.
    
    The query uses driver-cached state and does not issue AdminQ requests or
    read device registers.
    
    Sponsored by:   BBOX.io
---
 share/man/man4/ixl.4     |  32 ++++++++++++++-
 sys/dev/ixl/if_ixl.c     | 105 +++++++++++++++++++++++++++++++++++++++++++++++
 sys/dev/ixl/ixl_pf.h     |   1 +
 sys/dev/ixl/ixl_pf_iov.c |   4 +-
 4 files changed, 140 insertions(+), 2 deletions(-)

diff --git a/share/man/man4/ixl.4 b/share/man/man4/ixl.4
index b1a4a21c4592..af8327704842 100644
--- a/share/man/man4/ixl.4
+++ b/share/man/man4/ixl.4
@@ -29,7 +29,7 @@
 .\"
 .\" * Other names and brands may be claimed as the property of others.
 .\"
-.Dd August 12, 2026
+.Dd September 6, 2026
 .Dt IXL 4
 .Os
 .Sh NAME
@@ -293,6 +293,35 @@ minus one.
 An up to date list of parameters and their defaults can be found by using
 .Xr iovctl 8
 with the -S option.
+.Pp
+For each configured VF,
+.Xr ifconfig 8
+with the
+.Fl v
+option displays cached PF state, including the negotiated virtual-channel
+API after the VF completes its resource handshake following the last reset.
+The generic traffic and fault fields describe whether PF policy currently
+permits the VF to issue data traffic; they do not describe link or queue
+state.
+.Pp
+Structured status consumers also receive MDD diagnostics in the version 1
+.Cm driver.ixl
+namespace of the
+.Xr rtnetlink 4
+VF status response:
+.Bl -tag -width "mdd-tx-events"
+.It Cm version
+Namespace version number, currently 1.
+.It Cm mdd-blocked
+Boolean indicating that malicious-driver detection has isolated the VF.
+.It Cm mdd-tx-events
+Cumulative number of transmit malicious-driver latches attributed to the VF.
+.It Cm mdd-rx-events
+Cumulative number of receive malicious-driver latches attributed to the VF.
+.El
+.Pp
+The status query uses driver-cached state and does not issue AdminQ commands
+or read device registers.
 .Sh SUPPORT
 For general information and support,
 go to the Intel support website at:
@@ -307,6 +336,7 @@ email all the specific information related to the issue to
 .Xr iflib 4 ,
 .Xr led 4 ,
 .Xr netintro 4 ,
+.Xr rtnetlink 4 ,
 .Xr vlan 4 ,
 .Xr ifconfig 8 ,
 .Xr iovctl 8
diff --git a/sys/dev/ixl/if_ixl.c b/sys/dev/ixl/if_ixl.c
index cfd673430e50..723126c0dfd9 100644
--- a/sys/dev/ixl/if_ixl.c
+++ b/sys/dev/ixl/if_ixl.c
@@ -34,6 +34,8 @@
 #include "ixl.h"
 #include "ixl_pf.h"
 
+#include <net/if_vf_status.h>
+
 #ifdef IXL_IW
 #include "ixl_iw.h"
 #include "ixl_iw_int.h"
@@ -55,6 +57,20 @@
     __XSTRING(IXL_DRIVER_VERSION_MINOR) "."            \
     __XSTRING(IXL_DRIVER_VERSION_BUILD) "-k"
 
+/* Version 1 driver.ixl extension schema; documented in ixl(4). */
+#define        IXL_VF_STATUS_NAMESPACE         "driver.ixl"
+#define        IXL_VF_STATUS_VERSION           1
+#define        IXL_VF_STATUS_MDD_BLOCKED       "mdd-blocked"
+#define        IXL_VF_STATUS_MDD_TX_EVENTS     "mdd-tx-events"
+#define        IXL_VF_STATUS_MDD_RX_EVENTS     "mdd-rx-events"
+
+enum ixl_vf_status_field {
+       IXL_VF_STATUS_FIELD_MDD_BLOCKED,
+       IXL_VF_STATUS_FIELD_MDD_TX_EVENTS,
+       IXL_VF_STATUS_FIELD_MDD_RX_EVENTS,
+       IXL_VF_STATUS_NUM_FIELDS
+};
+
 /*********************************************************************
  *  PCI Device ID Table
  *
@@ -123,6 +139,8 @@ static int   ixl_if_i2c_req(if_ctx_t ctx, struct ifi2creq 
*req);
 static int      ixl_if_priv_ioctl(if_ctx_t ctx, u_long command, caddr_t data);
 static bool     ixl_if_needs_restart(if_ctx_t ctx, enum iflib_restart_event 
event);
 static void     ixl_if_led_func(if_ctx_t ctx, int onoff);
+static int      ixl_if_vf_status(if_ctx_t ctx,
+                    struct if_vf_status **statusp);
 #ifdef PCI_IOV
 static void     ixl_if_vflr_handle(if_ctx_t ctx);
 #endif
@@ -197,6 +215,7 @@ static device_method_t ixl_if_methods[] = {
        DEVMETHOD(ifdi_priv_ioctl, ixl_if_priv_ioctl),
        DEVMETHOD(ifdi_needs_restart, ixl_if_needs_restart),
        DEVMETHOD(ifdi_led_func, ixl_if_led_func),
+       DEVMETHOD(ifdi_vf_status, ixl_if_vf_status),
 #ifdef PCI_IOV
        DEVMETHOD(ifdi_iov_init, ixl_if_iov_init),
        DEVMETHOD(ifdi_iov_uninit, ixl_if_iov_uninit),
@@ -1997,6 +2016,92 @@ ixl_if_needs_restart(if_ctx_t ctx __unused, enum 
iflib_restart_event event)
        }
 }
 
+static int
+ixl_if_vf_status(if_ctx_t ctx, struct if_vf_status **statusp)
+{
+       struct ixl_pf *pf;
+       struct if_vf_extension *extension;
+       struct if_vf_info *info;
+       struct if_vf_status *status;
+       struct ixl_vf *vf;
+
+       pf = iflib_get_softc(ctx);
+       if (!pf->iov_attached)
+               return (EOPNOTSUPP);
+
+       status = if_vf_status_alloc(pf->num_vfs);
+       if (status == NULL)
+               return (ENOMEM);
+       for (int i = 0; i < pf->num_vfs; i++) {
+               vf = &pf->vfs[i];
+               info = &status->vfs[i];
+               info->fields = IFVF_F_CONFIGURED | IFVF_F_INITIALIZED |
+                   IFVF_F_VLAN_MODE | IFVF_F_VLAN_COUNT |
+                   IFVF_F_NUM_TX_QUEUES | IFVF_F_NUM_RX_QUEUES |
+                   IFVF_F_ALLOW_SET_MAC |
+                   IFVF_F_ALLOW_SET_VLAN | IFVF_F_MAC_ANTI_SPOOF |
+                   IFVF_F_ALLOW_PROMISC | IFVF_F_TRAFFIC_ALLOWED |
+                   IFVF_F_FAULT_BLOCKED;
+               info->index = i;
+               info->configured = (vf->vf_flags & VF_FLAG_ENABLED) != 0;
+               info->initialized = (vf->vf_flags & VF_FLAG_INITIALIZED) != 0;
+               if (info->initialized) {
+                       snprintf(info->api_version, sizeof(info->api_version),
+                           "%u.%u", vf->version.major, vf->version.minor);
+                       info->fields |= IFVF_F_API_VERSION;
+               }
+               if (!ETHER_IS_ZERO(vf->mac)) {
+                       memcpy(info->mac, vf->mac, sizeof(info->mac));
+                       info->fields |= IFVF_F_MAC;
+               }
+               if (vf->default_vlan == 0) {
+                       info->vlan_mode = IFVF_VLAN_TRUNK;
+                       info->vlan_count = vf->vsi.num_vlans;
+                       info->vlan_limit = IXL_VF_MAX_VLAN_FILTERS;
+                       info->fields |= IFVF_F_VLAN_LIMIT;
+               } else {
+                       info->vlan_mode = IFVF_VLAN_ACCESS;
+                       info->vlan = vf->default_vlan;
+                       info->vlan_pcp = 0;
+                       info->vlan_proto = ETHERTYPE_VLAN;
+                       info->vlan_count = 1;
+                       info->fields |= IFVF_F_VLAN | IFVF_F_VLAN_PCP |
+                           IFVF_F_VLAN_PROTO;
+               }
+               info->tx_queue_count = vf->qtag.num_active;
+               info->rx_queue_count = vf->qtag.num_active;
+               info->allow_set_mac =
+                   (vf->vf_flags & VF_FLAG_SET_MAC_CAP) != 0;
+               info->allow_set_vlan =
+                   (vf->vf_flags & VF_FLAG_VLAN_CAP) != 0;
+               info->mac_anti_spoof =
+                   (vf->vf_flags & VF_FLAG_MAC_ANTI_SPOOF) != 0;
+               info->allow_promisc =
+                   (vf->vf_flags & VF_FLAG_PROMISC_CAP) != 0;
+               info->traffic_allowed = info->configured && !vf->mdd_blocked;
+               info->fault_blocked = vf->mdd_blocked;
+
+               extension = if_vf_status_add_extension(info,
+                   IXL_VF_STATUS_NAMESPACE, IXL_VF_STATUS_VERSION,
+                   IXL_VF_STATUS_NUM_FIELDS);
+               if (extension == NULL) {
+                       if_vf_status_free(status);
+                       return (ENOMEM);
+               }
+               if_vf_extension_set_bool(extension,
+                   IXL_VF_STATUS_FIELD_MDD_BLOCKED,
+                   IXL_VF_STATUS_MDD_BLOCKED, vf->mdd_blocked);
+               if_vf_extension_set_number(extension,
+                   IXL_VF_STATUS_FIELD_MDD_TX_EVENTS,
+                   IXL_VF_STATUS_MDD_TX_EVENTS, vf->mdd_tx_events);
+               if_vf_extension_set_number(extension,
+                   IXL_VF_STATUS_FIELD_MDD_RX_EVENTS,
+                   IXL_VF_STATUS_MDD_RX_EVENTS, vf->mdd_rx_events);
+       }
+       *statusp = status;
+       return (0);
+}
+
 /*
  * Sanity check and save off tunable values.
  */
diff --git a/sys/dev/ixl/ixl_pf.h b/sys/dev/ixl/ixl_pf.h
index 7d751d3bd1dc..d244a2e36a38 100644
--- a/sys/dev/ixl/ixl_pf.h
+++ b/sys/dev/ixl/ixl_pf.h
@@ -187,6 +187,7 @@ struct ixl_pf {
        /* SR-IOV */
        struct ixl_vf           *vfs;
        int                     num_vfs;
+       bool                    iov_attached;
        uint16_t                veb_seid;
        int                     vc_debug_lvl;
 
diff --git a/sys/dev/ixl/ixl_pf_iov.c b/sys/dev/ixl/ixl_pf_iov.c
index 64e7a5e36bcc..29f0f1fd839e 100644
--- a/sys/dev/ixl/ixl_pf_iov.c
+++ b/sys/dev/ixl/ixl_pf_iov.c
@@ -123,8 +123,10 @@ ixl_initialize_sriov(struct ixl_pf *pf)
                device_printf(dev,
                    "Failed to initialize SR-IOV (error=%d)\n",
                    iov_error);
-       } else
+       } else {
+               pf->iov_attached = true;
                device_printf(dev, "SR-IOV ready\n");
+       }
 
        pf->vc_debug_lvl = 1;
 }

Reply via email to