On 09/06/10 22:24, Nathan Whitehorn wrote:
> On 09/06/10 20:22, Nathan Whitehorn wrote:
>   
>> Now that my SLB allocation issue is solved, with help with Matthew and
>> Alan, I have another VM puzzler.
>>
>> I have a simple program that tries to use all the memory on the system,
>> which isn't very much on the PS3, so I use it to test swap as well.
>> Shortly after it begins paging, the system locks up completely. I
>> managed to duplicate this behavior on an emulator, and found out what it
>> is actually doing. Somehow pmap_remove() is being called with arguments
>> pmap_remove(userpmap, PAGE_SIZE, VM_MAXUSER_ADDRESS = USRSTACK). For
>> powerpc64, VM_MAXUSER_ADDRESS is 0x7ffffffffffff000, so there are 10^15
>> pages to unmap in that range and it was busy taking until the end of
>> time unmapping them all.
>>
>> Here's the trace from KDB:
>>
>> moea64_remove()
>> pmap_remove()
>> vm_daemon()
>> fork_exit()
>> fork_trampoline()
>> ----end-----
>>
>> Does anyone have any idea why this is happening?
>>
>>   
>>     
> The culprit here is lines 703-706 of vm/vm_pageout.c:
>
>         if (desired == 0 && nothingwired) {
>                 pmap_remove(vm_map_pmap(map), vm_map_min(map),
>                     vm_map_max(map));
>         }
>
> It would be much better if it did this in sections, the way
> vm_map_delete does. I'll take a crack at this, though any suggestions
> for proper implementation would be appreciated.
> -nathan
>   
I've attached a patch that reimplements this by unmapping each map_entry
separately, which solves the problem on PowerPC and I believe is
functionally equivalent. My PS3 successfully completes a buildworld with
this patch. Are there any objections to me committing it?
-Nathan
Index: vm/vm_pageout.c
===================================================================
--- vm/vm_pageout.c     (revision 212277)
+++ vm/vm_pageout.c     (working copy)
@@ -701,8 +701,11 @@
         * table pages.
         */
        if (desired == 0 && nothingwired) {
-               pmap_remove(vm_map_pmap(map), vm_map_min(map),
-                   vm_map_max(map));
+               tmpe = map->header.next;
+               while (tmpe != &map->header) {
+                       pmap_remove(vm_map_pmap(map), tmpe->start, tmpe->end);
+                       tmpe = tmpe->next;
+               }
        }
        vm_map_unlock(map);
 }
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to