Module Name: src Committed By: ozaki-r Date: Thu Dec 14 05:45:55 UTC 2017
Modified Files: src/sys/kern: subr_psref.c Log Message: Improve debugging functions - Make psref_check_duplication check just if a given psref is on the list - It checked both psref and target - Suggested by riastradh@ some time ago - Add psref_check_existence that checks a releasing psref is surely on the list To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/kern/subr_psref.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_psref.c diff -u src/sys/kern/subr_psref.c:1.8 src/sys/kern/subr_psref.c:1.9 --- src/sys/kern/subr_psref.c:1.8 Mon Dec 11 02:33:17 2017 +++ src/sys/kern/subr_psref.c Thu Dec 14 05:45:55 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_psref.c,v 1.8 2017/12/11 02:33:17 knakahara Exp $ */ +/* $NetBSD: subr_psref.c,v 1.9 2017/12/14 05:45:55 ozaki-r 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.8 2017/12/11 02:33:17 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_psref.c,v 1.9 2017/12/14 05:45:55 ozaki-r Exp $"); #include <sys/types.h> #include <sys/condvar.h> @@ -187,22 +187,40 @@ psref_target_init(struct psref_target *t } #ifdef DEBUG +static bool +psref_exist(struct psref_cpu *pcpu, struct psref *psref) +{ + struct psref *_psref; + + SLIST_FOREACH(_psref, &pcpu->pcpu_head, psref_entry) { + if (_psref == psref) + return true; + } + return false; +} + static void psref_check_duplication(struct psref_cpu *pcpu, struct psref *psref, const struct psref_target *target) { bool found = false; - struct psref *_psref; - SLIST_FOREACH(_psref, &pcpu->pcpu_head, psref_entry) { - if (_psref == psref && - _psref->psref_target == target) { - found = true; - break; - } - } + found = psref_exist(pcpu, psref); if (found) { - panic("trying to acquire a target twice with the same psref: " + panic("The psref is already in the list (acquiring twice?): " + "psref=%p target=%p", psref, target); + } +} + +static void +psref_check_existence(struct psref_cpu *pcpu, struct psref *psref, + const struct psref_target *target) +{ + bool found = false; + + found = psref_exist(pcpu, psref); + if (!found) { + panic("The psref isn't in the list (releasing unused psref?): " "psref=%p target=%p", psref, target); } } @@ -304,6 +322,10 @@ psref_release(struct psref *psref, const */ s = splraiseipl(class->prc_iplcookie); pcpu = percpu_getref(class->prc_percpu); +#ifdef DEBUG + /* Sanity-check if the target is surely acquired before. */ + psref_check_existence(pcpu, psref, target); +#endif SLIST_REMOVE(&pcpu->pcpu_head, psref, psref, psref_entry); percpu_putref(class->prc_percpu); splx(s);