git: kernel - Numerous VM MPSAFE fixes

看板DFBSD_commit作者時間14年前 (2011/10/22 18:03), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
commit a5fc46c91597d0af0cfa8fd257b4a8ed6e1cf341 Author: Matthew Dillon <dillon@apollo.backplane.com> Date: Thu Sep 29 14:46:42 2011 -0700 kernel - Numerous VM MPSAFE fixes * Remove most critical sections from the VM subsystem, these are no longer applicable (vm_token covers the access). * _pmap_allocpte() for x86-64 - Conditionalize the zeroing of the vm_page after the grab. The grab can race other threads and result in a page which had already been zero'd AND populated with pte's, so we can't just zero it. Use m->valid to determine if the page is actually newly allocated or not. NOTE: The 32 bit code already properly zeros the page by detecting whether the pte has already been entered or not. The 64-bit code couldn't do this neatly so we used another method. * Hold the pmap vm_object in pmap_release() and pmap_object_init_pt() for the x86-64 pmap code. This prevents related loops from blocking on the pmap vm_object when freeing VM pages which is not expected by the code. * pmap_copy() for x86-64 needs the vm_token, critical sections are no longer sufficient. * Assert that PG_MANAGED is set when clearing pte's out of a pmap via the PV entries. The pte's must exist in this case and it's a critical panic if they don't. * pmap_replacevm() for x86-64 - Adjust newvm->vm_sysref prior to assigning it to p->p_vmspace to handle any potential MP races with other sysrefs on the vmspace. * faultin() needs p->p_token, not proc_token. * swapout_procs_callback() needs p->p_token. * Deallocate the VM object associated with a vm_page after freeing the page instead of before freeing the page. This fixes a potential use-after-refs-transition-to-0 case if a MP race occurs. Summary of changes: sys/platform/pc64/x86_64/pmap.c | 159 +++++++++++++++++++-------------------- sys/vm/device_pager.c | 2 - sys/vm/phys_pager.c | 2 - sys/vm/swap_pager.c | 38 --------- sys/vm/vm_contig.c | 11 --- sys/vm/vm_glue.c | 23 ++++-- sys/vm/vm_map.c | 2 + sys/vm/vm_object.c | 19 +----- sys/vm/vm_pageout.c | 45 +++--------- sys/vm/vm_swapcache.c | 2 - 10 files changed, 107 insertions(+), 196 deletions(-) http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/a5fc46c91597d0af0cfa8fd257b4a8ed6e1cf341 -- DragonFly BSD source repository
文章代碼(AID): #1EefJg_Q (DFBSD_commit)