Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys Fix psref(9) part of PR kern/52515. It is complete to fi...
details: https://anonhg.NetBSD.org/src/rev/373b3a2ed4fa
branches: trunk
changeset: 828396:373b3a2ed4fa
user: knakahara <knakahara%NetBSD.org@localhost>
date: Mon Dec 11 02:33:17 2017 +0000
description:
Fix psref(9) part of PR kern/52515. It is complete to fix the PR now.
implementated by ozaki-r@n.o, reviewed by riastradh@n.o, thanks.
XXX need pullup-8
diffstat:
sys/kern/subr_psref.c | 21 ++++++++++++---------
sys/sys/psref.h | 6 ++++--
2 files changed, 16 insertions(+), 11 deletions(-)
diffs (111 lines):
diff -r 6a2470cd64b2 -r 373b3a2ed4fa sys/kern/subr_psref.c
--- a/sys/kern/subr_psref.c Mon Dec 11 02:17:35 2017 +0000
+++ b/sys/kern/subr_psref.c Mon Dec 11 02:33:17 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_psref.c,v 1.7 2017/06/01 02:45:13 chs Exp $ */
+/* $NetBSD: subr_psref.c,v 1.8 2017/12/11 02:33:17 knakahara Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_psref.c,v 1.7 2017/06/01 02:45:13 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_psref.c,v 1.8 2017/12/11 02:33:17 knakahara Exp $");
#include <sys/types.h>
#include <sys/condvar.h>
@@ -78,7 +78,7 @@
#include <sys/queue.h>
#include <sys/xcall.h>
-LIST_HEAD(psref_head, psref);
+SLIST_HEAD(psref_head, psref);
static bool _psref_held(const struct psref_target *, struct psref_class *,
bool);
@@ -135,7 +135,7 @@
const struct psref_cpu *pcpu = p;
bool *retp = cookie;
- if (!LIST_EMPTY(&pcpu->pcpu_head))
+ if (!SLIST_EMPTY(&pcpu->pcpu_head))
*retp = false;
}
@@ -194,7 +194,7 @@
bool found = false;
struct psref *_psref;
- LIST_FOREACH(_psref, &pcpu->pcpu_head, psref_entry) {
+ SLIST_FOREACH(_psref, &pcpu->pcpu_head, psref_entry) {
if (_psref == psref &&
_psref->psref_target == target) {
found = true;
@@ -250,7 +250,7 @@
#endif
/* Record our reference. */
- LIST_INSERT_HEAD(&pcpu->pcpu_head, psref, psref_entry);
+ SLIST_INSERT_HEAD(&pcpu->pcpu_head, psref, psref_entry);
psref->psref_target = target;
psref->psref_lwp = curlwp;
psref->psref_cpu = curcpu();
@@ -273,6 +273,7 @@
psref_release(struct psref *psref, const struct psref_target *target,
struct psref_class *class)
{
+ struct psref_cpu *pcpu;
int s;
KASSERTMSG((kpreempt_disabled() || cpu_softintr_p() ||
@@ -302,7 +303,9 @@
* (as does blocking interrupts).
*/
s = splraiseipl(class->prc_iplcookie);
- LIST_REMOVE(psref, psref_entry);
+ pcpu = percpu_getref(class->prc_percpu);
+ SLIST_REMOVE(&pcpu->pcpu_head, psref, psref, psref_entry);
+ percpu_putref(class->prc_percpu);
splx(s);
/* If someone is waiting for users to drain, notify 'em. */
@@ -353,7 +356,7 @@
pcpu = percpu_getref(class->prc_percpu);
/* Record the new reference. */
- LIST_INSERT_HEAD(&pcpu->pcpu_head, pto, psref_entry);
+ SLIST_INSERT_HEAD(&pcpu->pcpu_head, pto, psref_entry);
pto->psref_target = pfrom->psref_target;
pto->psref_lwp = curlwp;
pto->psref_cpu = curcpu();
@@ -474,7 +477,7 @@
pcpu = percpu_getref(class->prc_percpu);
/* Search through all the references on this CPU. */
- LIST_FOREACH(psref, &pcpu->pcpu_head, psref_entry) {
+ SLIST_FOREACH(psref, &pcpu->pcpu_head, psref_entry) {
/* Sanity-check the reference's CPU. */
KASSERTMSG((psref->psref_cpu == curcpu()),
"passive reference transferred from CPU %u to CPU %u",
diff -r 6a2470cd64b2 -r 373b3a2ed4fa sys/sys/psref.h
--- a/sys/sys/psref.h Mon Dec 11 02:17:35 2017 +0000
+++ b/sys/sys/psref.h Mon Dec 11 02:33:17 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: psref.h,v 1.2 2016/12/16 20:12:11 christos Exp $ */
+/* $NetBSD: psref.h,v 1.3 2017/12/11 02:33:17 knakahara Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -69,7 +69,9 @@
* written only on the local CPU.
*/
struct psref {
- LIST_ENTRY(psref) psref_entry;
+ SLIST_ENTRY(psref) psref_entry;
+ /* To keep ABI with LIST_ENTRY(psref) version. */
+ void *psref_unused0;
const struct psref_target *psref_target;
struct lwp *psref_lwp;
struct cpu_info *psref_cpu;
Home |
Main Index |
Thread Index |
Old Index