diff options
-rwxr-xr-x | src/vlib/physmem.c | 7 | ||||
-rw-r--r-- | src/vlib/physmem.h | 1 | ||||
-rw-r--r-- | src/vnet/devices/tap/tap.c | 7 |
3 files changed, 13 insertions, 2 deletions
diff --git a/src/vlib/physmem.c b/src/vlib/physmem.c index 64920e1ebe2..a62309552f5 100755 --- a/src/vlib/physmem.c +++ b/src/vlib/physmem.c @@ -115,7 +115,12 @@ vlib_physmem_init (vlib_main_t * vm) if (vpm->base_addr == 0) vpm->base_addr = VLIB_PHYSMEM_DEFAULT_BASE_ADDDR; - clib_pmalloc_init (vpm->pmalloc_main, vpm->base_addr, 0); + clib_pmalloc_init (vpm->pmalloc_main, vpm->base_addr, vpm->max_size); + + /* update base_addr and max_size per actual allocation */ + vpm->base_addr = (uword) vpm->pmalloc_main->base; + vpm->max_size = (uword) vpm->pmalloc_main->max_pages << + vpm->pmalloc_main->def_log2_page_sz; return error; } diff --git a/src/vlib/physmem.h b/src/vlib/physmem.h index 7b7a3af3dfa..de79da51ad0 100644 --- a/src/vlib/physmem.h +++ b/src/vlib/physmem.h @@ -57,6 +57,7 @@ typedef struct { u32 flags; uword base_addr; + uword max_size; #define VLIB_PHYSMEM_MAIN_F_HAVE_PAGEMAP (1 << 0) #define VLIB_PHYSMEM_MAIN_F_HAVE_IOMMU (1 << 1) vlib_physmem_map_t *maps; diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c index 0d7916d7ee2..917bd10644c 100644 --- a/src/vnet/devices/tap/tap.c +++ b/src/vnet/devices/tap/tap.c @@ -31,6 +31,7 @@ #include <linux/rtnetlink.h> #include <vlib/vlib.h> +#include <vlib/physmem.h> #include <vlib/unix/unix.h> #include <vnet/ethernet/ethernet.h> #include <vnet/ip/ip4_packet.h> @@ -112,6 +113,7 @@ open_netns_fd (char *netns) void tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) { + vlib_physmem_main_t *vpm = &vm->physmem_main; vnet_main_t *vnm = vnet_get_main (); virtio_main_t *vim = &virtio_main; tap_main_t *tm = &tap_main; @@ -391,7 +393,10 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) vhost_mem = clib_mem_alloc (i); clib_memset (vhost_mem, 0, i); vhost_mem->nregions = 1; - vhost_mem->regions[0].memory_size = (1ULL << 47) - 4096; + vhost_mem->regions[0].memory_size = vpm->max_size; + vhost_mem->regions[0].guest_phys_addr = vpm->base_addr; + vhost_mem->regions[0].userspace_addr = + vhost_mem->regions[0].guest_phys_addr; _IOCTL (vif->fd, VHOST_SET_MEM_TABLE, vhost_mem); if ((args->error = |