|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 05/11] tools/foreignmem: Support querying the size of a resource
On Fri, Jan 08, 2021 at 05:52:36PM +0000, Andrew Cooper wrote:
> On 22/09/2020 19:24, Andrew Cooper wrote:
> > diff --git a/tools/libs/foreignmemory/linux.c
> > b/tools/libs/foreignmemory/linux.c
> > index fe73d5ab72..eec089e232 100644
> > --- a/tools/libs/foreignmemory/linux.c
> > +++ b/tools/libs/foreignmemory/linux.c
> > @@ -339,6 +342,39 @@ int osdep_xenforeignmemory_map_resource(
> > return 0;
> > }
> >
> > +int osdep_xenforeignmemory_resource_size(
> > + xenforeignmemory_handle *fmem, domid_t domid, unsigned int type,
> > + unsigned int id, unsigned long *nr_frames)
> > +{
> > + int rc;
> > + struct xen_mem_acquire_resource *xmar =
> > + xencall_alloc_buffer(fmem->xcall, sizeof(*xmar));
> > +
> > + if ( !xmar )
> > + {
> > + PERROR("Could not bounce memory for acquire_resource hypercall");
> > + return -1;
> > + }
> > +
> > + *xmar = (struct xen_mem_acquire_resource){
> > + .domid = domid,
> > + .type = type,
> > + .id = id,
> > + };
> > +
> > + rc = xencall2(fmem->xcall, __HYPERVISOR_memory_op,
> > + XENMEM_acquire_resource, (uintptr_t)xmar);
> > + if ( rc )
> > + goto out;
> > +
> > + *nr_frames = xmar->nr_frames;
> > +
> > + out:
> > + xencall_free_buffer(fmem->xcall, xmar);
> > +
> > + return rc;
> > +}
>
> Having talked this through with Roger, it's broken.
>
> In the meantime, foreignmem has gained acquire_resource on FreeBSD.
> Nothing in this osdep function is linux-specific, so it oughtn't to be
> osdep.
>
> However, its also not permitted to make hypercalls like this in
> restricted mode, and that isn't something we should be breaking.
> Amongst other things, it will prevent us from supporting >128 cpus, as
> Qemu needs updating to use this interface in due course.
>
> The only solution (which keeps restricted mode working) is to fix
> Linux's ioctl() to be able to understand size requests. This also
> avoids foreignmem needing to open a xencall handle which was fugly in
> the first place.
I think the following patch should allow you to fetch the resource
size from Linux privcmd driver by doing an ioctl with addr = 0 and num
= 0. I've just build tested it, but I haven't tried exercising the
code.
Roger.
---8<---
>From 5d717c7b9ad3561ed0b17e7c5cf76b7c9fb536db Mon Sep 17 00:00:00 2001
From: Roger Pau Monne <roger.pau@xxxxxxxxxx>
Date: Mon, 11 Jan 2021 10:38:59 +0100
Subject: [PATCH] xen/privcmd: allow fetching resource sizes
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Allow issuing an IOCTL_PRIVCMD_MMAP_RESOURCE ioctl with num = 0 and
addr = 0 in order to fetch the size of a specific resource.
Add a shortcut to the default map resource path, since fetching the
size requires no address to be passed in, and thus no VMA to setup.
Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
NB: fetching the size of a resource shouldn't trigger an hypercall
preemption, and hence I've dropped the preempt indications.
---
drivers/xen/privcmd.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
index b0c73c58f987..3278f93eb3da 100644
--- a/drivers/xen/privcmd.c
+++ b/drivers/xen/privcmd.c
@@ -717,7 +717,8 @@ static long privcmd_ioctl_restrict(struct file *file, void
__user *udata)
return 0;
}
-static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
+static long privcmd_ioctl_mmap_resource(struct file *file,
+ struct privcmd_mmap_resource __user *udata)
{
struct privcmd_data *data = file->private_data;
struct mm_struct *mm = current->mm;
@@ -734,6 +735,19 @@ static long privcmd_ioctl_mmap_resource(struct file *file,
void __user *udata)
if (data->domid != DOMID_INVALID && data->domid != kdata.dom)
return -EPERM;
+ memset(&xdata, 0, sizeof(xdata));
+
+ if (!kdata.addr && !kdata.num) {
+ /* Query the size of the resource. */
+ xdata.domid = kdata.dom;
+ xdata.type = kdata.type;
+ xdata.id = kdata.id;
+ rc = HYPERVISOR_memory_op(XENMEM_acquire_resource, &xdata);
+ if (rc)
+ return rc;
+ return __put_user(xdata.nr_frames, &udata->num);
+ }
+
mmap_write_lock(mm);
vma = find_vma(mm, kdata.addr);
@@ -768,7 +782,6 @@ static long privcmd_ioctl_mmap_resource(struct file *file,
void __user *udata)
} else
vma->vm_private_data = PRIV_VMA_LOCKED;
- memset(&xdata, 0, sizeof(xdata));
xdata.domid = kdata.dom;
xdata.type = kdata.type;
xdata.id = kdata.id;
--
2.29.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |