svn commit: r324314 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Thu Oct 5 13:01:19 UTC 2017
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;
}
More information about the svn-src-head
mailing list