|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl
On 29/08/12 17:14, Andres Lagar-Cavilla wrote:
>
> On Aug 29, 2012, at 9:15 AM, David Vrabel wrote:
>
>> From: David Vrabel <david.vrabel@xxxxxxxxxx>
>>
>> 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 ccee0f1..ddd32cf 100644
>> --- a/drivers/xen/privcmd.c
>> +++ b/drivers/xen/privcmd.c
>> @@ -248,18 +248,23 @@ 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)
>> {
>> xen_pfn_t *mfnp = data;
>> + int *err = data;
> Am I missing something or is there an aliasing here? Both mfnp and err point
> to data?
There is deliberate aliasing here. We use the mfn array to save the
error codes for later processing.
>> 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;
>> - st->err++;
>> + ret = xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1,
>> + st->vma->vm_page_prot, st->domain);
>> + if (ret < 0) {
>> + *err = ret;
>> + if (st->err == 0 || st->err == -ENOENT)
>> + st->err = ret;
> This will unset -ENOENT if a frame after an ENOENT error fails differently.
I thought that was what the original implementation did but it seems it
does not.
>> @@ -325,12 +359,16 @@ static long privcmd_ioctl_mmap_batch(void __user
>> *udata)
>>
>> up_write(&mm->mmap_sem);
>>
>> - if (state.err > 0) {
>> - state.user = m.arr;
>> + if (state.err) {
>> + 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);
> The callback now maps data to err (instead of mfnp … but I see no
> change to the gather_array other than a cast …am I missing something?
The kernel mfn and the err array are aliased.
I could have made gather_array() allow the kernel array to have larger
elements than the user array but that looked like too much work.
David
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |