From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zhihong Wang Subject: [PATCH v4 0/6] vhost: optimize enqueue Date: Mon, 29 Aug 2016 23:35:58 -0400 Message-ID: <1472528164-54296-1-git-send-email-zhihong.wang@intel.com> References: <1471319402-112998-1-git-send-email-zhihong.wang@intel.com> Cc: maxime.coquelin@redhat.com, yuanhan.liu@linux.intel.com, thomas.monjalon@6wind.com To: dev@dpdk.org Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 339772956 for ; Tue, 30 Aug 2016 12:43:57 +0200 (CEST) In-Reply-To: <1471319402-112998-1-git-send-email-zhihong.wang@intel.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch set optimizes the vhost enqueue function. It implements the vhost logic from scratch into a single function designed for high performance and good maintainability, and improves CPU efficiency significantly by optimizing cache access, which means: * Higher maximum throughput can be achieved for fast frontends like DPDK virtio pmd. * Better scalability can be achieved that each vhost core can support more connections because it takes less cycles to handle each single frontend. This patch set contains: 1. A Windows VM compatibility fix for vhost enqueue in 16.07 release. 2. A baseline patch to rewrite the vhost logic. 3. A series of optimization patches added upon the baseline. The main optimization techniques are: 1. Reorder code to reduce CPU pipeline stall cycles. 2. Batch update the used ring for better efficiency. 3. Prefetch descriptor to hide cache latency. 4. Remove useless volatile attribute to allow compiler optimization. Code reordering and batch used ring update bring most of the performance improvements. In the existing code there're 2 callbacks for vhost enqueue: * virtio_dev_merge_rx for mrg_rxbuf turned on cases. * virtio_dev_rx for mrg_rxbuf turned off cases. The performance of the existing code is not optimal, especially when the mrg_rxbuf feature turned on. Besides, having 2 callback paths increases maintenance efforts. Also, there's a compatibility issue in the existing code which causes Windows VM to hang when the mrg_rxbuf feature turned on. --- Changes in v4: 1. Fix a Windows VM compatibility issue. 2. Free shadow used ring in the right place. 3. Add failure check for shadow used ring malloc. 4. Refactor the code for clearer logic. 5. Add PRINT_PACKET for debugging. --- Changes in v3: 1. Remove unnecessary memset which causes frontend stall on SNB & IVB. 2. Rename variables to follow naming convention. 3. Rewrite enqueue and delete the obsolete in the same patch. --- Changes in v2: 1. Split the big function into several small ones. 2. Use multiple patches to explain each optimization. 3. Add comments. Zhihong Wang (6): vhost: fix windows vm hang vhost: rewrite enqueue vhost: remove useless volatile vhost: add desc prefetch vhost: batch update used ring vhost: optimize cache access lib/librte_vhost/vhost-net.h | 6 +- lib/librte_vhost/vhost_rxtx.c | 572 +++++++++++++++--------------------------- lib/librte_vhost/virtio-net.c | 42 +++- 3 files changed, 244 insertions(+), 376 deletions(-) -- 2.7.4