From 22677b0eef49ec30ef0facadee44b0084fc091ac Mon Sep 17 00:00:00 2001 From: Yunjian Wang Date: Sat, 10 Apr 2021 17:37:57 +0800 Subject: [PATCH] vfio: fix duplicated user mem map Currently, new user mem maps are checked if they are adjacent to an existing mem map and if so, the mem map entries are merged. It didn't check for duplicate mem maps, so if the API is called with the same mem map multiple times, they will occupy multiple mem map entries. This will reduce the amount of entries available for unique mem maps. So check for duplicate mem maps and merge them into one mem map entry if any found. Fixes: 0cbce3a167f1 ("vfio: skip DMA map failure if already mapped") Cc: stable@dpdk.org Suggested-by: Kevin Traynor Signed-off-by: Yunjian Wang Acked-by: Anatoly Burakov --- lib/librte_eal/linux/eal_vfio.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/librte_eal/linux/eal_vfio.c b/lib/librte_eal/linux/eal_vfio.c index fe25719991..25add2fa5d 100644 --- a/lib/librte_eal/linux/eal_vfio.c +++ b/lib/librte_eal/linux/eal_vfio.c @@ -171,6 +171,10 @@ adjust_map(struct user_mem_map *src, struct user_mem_map *end, static int merge_map(struct user_mem_map *left, struct user_mem_map *right) { + /* merge the same maps into one */ + if (memcmp(left, right, sizeof(struct user_mem_map)) == 0) + goto out; + if (left->addr + left->len != right->addr) return 0; if (left->iova + left->len != right->iova) @@ -178,6 +182,7 @@ merge_map(struct user_mem_map *left, struct user_mem_map *right) left->len += right->len; +out: memset(right, 0, sizeof(*right)); return 1; -- 2.20.1