git: 147e593921d7 - main - xen/privcmd: split setup of virtual address range into helper
Roger Pau Monné
royger at FreeBSD.org
Mon Jan 11 15:36:08 UTC 2021
The branch main has been updated by royger:
URL: https://cgit.FreeBSD.org/src/commit/?id=147e593921d7b9a6697a92a512ab7bd777f9a6b1
commit 147e593921d7b9a6697a92a512ab7bd777f9a6b1
Author: Roger Pau Monné <royger at FreeBSD.org>
AuthorDate: 2021-01-04 17:59:14 +0000
Commit: Roger Pau Monné <royger at FreeBSD.org>
CommitDate: 2021-01-11 15:14:59 +0000
xen/privcmd: split setup of virtual address range into helper
Preparatory change for further additions that will also make use of
the same code. No functional change.
Sponsored by: Citrix Systems R&D
---
sys/dev/xen/privcmd/privcmd.c | 69 ++++++++++++++++++++++---------------------
1 file changed, 36 insertions(+), 33 deletions(-)
diff --git a/sys/dev/xen/privcmd/privcmd.c b/sys/dev/xen/privcmd/privcmd.c
index 24bce97e9b3d..78fb32444931 100644
--- a/sys/dev/xen/privcmd/privcmd.c
+++ b/sys/dev/xen/privcmd/privcmd.c
@@ -217,6 +217,40 @@ privcmd_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size,
return (0);
}
+static struct privcmd_map *
+setup_virtual_area(struct thread *td, unsigned long addr, unsigned long num)
+{
+ vm_map_t map;
+ vm_map_entry_t entry;
+ vm_object_t mem;
+ vm_pindex_t pindex;
+ vm_prot_t prot;
+ boolean_t wired;
+ struct privcmd_map *umap;
+ int error;
+
+ if ((num == 0) || ((addr & PAGE_MASK) != 0))
+ return NULL;
+
+ map = &td->td_proc->p_vmspace->vm_map;
+ error = vm_map_lookup(&map, addr, VM_PROT_NONE, &entry, &mem, &pindex,
+ &prot, &wired);
+ if (error != KERN_SUCCESS || (entry->start != addr) ||
+ (entry->end != addr + (num * PAGE_SIZE)))
+ return NULL;
+
+ vm_map_lookup_done(map, entry);
+ if ((mem->type != OBJT_MGTDEVICE) ||
+ (mem->un_pager.devp.ops != &privcmd_pg_ops))
+ return NULL;
+
+ umap = mem->handle;
+ /* Allocate a bitset to store broken page mappings. */
+ umap->err = BITSET_ALLOC(num, M_PRIVCMD, M_WAITOK | M_ZERO);
+
+ return umap;
+}
+
static int
privcmd_ioctl(struct cdev *dev, unsigned long cmd, caddr_t arg,
int mode, struct thread *td)
@@ -255,12 +289,6 @@ privcmd_ioctl(struct cdev *dev, unsigned long cmd, caddr_t arg,
}
case IOCTL_PRIVCMD_MMAPBATCH: {
struct ioctl_privcmd_mmapbatch *mmap;
- vm_map_t map;
- vm_map_entry_t entry;
- vm_object_t mem;
- vm_pindex_t pindex;
- vm_prot_t prot;
- boolean_t wired;
struct xen_add_to_physmap_range add;
xen_ulong_t *idxs;
xen_pfn_t *gpfns;
@@ -271,33 +299,12 @@ privcmd_ioctl(struct cdev *dev, unsigned long cmd, caddr_t arg,
mmap = (struct ioctl_privcmd_mmapbatch *)arg;
- if ((mmap->num == 0) ||
- ((mmap->addr & PAGE_MASK) != 0)) {
+ umap = setup_virtual_area(td, mmap->addr, mmap->num);
+ if (umap == NULL) {
error = EINVAL;
break;
}
- map = &td->td_proc->p_vmspace->vm_map;
- error = vm_map_lookup(&map, mmap->addr, VM_PROT_NONE, &entry,
- &mem, &pindex, &prot, &wired);
- if (error != KERN_SUCCESS) {
- error = EINVAL;
- break;
- }
- if ((entry->start != mmap->addr) ||
- (entry->end != mmap->addr + (mmap->num * PAGE_SIZE))) {
- vm_map_lookup_done(map, entry);
- error = EINVAL;
- break;
- }
- vm_map_lookup_done(map, entry);
- if ((mem->type != OBJT_MGTDEVICE) ||
- (mem->un_pager.devp.ops != &privcmd_pg_ops)) {
- error = EINVAL;
- break;
- }
- umap = mem->handle;
-
add.domid = DOMID_SELF;
add.space = XENMAPSPACE_gmfn_foreign;
add.foreign_domid = mmap->dom;
@@ -316,10 +323,6 @@ privcmd_ioctl(struct cdev *dev, unsigned long cmd, caddr_t arg,
set_xen_guest_handle(add.gpfns, gpfns);
set_xen_guest_handle(add.errs, errs);
- /* Allocate a bitset to store broken page mappings. */
- umap->err = BITSET_ALLOC(mmap->num, M_PRIVCMD,
- M_WAITOK | M_ZERO);
-
for (index = 0; index < mmap->num; index += num) {
num = MIN(mmap->num - index, UINT16_MAX);
add.size = num;
More information about the dev-commits-src-main
mailing list