From 8d98684a60dc641b457922c1529a1d5d6479c94d Mon Sep 17 00:00:00 2001 From: Jianfeng Tan Date: Thu, 11 Aug 2016 02:17:30 +0000 Subject: Vhost-User: Fix calculate memory region size The memory region size calculation is wrong. For example, a region with size of 1G (hugepage size is also 1G), and offset is zero, use the previous way to calculate, the ultimate size to mmap and munmap is 2G, which could lead to segment fault when munmap is executed. This patch refers the way in DPDK to calculate the region size. Change-Id: I6f35cde15e2402be0025c556c192b87a46bbf978 Signed-off-by: Jianfeng Tan --- vnet/vnet/devices/dpdk/vhost_user.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'vnet') diff --git a/vnet/vnet/devices/dpdk/vhost_user.c b/vnet/vnet/devices/dpdk/vhost_user.c index f1c50019625..8335963d22b 100644 --- a/vnet/vnet/devices/dpdk/vhost_user.c +++ b/vnet/vnet/devices/dpdk/vhost_user.c @@ -883,8 +883,8 @@ static void dpdk_unmap_all_mem_regions(dpdk_device_t * xd) long page_sz = get_huge_page_size(vui->region_fd[i]); - ssize_t map_sz = (mem->regions[i].memory_size + - vui->region_offset[i] + page_sz) & ~(page_sz - 1); + ssize_t map_sz = RTE_ALIGN_CEIL(mem->regions[i].memory_size + + vui->region_offset[i], page_sz); r = munmap((void *)(vui->region_addr[i] - vui->region_offset[i]), map_sz); @@ -1188,7 +1188,7 @@ static clib_error_t * dpdk_vhost_user_socket_read (unix_file_t * uf) fd = fds[0]; /* align size to 2M page */ long page_sz = get_huge_page_size(fd); - ssize_t map_sz = (msg.log.size + msg.log.offset + page_sz) & ~(page_sz - 1); + ssize_t map_sz = RTE_ALIGN_CEIL(msg.log.size + msg.log.offset, page_sz); void *addr = mmap(0, map_sz, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); -- cgit 1.2.3-korg