From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 095B1A0C4C; Fri, 15 Oct 2021 09:10:58 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2F3CA4117B; Fri, 15 Oct 2021 09:10:56 +0200 (CEST) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 746254117B for ; Fri, 15 Oct 2021 09:10:54 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10137"; a="288730974" X-IronPort-AV: E=Sophos;i="5.85,375,1624345200"; d="scan'208";a="288730974" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Oct 2021 00:10:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,375,1624345200"; d="scan'208";a="592896658" Received: from limiao-icelake.sh.intel.com ([10.67.115.199]) by orsmga004.jf.intel.com with ESMTP; 15 Oct 2021 00:10:52 -0700 From: Miao Li To: dev@dpdk.org Cc: chenbo.xia@intel.com, maxime.coquelin@redhat.com, miao.li@intel.com Date: Fri, 15 Oct 2021 15:12:19 +0000 Message-Id: <20211015151223.425847-2-miao.li@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211015151223.425847-1-miao.li@intel.com> References: <20211012142250.410803-1-miao.li@intel.com> <20211015151223.425847-1-miao.li@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v5 1/5] net/virtio: 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 virtio 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 virtio_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 Reviewed-by: Chenbo Xia --- doc/guides/rel_notes/release_21_11.rst | 4 ++ drivers/net/virtio/virtio_ethdev.c | 56 ++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index 4c56cdfeaa..27dc896703 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -72,6 +72,10 @@ New Features Added macros ETH_RSS_IPV4_CHKSUM and ETH_RSS_L4_CHKSUM, now IPv4 and TCP/UDP/SCTP header checksum field can be used as input set for RSS. +* **Updated virtio PMD.** + + Implement rte_power_monitor API in virtio PMD. + * **Updated af_packet ethdev driver.** * Default VLAN strip behavior was changed. VLAN tag won't be stripped diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 6aa36b3f39..1227f3f1f4 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -74,6 +74,8 @@ static int virtio_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr); static int virtio_intr_disable(struct rte_eth_dev *dev); +static int virtio_get_monitor_addr(void *rx_queue, + struct rte_power_monitor_cond *pmc); static int virtio_dev_queue_stats_mapping_set( struct rte_eth_dev *eth_dev, @@ -982,6 +984,7 @@ static const struct eth_dev_ops virtio_eth_dev_ops = { .mac_addr_add = virtio_mac_addr_add, .mac_addr_remove = virtio_mac_addr_remove, .mac_addr_set = virtio_mac_addr_set, + .get_monitor_addr = virtio_get_monitor_addr, }; /* @@ -1313,6 +1316,59 @@ virtio_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) return 0; } +#define CLB_VAL_IDX 0 +#define CLB_MSK_IDX 1 +#define CLB_MATCH_IDX 2 +static int +virtio_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 +virtio_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc) +{ + struct virtnet_rx *rxvq = rx_queue; + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); + struct virtio_hw *hw; + + if (vq == NULL) + return -EINVAL; + + hw = vq->hw; + if (virtio_with_packed_queue(hw)) { + struct vring_packed_desc *desc; + desc = vq->vq_packed.ring.desc; + pmc->addr = &desc[vq->vq_used_cons_idx].flags; + if (vq->vq_packed.used_wrap_counter) + pmc->opaque[CLB_VAL_IDX] = + VRING_PACKED_DESC_F_AVAIL_USED; + else + pmc->opaque[CLB_VAL_IDX] = 0; + pmc->opaque[CLB_MSK_IDX] = VRING_PACKED_DESC_F_AVAIL_USED; + pmc->opaque[CLB_MATCH_IDX] = 1; + pmc->size = sizeof(desc[vq->vq_used_cons_idx].flags); + } else { + pmc->addr = &vq->vq_split.ring.used->idx; + pmc->opaque[CLB_VAL_IDX] = vq->vq_used_cons_idx + & (vq->vq_nentries - 1); + pmc->opaque[CLB_MSK_IDX] = vq->vq_nentries - 1; + pmc->opaque[CLB_MATCH_IDX] = 0; + pmc->size = sizeof(vq->vq_split.ring.used->idx); + } + pmc->fn = virtio_monitor_callback; + + return 0; +} + static int virtio_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) { -- 2.25.1