Port-xen archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Alloc userspace process to access mapped grant memory regions
On Sat, Nov 24, 2012 at 09:35:47AM +0100, Roger Pau Monné wrote:
> Thanks for the help, I've changed the code a little bit and tried doing
> something similar to what is done in the mmap function of xenevt:
>
> (inside device mmap handler):
> xen_shm_map(nentries, domid, grefp, &va, handlep, flags);
> pmap_extract_ma(pmap_kernel(), map->va, &ma)
> printf("Kernel MA: %p\n", (void *)ma);
> return x86_btop(xpmap_mtop(ma));
>
> This device also has an ioctl where the user-space process can pass a VA
> (in the user space) and get the grant associated with this VA (basically
> the passed VA is the return value of mmap(gntdev...)). I do the
> following in the ioctl handler:
>
> (passed_va is the user provided VA through the ioctl)
>
> paddr_t u_pa, k_pa;
> paddr_t u_ma, k_ma;
> pmap_t user_pmap = vm_map_pmap(&user_lwp->l_proc->p_vmspace->vm_map);
>
> pmap_extract(pmap, passed_va, &u_pa);
> foreach(kernel_va, list_of_mapped_grants) {
> /* kernel_va is map->va in the upper example */
> pmap_extract(pmap_kernel(), kernel_va, &k_pa);
> if (k_pa == u_pa) {
> printf("Find matching PA\n");
> pmap_extract_ma(pmap, passed_va, &process_ma);
> pmap_extract_ma(pmap_kernel(), kernel_va, &kernel_ma);
> printf("Kernel MA: %p - Userspace MA: %p\n",
> (void *)k_ma, (void *)u_ma);
> }
> }
>
> The output when performing the mmap is the following:
>
> Kernel MA: 0xb24c9000
>
> And the output when the user performs the ioctl to find the gref of the
> user-space VA is:
>
> Find matching PA
> Kernel MA: 0xb24c9000 - Userspace MA: 0xbda71000
>
> So it seems like I return the correct MA in the mmap handler, but the
> userspace process gets a wrong MA associated with it's VA?
Are the p2m and m2p maps consistent ? I suspect they're not ...
--
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
NetBSD: 26 ans d'experience feront toujours la difference
--
Home |
Main Index |
Thread Index |
Old Index