x86: Check for biglock leakage in interrupt handlers.
This commit is contained in:
parent
d8cd23d6aa
commit
8382e30f24
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: intr.h,v 1.62 2020/04/25 15:26:18 bouyer Exp $ */
|
/* $NetBSD: intr.h,v 1.63 2022/03/12 15:50:44 riastradh Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998, 2001, 2006, 2007, 2008, 2019 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998, 2001, 2006, 2007, 2008, 2019 The NetBSD Foundation, Inc.
|
||||||
|
@ -145,6 +145,7 @@ struct intrhand {
|
||||||
struct intrhand *ih_evt_next;
|
struct intrhand *ih_evt_next;
|
||||||
#endif
|
#endif
|
||||||
struct cpu_info *ih_cpu;
|
struct cpu_info *ih_cpu;
|
||||||
|
char ih_xname[INTRDEVNAMEBUF];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IMASK(ci,level) (ci)->ci_imask[(level)]
|
#define IMASK(ci,level) (ci)->ci_imask[(level)]
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: intr.c,v 1.159 2021/12/23 02:45:43 yamaguchi Exp $ */
|
/* $NetBSD: intr.c,v 1.160 2022/03/12 15:50:45 riastradh Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc.
|
* Copyright (c) 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc.
|
||||||
|
@ -133,7 +133,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.159 2021/12/23 02:45:43 yamaguchi Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.160 2022/03/12 15:50:45 riastradh Exp $");
|
||||||
|
|
||||||
#include "opt_intrdebug.h"
|
#include "opt_intrdebug.h"
|
||||||
#include "opt_multiprocessor.h"
|
#include "opt_multiprocessor.h"
|
||||||
|
@ -653,11 +653,16 @@ static int
|
||||||
intr_biglock_wrapper(void *vp)
|
intr_biglock_wrapper(void *vp)
|
||||||
{
|
{
|
||||||
struct intrhand *ih = vp;
|
struct intrhand *ih = vp;
|
||||||
|
int locks;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
KERNEL_LOCK(1, NULL);
|
KERNEL_LOCK(1, NULL);
|
||||||
|
|
||||||
|
locks = curcpu()->ci_biglock_count;
|
||||||
ret = (*ih->ih_realfun)(ih->ih_realarg);
|
ret = (*ih->ih_realfun)(ih->ih_realarg);
|
||||||
|
KASSERTMSG(locks == curcpu()->ci_biglock_count,
|
||||||
|
"%s @ %p slipped locks %d -> %d",
|
||||||
|
ih->ih_xname, ih->ih_realfun, locks, curcpu()->ci_biglock_count);
|
||||||
|
|
||||||
KERNEL_UNLOCK_ONE(NULL);
|
KERNEL_UNLOCK_ONE(NULL);
|
||||||
|
|
||||||
|
@ -904,6 +909,7 @@ intr_establish_xname(int legacy_irq, struct pic *pic, int pin, int type,
|
||||||
ih->ih_pin = pin;
|
ih->ih_pin = pin;
|
||||||
ih->ih_cpu = ci;
|
ih->ih_cpu = ci;
|
||||||
ih->ih_slot = slot;
|
ih->ih_slot = slot;
|
||||||
|
strlcpy(ih->ih_xname, xname, sizeof(ih->ih_xname));
|
||||||
#ifdef MULTIPROCESSOR
|
#ifdef MULTIPROCESSOR
|
||||||
if (!mpsafe) {
|
if (!mpsafe) {
|
||||||
ih->ih_fun = intr_biglock_wrapper;
|
ih->ih_fun = intr_biglock_wrapper;
|
||||||
|
|
Loading…
Reference in New Issue