Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci/ixgbe Add hw.ixvM.q[01].{interrupt_rate, [tr]xd_h...
details: https://anonhg.NetBSD.org/src/rev/16bdeab74321
branches: trunk
changeset: 359847:16bdeab74321
user: msaitoh <msaitoh%NetBSD.org@localhost>
date: Tue Feb 27 04:58:27 2018 +0000
description:
Add hw.ixvM.q[01].{interrupt_rate,[tr]xd_head,[tr]xd_tail} sysctls as ixg(4).
diffstat:
sys/dev/pci/ixgbe/ixv.c | 161 ++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 150 insertions(+), 11 deletions(-)
diffs (256 lines):
diff -r 67bb8f0132da -r 16bdeab74321 sys/dev/pci/ixgbe/ixv.c
--- a/sys/dev/pci/ixgbe/ixv.c Tue Feb 27 00:18:02 2018 +0000
+++ b/sys/dev/pci/ixgbe/ixv.c Tue Feb 27 04:58:27 2018 +0000
@@ -1,4 +1,4 @@
-/*$NetBSD: ixv.c,v 1.82 2018/02/26 08:14:01 knakahara Exp $*/
+/*$NetBSD: ixv.c,v 1.83 2018/02/27 04:58:27 msaitoh Exp $*/
/******************************************************************************
@@ -131,8 +131,16 @@
static void ixv_init_stats(struct adapter *);
static void ixv_update_stats(struct adapter *);
static void ixv_add_stats_sysctls(struct adapter *);
+
+
+/* Sysctl handlers */
static void ixv_set_sysctl_value(struct adapter *, const char *,
const char *, int *, int);
+static int ixv_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
+static int ixv_sysctl_rdh_handler(SYSCTLFN_PROTO);
+static int ixv_sysctl_rdt_handler(SYSCTLFN_PROTO);
+static int ixv_sysctl_tdt_handler(SYSCTLFN_PROTO);
+static int ixv_sysctl_tdh_handler(SYSCTLFN_PROTO);
/* The MSI-X Interrupt handlers */
static int ixv_msix_que(void *);
@@ -181,6 +189,9 @@
static bool ixv_enable_aim = false;
TUNABLE_INT("hw.ixv.enable_aim", &ixv_enable_aim);
+static int ixv_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
+TUNABLE_INT("hw.ixv.max_interrupt_rate", &ixv_max_interrupt_rate);
+
/* How many packets rxeof tries to clean at a time */
static int ixv_rx_process_limit = 256;
TUNABLE_INT("hw.ixv.rx_process_limit", &ixv_rx_process_limit);
@@ -1785,6 +1796,86 @@
} /* ixv_initialize_receive_units */
/************************************************************************
+ * ixv_sysctl_tdh_handler - Transmit Descriptor Head handler function
+ *
+ * Retrieves the TDH value from the hardware
+ ************************************************************************/
+static int
+ixv_sysctl_tdh_handler(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
+ uint32_t val;
+
+ if (!txr)
+ return (0);
+
+ val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_VFTDH(txr->me));
+ node.sysctl_data = &val;
+ return sysctl_lookup(SYSCTLFN_CALL(&node));
+} /* ixv_sysctl_tdh_handler */
+
+/************************************************************************
+ * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
+ *
+ * Retrieves the TDT value from the hardware
+ ************************************************************************/
+static int
+ixv_sysctl_tdt_handler(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
+ uint32_t val;
+
+ if (!txr)
+ return (0);
+
+ val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_VFTDT(txr->me));
+ node.sysctl_data = &val;
+ return sysctl_lookup(SYSCTLFN_CALL(&node));
+} /* ixv_sysctl_tdt_handler */
+
+/************************************************************************
+ * ixv_sysctl_rdh_handler - Receive Descriptor Head handler function
+ *
+ * Retrieves the RDH value from the hardware
+ ************************************************************************/
+static int
+ixv_sysctl_rdh_handler(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
+ uint32_t val;
+
+ if (!rxr)
+ return (0);
+
+ val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_VFRDH(rxr->me));
+ node.sysctl_data = &val;
+ return sysctl_lookup(SYSCTLFN_CALL(&node));
+} /* ixv_sysctl_rdh_handler */
+
+/************************************************************************
+ * ixv_sysctl_rdt_handler - Receive Descriptor Tail handler function
+ *
+ * Retrieves the RDT value from the hardware
+ ************************************************************************/
+static int
+ixv_sysctl_rdt_handler(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
+ uint32_t val;
+
+ if (!rxr)
+ return (0);
+
+ val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_VFRDT(rxr->me));
+ node.sysctl_data = &val;
+ return sysctl_lookup(SYSCTLFN_CALL(&node));
+} /* ixv_sysctl_rdt_handler */
+
+/************************************************************************
* ixv_setup_vlan_support
************************************************************************/
static void
@@ -2111,6 +2202,55 @@
*/
} /* ixv_update_stats */
+/************************************************************************
+ * ixv_sysctl_interrupt_rate_handler
+ ************************************************************************/
+static int
+ixv_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
+ struct adapter *adapter = que->adapter;
+ uint32_t reg, usec, rate;
+ int error;
+
+ if (que == NULL)
+ return 0;
+ reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_VTEITR(que->msix));
+ usec = ((reg & 0x0FF8) >> 3);
+ if (usec > 0)
+ rate = 500000 / usec;
+ else
+ rate = 0;
+ node.sysctl_data = &rate;
+ error = sysctl_lookup(SYSCTLFN_CALL(&node));
+ if (error || newp == NULL)
+ return error;
+ reg &= ~0xfff; /* default, no limitation */
+ if (rate > 0 && rate < 500000) {
+ if (rate < 1000)
+ rate = 1000;
+ reg |= ((4000000/rate) & 0xff8);
+ /*
+ * When RSC is used, ITR interval must be larger than
+ * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
+ * The minimum value is always greater than 2us on 100M
+ * (and 10M?(not documented)), but it's not on 1G and higher.
+ */
+ if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
+ && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
+ if ((adapter->num_queues > 1)
+ && (reg < IXGBE_MIN_RSC_EITR_10G1G))
+ return EINVAL;
+ }
+ ixv_max_interrupt_rate = rate;
+ } else
+ ixv_max_interrupt_rate = 0;
+ ixv_eitr_write(que, reg);
+
+ return (0);
+} /* ixv_sysctl_interrupt_rate_handler */
+
const struct sysctlnode *
ixv_sysctl_instance(struct adapter *adapter)
{
@@ -2173,7 +2313,7 @@
struct rx_ring *rxr = adapter->rx_rings;
struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
struct ixgbe_hw *hw = &adapter->hw;
- const struct sysctlnode *rnode;
+ const struct sysctlnode *rnode, *cnode;
struct sysctllog **log = &adapter->sysctllog;
const char *xname = device_xname(dev);
@@ -2221,35 +2361,36 @@
NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
break;
-#if 0 /* not yet */
if (sysctl_createv(log, 0, &rnode, &cnode,
CTLFLAG_READWRITE, CTLTYPE_INT,
"interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
- ixgbe_sysctl_interrupt_rate_handler, 0,
+ ixv_sysctl_interrupt_rate_handler, 0,
(void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
break;
+#if 0
if (sysctl_createv(log, 0, &rnode, &cnode,
CTLFLAG_READONLY, CTLTYPE_QUAD,
"irqs", SYSCTL_DESCR("irqs on this queue"),
NULL, 0, &(adapter->queues[i].irqs),
0, CTL_CREATE, CTL_EOL) != 0)
break;
+#endif
if (sysctl_createv(log, 0, &rnode, &cnode,
CTLFLAG_READONLY, CTLTYPE_INT,
"txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
- ixgbe_sysctl_tdh_handler, 0, (void *)txr,
+ ixv_sysctl_tdh_handler, 0, (void *)txr,
0, CTL_CREATE, CTL_EOL) != 0)
break;
if (sysctl_createv(log, 0, &rnode, &cnode,
CTLFLAG_READONLY, CTLTYPE_INT,
"txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
- ixgbe_sysctl_tdt_handler, 0, (void *)txr,
+ ixv_sysctl_tdt_handler, 0, (void *)txr,
0, CTL_CREATE, CTL_EOL) != 0)
break;
-#endif
+
evcnt_attach_dynamic(&adapter->queues[i].irqs, EVCNT_TYPE_INTR,
NULL, adapter->queues[i].evnamebuf, "IRQs on queue");
evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
@@ -2270,12 +2411,11 @@
struct lro_ctrl *lro = &rxr->lro;
#endif /* LRO */
-#if 0 /* not yet */
if (sysctl_createv(log, 0, &rnode, &cnode,
CTLFLAG_READONLY,
CTLTYPE_INT,
"rxd_head", SYSCTL_DESCR("Receive Descriptor Head"),
- ixgbe_sysctl_rdh_handler, 0, (void *)rxr, 0,
+ ixv_sysctl_rdh_handler, 0, (void *)rxr, 0,
CTL_CREATE, CTL_EOL) != 0)
break;
@@ -2283,10 +2423,9 @@
CTLFLAG_READONLY,
CTLTYPE_INT,
"rxd_tail", SYSCTL_DESCR("Receive Descriptor Tail"),
- ixgbe_sysctl_rdt_handler, 0, (void *)rxr, 0,
+ ixv_sysctl_rdt_handler, 0, (void *)rxr, 0,
CTL_CREATE, CTL_EOL) != 0)
break;
-#endif
evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
NULL, adapter->queues[i].evnamebuf, "Queue Packets Received");
Home |
Main Index |
Thread Index |
Old Index