* [RFC PATCH 0/3] xen/privcmd: support for paged-out frames @ 2012-08-23 17:13 David Vrabel 2012-08-23 17:13 ` [PATCH 1/3] xen/mm: return more precise error from xen_remap_domain_range() David Vrabel ` (3 more replies) 0 siblings, 4 replies; 17+ messages in thread From: David Vrabel @ 2012-08-23 17:13 UTC (permalink / raw) To: xen-devel Cc: Andres Lagar-Cavilla, Keir Fraser, David Vrabel, Konrad Rzeszutek Wilk This series is a straight forward-port of some functionality from classic kernels to support Xen hosts that do paging of guests. This isn't functionality the XenServer makes use of so I've not tested these with paging in use (GridCentric requested that our older kernels supported this and I'm just doing the forward port). I'm not entirely happy about the approach used here because: 1. It relies on the meaning of the return code of the update_mmu hypercall and it assumes the value Xen used for -ENOENT is the same the kernel uses. This does not appear to be a formal part of the hypercall ABI. Keir, can you comment on this? 2. It seems more sensible to have the kernel do the retries instead of libxc doing them. The kernel has to have a mechanism for this any way (for mapping back/front rings). 3. The current way of handling paged-out frames by repeatedly retrying is a bit lame. Shouldn't there be some event that the guest waiting for the frame can wait on instead? By moving the retry mechanism into the kernel we can change this without impacting the ABI to userspace. David ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 1/3] xen/mm: return more precise error from xen_remap_domain_range() 2012-08-23 17:13 [RFC PATCH 0/3] xen/privcmd: support for paged-out frames David Vrabel @ 2012-08-23 17:13 ` David Vrabel 2012-08-23 17:13 ` [PATCH 2/3] xen/privcmd: report paged-out frames in PRIVCMD_MMAPBATCH ioctl David Vrabel ` (2 subsequent siblings) 3 siblings, 0 replies; 17+ messages in thread From: David Vrabel @ 2012-08-23 17:13 UTC (permalink / raw) To: xen-devel Cc: Andres Lagar-Cavilla, Keir Fraser, David Vrabel, Konrad Rzeszutek Wilk From: David Vrabel <david.vrabel@citrix.com> Callers of xen_remap_domain_range() need to know if the remap failed because frame is currently paged out. So they can retry the remap later on. Return -ENOENT in this case. This assumes that the error codes returned by Xen are a subset of those used by the kernel. It is unclear if this is defined as part of the hypercall ABI. Signed-off-by: David Vrabel <david.vrabel@citrix.com> --- arch/x86/xen/mmu.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index b65a761..fb187ea 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -2355,8 +2355,8 @@ int xen_remap_domain_mfn_range(struct vm_area_struct *vma, if (err) goto out; - err = -EFAULT; - if (HYPERVISOR_mmu_update(mmu_update, batch, NULL, domid) < 0) + err = HYPERVISOR_mmu_update(mmu_update, batch, NULL, domid); + if (err < 0) goto out; nr -= batch; -- 1.7.2.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 2/3] xen/privcmd: report paged-out frames in PRIVCMD_MMAPBATCH ioctl 2012-08-23 17:13 [RFC PATCH 0/3] xen/privcmd: support for paged-out frames David Vrabel 2012-08-23 17:13 ` [PATCH 1/3] xen/mm: return more precise error from xen_remap_domain_range() David Vrabel @ 2012-08-23 17:13 ` David Vrabel 2012-08-24 1:34 ` Andres Lagar-Cavilla 2012-08-24 18:01 ` Bastian Blank 2012-08-23 17:13 ` [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl David Vrabel 2012-08-24 1:32 ` [RFC PATCH 0/3] xen/privcmd: support for paged-out frames Andres Lagar-Cavilla 3 siblings, 2 replies; 17+ messages in thread From: David Vrabel @ 2012-08-23 17:13 UTC (permalink / raw) To: xen-devel Cc: Andres Lagar-Cavilla, Keir Fraser, David Vrabel, Konrad Rzeszutek Wilk From: David Vrabel <david.vrabel@citrix.com> libxc handles paged-out frames in xc_map_foreign_bulk() and friends by retrying the map operation. libxc expects the PRIVCMD_MMAPBATCH ioctl to report paged out frames by setting bit 31 in the mfn. Do this for the PRIVCMD_MMAPBATCH ioctl if xen_remap_domain_mfn_range() returned -ENOENT. Signed-off-by: David Vrabel <david.vrabel@citrix.com> --- drivers/xen/privcmd.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c index ccee0f1..f8c1b6d 100644 --- a/drivers/xen/privcmd.c +++ b/drivers/xen/privcmd.c @@ -255,10 +255,15 @@ static int mmap_batch_fn(void *data, void *state) { xen_pfn_t *mfnp = data; struct mmap_batch_state *st = state; + int ret; - if (xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1, - st->vma->vm_page_prot, st->domain) < 0) { - *mfnp |= 0xf0000000U; + ret = xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1, + st->vma->vm_page_prot, st->domain); + if (ret < 0) { + if (ret == -ENOENT) + *mfnp |= 0x80000000U; + else + *mfnp |= 0xf0000000U; st->err++; } st->va += PAGE_SIZE; -- 1.7.2.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 2/3] xen/privcmd: report paged-out frames in PRIVCMD_MMAPBATCH ioctl 2012-08-23 17:13 ` [PATCH 2/3] xen/privcmd: report paged-out frames in PRIVCMD_MMAPBATCH ioctl David Vrabel @ 2012-08-24 1:34 ` Andres Lagar-Cavilla 2012-08-24 18:01 ` Bastian Blank 1 sibling, 0 replies; 17+ messages in thread From: Andres Lagar-Cavilla @ 2012-08-24 1:34 UTC (permalink / raw) To: David Vrabel; +Cc: xen-devel, Keir Fraser, Konrad Rzeszutek Wilk On Aug 23, 2012, at 1:13 PM, David Vrabel wrote: > From: David Vrabel <david.vrabel@citrix.com> > > libxc handles paged-out frames in xc_map_foreign_bulk() and friends by > retrying the map operation. libxc expects the PRIVCMD_MMAPBATCH ioctl > to report paged out frames by setting bit 31 in the mfn. > > Do this for the PRIVCMD_MMAPBATCH ioctl if > xen_remap_domain_mfn_range() returned -ENOENT. > > Signed-off-by: David Vrabel <david.vrabel@citrix.com> > --- > drivers/xen/privcmd.c | 11 ++++++++--- > 1 files changed, 8 insertions(+), 3 deletions(-) > > diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c > index ccee0f1..f8c1b6d 100644 > --- a/drivers/xen/privcmd.c > +++ b/drivers/xen/privcmd.c > @@ -255,10 +255,15 @@ static int mmap_batch_fn(void *data, void *state) > { > xen_pfn_t *mfnp = data; > struct mmap_batch_state *st = state; > + int ret; > > - if (xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1, > - st->vma->vm_page_prot, st->domain) < 0) { > - *mfnp |= 0xf0000000U; > + ret = xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1, > + st->vma->vm_page_prot, st->domain); > + if (ret < 0) { > + if (ret == -ENOENT) > + *mfnp |= 0x80000000U; As Konrad pointed out separately, constants here would be great. These two constants are defined in <xen>/include/public/domctl.h. In particular, the 0x80..0 constant is defined there but *not* used by the hypervisor. I don't see a problem in (re)defining it in the linux interface headers shared between libxc and the kernel -- this is where it really belongs. It could be even phased out of domctl.h in 4.2 (unlikely) or 4.3. As for the 0xf0..0 constant I have no strong opinion -- pre-existing problem. > + else > + *mfnp |= 0xf0000000U; > st->err++; > } > st->va += PAGE_SIZE; Libxc expects errno to be ENOENT if at least one map hypercall returned ENOENT. So you need to keep an extra latch in the state, e.g. st->enoents. Or recycle st->err to be a tristate (ok, error, enoent), since I don't see any actual use of err count. Whichever way, privcmd_ioctl_mmap_batch needs to find out if it needs to return ENOENT. Note this requirement also extends to PRIVCMD_MMAPBATCH_V2. Andres > -- > 1.7.2.5 > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 2/3] xen/privcmd: report paged-out frames in PRIVCMD_MMAPBATCH ioctl 2012-08-23 17:13 ` [PATCH 2/3] xen/privcmd: report paged-out frames in PRIVCMD_MMAPBATCH ioctl David Vrabel 2012-08-24 1:34 ` Andres Lagar-Cavilla @ 2012-08-24 18:01 ` Bastian Blank 1 sibling, 0 replies; 17+ messages in thread From: Bastian Blank @ 2012-08-24 18:01 UTC (permalink / raw) To: David Vrabel Cc: Andres Lagar-Cavilla, xen-devel, Keir Fraser, Konrad Rzeszutek Wilk On Thu, Aug 23, 2012 at 06:13:45PM +0100, David Vrabel wrote: > + if (ret < 0) { > + if (ret == -ENOENT) > + *mfnp |= 0x80000000U; > + else > + *mfnp |= 0xf0000000U; Please don't use magic constants. Bastian -- Respect is a rational process -- McCoy, "The Galileo Seven", stardate 2822.3 ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl 2012-08-23 17:13 [RFC PATCH 0/3] xen/privcmd: support for paged-out frames David Vrabel 2012-08-23 17:13 ` [PATCH 1/3] xen/mm: return more precise error from xen_remap_domain_range() David Vrabel 2012-08-23 17:13 ` [PATCH 2/3] xen/privcmd: report paged-out frames in PRIVCMD_MMAPBATCH ioctl David Vrabel @ 2012-08-23 17:13 ` David Vrabel 2012-08-23 19:40 ` Konrad Rzeszutek Wilk 2012-08-24 1:35 ` Andres Lagar-Cavilla 2012-08-24 1:32 ` [RFC PATCH 0/3] xen/privcmd: support for paged-out frames Andres Lagar-Cavilla 3 siblings, 2 replies; 17+ messages in thread From: David Vrabel @ 2012-08-23 17:13 UTC (permalink / raw) To: xen-devel Cc: Andres Lagar-Cavilla, Keir Fraser, David Vrabel, Konrad Rzeszutek Wilk From: David Vrabel <david.vrabel@citrix.com> PRIVCMD_MMAPBATCH_V2 extends PRIVCMD_MMAPBATCH with an additional field for reporting the error code for every frame that could not be mapped. libxc prefers PRIVCMD_MMAPBATCH_V2 over PRIVCMD_MMAPBATCH. Signed-off-by: David Vrabel <david.vrabel@citrix.com> --- drivers/xen/privcmd.c | 54 +++++++++++++++++++++++++++++++++++++++---------- include/xen/privcmd.h | 10 +++++++++ 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c index f8c1b6d..4f97160 100644 --- a/drivers/xen/privcmd.c +++ b/drivers/xen/privcmd.c @@ -248,7 +248,8 @@ struct mmap_batch_state { struct vm_area_struct *vma; int err; - xen_pfn_t __user *user; + xen_pfn_t __user *user_mfn; + int __user *user_err; }; static int mmap_batch_fn(void *data, void *state) @@ -275,34 +276,58 @@ static int mmap_return_errors(void *data, void *state) { xen_pfn_t *mfnp = data; struct mmap_batch_state *st = state; + int ret = 0; - return put_user(*mfnp, st->user++); + if (st->user_err) { + if ((*mfnp & 0xf0000000U) == 0xf0000000U) + ret = -ENOENT; + else if ((*mfnp & 0xf0000000U) == 0x80000000U) + ret = -EINVAL; + else + ret = 0; + return __put_user(ret, st->user_err); + } else + return __put_user(*mfnp, st->user_mfn++); } static struct vm_operations_struct privcmd_vm_ops; -static long privcmd_ioctl_mmap_batch(void __user *udata) +static long privcmd_ioctl_mmap_batch(void __user *udata, int version) { int ret; - struct privcmd_mmapbatch m; + struct privcmd_mmapbatch_v2 m; struct mm_struct *mm = current->mm; struct vm_area_struct *vma; unsigned long nr_pages; LIST_HEAD(pagelist); struct mmap_batch_state state; + printk("%s(%d)\n", __func__, version); + if (!xen_initial_domain()) return -EPERM; - if (copy_from_user(&m, udata, sizeof(m))) - return -EFAULT; + if (version == 1) { + if (copy_from_user(&m, udata, sizeof(struct privcmd_mmapbatch))) + return -EFAULT; + if (!access_ok(VERIFY_WRITE, m.arr, m.num * sizeof(*m.arr))) + return -EFAULT; + m.err = NULL; + } else { + if (copy_from_user(&m, udata, sizeof(struct privcmd_mmapbatch_v2))) + return -EFAULT; + if (!access_ok(VERIFY_READ, m.arr, m.num * sizeof(*m.arr))) + return -EFAULT; + if (!access_ok(VERIFY_WRITE, m.err, m.num * (sizeof(*m.err)))) + return -EFAULT; + } nr_pages = m.num; if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT))) return -EINVAL; ret = gather_array(&pagelist, m.num, sizeof(xen_pfn_t), - m.arr); + (xen_pfn_t *)m.arr); if (ret || list_empty(&pagelist)) goto out; @@ -331,10 +356,11 @@ static long privcmd_ioctl_mmap_batch(void __user *udata) up_write(&mm->mmap_sem); if (state.err > 0) { - state.user = m.arr; + state.user_mfn = (xen_pfn_t *)m.arr; + state.user_err = m.err; ret = traverse_pages(m.num, sizeof(xen_pfn_t), - &pagelist, - mmap_return_errors, &state); + &pagelist, + mmap_return_errors, &state); } out: @@ -359,7 +385,13 @@ static long privcmd_ioctl(struct file *file, break; case IOCTL_PRIVCMD_MMAPBATCH: - ret = privcmd_ioctl_mmap_batch(udata); + ret = privcmd_ioctl_mmap_batch(udata, 1); + printk("%s() batch ret = %d\n", __func__, ret); + break; + + case IOCTL_PRIVCMD_MMAPBATCH_V2: + ret = privcmd_ioctl_mmap_batch(udata, 2); + printk("%s() batch ret = %d\n", __func__, ret); break; default: diff --git a/include/xen/privcmd.h b/include/xen/privcmd.h index 17857fb..9fa27c4 100644 --- a/include/xen/privcmd.h +++ b/include/xen/privcmd.h @@ -62,6 +62,14 @@ struct privcmd_mmapbatch { xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */ }; +struct privcmd_mmapbatch_v2 { + unsigned int num; /* number of pages to populate */ + domid_t dom; /* target domain */ + __u64 addr; /* virtual address */ + const xen_pfn_t __user *arr; /* array of mfns */ + int __user *err; /* array of error codes */ +}; + /* * @cmd: IOCTL_PRIVCMD_HYPERCALL * @arg: &privcmd_hypercall_t @@ -73,5 +81,7 @@ struct privcmd_mmapbatch { _IOC(_IOC_NONE, 'P', 2, sizeof(struct privcmd_mmap)) #define IOCTL_PRIVCMD_MMAPBATCH \ _IOC(_IOC_NONE, 'P', 3, sizeof(struct privcmd_mmapbatch)) +#define IOCTL_PRIVCMD_MMAPBATCH_V2 \ + _IOC(_IOC_NONE, 'P', 4, sizeof(struct privcmd_mmapbatch_v2)) #endif /* __LINUX_PUBLIC_PRIVCMD_H__ */ -- 1.7.2.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl 2012-08-23 17:13 ` [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl David Vrabel @ 2012-08-23 19:40 ` Konrad Rzeszutek Wilk 2012-08-24 11:14 ` David Vrabel 2012-08-24 1:35 ` Andres Lagar-Cavilla 1 sibling, 1 reply; 17+ messages in thread From: Konrad Rzeszutek Wilk @ 2012-08-23 19:40 UTC (permalink / raw) To: David Vrabel; +Cc: Andres Lagar-Cavilla, xen-devel, Keir Fraser On Thu, Aug 23, 2012 at 06:13:46PM +0100, David Vrabel wrote: > From: David Vrabel <david.vrabel@citrix.com> > > PRIVCMD_MMAPBATCH_V2 extends PRIVCMD_MMAPBATCH with an additional > field for reporting the error code for every frame that could not be > mapped. libxc prefers PRIVCMD_MMAPBATCH_V2 over PRIVCMD_MMAPBATCH. > > Signed-off-by: David Vrabel <david.vrabel@citrix.com> > --- > drivers/xen/privcmd.c | 54 +++++++++++++++++++++++++++++++++++++++---------- > include/xen/privcmd.h | 10 +++++++++ > 2 files changed, 53 insertions(+), 11 deletions(-) > > diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c > index f8c1b6d..4f97160 100644 > --- a/drivers/xen/privcmd.c > +++ b/drivers/xen/privcmd.c > @@ -248,7 +248,8 @@ struct mmap_batch_state { > struct vm_area_struct *vma; > int err; > > - xen_pfn_t __user *user; > + xen_pfn_t __user *user_mfn; > + int __user *user_err; > }; > > static int mmap_batch_fn(void *data, void *state) > @@ -275,34 +276,58 @@ static int mmap_return_errors(void *data, void *state) > { > xen_pfn_t *mfnp = data; > struct mmap_batch_state *st = state; > + int ret = 0; > > - return put_user(*mfnp, st->user++); > + if (st->user_err) { > + if ((*mfnp & 0xf0000000U) == 0xf0000000U) > + ret = -ENOENT; > + else if ((*mfnp & 0xf0000000U) == 0x80000000U) > + ret = -EINVAL; Yikes. Any way those 0xf000.. and 0x8000 can at least be #defined > + else > + ret = 0; > + return __put_user(ret, st->user_err); > + } else > + return __put_user(*mfnp, st->user_mfn++); > } > > static struct vm_operations_struct privcmd_vm_ops; > > -static long privcmd_ioctl_mmap_batch(void __user *udata) > +static long privcmd_ioctl_mmap_batch(void __user *udata, int version) > { > int ret; > - struct privcmd_mmapbatch m; > + struct privcmd_mmapbatch_v2 m; > struct mm_struct *mm = current->mm; > struct vm_area_struct *vma; > unsigned long nr_pages; > LIST_HEAD(pagelist); > struct mmap_batch_state state; > > + printk("%s(%d)\n", __func__, version); > + Hehe. > if (!xen_initial_domain()) > return -EPERM; > > - if (copy_from_user(&m, udata, sizeof(m))) > - return -EFAULT; > + if (version == 1) { > + if (copy_from_user(&m, udata, sizeof(struct privcmd_mmapbatch))) > + return -EFAULT; > + if (!access_ok(VERIFY_WRITE, m.arr, m.num * sizeof(*m.arr))) > + return -EFAULT; That is new.. > + m.err = NULL; > + } else { Not elseif (version == 2) ? .. what if version 3 comes around? > + if (copy_from_user(&m, udata, sizeof(struct privcmd_mmapbatch_v2))) > + return -EFAULT; > + if (!access_ok(VERIFY_READ, m.arr, m.num * sizeof(*m.arr))) > + return -EFAULT; > + if (!access_ok(VERIFY_WRITE, m.err, m.num * (sizeof(*m.err)))) > + return -EFAULT; I think the VERIFY_WRITE can cover both versions? > + } > > nr_pages = m.num; > if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT))) > return -EINVAL; > > ret = gather_array(&pagelist, m.num, sizeof(xen_pfn_t), > - m.arr); > + (xen_pfn_t *)m.arr); > > if (ret || list_empty(&pagelist)) > goto out; > @@ -331,10 +356,11 @@ static long privcmd_ioctl_mmap_batch(void __user *udata) > up_write(&mm->mmap_sem); > > if (state.err > 0) { > - state.user = m.arr; > + state.user_mfn = (xen_pfn_t *)m.arr; > + state.user_err = m.err; > ret = traverse_pages(m.num, sizeof(xen_pfn_t), > - &pagelist, > - mmap_return_errors, &state); > + &pagelist, > + mmap_return_errors, &state); > } > > out: > @@ -359,7 +385,13 @@ static long privcmd_ioctl(struct file *file, > break; > > case IOCTL_PRIVCMD_MMAPBATCH: > - ret = privcmd_ioctl_mmap_batch(udata); > + ret = privcmd_ioctl_mmap_batch(udata, 1); > + printk("%s() batch ret = %d\n", __func__, ret); Pfff... > + break; > + > + case IOCTL_PRIVCMD_MMAPBATCH_V2: > + ret = privcmd_ioctl_mmap_batch(udata, 2); > + printk("%s() batch ret = %d\n", __func__, ret); > break; > > default: > diff --git a/include/xen/privcmd.h b/include/xen/privcmd.h > index 17857fb..9fa27c4 100644 > --- a/include/xen/privcmd.h > +++ b/include/xen/privcmd.h > @@ -62,6 +62,14 @@ struct privcmd_mmapbatch { > xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */ > }; > > +struct privcmd_mmapbatch_v2 { > + unsigned int num; /* number of pages to populate */ unsigend int? Not 'u32'? > + domid_t dom; /* target domain */ > + __u64 addr; /* virtual address */ > + const xen_pfn_t __user *arr; /* array of mfns */ > + int __user *err; /* array of error codes */ int? Not a specific type? > +}; > + > /* > * @cmd: IOCTL_PRIVCMD_HYPERCALL > * @arg: &privcmd_hypercall_t > @@ -73,5 +81,7 @@ struct privcmd_mmapbatch { > _IOC(_IOC_NONE, 'P', 2, sizeof(struct privcmd_mmap)) > #define IOCTL_PRIVCMD_MMAPBATCH \ > _IOC(_IOC_NONE, 'P', 3, sizeof(struct privcmd_mmapbatch)) > +#define IOCTL_PRIVCMD_MMAPBATCH_V2 \ > + _IOC(_IOC_NONE, 'P', 4, sizeof(struct privcmd_mmapbatch_v2)) > > #endif /* __LINUX_PUBLIC_PRIVCMD_H__ */ > -- > 1.7.2.5 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl 2012-08-23 19:40 ` Konrad Rzeszutek Wilk @ 2012-08-24 11:14 ` David Vrabel 2012-08-24 11:41 ` Konrad Rzeszutek Wilk 0 siblings, 1 reply; 17+ messages in thread From: David Vrabel @ 2012-08-24 11:14 UTC (permalink / raw) To: Konrad Rzeszutek Wilk Cc: Andres Lagar-Cavilla, xen-devel@lists.xensource.com, Keir (Xen.org) On 23/08/12 20:40, Konrad Rzeszutek Wilk wrote: > On Thu, Aug 23, 2012 at 06:13:46PM +0100, David Vrabel wrote: >> From: David Vrabel <david.vrabel@citrix.com> >> >> PRIVCMD_MMAPBATCH_V2 extends PRIVCMD_MMAPBATCH with an additional >> field for reporting the error code for every frame that could not be >> mapped. libxc prefers PRIVCMD_MMAPBATCH_V2 over PRIVCMD_MMAPBATCH. [...] >> diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c >> index f8c1b6d..4f97160 100644 >> --- a/drivers/xen/privcmd.c >> +++ b/drivers/xen/privcmd.c >> @@ -275,34 +276,58 @@ static int mmap_return_errors(void *data, void *state) >> { >> xen_pfn_t *mfnp = data; >> struct mmap_batch_state *st = state; >> + int ret = 0; >> >> - return put_user(*mfnp, st->user++); >> + if (st->user_err) { >> + if ((*mfnp & 0xf0000000U) == 0xf0000000U) >> + ret = -ENOENT; >> + else if ((*mfnp & 0xf0000000U) == 0x80000000U) >> + ret = -EINVAL; > > Yikes. Any way those 0xf000.. and 0x8000 can at least be #defined Agreed. >> + else >> + ret = 0; >> + return __put_user(ret, st->user_err); >> + } else >> + return __put_user(*mfnp, st->user_mfn++); >> } >> >> static struct vm_operations_struct privcmd_vm_ops; >> >> -static long privcmd_ioctl_mmap_batch(void __user *udata) >> +static long privcmd_ioctl_mmap_batch(void __user *udata, int version) >> { >> int ret; >> - struct privcmd_mmapbatch m; >> + struct privcmd_mmapbatch_v2 m; >> struct mm_struct *mm = current->mm; >> struct vm_area_struct *vma; >> unsigned long nr_pages; >> LIST_HEAD(pagelist); >> struct mmap_batch_state state; >> >> + printk("%s(%d)\n", __func__, version); >> + > > Hehe. Heh. I didn't polish up these patches as I wasn't sure this new interface was useful. >> if (!xen_initial_domain()) >> return -EPERM; >> >> - if (copy_from_user(&m, udata, sizeof(m))) >> - return -EFAULT; >> + if (version == 1) { >> + if (copy_from_user(&m, udata, sizeof(struct privcmd_mmapbatch))) >> + return -EFAULT; >> + if (!access_ok(VERIFY_WRITE, m.arr, m.num * sizeof(*m.arr))) >> + return -EFAULT; > > That is new.. We use access_ok() here so we can use the less expensive __get_user() and __put_user() later on. >> + if (copy_from_user(&m, udata, sizeof(struct privcmd_mmapbatch_v2))) >> + return -EFAULT; >> + if (!access_ok(VERIFY_READ, m.arr, m.num * sizeof(*m.arr))) >> + return -EFAULT; >> + if (!access_ok(VERIFY_WRITE, m.err, m.num * (sizeof(*m.err)))) >> + return -EFAULT; > > I think the VERIFY_WRITE can cover both versions? Yes, VERIFY_WRITE is a superset of VERIFY_READ. In v1, m.arr is read/write but in v2, m.arr is const so we use VERIFY_READ so the userspace buffer can reside in a read-only section. >> --- a/include/xen/privcmd.h >> +++ b/include/xen/privcmd.h >> @@ -62,6 +62,14 @@ struct privcmd_mmapbatch { >> xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */ >> }; >> >> +struct privcmd_mmapbatch_v2 { >> + unsigned int num; /* number of pages to populate */ > > unsigend int? Not 'u32'? >> + domid_t dom; /* target domain */ >> + __u64 addr; /* virtual address */ >> + const xen_pfn_t __user *arr; /* array of mfns */ >> + int __user *err; /* array of error codes */ > > int? Not a specific type? It's an existing interface supported by classic Xen kernels and currently being used by libxc. So while I agree that it's not the best interface, I don't think it can be changed. David ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl 2012-08-24 11:14 ` David Vrabel @ 2012-08-24 11:41 ` Konrad Rzeszutek Wilk 2012-08-24 11:50 ` Ian Campbell 2012-08-24 12:00 ` David Vrabel 0 siblings, 2 replies; 17+ messages in thread From: Konrad Rzeszutek Wilk @ 2012-08-24 11:41 UTC (permalink / raw) To: David Vrabel Cc: Andres Lagar-Cavilla, xen-devel@lists.xensource.com, Keir (Xen.org) > >> +struct privcmd_mmapbatch_v2 { > >> + unsigned int num; /* number of pages to populate */ > > > > unsigend int? Not 'u32'? > >> + domid_t dom; /* target domain */ > >> + __u64 addr; /* virtual address */ > >> + const xen_pfn_t __user *arr; /* array of mfns */ > >> + int __user *err; /* array of error codes */ > > > > int? Not a specific type? > > It's an existing interface supported by classic Xen kernels and > currently being used by libxc. So while I agree that it's not the best > interface, I don't think it can be changed. How does it work with a 64-bit dom0 and 32-bit userspace? Is the libxc smart enough to figure out the size of the structure? > > David ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl 2012-08-24 11:41 ` Konrad Rzeszutek Wilk @ 2012-08-24 11:50 ` Ian Campbell 2012-08-24 12:00 ` David Vrabel 1 sibling, 0 replies; 17+ messages in thread From: Ian Campbell @ 2012-08-24 11:50 UTC (permalink / raw) To: Konrad Rzeszutek Wilk Cc: Andres Lagar-Cavilla, xen-devel@lists.xensource.com, Keir (Xen.org), David Vrabel On Fri, 2012-08-24 at 12:41 +0100, Konrad Rzeszutek Wilk wrote: > > >> +struct privcmd_mmapbatch_v2 { > > >> + unsigned int num; /* number of pages to populate */ > > > > > > unsigend int? Not 'u32'? > > >> + domid_t dom; /* target domain */ > > >> + __u64 addr; /* virtual address */ > > >> + const xen_pfn_t __user *arr; /* array of mfns */ > > >> + int __user *err; /* array of error codes */ > > > > > > int? Not a specific type? > > > > It's an existing interface supported by classic Xen kernels and > > currently being used by libxc. So while I agree that it's not the best > > interface, I don't think it can be changed. > > How does it work with a 64-bit dom0 and 32-bit userspace? Is the libxc > smart enough to figure out the size of the structure? This already doesn't work for numerous reasons. The man one being that libxc will make 32 bit hypercalls, but when the kernel forwards them on they look like 64 bit ones. Ian. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl 2012-08-24 11:41 ` Konrad Rzeszutek Wilk 2012-08-24 11:50 ` Ian Campbell @ 2012-08-24 12:00 ` David Vrabel 2012-08-24 12:14 ` Ian Campbell 1 sibling, 1 reply; 17+ messages in thread From: David Vrabel @ 2012-08-24 12:00 UTC (permalink / raw) To: Konrad Rzeszutek Wilk Cc: Andres Lagar-Cavilla, xen-devel@lists.xensource.com, Keir (Xen.org), Ian Campbell On 24/08/12 12:41, Konrad Rzeszutek Wilk wrote: >>>> +struct privcmd_mmapbatch_v2 { >>>> + unsigned int num; /* number of pages to populate */ >>> >>> unsigend int? Not 'u32'? >>>> + domid_t dom; /* target domain */ >>>> + __u64 addr; /* virtual address */ >>>> + const xen_pfn_t __user *arr; /* array of mfns */ >>>> + int __user *err; /* array of error codes */ >>> >>> int? Not a specific type? >> >> It's an existing interface supported by classic Xen kernels and >> currently being used by libxc. So while I agree that it's not the best >> interface, I don't think it can be changed. It's also the same as struct privcmd_mmapbatch except for the extra 'err' field and 'arr' being const. > How does it work with a 64-bit dom0 and 32-bit userspace? Is the libxc > smart enough to figure out the size of the structure? privcmd doesn't support compat ioctls because there there is nothing doing the translation of the hypercalls from the 32-bit to 64-bit ABI -- the hypervisor won't do it as the hypercalls are called from the 64-bit kernel. 64 bit Xen, 64 bit dom0, 32 bit tools has never worked for this reason. I think Ian Campbell had some hacky patches for this but he may not want to admit to them. ;) David ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl 2012-08-24 12:00 ` David Vrabel @ 2012-08-24 12:14 ` Ian Campbell 0 siblings, 0 replies; 17+ messages in thread From: Ian Campbell @ 2012-08-24 12:14 UTC (permalink / raw) To: David Vrabel Cc: Andres Lagar-Cavilla, xen-devel@lists.xensource.com, Keir (Xen.org), Konrad Rzeszutek Wilk On Fri, 2012-08-24 at 13:00 +0100, David Vrabel wrote: > 64 bit Xen, 64 bit dom0, 32 bit tools has never worked for this reason. > I think Ian Campbell had some hacky patches for this but he may not > want to admit to them. ;) They were pretty nasty. I think I made a 32-bit hypercall entry path available to 64 bit kernels (via int 0x8?) so privcmd used that for 32 bit tasks. Then there was some hacking to make the hypercall compat arg translation area work for 64 bit guests (I don't remember what I did here, I seem to recall it wasn't pretty) I eventually fell at the hurdle of getting 64 bit blktap kernel module to work with 32 bit tapdisk process (since the ring layouts are different). Not an impossible problem but at this poiint I couldn't be bothered any more. > > David ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl 2012-08-23 17:13 ` [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl David Vrabel 2012-08-23 19:40 ` Konrad Rzeszutek Wilk @ 2012-08-24 1:35 ` Andres Lagar-Cavilla 1 sibling, 0 replies; 17+ messages in thread From: Andres Lagar-Cavilla @ 2012-08-24 1:35 UTC (permalink / raw) To: David Vrabel; +Cc: xen-devel, Keir Fraser, Konrad Rzeszutek Wilk On Aug 23, 2012, at 1:13 PM, David Vrabel wrote: > From: David Vrabel <david.vrabel@citrix.com> > > PRIVCMD_MMAPBATCH_V2 extends PRIVCMD_MMAPBATCH with an additional > field for reporting the error code for every frame that could not be > mapped. libxc prefers PRIVCMD_MMAPBATCH_V2 over PRIVCMD_MMAPBATCH. > > Signed-off-by: David Vrabel <david.vrabel@citrix.com> > --- > drivers/xen/privcmd.c | 54 +++++++++++++++++++++++++++++++++++++++---------- > include/xen/privcmd.h | 10 +++++++++ > 2 files changed, 53 insertions(+), 11 deletions(-) > > diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c > index f8c1b6d..4f97160 100644 > --- a/drivers/xen/privcmd.c > +++ b/drivers/xen/privcmd.c > @@ -248,7 +248,8 @@ struct mmap_batch_state { > struct vm_area_struct *vma; > int err; > > - xen_pfn_t __user *user; > + xen_pfn_t __user *user_mfn; > + int __user *user_err; > }; > > static int mmap_batch_fn(void *data, void *state) > @@ -275,34 +276,58 @@ static int mmap_return_errors(void *data, void *state) > { > xen_pfn_t *mfnp = data; > struct mmap_batch_state *st = state; > + int ret = 0; > > - return put_user(*mfnp, st->user++); > + if (st->user_err) { > + if ((*mfnp & 0xf0000000U) == 0xf0000000U) > + ret = -ENOENT; > + else if ((*mfnp & 0xf0000000U) == 0x80000000U) > + ret = -EINVAL; Wires crossed. 0x80..0 is ENOENT, 0xf0..0 is EINVAL. Really in need of constants. > + else > + ret = 0; > + return __put_user(ret, st->user_err); > + } else > + return __put_user(*mfnp, st->user_mfn++); > } > > static struct vm_operations_struct privcmd_vm_ops; > > -static long privcmd_ioctl_mmap_batch(void __user *udata) > +static long privcmd_ioctl_mmap_batch(void __user *udata, int version) > { > int ret; > - struct privcmd_mmapbatch m; > + struct privcmd_mmapbatch_v2 m; > struct mm_struct *mm = current->mm; > struct vm_area_struct *vma; > unsigned long nr_pages; > LIST_HEAD(pagelist); > struct mmap_batch_state state; > > + printk("%s(%d)\n", __func__, version); Surely this and other unconditional printk's to go away in next round… Thanks Andres > + > if (!xen_initial_domain()) > return -EPERM; > > - if (copy_from_user(&m, udata, sizeof(m))) > - return -EFAULT; > + if (version == 1) { > + if (copy_from_user(&m, udata, sizeof(struct privcmd_mmapbatch))) > + return -EFAULT; > + if (!access_ok(VERIFY_WRITE, m.arr, m.num * sizeof(*m.arr))) > + return -EFAULT; > + m.err = NULL; > + } else { > + if (copy_from_user(&m, udata, sizeof(struct privcmd_mmapbatch_v2))) > + return -EFAULT; > + if (!access_ok(VERIFY_READ, m.arr, m.num * sizeof(*m.arr))) > + return -EFAULT; > + if (!access_ok(VERIFY_WRITE, m.err, m.num * (sizeof(*m.err)))) > + return -EFAULT; > + } > > nr_pages = m.num; > if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT))) > return -EINVAL; > > ret = gather_array(&pagelist, m.num, sizeof(xen_pfn_t), > - m.arr); > + (xen_pfn_t *)m.arr); > > if (ret || list_empty(&pagelist)) > goto out; > @@ -331,10 +356,11 @@ static long privcmd_ioctl_mmap_batch(void __user *udata) > up_write(&mm->mmap_sem); > > if (state.err > 0) { > - state.user = m.arr; > + state.user_mfn = (xen_pfn_t *)m.arr; > + state.user_err = m.err; > ret = traverse_pages(m.num, sizeof(xen_pfn_t), > - &pagelist, > - mmap_return_errors, &state); > + &pagelist, > + mmap_return_errors, &state); > } > > out: > @@ -359,7 +385,13 @@ static long privcmd_ioctl(struct file *file, > break; > > case IOCTL_PRIVCMD_MMAPBATCH: > - ret = privcmd_ioctl_mmap_batch(udata); > + ret = privcmd_ioctl_mmap_batch(udata, 1); > + printk("%s() batch ret = %d\n", __func__, ret); > + break; > + > + case IOCTL_PRIVCMD_MMAPBATCH_V2: > + ret = privcmd_ioctl_mmap_batch(udata, 2); > + printk("%s() batch ret = %d\n", __func__, ret); > break; > > default: > diff --git a/include/xen/privcmd.h b/include/xen/privcmd.h > index 17857fb..9fa27c4 100644 > --- a/include/xen/privcmd.h > +++ b/include/xen/privcmd.h > @@ -62,6 +62,14 @@ struct privcmd_mmapbatch { > xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */ > }; > > +struct privcmd_mmapbatch_v2 { > + unsigned int num; /* number of pages to populate */ > + domid_t dom; /* target domain */ > + __u64 addr; /* virtual address */ > + const xen_pfn_t __user *arr; /* array of mfns */ > + int __user *err; /* array of error codes */ > +}; > + > /* > * @cmd: IOCTL_PRIVCMD_HYPERCALL > * @arg: &privcmd_hypercall_t > @@ -73,5 +81,7 @@ struct privcmd_mmapbatch { > _IOC(_IOC_NONE, 'P', 2, sizeof(struct privcmd_mmap)) > #define IOCTL_PRIVCMD_MMAPBATCH \ > _IOC(_IOC_NONE, 'P', 3, sizeof(struct privcmd_mmapbatch)) > +#define IOCTL_PRIVCMD_MMAPBATCH_V2 \ > + _IOC(_IOC_NONE, 'P', 4, sizeof(struct privcmd_mmapbatch_v2)) > > #endif /* __LINUX_PUBLIC_PRIVCMD_H__ */ > -- > 1.7.2.5 > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 0/3] xen/privcmd: support for paged-out frames 2012-08-23 17:13 [RFC PATCH 0/3] xen/privcmd: support for paged-out frames David Vrabel ` (2 preceding siblings ...) 2012-08-23 17:13 ` [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl David Vrabel @ 2012-08-24 1:32 ` Andres Lagar-Cavilla 2012-08-24 11:58 ` David Vrabel 3 siblings, 1 reply; 17+ messages in thread From: Andres Lagar-Cavilla @ 2012-08-24 1:32 UTC (permalink / raw) To: David Vrabel; +Cc: Olaf Hering, xen-devel, Keir Fraser, Konrad Rzeszutek Wilk On Aug 23, 2012, at 1:13 PM, David Vrabel wrote: > This series is a straight forward-port of some functionality from > classic kernels to support Xen hosts that do paging of guests. > > This isn't functionality the XenServer makes use of so I've not tested > these with paging in use (GridCentric requested that our older kernels > supported this and I'm just doing the forward port). Thanks for this series. Very timely. I may add that we are not the only consumers of paging. This functionality was first added into classic kernels by Olaf Hering from Suse (added to cc). > > I'm not entirely happy about the approach used here because: > > 1. It relies on the meaning of the return code of the update_mmu > hypercall and it assumes the value Xen used for -ENOENT is the same > the kernel uses. This does not appear to be a formal part of the > hypercall ABI. > > Keir, can you comment on this? I see your point. I may add that it's likely to be more pervasive than just relying on ENOENT being 12. Which is a fairly safe bet. > > 2. It seems more sensible to have the kernel do the retries instead of > libxc doing them. The kernel has to have a mechanism for this any way > (for mapping back/front rings). > > 3. The current way of handling paged-out frames by repeatedly retrying > is a bit lame. Shouldn't there be some event that the guest waiting > for the frame can wait on instead? By moving the retry mechanism into > the kernel we can change this without impacting the ABI to userspace. Lame is an interesting choice of language :) I am not a huge fan of libxc retry, but we've been pounding it quite hard for a while and it works -- and, importantly, it yields the scheduler :) While kernel retry may benefit from hypothetical code reuse, "Shouldn't there be some event that the guest waiting for the frame can wait on instead?" will need to become concrete to start a real discussion. For better or worse, since xen-4.1 (!) libxc will do the right thing if fed the appropriate errno. Let me re-iterate that this is great work. Thanks Andres > > David > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 0/3] xen/privcmd: support for paged-out frames 2012-08-24 1:32 ` [RFC PATCH 0/3] xen/privcmd: support for paged-out frames Andres Lagar-Cavilla @ 2012-08-24 11:58 ` David Vrabel 2012-08-24 12:14 ` Ian Campbell 0 siblings, 1 reply; 17+ messages in thread From: David Vrabel @ 2012-08-24 11:58 UTC (permalink / raw) To: Andres Lagar-Cavilla Cc: Olaf Hering, xen-devel@lists.xensource.com, Keir (Xen.org), Konrad Rzeszutek Wilk On 24/08/12 02:32, Andres Lagar-Cavilla wrote: > On Aug 23, 2012, at 1:13 PM, David Vrabel wrote: > >> This series is a straight forward-port of some functionality from >> classic kernels to support Xen hosts that do paging of guests. >> >> This isn't functionality the XenServer makes use of so I've not tested >> these with paging in use (GridCentric requested that our older kernels >> supported this and I'm just doing the forward port). > > Thanks for this series. Very timely. I may add that we are not the > only consumers of paging. This functionality was first added into > classic kernels by Olaf Hering from Suse (added to cc). Sure. >> I'm not entirely happy about the approach used here because: >> >> 1. It relies on the meaning of the return code of the update_mmu >> hypercall and it assumes the value Xen used for -ENOENT is the same >> the kernel uses. This does not appear to be a formal part of the >> hypercall ABI. >> >> Keir, can you comment on this? > > I see your point. I may add that it's likely to be more pervasive > than just relying on ENOENT being 12. Which is a fairly safe bet. > >> >> 2. It seems more sensible to have the kernel do the retries instead of >> libxc doing them. The kernel has to have a mechanism for this any way >> (for mapping back/front rings). >> >> 3. The current way of handling paged-out frames by repeatedly retrying >> is a bit lame. Shouldn't there be some event that the guest waiting >> for the frame can wait on instead? By moving the retry mechanism into >> the kernel we can change this without impacting the ABI to userspace. > > Lame is an interesting choice of language :) My embedded background makes me frown at anything that polls -- it's generally bad for power consumption. > I am not a huge fan of libxc retry, but we've been pounding it quite > hard for a while and it works -- and, importantly, it yields the > scheduler :) > > While kernel retry may benefit from hypothetical code reuse, > "Shouldn't there be some event that the guest waiting for the frame can > wait on instead?" will need to become concrete to start a real discussion. In kernel retries don't require the event. Using the event is something to consider in the longer term. > For better or worse, since xen-4.1 (!) libxc will do the right thing > if fed the appropriate errno. At a minimum I think we need to fix the existing interface to have the behavior libxc expects. Is PRIVCMD_MMAPBATCH_V2 actually required? It doesn't seem to do much more than the V1 interface. Perhaps the fix in patches #1 and #2 sufficient to make libxc work? David ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 0/3] xen/privcmd: support for paged-out frames 2012-08-24 11:58 ` David Vrabel @ 2012-08-24 12:14 ` Ian Campbell 2012-08-24 15:06 ` Andres Lagar-Cavilla 0 siblings, 1 reply; 17+ messages in thread From: Ian Campbell @ 2012-08-24 12:14 UTC (permalink / raw) To: David Vrabel Cc: Andres Lagar-Cavilla, Olaf Hering, xen-devel@lists.xensource.com, Keir (Xen.org), Konrad Rzeszutek Wilk On Fri, 2012-08-24 at 12:58 +0100, David Vrabel wrote: > Is PRIVCMD_MMAPBATCH_V2 actually required? It doesn't seem to do much > more than the V1 interface. Perhaps the fix in patches #1 and #2 > sufficient to make libxc work? The V1 interface has some hideous misfeature wrt error reporting iirc. It doesn't report the actual per-frame error code, just the "an error" signal through setting the top nibble (already a nasty interface!), IIRC Aha: http://xenbits.xen.org/hg/linux-2.6.18-xen.hg/rev/6d6c3dd995c0 It was knackered on 64 bit (actually set bits 28-31...)... Ian. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [RFC PATCH 0/3] xen/privcmd: support for paged-out frames 2012-08-24 12:14 ` Ian Campbell @ 2012-08-24 15:06 ` Andres Lagar-Cavilla 0 siblings, 0 replies; 17+ messages in thread From: Andres Lagar-Cavilla @ 2012-08-24 15:06 UTC (permalink / raw) To: Ian Campbell Cc: Olaf Hering, xen-devel@lists.xensource.com, Keir (Xen.org), Konrad Rzeszutek Wilk, Andres Lagar-Cavilla, David Vrabel On Aug 24, 2012, at 8:14 AM, Ian Campbell wrote: > On Fri, 2012-08-24 at 12:58 +0100, David Vrabel wrote: >> Is PRIVCMD_MMAPBATCH_V2 actually required? It doesn't seem to do much >> more than the V1 interface. Perhaps the fix in patches #1 and #2 >> sufficient to make libxc work? > > The V1 interface has some hideous misfeature wrt error reporting iirc. > > It doesn't report the actual per-frame error code, just the "an error" > signal through setting the top nibble (already a nasty interface!), IIRC > > Aha: http://xenbits.xen.org/hg/linux-2.6.18-xen.hg/rev/6d6c3dd995c0 IIuc, David's approach in these patches was hypervisor rc -> encode into mfn field -> decode into error rval if available. The changeset Ian references shows a different approach is needed. Perhaps: 1. Provide local err array in all cases 2. Always store hypervisor rc into err array 3. if version 2, copy into user-space. If version 1, encode into user-space mfn Andres > > It was knackered on 64 bit (actually set bits 28-31...)... > > Ian. > ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2012-08-24 18:01 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-08-23 17:13 [RFC PATCH 0/3] xen/privcmd: support for paged-out frames David Vrabel 2012-08-23 17:13 ` [PATCH 1/3] xen/mm: return more precise error from xen_remap_domain_range() David Vrabel 2012-08-23 17:13 ` [PATCH 2/3] xen/privcmd: report paged-out frames in PRIVCMD_MMAPBATCH ioctl David Vrabel 2012-08-24 1:34 ` Andres Lagar-Cavilla 2012-08-24 18:01 ` Bastian Blank 2012-08-23 17:13 ` [PATCH 3/3] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl David Vrabel 2012-08-23 19:40 ` Konrad Rzeszutek Wilk 2012-08-24 11:14 ` David Vrabel 2012-08-24 11:41 ` Konrad Rzeszutek Wilk 2012-08-24 11:50 ` Ian Campbell 2012-08-24 12:00 ` David Vrabel 2012-08-24 12:14 ` Ian Campbell 2012-08-24 1:35 ` Andres Lagar-Cavilla 2012-08-24 1:32 ` [RFC PATCH 0/3] xen/privcmd: support for paged-out frames Andres Lagar-Cavilla 2012-08-24 11:58 ` David Vrabel 2012-08-24 12:14 ` Ian Campbell 2012-08-24 15:06 ` Andres Lagar-Cavilla
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).