Author: mjg
Date: Thu Oct  5 13:01:18 2017
New Revision: 324314
URL: https://svnweb.freebsd.org/changeset/base/324314

Log:
  locks: partially tidy up waiting on readers
  
  spin first instant of instantly re-readoing and don't re-read after
  spinning is finished - the state is already known.
  
  Note the code is subject to significant changes later.
  
  MFC after:    1 week

Modified:
  head/sys/kern/kern_rwlock.c
  head/sys/kern/kern_sx.c

Modified: head/sys/kern/kern_rwlock.c
==============================================================================
--- head/sys/kern/kern_rwlock.c Thu Oct  5 12:50:03 2017        (r324313)
+++ head/sys/kern/kern_rwlock.c Thu Oct  5 13:01:18 2017        (r324314)
@@ -489,12 +489,11 @@ __rw_rlock_hard(volatile uintptr_t *c, struct thread *
                            "spinning", "lockname:\"%s\"",
                            rw->lock_object.lo_name);
                        for (i = 0; i < rowner_loops; i++) {
+                               cpu_spinwait();
                                v = RW_READ_VALUE(rw);
                                if ((v & RW_LOCK_READ) == 0 || RW_CAN_READ(td, 
v))
                                        break;
-                               cpu_spinwait();
                        }
-                       v = RW_READ_VALUE(rw);
 #ifdef KDTRACE_HOOKS
                        lda.spin_cnt += rowner_loops - i;
 #endif
@@ -930,13 +929,13 @@ __rw_wlock_hard(volatile uintptr_t *c, uintptr_t v, ui
                            "spinning", "lockname:\"%s\"",
                            rw->lock_object.lo_name);
                        for (i = 0; i < rowner_loops; i++) {
-                               if ((rw->rw_lock & RW_LOCK_WRITE_SPINNER) == 0)
-                                       break;
                                cpu_spinwait();
+                               v = RW_READ_VALUE(rw);
+                               if ((v & RW_LOCK_WRITE_SPINNER) == 0)
+                                       break;
                        }
                        KTR_STATE0(KTR_SCHED, "thread", sched_tdname(curthread),
                            "running");
-                       v = RW_READ_VALUE(rw);
 #ifdef KDTRACE_HOOKS
                        lda.spin_cnt += rowner_loops - i;
 #endif

Modified: head/sys/kern/kern_sx.c
==============================================================================
--- head/sys/kern/kern_sx.c     Thu Oct  5 12:50:03 2017        (r324313)
+++ head/sys/kern/kern_sx.c     Thu Oct  5 13:01:18 2017        (r324314)
@@ -605,18 +605,17 @@ _sx_xlock_hard(struct sx *sx, uintptr_t x, uintptr_t t
                                                CTR4(KTR_LOCK,
                                    "%s: shared spinning on %p with %u and %u",
                                                    __func__, sx, spintries, i);
-                                       x = sx->sx_lock;
+                                       cpu_spinwait();
+                                       x = SX_READ_VALUE(sx);
                                        if ((x & SX_LOCK_SHARED) == 0 ||
                                            SX_SHARERS(x) == 0)
                                                break;
-                                       cpu_spinwait();
+                               }
 #ifdef KDTRACE_HOOKS
-                                       lda.spin_cnt++;
+                               lda.spin_cnt += i;
 #endif
-                               }
                                KTR_STATE0(KTR_SCHED, "thread",
                                    sched_tdname(curthread), "running");
-                               x = SX_READ_VALUE(sx);
                                if (i != asx_loops)
                                        continue;
                        }
_______________________________________________
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