Since ethdev patch is factored out from the patch series the rest could
go to mlx5 maintainers.
On 6/7/22 15:59, Spike Du wrote:
Add command line options to support host shaper configure.
- Command syntax:
mlx5 set port <port_id> host_shaper avail_thresh_triggered <0|1> rate
<rate_num>
- Example commands:
To enable avail_thresh_triggered on port 1 and disable current host
shaper:
testpmd> mlx5 set port 1 host_shaper avail_thresh_triggered 1 rate 0
To disable avail_thresh_triggered and current host shaper on port 1:
testpmd> mlx5 set port 1 host_shaper avail_thresh_triggered 0 rate 0
The rate unit is 100Mbps.
To disable avail_thresh_triggered and configure a shaper of 5Gbps on
port 1:
testpmd> mlx5 set port 1 host_shaper avail_thresh_triggered 0 rate 50
Add sample code to handle rxq available descriptor threshold event, it
delays a while so that rxq empties, then disables host shaper and
rearms available descriptor threshold event.
Signed-off-by: Spike Du <[email protected]>
[snip]
+
+static uint8_t host_shaper_avail_thresh_triggered[RTE_MAX_ETHPORTS];
+#define SHAPER_DISABLE_DELAY_US 100000 /* 100ms */
+
+/**
+ * Disable the host shaper and re-arm available descriptor threshold event.
+ *
+ * @param[in] args
+ * uint32_t integer combining port_id and rxq_id.
+ */
+static void
+mlx5_test_host_shaper_disable(void *args)
+{
+ uint32_t port_rxq_id = (uint32_t)(uintptr_t)args;
+ uint16_t port_id = port_rxq_id & 0xffff;
+ uint16_t qid = (port_rxq_id >> 16) & 0xffff;
+ struct rte_eth_rxq_info qinfo;
+
+ printf("%s disable shaper\n", __func__);
+ if (rte_eth_rx_queue_info_get(port_id, qid, &qinfo)) {
+ printf("rx_queue_info_get returns error\n");
+ return;
+ }
+ /* Rearm the available descriptor threshold event. */
+ if (rte_eth_rx_avail_thresh_set(port_id, qid, qinfo.avail_thresh)) {
+ printf("config avail_thresh returns error\n");
+ return;
+ }
+ /* Only disable the shaper when avail_thresh_triggered is set. */
+ if (host_shaper_avail_thresh_triggered[port_id] &&
+ rte_pmd_mlx5_host_shaper_config(port_id, 0, 0))
+ printf("%s disable shaper returns error\n", __func__);
+}
+
+void
+mlx5_test_avail_thresh_event_handler(uint16_t port_id, uint16_t rxq_id)
+{
+ uint32_t port_rxq_id = port_id | (rxq_id << 16);
Nobody guarantees here that port_id refers to an mlx5 port.
It could be any port with avail_thres support.
+
+ rte_eal_alarm_set(SHAPER_DISABLE_DELAY_US,
+ mlx5_test_host_shaper_disable,
+ (void *)(uintptr_t)port_rxq_id);
+ printf("%s port_id:%u rxq_id:%u\n", __func__, port_id, rxq_id);
+}
[snip]
+cmdline_parse_token_string_t cmd_port_host_shaper_mlx5 =
+ TOKEN_STRING_INITIALIZER(struct cmd_port_host_shaper_result,
+ mlx5, "mlx5");
I think it lucks 'static' keyword (many cases below).
[snip]