Doug's method for suppressing stray interrupt logging

Douglas W. Goodall douglas_goodall at mac.com
Mon Jul 24 18:23:29 UTC 2006


Hello Yousef and All,

In /usr/src/sys/i386/i386/intr_machdep.c:

    197         /*
    198          * For stray interrupts, mask and EOI the source, bump the

    199          * stray count, and log the condition.
    200          */    
    201         if (ie == NULL || TAILQ_EMPTY(&ie->ie_handlers)) {
    202                 isrc->is_pic->pic_disable_source(isrc, PIC_EOI);
    203 
    204 /*              (*isrc->is_straycount)++;                
    205                 if (*isrc->is_straycount < MAX_STRAY_LOG)     
    206                         log(LOG_ERR, "stray irq%d\n", vector);

    207                 else if (*isrc->is_straycount == MAX_STRAY_LOG)
    208                         log(LOG_CRIT,
    209                             "too many stray irq %d's: not logging
anymore\n",
    210                             vector);
    211 */ 
    212                        
    213                 return;

See line 204 where /* starts the suspension
See line 211 where */ ends the suspension

Ian,
 Your question was good. Since the IBM AT there have been two programmable
interrupt controllers in the architecture.
 The second one is slaved off the first one attached to the IR7 line of the
primary pic.

 The interrupt routine does the necessay things to remove a valid interrupt
cause and sends the End of
Interrupt (EOI)command to the PIC.  

 In the case of the "default ir7", there is no valid cause and that is why
it is called a stray interrupt.
 The interrupt code in 6.1 looks good but IMHO the code shouldn't bother to
log the strays.

 The code is handling them properly and my only contention is that the
messenger should be ignored.

 One coud say, "Gee my Sharp PC-MM20 has a noisy bus and gets more default
ir7's than some other box",
but in the pig picture a few extra trips into the interrupt code is not
enough cycles to sneeze at.

BTW: The reason I didn't just change the value of MAX_STRAY_LOG was a
nagging concern that if too many
Stray interrupts occurred (like 32768) there might be a signed/unsigned
comparison problem in the code
that might cause the logging suspension to fail unexpectedly.

Is is a great honor for me to share some hard earned knowledge with the
community. :-)

Respectfully,

Douglas W. Goodall
FreeBSD Enthusiast




More information about the freebsd-mobile mailing list