> -----Original Message----- > From: Maxime Coquelin [mailto:maxime.coque...@redhat.com] > Sent: Wednesday, March 21, 2018 11:44 PM > To: dev@dpdk.org; Tan, Jianfeng; Bie, Tiwei; jfreim...@redhat.com > Cc: sta...@dpdk.org; Maxime Coquelin > Subject: [PATCH] vhost: avoid concurrency when logging dirty pages > > 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: sta...@dpdk.org > > Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
As you mentioned, the concern is if it affects the rate of convergence. Hope we could have some tests on that. Reviewed-by: Jianfeng Tan <jianfeng....@intel.com> Thanks! > --- > 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