Allocating physical memory without a kernel mapping

Giovanni Trematerra giovanni.trematerra at gmail.com
Mon Mar 1 14:19:43 UTC 2010


On Mon, Mar 1, 2010 at 10:59 AM, Alexander Eichner <alexeichi at yahoo.de> wrote:
> Hi,
>
> I'm currently trying to finish the R0 memory implementation[1] of FreeBSD for VirtualBox. One of the missing methods allocates physical non contiguous pages which don't need to have a kernel mapping (rtR0MemObjNativeAllocPhysNC). I'm using vm_phys_alloc_contig to achieve this. The pages are than mapped into the user space VM process using pmap_enter (rtR0MemObjNativeMapUser) and if they are not needed anymore vm_page_free_toq is used to free the pages (rtR0MemObjNativeFree).
> Everything works as long as the VM runs but if the VM process terminates and I do something else the host will panic at some point (usually when I try to start a gnome session) with "pmap_enter: missing reference to page table page <va>"[2].
> There seems to some problem with the wire count of that page but I can't see what I'm doing wrong at the moment.
> Thanks in advance for any help.

Please, try this patch against revision 26898.

--- memobj-r0drv-freebsd.c.orig 2010-02-26 10:28:44.000000000 +0100
+++ memobj-r0drv-freebsd.c      2010-02-26 13:55:35.000000000 +0100
@@ -209,8 +209,7 @@ int rtR0MemObjNativeAllocPage(PPRTR0MEMO
                vm_page_t   pPage;

                pPage = vm_page_alloc(pMemFreeBSD->pObject, PageIndex,
-                                      VM_ALLOC_NOBUSY | VM_ALLOC_SYSTEM |
-                                      VM_ALLOC_WIRED);
+                                      VM_ALLOC_NOBUSY | VM_ALLOC_SYSTEM);

 #if __FreeBSD_version >= 800000 /** @todo Find exact version number */
                /* Fixes crashes during VM termination on
FreeBSD8-CURRENT amd64
@@ -220,9 +219,6 @@ int rtR0MemObjNativeAllocPage(PPRTR0MEMO

                if (pPage)
                {
-                    vm_page_lock_queues();
-                    vm_page_wire(pPage);
-                    vm_page_unlock_queues();
                    /* Put the page into the page table now. */
 #if __FreeBSD_version >= 701105
                    pmap_enter(kernel_map->pmap, AddressDst,
VM_PROT_NONE, pPage,
@@ -253,6 +249,8 @@ int rtR0MemObjNativeAllocPage(PPRTR0MEMO

            if (rc == VINF_SUCCESS)
            {
+                               vm_map_wire(kernel_map, MapAddress,
MapAddress + cb,
+                                               VM_MAP_WIRE_SYSTEM |
VM_MAP_WIRE_NOHOLES);
                pMemFreeBSD->Core.pv = (void *)MapAddress;
                *ppMem = &pMemFreeBSD->Core;
                return VINF_SUCCESS;

>
> Regards,
> Alexander Eichner
>
> [1] http://www.virtualbox.org/browser/trunk/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c?rev=26899
> [2]http://fxr.watson.org/fxr/source/amd64/amd64/pmap.c?im=bigexcerpts#L3076
>
> __________________________________________________
> Do You Yahoo!?
> Sie sind Spam leid? Yahoo! Mail verfügt über einen herausragenden Schutz gegen Massenmails.
> http://mail.yahoo.com
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>


More information about the freebsd-hackers mailing list