From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by dpdk.org (Postfix) with ESMTP id 15D615F24; Wed, 21 Mar 2018 16:44:33 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 254404040859; Wed, 21 Mar 2018 15:44:32 +0000 (UTC) Received: from localhost.localdomain (ovpn-112-43.ams2.redhat.com [10.36.112.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id B1A6C202322F; Wed, 21 Mar 2018 15:44:30 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, jianfeng.tan@intel.com, tiwei.bie@intel.com, jfreimann@redhat.com Cc: stable@dpdk.org, Maxime Coquelin Date: Wed, 21 Mar 2018 16:44:13 +0100 Message-Id: <20180321154413.1120-1-maxime.coquelin@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Wed, 21 Mar 2018 15:44:32 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Wed, 21 Mar 2018 15:44:32 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'maxime.coquelin@redhat.com' RCPT:'' Subject: [dpdk-dev] [PATCH] vhost: avoid concurrency when logging dirty pages 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: , X-List-Received-Date: Wed, 21 Mar 2018 15:44:33 -0000 This patch aims at fixing a migration performance regression faced since atomic operation is used to log pages as dirty when doing live migration. Instead of setting a single bit by doing an atomic read-modify-write operation to log a page as dirty, this patch write 0xFF to the corresponding byte, and so logs 8 page as dirty. The advantage is that it avoids concurrent atomic operations by multiple PMD threads, the drawback is that some clean pages are marked as dirty and so are transferred twice. Fixes: 897f13a1f726 ("vhost: make page logging atomic") Cc: stable@dpdk.org Signed-off-by: Maxime Coquelin --- lib/librte_vhost/vhost.h | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index d947bc9e3..aa2606f8a 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -247,18 +247,14 @@ struct virtio_net { #define VHOST_LOG_PAGE 4096 /* - * Atomically set a bit in memory. + * Mark all pages belonging to the same dirty log bitmap byte + * as dirty. The goal is to avoid concurrency between different + * threads doing atomic read-modify-writes on the same byte. */ -static __rte_always_inline void -vhost_set_bit(unsigned int nr, volatile uint8_t *addr) -{ - __sync_fetch_and_or_8(addr, (1U << nr)); -} - static __rte_always_inline void vhost_log_page(uint8_t *log_base, uint64_t page) { - vhost_set_bit(page % 8, &log_base[page / 8]); + log_base[page / 8] = 0xff; } static __rte_always_inline void -- 2.14.3