Re: [PATCH] Add intr_mask() / intr_unmask() interface to mask / unmask individual interrupt sources

Jason Thorpe <[email protected]>
Newsgroups gmane.os.netbsd.ports.x86-64,gmane.os.netbsd.ports.i386
Message-ID <[email protected]>

> On Aug 23, 2019, at 11:43 PM, Maxime Villard <[email protected]> wrote:
> 
> One possible problem though:
> 
> -	(*pic->pic_hwunmask)(pic, pin);
> +	isp->is_distribute_pending = false;
> +	if (isp->is_mask_count == 0)
> 
> You get interrupted here, intr_mask_xcall() comes in and does is_mask_count++,
> then calls pic->pic_hwmask().
> 
> +		(*pic->pic_hwunmask)(pic, pin);
> 
> Here it gets unmasked but with is_mask_count==1.

Hm, intr_mask_xcall() should only get invoked via a call to intr_mask_internal(), which takes the cpu_lock before performing any cross-calls. 

The code you quote in intr_set_affinity() is called via intr_distribute_locked(), which is called via interrupt_distribute() with the cpu_lock held as well.  So I think these are already safely serialized, although I could add an extra measure of safety by disabling interrupts on the current CPU around those 3 lines of code to make absolutely sure that cross-call doesn't arrive until we're done.

-- thorpej
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.