* [PATCH v5 01/26] vhost: fix IOTLB entries overlap check with previous entry
[not found] <20230606081852.71003-1-maxime.coquelin@redhat.com>
@ 2023-06-06 8:18 ` Maxime Coquelin
2023-06-06 8:18 ` [PATCH v5 04/26] vhost: don't dump unneeded pages with IOTLB Maxime Coquelin
1 sibling, 0 replies; 2+ messages in thread
From: Maxime Coquelin @ 2023-06-06 8:18 UTC (permalink / raw)
To: dev, chenbo.xia, david.marchand, mkp, fbl, jasowang,
cunming.liang, xieyongji, echaudro, eperezma, amorenoz, lulu
Cc: Maxime Coquelin, stable
Commit 22b6d0ac691a ("vhost: fix madvise IOTLB entries pages overlap check")
fixed the check to ensure the entry to be removed does not
overlap with the next one in the IOTLB cache before marking
it as DONTDUMP with madvise(). This is not enough, because
the same issue is present when comparing with the previous
entry in the cache, where the end address of the previous
entry should be used, not the start one.
Fixes: dea092d0addb ("vhost: fix madvise arguments alignment")
Cc: stable@dpdk.org
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Mike Pattrick <mkp@redhat.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.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 3f45bc6061..870c8acb88 100644
--- a/lib/vhost/iotlb.c
+++ b/lib/vhost/iotlb.c
@@ -178,8 +178,8 @@ vhost_user_iotlb_cache_random_evict(struct virtio_net *dev, struct vhost_virtque
mask = ~(alignment - 1);
/* Don't disable coredump if the previous node is in the same page */
- if (prev_node == NULL ||
- (node->uaddr & mask) != (prev_node->uaddr & mask)) {
+ if (prev_node == NULL || (node->uaddr & mask) !=
+ ((prev_node->uaddr + prev_node->size - 1) & 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 + node->size - 1) & mask) !=
@@ -283,8 +283,8 @@ vhost_user_iotlb_cache_remove(struct virtio_net *dev, struct vhost_virtqueue *vq
mask = ~(alignment-1);
/* Don't disable coredump if the previous node is in the same page */
- if (prev_node == NULL ||
- (node->uaddr & mask) != (prev_node->uaddr & mask)) {
+ if (prev_node == NULL || (node->uaddr & mask) !=
+ ((prev_node->uaddr + prev_node->size - 1) & 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 + node->size - 1) & mask) !=
--
2.40.1
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH v5 04/26] vhost: don't dump unneeded pages with IOTLB
[not found] <20230606081852.71003-1-maxime.coquelin@redhat.com>
2023-06-06 8:18 ` [PATCH v5 01/26] vhost: fix IOTLB entries overlap check with previous entry Maxime Coquelin
@ 2023-06-06 8:18 ` Maxime Coquelin
1 sibling, 0 replies; 2+ messages in thread
From: Maxime Coquelin @ 2023-06-06 8:18 UTC (permalink / raw)
To: dev, chenbo.xia, david.marchand, mkp, fbl, jasowang,
cunming.liang, xieyongji, echaudro, eperezma, amorenoz, lulu
Cc: Maxime Coquelin, stable
On IOTLB entry removal, previous fixes took care of not
marking pages shared with other IOTLB entries as DONTDUMP.
However, if an IOTLB entry is spanned on multiple pages,
the other pages were kept as DODUMP while they might not
have been shared with other entries, increasing needlessly
the coredump size.
This patch addresses this issue by excluding only the
shared pages from madvise's DONTDUMP.
Fixes: dea092d0addb ("vhost: fix madvise arguments alignment")
Cc: stable@dpdk.org
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Mike Pattrick <mkp@redhat.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
---
lib/vhost/iotlb.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/lib/vhost/iotlb.c b/lib/vhost/iotlb.c
index 4ef038adff..95d67ac832 100644
--- a/lib/vhost/iotlb.c
+++ b/lib/vhost/iotlb.c
@@ -54,16 +54,23 @@ static void
vhost_user_iotlb_clear_dump(struct virtio_net *dev, struct vhost_iotlb_entry *node,
struct vhost_iotlb_entry *prev, struct vhost_iotlb_entry *next)
{
- uint64_t align;
+ uint64_t align, start, end;
+
+ start = node->uaddr;
+ end = node->uaddr + node->size;
align = hua_to_alignment(dev->mem, (void *)(uintptr_t)node->uaddr);
- /* Don't disable coredump if the previous node is in the same page */
- if (!vhost_user_iotlb_share_page(prev, node, align)) {
- /* Don't disable coredump if the next node is in the same page */
- if (!vhost_user_iotlb_share_page(node, next, align))
- mem_set_dump((void *)(uintptr_t)node->uaddr, node->size, false, align);
- }
+ /* Skip first page if shared with previous entry. */
+ if (vhost_user_iotlb_share_page(prev, node, align))
+ start = RTE_ALIGN_CEIL(start, align);
+
+ /* Skip last page if shared with next entry. */
+ if (vhost_user_iotlb_share_page(node, next, align))
+ end = RTE_ALIGN_FLOOR(end, align);
+
+ if (end > start)
+ mem_set_dump((void *)(uintptr_t)start, end - start, false, align);
}
static struct vhost_iotlb_entry *
--
2.40.1
^ permalink raw reply [flat|nested] 2+ messages in thread