tap: fix tap interface not working on Arm issue 69/21469/3
authorLijian.Zhang <Lijian.Zhang@arm.com>
Wed, 21 Aug 2019 09:51:16 +0000 (17:51 +0800)
committerDamjan Marion <dmarion@me.com>
Tue, 3 Sep 2019 15:55:40 +0000 (15:55 +0000)
The VPP code tries to set all userspace memory in the table via IOCTL
to VHOST_SET_MEM_TABLE. But on aarch64, the userspace address range is
larger (48 bits) than that on x86 (47 bits). Below is an segment from
/proc/[vpp]/maps.

fffb41200000-fffb43a00000 rw-s 00000000 00:0e 532232
/anon_hugepage (deleted)

Instead of setting all userspace memory space to vhost-net, will only set
the address space reserved by pmalloc module during initialization.

Type: fix

Change-Id: I91cb35e990869b42094cf2cd0512593733d33677
Signed-off-by: Lijian Zhang <Lijian.Zhang@arm.com>
Reviewed-by: Steve Capper <Steve.Capper@arm.com>
src/vlib/physmem.c
src/vlib/physmem.h
src/vnet/devices/tap/tap.c

index 64920e1..a623095 100755 (executable)
@@ -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;
 }
index 7b7a3af..de79da5 100644 (file)
@@ -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;
index 0d7916d..917bd10 100644 (file)
@@ -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 =