Author: emaste
Date: Thu Jan 23 14:11:02 2020
New Revision: 357045
URL: https://svnweb.freebsd.org/changeset/base/357045

Log:
  Apply r355819 to sparc64 - fix assertion failure after r355784
  
  From r355819:
  Repeat the spinlock_enter/exit pattern from amd64 on other architectures
  to fix an assert violation introduced in r355784.  Without this
  spinlock_exit() may see owepreempt and switch before reducing the
  spinlock count.  amd64 had been optimized to do a single critical
  enter/exit regardless of the number of spinlocks which avoided the
  problem and this optimization had not been applied elsewhere.
  
  This is completely untested - I have no obsolete Sparc hardware - but
  someone did try testing recent changes on sparc64 (PR 243534).
  
  PR:           243534

Modified:
  head/sys/sparc64/sparc64/machdep.c

Modified: head/sys/sparc64/sparc64/machdep.c
==============================================================================
--- head/sys/sparc64/sparc64/machdep.c  Thu Jan 23 14:01:03 2020        
(r357044)
+++ head/sys/sparc64/sparc64/machdep.c  Thu Jan 23 14:11:02 2020        
(r357045)
@@ -224,9 +224,9 @@ spinlock_enter(void)
                wrpr(pil, 0, PIL_TICK);
                td->td_md.md_spinlock_count = 1;
                td->td_md.md_saved_pil = pil;
+               critical_enter();
        } else
                td->td_md.md_spinlock_count++;
-       critical_enter();
 }
 
 void
@@ -236,11 +236,12 @@ spinlock_exit(void)
        register_t pil;
 
        td = curthread;
-       critical_exit();
        pil = td->td_md.md_saved_pil;
        td->td_md.md_spinlock_count--;
-       if (td->td_md.md_spinlock_count == 0)
+       if (td->td_md.md_spinlock_count == 0) {
+               critical_exit();
                wrpr(pil, pil, 0);
+       }
 }
 
 static phandle_t
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to