[PATCH v5 7/7] app/testpmd: add Host Shaper command
Andrew Rybchenko
andrew.rybchenko at oktetlabs.ru
Thu Jun 9 09:55:20 CEST 2022
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 <spiked at nvidia.com>
[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]
More information about the dev
mailing list