diff options
author | Sergio Lopez <slp@sinrega.org> | 2011-12-29 22:30:12 +0100 |
---|---|---|
committer | Sergio Lopez <slp@sinrega.org> | 2011-12-29 22:30:12 +0100 |
commit | 666299d037be6ffa83345d6d281fa955431f55fe (patch) | |
tree | f63ff542ac6bbe6d6d99fa17348a5ca958685227 /vm/memory_object.c | |
parent | 6af53cb9d48013971ad5fa37de173c1bbf73292a (diff) |
* include/mach/memory_object.h: Add MEMORY_OBJECT_COPY_VMPRIV to mark objects that can't be blocked even if dirty page limits has been exceeded.k0ro/advisory_pageout/master
* vm/memory_object.c (memory_object_data_supply): Mark pages provided by user as external.
* (memory_object_lock_request): Lock page queues before cleaning holding pages.
* (memory_object_set_attributes_common): Deal with MEMORY_OBJECT_COPY_VMPRIV.
* vm/vm_fault.c (vm_fault_page): If the number of potentially dirty pages has reached a certain static number, either request a pageout or block the thread.
* (vm_fault_page): Force an early request for a real page instead of a fictitious one.
* vm/vm_object.h (struct vm_object): New flag vm_privileged that relates with MEMORY_OBJECT_COPY_PRIV.
* vm/vm_object.c (vm_object_bootstrap): Initialize vm_privileged property as FALSE.
* vm/vm_page.h: Add variables vm_page_too_dirty, vm_page_dirty_count and vm_page_external_target.
* vm/vm_pageout.c: Adjust VM_PAGE_FREE_TARGET, VM_PAGE_FREE_MIN and VM_PAGE_EXTERNAL_LIMIT. Make vm_page_external_target signed.
* (vm_pageout_setup): Write lock cleaned pages. Adjust dirty page counters.
* (vm_pageout_scan): Try freeing clean external pages first. Disable broken old code.
* vm/vm_resident.c: Add variables vm_page_too_dirty and vm_page_dirty_count.
* (vm_page_convert.c): Propagate external argument to converted page.
* (vm_page_grab): Don't use old external page limits.
* (vm_page_grab_contiguous_pages): Likewise.
* (vm_page_wait): Likewise.
* (vm_page_release): Don't adjust external count.
* (vm_page_free): Adjust external and external-dirty counters here. Wake up blocked threads.
Diffstat (limited to 'vm/memory_object.c')
-rw-r--r-- | vm/memory_object.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/vm/memory_object.c b/vm/memory_object.c index e281c6a3..41bfd739 100644 --- a/vm/memory_object.c +++ b/vm/memory_object.c @@ -217,12 +217,22 @@ retry_lookup: data_m->dirty = FALSE; pmap_clear_modify(data_m->phys_addr); + if (!object->internal) { + data_m->external = TRUE; + if (lock_value == VM_PROT_NONE) { + /* Be sure we get notified if page + could be potentially dirty */ + lock_value = VM_PROT_WRITE; + } + } + data_m->page_lock = lock_value; data_m->unlock_request = VM_PROT_NONE; data_m->precious = precious; vm_page_lock_queues(); vm_page_insert(data_m, object, offset); + vm_page_external_count++; if (was_absent) vm_page_activate(data_m); @@ -749,11 +759,13 @@ MACRO_BEGIN \ \ vm_object_lock(object); \ \ + vm_page_lock_queues(); \ for (i = 0; i < atop(new_offset); i++) { \ hp = holding_pages[i]; \ if (hp != VM_PAGE_NULL) \ VM_PAGE_FREE(hp); \ } \ + vm_page_unlock_queues(); \ \ new_object = VM_OBJECT_NULL; \ MACRO_END @@ -912,6 +924,7 @@ memory_object_set_attributes_common(object, object_ready, may_cache, case MEMORY_OBJECT_COPY_CALL: case MEMORY_OBJECT_COPY_DELAY: case MEMORY_OBJECT_COPY_TEMPORARY: + case MEMORY_OBJECT_COPY_VMPRIV: break; default: vm_object_deallocate(object); @@ -943,6 +956,10 @@ memory_object_set_attributes_common(object, object_ready, may_cache, object->pager_ready = object_ready; if (copy_strategy == MEMORY_OBJECT_COPY_TEMPORARY) { object->temporary = TRUE; + } else if (copy_strategy == MEMORY_OBJECT_COPY_VMPRIV) { + object->vm_privileged = TRUE; + object->copy_strategy = MEMORY_OBJECT_COPY_NONE; + printf("creating an vm_privileged object\n"); } else { object->copy_strategy = copy_strategy; } |