[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


  • To: Andrew Cooper <amc96@xxxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Mon, 11 Jan 2021 11:50:01 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LJM76eaGKONXGj0LDehZpAPv50J84xuS8wH4i6oJndw=; b=lCgirfqw0ZsWrxidJZkYnxZ4hbEyteSW96zDp0u7n9AExH2fMgPHSgqHU8iBVcE/1yASwBrG8uW9CYNx+/fDEkqj6OmIxqIn5FdDRM8Ofl5z4YhYzQT6IzDt37vqXa0+hifaDpGg7JrpuU8Cw0cf+LPxoduE+FYUInE52YtA/klawdOHcVE9lvd/oNc7CBsqQLG98pFA2NKZ+vFdppCAQXg+oT99bdQ/VgXbgVmCxqjaw61irMTM/nUh2E46OglZtU0Knfdy2fATqOenHZkZJvs1EtfzowCWaI6v6XJ/6RLt9C5q3sTHGBj9hPuci42vqZoqwnxplkAHgEzRxKOjig==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gGmLSEzGzu1pmO8KeW7L1VVVODvB1T3zySg0vlO48za2N0CROogMXBeLT7qUxPLsROrRrnRtSOJyXtFcHyv6rNvdm6B8Fit2tr86AO5Zs6uts3DJo2uc1z54Tsv2KfCCN5VIR9WyIDKuVb7r3KK6a5J9eMVDIL0+KFP2ER0gS0XQjQjzWB3m2x3PcXaxPr+16dTEc7zFM4wGM6eMOZ6mAiWAa6dWR4GIeeCkDi1qHdfKRwKvz8oP7GDeoUmoZTU+IhueC177ppWcmQEAawBDPR+M9wzyLFtqTd+tG4ZACRcNZwT0lGzRoLP7u4UREBp2p61XLol9E+zb5ASF6P34yA==
  • Authentication-results: esa2.hc3370-68.iphmx.com; dkim=pass (signature verified) header.i=@citrix.onmicrosoft.com
  • Cc: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Ian Jackson <iwj@xxxxxxxxxxxxxx>, Michał Leszczyński <michal.leszczynski@xxxxxxx>, Hubert Jasudowicz <hubert.jasudowicz@xxxxxxx>, Tamas K Lengyel <tamas@xxxxxxxxxxxxx>
  • Delivery-date: Mon, 11 Jan 2021 10:50:24 +0000
  • Ironport-sdr: ed0gKSu9H6oRElfQobDW0FrRsKzNwQia7Yaeb+5fFGpXz1muPr0tUQxsTaF6rDmvqipG+npKUo IfppnA0VRAGs2TXcSXLeZtZvjjlPdcmdCNxvAzbH9Zou6EaxyCOzW9L4xOr4uGX9gypMZcQG8d M1l/WGPGRpcM2/JswLp4WF5H1NosPsbbYl+E7hHSpdZPHRDpcMjCCS22fPHBpUpJ1hlUONmD7X e3XOiySHqPEDCcKjTeLVIASx4jwM95Ds9nCwmeiq7WbyJThK84wG+Kr08uPkk2lQDpXrDvPlp1 M8M=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

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




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.