[dpdk-dev,RFC,1/7] lib/librte_vhost: Fix host_memory_map() to handle various memory regions
Commit Message
Without this patch, host_memory_map() can only handle a region that
exists on head of a guest physical memory. The patch fixes the
host_memory_map() to handle regions exist on middle of the physical memory.
Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
---
lib/librte_vhost/virtio-net.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
@@ -83,6 +83,7 @@ const uint32_t BUFSIZE = PATH_MAX;
/* Structure containing information gathered from maps file. */
struct procmap {
uint64_t va_start; /* Start virtual address in file. */
+ uint64_t va_end; /* End virtual address in file. */
uint64_t len; /* Size of file. */
uint64_t pgoff; /* Not used. */
uint32_t maj; /* Not used. */
@@ -176,7 +177,7 @@ host_memory_map(struct virtio_net *dev, struct virtio_memory *mem,
return -1;
}
- procmap.len = strtoull(in[1], &end, 16);
+ procmap.va_end = strtoull(in[1], &end, 16);
if ((in[1] == '\0') || (end == NULL) || (*end != '\0') || (errno != 0)) {
fclose(fmap);
return -1;
@@ -209,8 +210,8 @@ host_memory_map(struct virtio_net *dev, struct virtio_memory *mem,
memcpy(&procmap.prot, in[2], PROT_SZ);
memcpy(&procmap.fname, in[7], PATH_MAX);
- if (procmap.va_start == addr) {
- procmap.len = procmap.len - procmap.va_start;
+ if ((procmap.va_start <= addr) && (procmap.va_end >= addr)) {
+ procmap.len = procmap.va_end - procmap.va_start;
found = 1;
break;
}