From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Edwin Zhai Date: Wed, 5 Sep 2018 09:35:05 +0800 Subject: [PATCH] Adds new API for unmap memseg It is required when DM unmap ptdev BAR in deinit Tracked-on: projectacrn/acrn-hypervisor#1146 Signed-off-by: Edwin Zhai Reviewed-by: Yin Fengwei Reviewed-by: Zhao Yakui --- drivers/char/vhm/vhm_dev.c | 11 +++++++++++ drivers/vhm/vhm_mm.c | 17 +++++++++++++++++ include/linux/vhm/acrn_vhm_mm.h | 11 +++++++++++ include/linux/vhm/vhm_ioctl_defs.h | 1 + 4 files changed, 40 insertions(+) diff --git a/drivers/char/vhm/vhm_dev.c b/drivers/char/vhm/vhm_dev.c index 152aba23d95f..6e351c387928 100644 --- a/drivers/char/vhm/vhm_dev.c +++ b/drivers/char/vhm/vhm_dev.c @@ -316,6 +316,17 @@ static long vhm_dev_ioctl(struct file *filep, break; } + case IC_UNSET_MEMSEG: { + struct vm_memmap memmap; + + if (copy_from_user(&memmap, (void *)ioctl_param, + sizeof(struct vm_memmap))) + return -EFAULT; + + ret = unmap_guest_memseg(vm, &memmap); + break; + } + case IC_SET_IOREQ_BUFFER: { /* init ioreq buffer */ ret = acrn_ioreq_init(vm, (unsigned long)ioctl_param); diff --git a/drivers/vhm/vhm_mm.c b/drivers/vhm/vhm_mm.c index 4d5854d0c139..6bea6688ddc0 100644 --- a/drivers/vhm/vhm_mm.c +++ b/drivers/vhm/vhm_mm.c @@ -208,6 +208,23 @@ int map_guest_memseg(struct vhm_vm *vm, struct vm_memmap *memmap) return 0; } +int unmap_guest_memseg(struct vhm_vm *vm, struct vm_memmap *memmap) +{ + /* only handle mmio */ + if (memmap->type != VM_MEMMAP_MMIO) { + pr_err("vhm: %s invalid memmap type: %d for unmap\n", + __func__, memmap->type); + return -EINVAL; + } + + if (del_memory_region(vm->vmid, memmap->gpa, memmap->len) < 0) { + pr_err("vhm: failed to del memory region %ld!\n", vm->vmid); + return -EFAULT; + } + + return 0; +} + void free_guest_mem(struct vhm_vm *vm) { return hugepage_free_guest(vm); diff --git a/include/linux/vhm/acrn_vhm_mm.h b/include/linux/vhm/acrn_vhm_mm.h index 62aed3466e9f..7b6b1b40615b 100644 --- a/include/linux/vhm/acrn_vhm_mm.h +++ b/include/linux/vhm/acrn_vhm_mm.h @@ -169,6 +169,17 @@ void free_guest_mem(struct vhm_vm *vm); */ int map_guest_memseg(struct vhm_vm *vm, struct vm_memmap *memmap); +/** + * unmap_guest_memseg - unset guest mmapping of memory set by + * map_guest_memseg + * + * @vm: pointer to guest vm + * @memmap: pointer to guest memory mapping info + * + * Return: + */ +int unmap_guest_memseg(struct vhm_vm *vm, struct vm_memmap *memmap); + int init_trusty(struct vhm_vm *vm); void deinit_trusty(struct vhm_vm *vm); diff --git a/include/linux/vhm/vhm_ioctl_defs.h b/include/linux/vhm/vhm_ioctl_defs.h index cf4f63211aa2..6c09157a9bef 100644 --- a/include/linux/vhm/vhm_ioctl_defs.h +++ b/include/linux/vhm/vhm_ioctl_defs.h @@ -94,6 +94,7 @@ /* IC_ALLOC_MEMSEG not used */ #define IC_ALLOC_MEMSEG _IC_ID(IC_ID, IC_ID_MEM_BASE + 0x00) #define IC_SET_MEMSEG _IC_ID(IC_ID, IC_ID_MEM_BASE + 0x01) +#define IC_UNSET_MEMSEG _IC_ID(IC_ID, IC_ID_MEM_BASE + 0x02) /* PCI assignment*/ #define IC_ID_PCI_BASE 0x50UL -- https://clearlinux.org