Re: [linux-usb-devel] question on irqs and memory ordering

Alan Stern <[email protected]>
Newsgroups gmane.linux.kernel,gmane.linux.usb.devel
Message-ID <[email protected]>
On Wed, 14 Mar 2007, Oliver Neukum wrote:

> Hi,
> 
> I am looking at this code:
> 
> 	if (new_msr &
> 	    (MOS_MSR_DELTA_CTS | MOS_MSR_DELTA_DSR | MOS_MSR_DELTA_RI |
> 	     MOS_MSR_DELTA_CD)) {
> 		icount = &mos7840_port->icount;
> 
> 		/* update input line counters */
> 		if (new_msr & MOS_MSR_DELTA_CTS) {
> 			icount->cts++;
> 		}
> 		if (new_msr & MOS_MSR_DELTA_DSR) {
> 			icount->dsr++;
> 		}
> 		if (new_msr & MOS_MSR_DELTA_CD) {
> 			icount->dcd++;
> 		}
> 		if (new_msr & MOS_MSR_DELTA_RI) {
> 			icount->rng++;
> 		}
> 	}
> 
> It is called in interrupt and uses no locking. What happens if the next
> irq is processed on another cpu? Is that cpu guaranteed to see the updates
> to the incremented variables?

I _think_ it's okay.  Taking an interrupt and returning from an interrupt
ought to have explicit or implicit memory barriers.

It wouldn't hurt to ask someone else.  David Howells wrote
Documentation/memory-barriers.txt so maybe he knows.  (The document itself
doesn't say one way or the other.)

Alan Stern
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.