Module Name: src
Committed By: ad
Date: Sat Nov 30 17:49:03 UTC 2019
Modified Files:
src/sys/sys: userret.h
Log Message:
Avoid false sharing: only update spc_curpriority if value has changed.
To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/sys/sys/userret.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/sys/userret.h
diff -u src/sys/sys/userret.h:1.30 src/sys/sys/userret.h:1.31
--- src/sys/sys/userret.h:1.30 Fri Nov 22 23:38:15 2019
+++ src/sys/sys/userret.h Sat Nov 30 17:49:03 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: userret.h,v 1.30 2019/11/22 23:38:15 ad Exp $ */
+/* $NetBSD: userret.h,v 1.31 2019/11/30 17:49:03 ad Exp $ */
/*-
* Copyright (c) 1998, 2000, 2003, 2006, 2008, 2019 The NetBSD Foundation, Inc.
@@ -100,14 +100,20 @@ mi_userret(struct lwp *l)
KPREEMPT_DISABLE(l);
ci = l->l_cpu;
}
- l->l_kpriority = false;
/*
* lwp_eprio() is too involved to use here unlocked. At this point
* it only matters for PTHREAD_PRIO_PROTECT; setting a too low value
* is OK because the scheduler will find out the true value if we
* end up in mi_switch().
+ *
+ * This is being called on every syscall and trap, and remote CPUs
+ * regularly look at ci_schedstate. Keep the cache line in the
+ * SHARED state by only updating spc_curpriority if it has changed.
*/
- ci->ci_schedstate.spc_curpriority = l->l_priority;
+ l->l_kpriority = false;
+ if (ci->ci_schedstate.spc_curpriority != l->l_priority) {
+ ci->ci_schedstate.spc_curpriority = l->l_priority;
+ }
KPREEMPT_ENABLE(l);
LOCKDEBUG_BARRIER(NULL, 0);