From patchwork Sat Sep 18 13:22:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Miao" X-Patchwork-Id: 99264 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9A1E2A0C47; Sat, 18 Sep 2021 07:20:26 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9B96D410EE; Sat, 18 Sep 2021 07:20:21 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mails.dpdk.org (Postfix) with ESMTP id 6151D406B4 for ; Sat, 18 Sep 2021 07:20:19 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10110"; a="221037375" X-IronPort-AV: E=Sophos;i="5.85,303,1624345200"; d="scan'208";a="221037375" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Sep 2021 22:20:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,303,1624345200"; d="scan'208";a="510219814" Received: from limiao-icelake.sh.intel.com ([10.67.115.199]) by fmsmga008.fm.intel.com with ESMTP; 17 Sep 2021 22:20:16 -0700 From: Miao Li To: dev@dpdk.org Cc: chenbo.xia@intel.com, maxime.coquelin@redhat.com, miao.li@intel.com Date: Sat, 18 Sep 2021 13:22:04 +0000 Message-Id: <20210918132206.166694-4-miao.li@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210918132206.166694-1-miao.li@intel.com> References: <20210910130548.127017-1-miao.li@intel.com> <20210918132206.166694-1-miao.li@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 3/5] net/vhost: implement rte_power_monitor API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- drivers/net/vhost/rte_eth_vhost.c | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index a202931e9a..eabb0b0519 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -1380,6 +1380,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, @@ -1399,6 +1438,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