Module Name: src Committed By: matt Date: Mon May 2 06:33:16 UTC 2011
Modified Files: src/sys/kern: subr_pcu.c Log Message: Don't call pcu_do_op in pcu_load to save current context, use pcu_cpu_op instead (since it will deal with ci->ci_pcu_curlwp[id] being NULL). To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/kern/subr_pcu.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_pcu.c diff -u src/sys/kern/subr_pcu.c:1.5 src/sys/kern/subr_pcu.c:1.6 --- src/sys/kern/subr_pcu.c:1.5 Mon May 2 01:43:37 2011 +++ src/sys/kern/subr_pcu.c Mon May 2 06:33:16 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_pcu.c,v 1.5 2011/05/02 01:43:37 matt Exp $ */ +/* $NetBSD: subr_pcu.c,v 1.6 2011/05/02 06:33:16 matt Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_pcu.c,v 1.5 2011/05/02 01:43:37 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_pcu.c,v 1.6 2011/05/02 06:33:16 matt Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -125,7 +125,8 @@ } /* - * pcu_cpu_op: helper routine to call pcu_do_op() via xcall(9). + * pcu_cpu_op: helper routine to call pcu_do_op() via xcall(9) or + * by pcu_load. */ static void pcu_cpu_op(const pcu_ops_t *pcu, const int flags) @@ -133,7 +134,7 @@ const u_int id = pcu->pcu_id; lwp_t * const l = curcpu()->ci_pcu_curlwp[id]; - KASSERT(cpu_softintr_p()); + //KASSERT(cpu_softintr_p()); /* If no state - nothing to do. */ if (l == NULL) { @@ -164,7 +165,9 @@ /* * State is on the current CPU - just perform the operations. */ - KASSERT(ci->ci_pcu_curlwp[id] == l); + KASSERTMSG(ci->ci_pcu_curlwp[id] == l, + ("%s: cpu%u: pcu_curlwp[%u] (%p) != l (%p)", + __func__, cpu_index(ci), id, ci->ci_pcu_curlwp[id], l)); pcu_do_op(pcu, l, flags); splx(s); return; @@ -227,7 +230,7 @@ KASSERT(l->l_pcu_cpu[id] == NULL); /* Save the PCU state on the current CPU, if there is any. */ - pcu_do_op(pcu, l, PCU_SAVE | PCU_RELEASE); + pcu_cpu_op(pcu, PCU_SAVE | PCU_RELEASE); KASSERT(curci->ci_pcu_curlwp[id] == NULL); /*