Author: mjg
Date: Fri Dec  7 16:22:54 2018
New Revision: 341699
URL: https://svnweb.freebsd.org/changeset/base/341699

Log:
  vm: use fcmpset for vmspace reference counting
  
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/vm/vm_map.c

Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c        Fri Dec  7 16:11:45 2018        (r341698)
+++ head/sys/vm/vm_map.c        Fri Dec  7 16:22:54 2018        (r341699)
@@ -391,8 +391,8 @@ vmspace_exit(struct thread *td)
        p = td->td_proc;
        vm = p->p_vmspace;
        atomic_add_int(&vmspace0.vm_refcnt, 1);
+       refcnt = vm->vm_refcnt;
        do {
-               refcnt = vm->vm_refcnt;
                if (refcnt > 1 && p->p_vmspace != &vmspace0) {
                        /* Switch now since other proc might free vmspace */
                        PROC_VMSPACE_LOCK(p);
@@ -400,7 +400,7 @@ vmspace_exit(struct thread *td)
                        PROC_VMSPACE_UNLOCK(p);
                        pmap_activate(td);
                }
-       } while (!atomic_cmpset_int(&vm->vm_refcnt, refcnt, refcnt - 1));
+       } while (!atomic_fcmpset_int(&vm->vm_refcnt, &refcnt, refcnt - 1));
        if (refcnt == 1) {
                if (p->p_vmspace != vm) {
                        /* vmspace not yet freed, switch back */
@@ -437,13 +437,13 @@ vmspace_acquire_ref(struct proc *p)
                PROC_VMSPACE_UNLOCK(p);
                return (NULL);
        }
+       refcnt = vm->vm_refcnt;
        do {
-               refcnt = vm->vm_refcnt;
                if (refcnt <= 0) {      /* Avoid 0->1 transition */
                        PROC_VMSPACE_UNLOCK(p);
                        return (NULL);
                }
-       } while (!atomic_cmpset_int(&vm->vm_refcnt, refcnt, refcnt + 1));
+       } while (!atomic_fcmpset_int(&vm->vm_refcnt, &refcnt, refcnt + 1));
        if (vm != p->p_vmspace) {
                PROC_VMSPACE_UNLOCK(p);
                vmspace_free(vm);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to