]> git.droids-corp.org - dpdk.git/commitdiff
vdpa/mlx5: add hardware queue moderation
authorXueming Li <xuemingl@nvidia.com>
Wed, 6 Jan 2021 03:06:30 +0000 (03:06 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 8 Jan 2021 17:07:56 +0000 (18:07 +0100)
The next parameters control the HW queue moderation feature.
This feature helps to control the traffic performance and latency
trade-off.

Each packet completion report from HW to SW requires CQ processing by SW
and triggers interrupt for the guest driver. Interrupt report and
handling cost CPU cycles and time and the amount of this affects
directly on packet performance and latency.

hw_latency_mode parameters [int]
  0, HW default.
  1, Latency is counted from the first packet completion report.
  2, Latency is counted from the last packet completion.
hw_max_latency_us parameters [int]
  0 - 4095, The maximum time in microseconds that packet completion
  report can be delayed.
hw_max_pending_comp parameter [int]
  0 - 65535, The maximum number of pending packets completions in an HW
queue.

Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
doc/guides/vdpadevs/mlx5.rst
drivers/vdpa/mlx5/mlx5_vdpa.c
drivers/vdpa/mlx5/mlx5_vdpa.h
drivers/vdpa/mlx5/mlx5_vdpa_virtq.c

index 730e171ba387b8a1ff33acd288ff7e3e56d03c49..1f2ae6fb922fa4a352adf1604ba9a9e0b519da7e 100644 (file)
@@ -139,6 +139,30 @@ Driver options
   CPU core number to set polling thread affinity to, default to control plane
   cpu.
 
+- ``hw_latency_mode`` parameter [int]
+
+  The completion queue moderation mode:
+
+  - 0, HW default.
+
+  - 1, Latency is counted from the first packet completion report.
+
+  - 2, Latency is counted from the last packet completion.
+
+- ``hw_max_latency_us`` parameter [int]
+
+  - 1 - 4095, The maximum time in microseconds that packet completion report
+    can be delayed.
+
+  - 0, HW default.
+
+- ``hw_max_pending_comp`` parameter [int]
+
+  - 1 - 65535, The maximum number of pending packets completions in an HW queue.
+
+  - 0, HW default.
+
+
 Error handling
 ^^^^^^^^^^^^^^
 
index 5d954d48ceccd7887025819bd098d604ed8bd149..0f22a863a3fb5661e0a0cca955c5f66638060e5e 100644 (file)
@@ -636,6 +636,12 @@ mlx5_vdpa_args_check_handler(const char *key, const char *val, void *opaque)
                        DRV_LOG(WARNING, "Invalid event_core %s.", val);
                else
                        priv->event_core = tmp;
+       } else if (strcmp(key, "hw_latency_mode") == 0) {
+               priv->hw_latency_mode = (uint32_t)tmp;
+       } else if (strcmp(key, "hw_max_latency_us") == 0) {
+               priv->hw_max_latency_us = (uint32_t)tmp;
+       } else if (strcmp(key, "hw_max_pending_comp") == 0) {
+               priv->hw_max_pending_comp = (uint32_t)tmp;
        } else {
                DRV_LOG(WARNING, "Invalid key %s.", key);
        }
index b4dd3834aa3176efdf1a90b0c1f3855d001ae823..cf6b90e8e9e46544fc3f6cd9b0c3d7792f7d0dda 100644 (file)
@@ -135,6 +135,9 @@ struct mlx5_vdpa_priv {
        uint32_t event_us;
        uint32_t timer_delay_us;
        uint32_t no_traffic_time_s;
+       uint8_t hw_latency_mode; /* Hardware CQ moderation mode. */
+       uint16_t hw_max_latency_us; /* Hardware CQ moderation period in usec. */
+       uint16_t hw_max_pending_comp; /* Hardware CQ moderation counter. */
        struct rte_vdpa_device *vdev; /* vDPA device. */
        int vid; /* vhost device id. */
        struct ibv_context *ctx; /* Device context. */
index 3e882e40000ffddb2660120eb8267cf8c5749c4a..332753fd621f01d6404f95a8e3ef7560177195a6 100644 (file)
@@ -327,6 +327,9 @@ mlx5_vdpa_virtq_setup(struct mlx5_vdpa_priv *priv, int index)
        attr.tis_id = priv->tiss[(index / 2) % priv->num_lag_ports]->id;
        attr.queue_index = index;
        attr.pd = priv->pdn;
+       attr.hw_latency_mode = priv->hw_latency_mode;
+       attr.hw_max_latency_us = priv->hw_max_latency_us;
+       attr.hw_max_pending_comp = priv->hw_max_pending_comp;
        virtq->virtq = mlx5_devx_cmd_create_virtq(priv->ctx, &attr);
        virtq->priv = priv;
        if (!virtq->virtq)