]> git.droids-corp.org - dpdk.git/commitdiff
net/vhost: support power monitor
authorMiao Li <miao.li@intel.com>
Mon, 25 Oct 2021 14:47:23 +0000 (14:47 +0000)
committerMaxime Coquelin <maxime.coquelin@redhat.com>
Fri, 29 Oct 2021 10:32:29 +0000 (12:32 +0200)
According to current semantics of power monitor, this commit adds a
callback function to decide whether aborts the sleep by checking
current value against the expected value and vhost_get_monitor_addr
to provide address to monitor. When no packet come in, the value of
address will not be changed and the running core will sleep. Once
packets arrive, the value of address will be changed and the running
core will wakeup.

Signed-off-by: Miao Li <miao.li@intel.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
doc/guides/rel_notes/release_21_11.rst
drivers/net/vhost/rte_eth_vhost.c

index 2e4fd9ac8fb14820c2c0dec81c764b5749347426..8f260d30f5c5078608bfa0cd270658f6882d7f56 100644 (file)
@@ -203,6 +203,10 @@ New Features
 
   Added an API to support power monitor in vhost library.
 
+* **Updated vhost PMD.**
+
+  Add power monitor support in vhost PMD.
+
 * **Updated virtio PMD.**
 
   * Initial support for RSS receive mode has been added to the Virtio PMD,
index 5111304ff90a708c9d09537a157448e9ed2415a1..8bb3b27d01d9d00eac60e7275c5de337d59311bb 100644 (file)
@@ -1390,6 +1390,45 @@ eth_rx_queue_count(void *rx_queue)
        return rte_vhost_rx_queue_count(vq->vid, vq->virtqueue_id);
 }
 
+#define CLB_VAL_IDX 0
+#define CLB_MSK_IDX 1
+#define CLB_MATCH_IDX 2
+static int
+vhost_monitor_callback(const uint64_t value,
+               const uint64_t opaque[RTE_POWER_MONITOR_OPAQUE_SZ])
+{
+       const uint64_t m = opaque[CLB_MSK_IDX];
+       const uint64_t v = opaque[CLB_VAL_IDX];
+       const uint64_t c = opaque[CLB_MATCH_IDX];
+
+       if (c)
+               return (value & m) == v ? -1 : 0;
+       else
+               return (value & m) == v ? 0 : -1;
+}
+
+static int
+vhost_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc)
+{
+       struct vhost_queue *vq = rx_queue;
+       struct rte_vhost_power_monitor_cond vhost_pmc;
+       int ret;
+       if (vq == NULL)
+               return -EINVAL;
+       ret = rte_vhost_get_monitor_addr(vq->vid, vq->virtqueue_id,
+                       &vhost_pmc);
+       if (ret < 0)
+               return -EINVAL;
+       pmc->addr = vhost_pmc.addr;
+       pmc->opaque[CLB_VAL_IDX] = vhost_pmc.val;
+       pmc->opaque[CLB_MSK_IDX] = vhost_pmc.mask;
+       pmc->opaque[CLB_MATCH_IDX] = vhost_pmc.match;
+       pmc->size = vhost_pmc.size;
+       pmc->fn = vhost_monitor_callback;
+
+       return 0;
+}
+
 static const struct eth_dev_ops ops = {
        .dev_start = eth_dev_start,
        .dev_stop = eth_dev_stop,
@@ -1409,6 +1448,7 @@ static const struct eth_dev_ops ops = {
        .xstats_get_names = vhost_dev_xstats_get_names,
        .rx_queue_intr_enable = eth_rxq_intr_enable,
        .rx_queue_intr_disable = eth_rxq_intr_disable,
+       .get_monitor_addr = vhost_get_monitor_addr,
 };
 
 static int