> -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Wednesday, March 15, 2023 7:40 PM > To: dev@dpdk.org; m...@redhat.com; Xia, Chenbo <chenbo....@intel.com>; > david.march...@redhat.com > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [PATCH v2] vhost: fix madvise IOTLB entries pages overlap check > > At removal time, when testing whether the IOTLB entry has > shared pages with the previous and next entries in the > cache, it checks whether the start address of the entry to > be removed is on the same page as the start address of the > next entry in the cache. > > This is not correct, as an entry could cover several page > so the end address of the entry to be remove should be > used. This patch address this issue. > > Fixes: dea092d0addb ("vhost: fix madvise arguments alignment") > > Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com> > --- > lib/vhost/iotlb.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/lib/vhost/iotlb.c b/lib/vhost/iotlb.c > index 11785392ac..3f45bc6061 100644 > --- a/lib/vhost/iotlb.c > +++ b/lib/vhost/iotlb.c > @@ -182,8 +182,8 @@ vhost_user_iotlb_cache_random_evict(struct virtio_net > *dev, struct vhost_virtque > (node->uaddr & mask) != > (prev_node->uaddr & > mask)) { > next_node = RTE_TAILQ_NEXT(node, next); > /* Don't disable coredump if the next node is in > the same page */ > - if (next_node == NULL || > - (node->uaddr & mask) != > (next_node- > >uaddr & mask)) > + if (next_node == NULL || ((node->uaddr + node- > >size - 1) & mask) != > + (next_node->uaddr & mask)) > mem_set_dump((void > *)(uintptr_t)node->uaddr, > node->size, > false, alignment); > } > @@ -287,8 +287,8 @@ vhost_user_iotlb_cache_remove(struct virtio_net *dev, > struct vhost_virtqueue *vq > (node->uaddr & mask) != > (prev_node->uaddr & > mask)) { > next_node = RTE_TAILQ_NEXT(node, next); > /* Don't disable coredump if the next node is in > the same page */ > - if (next_node == NULL || > - (node->uaddr & mask) != > (next_node- > >uaddr & mask)) > + if (next_node == NULL || ((node->uaddr + node- > >size - 1) & mask) != > + (next_node->uaddr & mask)) > mem_set_dump((void > *)(uintptr_t)node->uaddr, > node->size, > false, alignment); > } > -- > 2.39.2
Reviewed-by: Chenbo Xia <chenbo....@intel.com>