Hi,
In the latest dpdk master branch, in the function *vhost_log_cache_page*: static __rte_always_inline void vhost_log_cache_page(struct virtio_net *dev, struct vhost_virtqueue *vq, uint64_t page) { uint32_t bit_nr = page % (sizeof(unsigned long) << 3); uint32_t offset = page / (sizeof(unsigned long) << 3); int i; for (i = 0; i < vq->log_cache_nb_elem; i++) { struct log_cache_entry *elem = vq->log_cache + i; if (elem->offset == offset) { elem->val |= (1UL << bit_nr); return; } } if (unlikely(i >= VHOST_LOG_CACHE_NR)) { /* * No more room for a new log cache entry, * so write the dirty log map directly. */ rte_smp_wmb(); vhost_log_page((uint8_t *)(uintptr_t)dev->log_base, page); return; } vq->log_cache[i].offset = offset; vq->log_cache[i].val = (1UL << bit_nr); } Did it just miss an increment on vq->log_cache_nb_elem ? Looks like a vq->log_cache_nb_elem++ is needed here.