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 BDCCAA0524; Wed, 2 Jun 2021 10:36:45 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4EE564069F; Wed, 2 Jun 2021 10:36:45 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id E434A40689 for ; Wed, 2 Jun 2021 10:36:43 +0200 (CEST) IronPort-SDR: WlRrb9ESLeC80bu2/YOn6dKeLU2PAiw8oZs9GuiJHr6MUXo7LoyTws2AXIFKk1co2y5fH9KM02 l2ItorwFzOaw== X-IronPort-AV: E=McAfee;i="6200,9189,10002"; a="267612582" X-IronPort-AV: E=Sophos;i="5.83,241,1616482800"; d="scan'208";a="267612582" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Jun 2021 01:36:38 -0700 IronPort-SDR: TWo2sLxTGBDpgyyg/GuQ8/80JFJDZ2y9RFBG/aqxUURUzh22u78EDJQghi/pcUI6Vq/65koRmC RYpvO5nr13Lw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.83,241,1616482800"; d="scan'208";a="550050124" Received: from npg_dpdk_virtio_jiayuhu_07.sh.intel.com ([10.67.119.25]) by fmsmga001.fm.intel.com with ESMTP; 02 Jun 2021 01:36:36 -0700 From: Jiayu Hu To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, chenbo.xia@intel.com, Jiayu Hu Date: Wed, 2 Jun 2021 11:05:29 -0400 Message-Id: <1622646329-279450-1-git-send-email-jiayu.hu@intel.com> X-Mailer: git-send-email 2.7.4 Subject: [dpdk-dev] [PATCH] vhost: allow to check in-flight packets for async vhost 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 allows to check the amount of in-flight packets for vhost queues which register async channel acceleration. Signed-off-by: Jiayu Hu --- doc/guides/prog_guide/vhost_lib.rst | 5 +++++ lib/vhost/rte_vhost_async.h | 14 ++++++++++++++ lib/vhost/version.map | 3 +++ lib/vhost/vhost.c | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+) diff --git a/doc/guides/prog_guide/vhost_lib.rst b/doc/guides/prog_guide/vhost_lib.rst index d18fb98..9fdc6d5 100644 --- a/doc/guides/prog_guide/vhost_lib.rst +++ b/doc/guides/prog_guide/vhost_lib.rst @@ -281,6 +281,11 @@ The following is an overview of some key Vhost API functions: Poll enqueue completion status from async data path. Completed packets are returned to applications through ``pkts``. +* ``rte_vhost_async_get_inflight(vid, queue_id)`` + + This function returns the amount of in-flight packets by now for the + vhost queue which registers async channel acceleration. + Vhost-user Implementations -------------------------- diff --git a/lib/vhost/rte_vhost_async.h b/lib/vhost/rte_vhost_async.h index 6faa31f..553da4d 100644 --- a/lib/vhost/rte_vhost_async.h +++ b/lib/vhost/rte_vhost_async.h @@ -193,4 +193,18 @@ __rte_experimental uint16_t rte_vhost_poll_enqueue_completed(int vid, uint16_t queue_id, struct rte_mbuf **pkts, uint16_t count); +/** + * This function returns the amount of in-flight packets by now + * for the vhost queue which registers async channel acceleration. + * + * @param vid + * id of vhost device to enqueue data + * @param queue_id + * queue id to enqueue data + * @return + * the amount of in-flight packets on success; -1 on failure + */ +__rte_experimental +int rte_vhost_async_get_inflight(int vid, uint16_t queue_id); + #endif /* _RTE_VHOST_ASYNC_H_ */ diff --git a/lib/vhost/version.map b/lib/vhost/version.map index 9103a23..28238cb 100644 --- a/lib/vhost/version.map +++ b/lib/vhost/version.map @@ -79,4 +79,7 @@ EXPERIMENTAL { # added in 21.05 rte_vhost_get_negotiated_protocol_features; + + # added in 21.08 + rte_vhost_async_get_inflight; }; diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index c96f633..4547705 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -1780,5 +1780,40 @@ int rte_vhost_async_channel_unregister(int vid, uint16_t queue_id) return ret; } +int rte_vhost_async_get_inflight(int vid, uint16_t queue_id) +{ + struct vhost_virtqueue *vq; + struct virtio_net *dev = get_device(vid); + int ret = -1; + + if (dev == NULL) + return ret; + + if (queue_id >= VHOST_MAX_VRING) + return ret; + + vq = dev->virtqueue[queue_id]; + + if (vq == NULL) + return ret; + + ret = 0; + + if (!vq->async_registered) + return ret; + + if (!rte_spinlock_trylock(&vq->access_lock)) { + VHOST_LOG_CONFIG(ERR, "Failed to check in-flight packets. " + "virt queue busy.\n"); + return -1; + } + + ret = vq->async_pkts_inflight_n; + rte_spinlock_unlock(&vq->access_lock); + + return ret; + +} + RTE_LOG_REGISTER_SUFFIX(vhost_config_log_level, config, INFO); RTE_LOG_REGISTER_SUFFIX(vhost_data_log_level, data, WARNING); -- 2.7.4