Linux-kernel mailing list archive 2000-32,: [CHECKER]: possible irq alloc/free problems

# [CHECKER]: possible irq alloc/free problems

Dawson Engler (engler@csl.Stanford.EDU)
Fri, 11 Aug 2000 17:36:58 -0700 (PDT)

- Messages sorted by: [ date ][ thread ][ subject ][ author ]
- Next message: William Scott Lockwood III: "(OT)Re: NTFS-like streams?"
- Previous message: James Sutherland: "Re: NTFS-like streams?"

Hi All,

I modified the g++ extension we were using to check malloc/free to
also check irq alloc/dealloc (since its very similar). It has two
rules:
1. all request_irq's are checked for failure.
2. on error paths all allocated irq's are deallocated.

It turned up a bunch of cases in device drivers, some of which look
like actual errors. If anyone could look at these and say whether such
errors are (1) important and (2) actual (rather than false positives)
I'd appreciate it.

Dawson
----------------------------------------------------------------------
/u2/engler/ic/linux-2.3.99/drivers/char/pc_keyb.c:754:pckbd_init_hw: ERROR: unchecked irq_alloc

void __init pckbd_init_hw(void){
kbd_request_region();

/* Flush any pending input. */
kbd_clear_input();

if (kbd_startup_reset) {
char *msg = initialize_kbd();
if (msg)
printk(KERN_WARNING "initialize_kbd: %s\n", msg); }#if defined CONFIG_PSMOUSE
psaux_init();
#endif

/* Ok, finally allocate the IRQ, and off we go.. */
kbd_request_irq(keyboard_interrupt); <------ unchecked
}

--------------------------------------------------------------------------

/u2/engler/ic/linux-2.3.99/drivers/char/stradis.c:2076:configure_saa7146: ERROR:did not deallocate irq from line 2065

result = request_irq (saa->irq, saa7146_irq, SA_SHIRQ | SA_INTERRUPT, "stradis", (void *) saa);
if (result == -EINVAL)
printk (KERN_ERR "stradis%d: Bad irq number or handler\n", num);
if (result == -EBUSY)
printk (KERN_ERR "stradis%d: IRQ %ld busy, change your PnP"
" config in BIOS\n", num, saa->irq);
if (result < 0)
return result;
pci_set_master (dev);
if (video_register_device (&saa->video_dev, VFL_TYPE_GRABBER) < 0)
return -1; <----------------- lost irq

----------------------------------------------------------------------------

/u2/engler/ic/linux-2.3.99/drivers/net/tokenring/abyss.c:195:abyss_probe: ERROR:did not deallocate irq from line 131
/u2/engler/ic/linux-2.3.99/drivers/net/tokenring/abyss.c:201:abyss_probe: ERROR:did not deallocate irq from line 131

request_region(pci_ioaddr, ABYSS_IO_EXTENT, "abyss");
if(request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ,
"abyss", dev)) {
release_region(pci_ioaddr, ABYSS_IO_EXTENT) ;
continue; /*return (-ENODEV);*/ /* continue; ?? */
}

card->pci_dev = pdev;
} else {
printk("abyss: register_trdev() returned non-zero.\n");
kfree(dev->priv);
kfree(dev);
return -1;

...
if (abyss_card_list)
return 0;
return (-1);
}

-----------------------------------------------------------------------
Aren't totally clear cut since alot happens in between:

if (request_irq(dev->irq, &streamer_interrupt, SA_SHIRQ, "streamer", dev)) {
return -EAGAIN;
}

...
/u2/engler/ic/linux-2.3.99/drivers/net/tokenring/lanstreamer.c:566:streamer_open: ERROR:did not deallocate irq from line 464

if (srb_word == STREAMER_CLEAR_RET_CODE) {
printk(KERN_WARNING "%s: Adapter Open time out or error.\n",
dev->name);
return -EIO;
}

ERNEL);

/u2/engler/ic/linux-2.3.99/drivers/net/tokenring/lanstreamer.c:645:streamer_open: ERROR:did not deallocate irq from line 464

if (!streamer_priv->streamer_rx_ring) {
printk(KERN_WARNING "%s ALLOC of streamer rx ring FAILED!!\n",dev->name);
return -EIO;
}

/u2/engler/ic/linux-2.3.99/drivers/net/tokenring/lanstreamer.c:686:streamer_open: ERROR:did not deallocate irq from line 464

if (!streamer_priv->streamer_tx_ring) {
printk(KERN_WARNING "%s ALLOC of streamer_tx_ring FAILED\n",dev->name);
return -EIO;
}

--------------------------------------------------------------------
/u2/engler/ic/linux-2.3.99/drivers/net/tokenring/smctr.c:1170:smctr_chk_isa: ERROR:did not deallocate irq from line 1093

if(request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) return (-ENODEV);

...
/* see if the chip is corrupted */
if(smctr_read_584_chksum(ioaddr))
{
printk("%s: EEPROM Checksum Failure\n", dev->name);
return(-1);
}
--------------------------------------------------------------------

/u2/engler/ic/linux-2.3.99/drivers/net/tokenring/tmspci.c:221:tms_pci_probe: ERROR:did not deallocate irq from line 154
/u2/engler/ic/linux-2.3.99/drivers/net/tokenring/tmspci.c:227:tms_pci_probe: ERROR:did not deallocate irq from line 154

if(request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ,
cardinfo->name, dev)) {
release_region(pci_ioaddr, TMS_PCI_IO_EXTENT);
continue; /*return (-ENODEV);*/ /* continue; ?? */
}
card->pci_dev = pdev;
card->cardinfo = cardinfo;
} else {
printk("%s: register_trdev() returned non-zero.\n", dev->name);
kfree(dev->priv);
kfree(dev);
return -1;
}
}

if (tms_pci_card_list)
return 0;
return (-1);
}
--------------------------------------------------------------------------

/u2/engler/ic/linux-2.3.99/drivers/net/appletalk/ltpc.c:1226:ltpc_probe: ERROR: unchecked irq_alloc

if (irq) {
/* grab it and don't let go :-) */
(void) request_irq( irq, &ltpc_interrupt, 0, "ltpc", dev);

-----------------------------------------------------------------------

/u2/engler/ic/linux-2.3.99/drivers/pcmcia/i82365.c:1511:init_i82365: ERROR: unchecked irq_alloc

/* Set up interrupt handler(s) */
#ifdef CONFIG_ISA
if (grab_irq != 0)
request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);
#endif

------------------------
/u2/engler/ic/linux-2.3.99/drivers/isdn/sc/init.c:383:init_sc: ERROR: unchecked irq_alloc
REQUEST_IRQ(adapter[cinst]->interrupt, interrupt_handler, SA_INTERRUPT,
interface->id, NULL);

-------------------------------------------------------------------
/u2/engler/ic/linux-2.3.99/drivers/atm/zatm.c:1514:zatm_start: ERROR:did not deallocate irq from line 1467
/u2/engler/ic/linux-2.3.99/drivers/atm/zatm.c:1506:zatm_start: ERROR:did not deallocate irq from line 1467

if (request_irq(zatm_dev->irq,&zatm_int,SA_SHIRQ,DEV_LABEL,dev)) { printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in use\n",
dev->number,zatm_dev->irq); return -EAGAIN;

...
if ((here^virt_to_bus((void *) here)) & 0xffff) { printk(KERN_ERR DEV_LABEL "(itf %d): system "
"bus incompatible with driver\n",
dev->number); kfree((void *) here);
return -ENODEV;
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

- Next message: William Scott Lockwood III: "(OT)Re: NTFS-like streams?"
- Previous message: James Sutherland: "Re: NTFS-like streams?"