From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 27FC9A0559; Tue, 17 Mar 2020 03:43:18 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 151FA1C0B8; Tue, 17 Mar 2020 03:43:12 +0100 (CET) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id A0C071C08C for ; Tue, 17 Mar 2020 03:43:08 +0100 (CET) IronPort-SDR: cQJncAg294z/GTpjKghfqe6Lq1UmrHIMyizQX39nUre2ZE/5cTJ9uMt2Uuh5Txblnsnn5wJEUz cMo2AksFa6xw== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2020 19:43:08 -0700 IronPort-SDR: WcT7oT+aZZYSQ/WZL2LjDHGc/j1QdUqD9cD+OfJVfznJWk57bLalUzfQ07WLVOcyO/Wcbz0ORy gI77f9ak5UVg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,562,1574150400"; d="scan'208";a="417390177" Received: from npg_dpdk_virtio_jiayuhu_07.sh.intel.com ([10.67.119.35]) by orsmga005.jf.intel.com with ESMTP; 16 Mar 2020 19:43:06 -0700 From: Jiayu Hu To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, xiaolong.ye@intel.com, zhihong.wang@intel.com, Jiayu Hu Date: Tue, 17 Mar 2020 05:21:22 -0400 Message-Id: <1584436885-18651-2-git-send-email-jiayu.hu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1584436885-18651-1-git-send-email-jiayu.hu@intel.com> References: <1584436885-18651-1-git-send-email-jiayu.hu@intel.com> Subject: [dpdk-dev] [PATCH 1/4] vhost: populate guest memory for DMA-accelerated vhost-user X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" DMA engines, like I/OAT, are efficient in moving large data within memory. Offloading large copies in vhost side to DMA engines can save precious CPU cycles and improve vhost performance. However, using the DMA engine requires to populate guest's memory. This patch is to enable DMA-accelerated vhost-user to populate guest's memory. Signed-off-by: Jiayu Hu --- lib/librte_vhost/rte_vhost.h | 1 + lib/librte_vhost/socket.c | 20 ++++++++++++++++++++ lib/librte_vhost/vhost.h | 2 ++ lib/librte_vhost/vhost_user.c | 3 ++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h index c7b619a..8871249 100644 --- a/lib/librte_vhost/rte_vhost.h +++ b/lib/librte_vhost/rte_vhost.h @@ -35,6 +35,7 @@ extern "C" { #define RTE_VHOST_USER_EXTBUF_SUPPORT (1ULL << 5) /* support only linear buffers (no chained mbufs) */ #define RTE_VHOST_USER_LINEARBUF_SUPPORT (1ULL << 6) +#define RTE_VHOST_USER_DMA_COPY (1ULL << 7) /** Protocol features. */ #ifndef VHOST_USER_PROTOCOL_F_MQ diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index 7c80121..b811dc9 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -62,6 +62,8 @@ struct vhost_user_socket { */ int vdpa_dev_id; + bool dma_enabled; + struct vhost_device_ops const *notify_ops; }; @@ -241,6 +243,13 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket) if (vsocket->linearbuf) vhost_enable_linearbuf(vid); + if (vsocket->dma_enabled) { + struct virtio_net *dev; + + dev = get_device(vid); + dev->dma_enabled = true; + } + VHOST_LOG_CONFIG(INFO, "new device, handle is %d\n", vid); if (vsocket->notify_ops->new_connection) { @@ -891,6 +900,17 @@ rte_vhost_driver_register(const char *path, uint64_t flags) goto out_mutex; } + vsocket->dma_enabled = flags & RTE_VHOST_USER_DMA_COPY; + + if (vsocket->dma_enabled && + (flags & (RTE_VHOST_USER_IOMMU_SUPPORT | + RTE_VHOST_USER_POSTCOPY_SUPPORT))) { + VHOST_LOG_CONFIG(ERR, "error: enabling DMA copy and IOMMU " + "or post-copy feature simultaneously is not " + "supported\n"); + goto out_mutex; + } + /* * Set the supported features correctly for the builtin vhost-user * net driver. diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 2087d14..c245771 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -383,6 +383,8 @@ struct virtio_net { */ int vdpa_dev_id; + bool dma_enabled; + /* context data for the external message handlers */ void *extern_data; /* pre and post vhost user message handlers for the device */ diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index bd1be01..9c8356a 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -1138,7 +1138,8 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, goto err_mmap; } - populate = (dev->dequeue_zero_copy) ? MAP_POPULATE : 0; + populate = (dev->dequeue_zero_copy || dev->dma_enabled) ? + MAP_POPULATE : 0; mmap_addr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED | populate, fd, 0); -- 2.7.4