Module Name: src Committed By: jmcneill Date: Mon Dec 23 15:51:47 UTC 2019
Modified Files: src/sys/arch/arm/pic: pic.c picvar.h Log Message: Add reference counts to intr_mask/intr_unmask as calls can be nested, spotted by thorpej To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/sys/arch/arm/pic/pic.c cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/pic/picvar.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/arch/arm/pic/pic.c diff -u src/sys/arch/arm/pic/pic.c:1.49 src/sys/arch/arm/pic/pic.c:1.50 --- src/sys/arch/arm/pic/pic.c:1.49 Mon Dec 23 15:34:23 2019 +++ src/sys/arch/arm/pic/pic.c Mon Dec 23 15:51:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pic.c,v 1.49 2019/12/23 15:34:23 jmcneill Exp $ */ +/* $NetBSD: pic.c,v 1.50 2019/12/23 15:51:47 jmcneill Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -33,7 +33,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.49 2019/12/23 15:34:23 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.50 2019/12/23 15:51:47 jmcneill Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -909,7 +909,8 @@ intr_mask(void *ih) struct pic_softc * const pic = is->is_pic; const int irq = is->is_irq; - (*pic->pic_ops->pic_block_irqs)(pic, irq & ~0x1f, __BIT(irq & 0x1f)); + if (atomic_inc_32_nv(&is->is_mask_count) == 1) + (*pic->pic_ops->pic_block_irqs)(pic, irq & ~0x1f, __BIT(irq & 0x1f)); } void @@ -919,7 +920,8 @@ intr_unmask(void *ih) struct pic_softc * const pic = is->is_pic; const int irq = is->is_irq; - (*pic->pic_ops->pic_unblock_irqs)(pic, irq & ~0x1f, __BIT(irq & 0x1f)); + if (atomic_dec_32_nv(&is->is_mask_count) == 0) + (*pic->pic_ops->pic_unblock_irqs)(pic, irq & ~0x1f, __BIT(irq & 0x1f)); } const char * Index: src/sys/arch/arm/pic/picvar.h diff -u src/sys/arch/arm/pic/picvar.h:1.24 src/sys/arch/arm/pic/picvar.h:1.25 --- src/sys/arch/arm/pic/picvar.h:1.24 Mon Dec 23 15:34:23 2019 +++ src/sys/arch/arm/pic/picvar.h Mon Dec 23 15:51:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: picvar.h,v 1.24 2019/12/23 15:34:23 jmcneill Exp $ */ +/* $NetBSD: picvar.h,v 1.25 2019/12/23 15:51:47 jmcneill Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -126,6 +126,7 @@ struct intrsource { bool is_mpsafe; char is_source[16]; char *is_xname; + uint32_t is_mask_count; }; struct pic_percpu {