[v7,3/5] net/vhost: implement rte_power_monitor API

Message ID 20211018141638.5916-4-miao.li@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Maxime Coquelin
Headers
Series Implement rte_power_monitor API in virtio/vhost PMD |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Li, Miao Oct. 18, 2021, 2:16 p.m. UTC
  This patch implements rte_power_monitor API in vhost PMD to reduce
power consumption when no packet come in. 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>
---
 doc/guides/rel_notes/release_21_11.rst |  4 +++
 drivers/net/vhost/rte_eth_vhost.c      | 40 ++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)
  

Comments

Chenbo Xia Oct. 19, 2021, 4:39 a.m. UTC | #1
> -----Original Message-----
> From: Li, Miao <miao.li@intel.com>
> Sent: Monday, October 18, 2021 10:17 PM
> To: dev@dpdk.org
> Cc: Xia, Chenbo <chenbo.xia@intel.com>; maxime.coquelin@redhat.com; Li, Miao
> <miao.li@intel.com>
> Subject: [PATCH v7 3/5] net/vhost: implement rte_power_monitor API
> 
> This patch implements rte_power_monitor API in vhost PMD to reduce
> power consumption when no packet come in. 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>
> ---
>  doc/guides/rel_notes/release_21_11.rst |  4 +++
>  drivers/net/vhost/rte_eth_vhost.c      | 40 ++++++++++++++++++++++++++
>  2 files changed, 44 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/release_21_11.rst
> b/doc/guides/rel_notes/release_21_11.rst
> index a497674352..f3dc2cf219 100644
> --- a/doc/guides/rel_notes/release_21_11.rst
> +++ b/doc/guides/rel_notes/release_21_11.rst
> @@ -84,6 +84,10 @@ New Features
> 
>    Added an API to support power monitor in vhost library.
> 
> +* **Updated vhost PMD.**
> +
> +  Implement rte_power_monitor API in vhost PMD.
> +
>  * **Updated virtio PMD.**
> 
>    Implement rte_power_monitor API in virtio PMD.
> diff --git a/drivers/net/vhost/rte_eth_vhost.c
> b/drivers/net/vhost/rte_eth_vhost.c
> index 2e24e5f7ff..c9947e4db7 100644
> --- a/drivers/net/vhost/rte_eth_vhost.c
> +++ b/drivers/net/vhost/rte_eth_vhost.c
> @@ -1386,6 +1386,45 @@ eth_rx_queue_count(struct rte_eth_dev *dev, uint16_t
> rx_queue_id)
>  	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,
> @@ -1405,6 +1444,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
> --
> 2.25.1

Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
  
Hunt, David Oct. 22, 2021, 12:01 p.m. UTC | #2
On 19/10/2021 5:39 AM, Xia, Chenbo wrote:
>> -----Original Message-----
>> From: Li, Miao <miao.li@intel.com>
>> Sent: Monday, October 18, 2021 10:17 PM
>> To: dev@dpdk.org
>> Cc: Xia, Chenbo <chenbo.xia@intel.com>; maxime.coquelin@redhat.com; Li, Miao
>> <miao.li@intel.com>
>> Subject: [PATCH v7 3/5] net/vhost: implement rte_power_monitor API
>>
>> This patch implements rte_power_monitor API in vhost PMD to reduce
>> power consumption when no packet come in. 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>
>> ---
>>   doc/guides/rel_notes/release_21_11.rst |  4 +++
>>   drivers/net/vhost/rte_eth_vhost.c      | 40 ++++++++++++++++++++++++++
>>   2 files changed, 44 insertions(+)
>>
>> diff --git a/doc/guides/rel_notes/release_21_11.rst
>> b/doc/guides/rel_notes/release_21_11.rst
>> index a497674352..f3dc2cf219 100644
>> --- a/doc/guides/rel_notes/release_21_11.rst
>> +++ b/doc/guides/rel_notes/release_21_11.rst
>> @@ -84,6 +84,10 @@ New Features
>>
>>     Added an API to support power monitor in vhost library.
>>
>> +* **Updated vhost PMD.**
>> +
>> +  Implement rte_power_monitor API in vhost PMD.
>> +
>>   * **Updated virtio PMD.**
>>
>>     Implement rte_power_monitor API in virtio PMD.
>> diff --git a/drivers/net/vhost/rte_eth_vhost.c
>> b/drivers/net/vhost/rte_eth_vhost.c
>> index 2e24e5f7ff..c9947e4db7 100644
>> --- a/drivers/net/vhost/rte_eth_vhost.c
>> +++ b/drivers/net/vhost/rte_eth_vhost.c
>> @@ -1386,6 +1386,45 @@ eth_rx_queue_count(struct rte_eth_dev *dev, uint16_t
>> rx_queue_id)
>>   	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,
>> @@ -1405,6 +1444,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
>> --
>> 2.25.1
> Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>


Acked-by: David Hunt <david.hunt@intel.com>
  

Patch

diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst
index a497674352..f3dc2cf219 100644
--- a/doc/guides/rel_notes/release_21_11.rst
+++ b/doc/guides/rel_notes/release_21_11.rst
@@ -84,6 +84,10 @@  New Features
 
   Added an API to support power monitor in vhost library.
 
+* **Updated vhost PMD.**
+
+  Implement rte_power_monitor API in vhost PMD.
+
 * **Updated virtio PMD.**
 
   Implement rte_power_monitor API in virtio PMD.
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 2e24e5f7ff..c9947e4db7 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -1386,6 +1386,45 @@  eth_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	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,
@@ -1405,6 +1444,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