Message ID | 20210118140426.80458-1-roger.pau@citrix.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [for,<=,5.4] xen/privcmd: allow fetching resource sizes | expand |
On Mon, Jan 18, 2021 at 03:04:26PM +0100, Roger Pau Monne wrote: > commit ef3a575baf53571dc405ee4028e26f50856898e7 upstream > > 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. > > This is missing from the initial implementation, and causes issues > when mapping resources that don't have fixed or known sizes. > > Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> > Reviewed-by: Juergen Gross <jgross@suse.com> > Tested-by: Andrew Cooper <andrew.cooper3@citrix.com> > Cc: stable@vger.kernel.org # >= 4.18 > Link: https://lore.kernel.org/r/20210112115358.23346-1-roger.pau@citrix.com > Signed-off-by: Juergen Gross <jgross@suse.com> > --- > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> > Cc: xen-devel@lists.xenproject.org > --- > drivers/xen/privcmd.c | 25 +++++++++++++++++++------ > 1 file changed, 19 insertions(+), 6 deletions(-) Now queued up, thanks. greg k-h
On 20/01/2021 11:03, Greg KH wrote: > On Mon, Jan 18, 2021 at 03:04:26PM +0100, Roger Pau Monne wrote: >> commit ef3a575baf53571dc405ee4028e26f50856898e7 upstream >> >> 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. >> >> This is missing from the initial implementation, and causes issues >> when mapping resources that don't have fixed or known sizes. >> >> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> >> Reviewed-by: Juergen Gross <jgross@suse.com> >> Tested-by: Andrew Cooper <andrew.cooper3@citrix.com> >> Cc: stable@vger.kernel.org # >= 4.18 >> Link: https://lore.kernel.org/r/20210112115358.23346-1-roger.pau@citrix.com >> Signed-off-by: Juergen Gross <jgross@suse.com> >> --- >> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> >> Cc: xen-devel@lists.xenproject.org >> --- >> drivers/xen/privcmd.c | 25 +++++++++++++++++++------ >> 1 file changed, 19 insertions(+), 6 deletions(-) > Now queued up, thanks. Hello, The upstream version of this patch was queued against 5.4 and 4.19, both of which suffered a patch conflict, and are fixed by this version. Was it an oversight that this version didn't get queued for 4.19? Thanks, ~Andrew
On Tue, Jan 26, 2021 at 05:22:59PM +0000, Andrew Cooper wrote: > On 20/01/2021 11:03, Greg KH wrote: > > On Mon, Jan 18, 2021 at 03:04:26PM +0100, Roger Pau Monne wrote: > >> commit ef3a575baf53571dc405ee4028e26f50856898e7 upstream > >> > >> 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. > >> > >> This is missing from the initial implementation, and causes issues > >> when mapping resources that don't have fixed or known sizes. > >> > >> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> > >> Reviewed-by: Juergen Gross <jgross@suse.com> > >> Tested-by: Andrew Cooper <andrew.cooper3@citrix.com> > >> Cc: stable@vger.kernel.org # >= 4.18 > >> Link: https://lore.kernel.org/r/20210112115358.23346-1-roger.pau@citrix.com > >> Signed-off-by: Juergen Gross <jgross@suse.com> > >> --- > >> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> > >> Cc: xen-devel@lists.xenproject.org > >> --- > >> drivers/xen/privcmd.c | 25 +++++++++++++++++++------ > >> 1 file changed, 19 insertions(+), 6 deletions(-) > > Now queued up, thanks. > > Hello, > > The upstream version of this patch was queued against 5.4 and 4.19, both > of which suffered a patch conflict, and are fixed by this version. > > Was it an oversight that this version didn't get queued for 4.19? It does not apply cleanly there, if you provide a working backport, I will be glad to apply it. thanks, greg k-h
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c index 7e6e682104dc..a8486432be05 100644 --- a/drivers/xen/privcmd.c +++ b/drivers/xen/privcmd.c @@ -743,14 +743,15 @@ static int remap_pfn_fn(pte_t *ptep, pgtable_t token, unsigned long addr, 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; struct vm_area_struct *vma; struct privcmd_mmap_resource kdata; xen_pfn_t *pfns = NULL; - struct xen_mem_acquire_resource xdata; + struct xen_mem_acquire_resource xdata = { }; int rc; if (copy_from_user(&kdata, udata, sizeof(kdata))) @@ -760,6 +761,22 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata) if (data->domid != DOMID_INVALID && data->domid != kdata.dom) return -EPERM; + /* Both fields must be set or unset */ + if (!!kdata.addr != !!kdata.num) + return -EINVAL; + + xdata.domid = kdata.dom; + xdata.type = kdata.type; + xdata.id = kdata.id; + + if (!kdata.addr && !kdata.num) { + /* Query the size of the resource. */ + rc = HYPERVISOR_memory_op(XENMEM_acquire_resource, &xdata); + if (rc) + return rc; + return __put_user(xdata.nr_frames, &udata->num); + } + down_write(&mm->mmap_sem); vma = find_vma(mm, kdata.addr); @@ -793,10 +810,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; xdata.frame = kdata.idx; xdata.nr_frames = kdata.num; set_xen_guest_handle(xdata.frame_list, pfns);