diff -urNX dontdiff linux-2.5.22/arch/cris/drivers/serial.c linux-2.5.22-bh/arch/cris/drivers/serial.c --- linux-2.5.22/arch/cris/drivers/serial.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/arch/cris/drivers/serial.c Mon Jun 17 13:04:29 2002 @@ -333,8 +333,6 @@ #define _INLINE_ inline -static DECLARE_TASK_QUEUE(tq_serial); - struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -1092,8 +1090,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } /* The output DMA channel is free - use it to send as many chars as possible @@ -1955,12 +1952,6 @@ * them using rs_sched_event(), and they get done here. */ static void -do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - -static void do_softint(void *private_) { struct e100_serial *info = (struct e100_serial *) private_; @@ -3483,8 +3474,6 @@ show_serial_version(); - init_bh(SERIAL_BH, do_serial_bh); - /* Setup the timed flush handler system */ #if !defined(CONFIG_ETRAX_SERIAL_FAST_TIMER) && !defined(CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST) diff -urNX dontdiff linux-2.5.22/arch/cris/drivers/usb-host.c linux-2.5.22-bh/arch/cris/drivers/usb-host.c --- linux-2.5.22/arch/cris/drivers/usb-host.c Sun Jun 2 18:44:46 2002 +++ linux-2.5.22-bh/arch/cris/drivers/usb-host.c Mon Jun 17 12:28:20 2002 @@ -1972,8 +1972,7 @@ reg->usb_bh.routine = etrax_usb_hc_intr_bottom_half; reg->usb_bh.data = reg; - queue_task(®->usb_bh, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(®->usb_bh); DBFEXIT; } diff -urNX dontdiff linux-2.5.22/arch/mips/au1000/common/serial.c linux-2.5.22-bh/arch/mips/au1000/common/serial.c --- linux-2.5.22/arch/mips/au1000/common/serial.c Sun Jun 2 18:44:46 2002 +++ linux-2.5.22-bh/arch/mips/au1000/common/serial.c Mon Jun 17 13:04:50 2002 @@ -124,8 +124,6 @@ static char *serial_name = "Serial driver"; -static DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -331,8 +329,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } static _INLINE_ void receive_chars(struct async_struct *info, @@ -621,11 +618,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { struct async_struct *info = (struct async_struct *) private_; @@ -2560,7 +2552,6 @@ int i; struct serial_state * state; - init_bh(SERIAL_BH, do_serial_bh); init_timer(&serial_timer); serial_timer.function = rs_timer; mod_timer(&serial_timer, jiffies + RS_STROBE_TIME); @@ -2818,7 +2809,6 @@ /* printk("Unloading %s: version %s\n", serial_name, serial_version); */ del_timer_sync(&serial_timer); save_flags(flags); cli(); - remove_bh(SERIAL_BH); if ((e1 = tty_unregister_driver(&serial_driver))) printk("serial: failed to unregister serial driver (%d)\n", e1); diff -urNX dontdiff linux-2.5.22/arch/mips/baget/vacserial.c linux-2.5.22-bh/arch/mips/baget/vacserial.c --- linux-2.5.22/arch/mips/baget/vacserial.c Sun Jun 2 18:44:51 2002 +++ linux-2.5.22-bh/arch/mips/baget/vacserial.c Mon Jun 17 13:04:39 2002 @@ -93,8 +93,6 @@ static char *serial_name = "VAC Serial driver"; static char *serial_version = "4.26"; -static DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -323,8 +321,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } static _INLINE_ void receive_chars(struct async_struct *info, @@ -586,11 +583,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { struct async_struct *info = (struct async_struct *) private_; @@ -2321,7 +2313,6 @@ dualsp_serial_init (); #endif - init_bh(SERIAL_BH, do_serial_bh); init_timer(&vacs_timer); vacs_timer.function = rs_timer; vacs_timer.expires = 0; @@ -2529,7 +2520,6 @@ cli(); del_timer_sync(&vacs_timer); - remove_bh(SERIAL_BH); if ((e1 = tty_unregister_driver(&serial_driver))) printk("SERIAL: failed to unregister serial driver (%d)\n", diff -urNX dontdiff linux-2.5.22/arch/mips/gt64120/common/gt_irq.c linux-2.5.22-bh/arch/mips/gt64120/common/gt_irq.c --- linux-2.5.22/arch/mips/gt64120/common/gt_irq.c Sun Jun 2 18:44:52 2002 +++ linux-2.5.22-bh/arch/mips/gt64120/common/gt_irq.c Mon Jun 17 12:29:42 2002 @@ -134,10 +134,8 @@ if (irq_src & (1 << count)) { if (irq_handlers[INT_CAUSE_MAIN][count]. routine) { - queue_task(&irq_handlers - [INT_CAUSE_MAIN][count], - &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&irq_handlers + [INT_CAUSE_MAIN][count]); handled = 1; } } diff -urNX dontdiff linux-2.5.22/arch/ppc/8260_io/uart.c linux-2.5.22-bh/arch/ppc/8260_io/uart.c --- linux-2.5.22/arch/ppc/8260_io/uart.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/arch/ppc/8260_io/uart.c Mon Jun 17 13:04:02 2002 @@ -74,8 +74,6 @@ static char *serial_name = "CPM UART driver"; static char *serial_version = "0.01"; -static DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; static int serial_console_setup(struct console *co, char *options); @@ -334,8 +332,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } static _INLINE_ void receive_chars(ser_info_t *info) @@ -631,11 +628,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { ser_info_t *info = (ser_info_t *) private_; @@ -2506,8 +2498,6 @@ volatile immap_t *immap; volatile iop8260_t *io; - init_bh(SERIAL_BH, do_serial_bh); - show_serial_version(); /* Initialize the tty_driver structure */ diff -urNX dontdiff linux-2.5.22/arch/ppc/8xx_io/uart.c linux-2.5.22-bh/arch/ppc/8xx_io/uart.c --- linux-2.5.22/arch/ppc/8xx_io/uart.c Sun Jun 2 18:44:43 2002 +++ linux-2.5.22-bh/arch/ppc/8xx_io/uart.c Mon Jun 17 13:04:13 2002 @@ -86,8 +86,6 @@ static char *serial_name = "CPM UART driver"; static char *serial_version = "0.03"; -static DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; static int serial_console_setup(struct console *co, char *options); @@ -351,8 +349,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } static _INLINE_ void receive_chars(ser_info_t *info, struct pt_regs *regs) @@ -695,11 +692,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { ser_info_t *info = (ser_info_t *) private_; @@ -2555,8 +2547,6 @@ volatile scc_uart_t *sup; volatile immap_t *immap; - init_bh(SERIAL_BH, do_serial_bh); - show_serial_version(); /* Initialize the tty_driver structure */ diff -urNX dontdiff linux-2.5.22/drivers/acorn/block/fd1772.c linux-2.5.22-bh/drivers/acorn/block/fd1772.c --- linux-2.5.22/drivers/acorn/block/fd1772.c Mon Jun 17 04:49:03 2002 +++ linux-2.5.22-bh/drivers/acorn/block/fd1772.c Mon Jun 17 12:05:07 2002 @@ -1288,8 +1288,7 @@ floppy_irqconsequencehandler(); if ((MultReadInProgress) && (fdc1772_bytestogo==0)) fd_readtrack_check(0); if (fdc_busy) { - queue_task(&fd1772_tq,&tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&fd1772_tq); } } @@ -1311,8 +1310,7 @@ redo_fd_request(); - queue_task(&fd1772_tq,&tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&fd1772_tq); } diff -urNX dontdiff linux-2.5.22/drivers/acorn/block/mfmhd.c linux-2.5.22-bh/drivers/acorn/block/mfmhd.c --- linux-2.5.22/drivers/acorn/block/mfmhd.c Mon Jun 17 04:49:03 2002 +++ linux-2.5.22-bh/drivers/acorn/block/mfmhd.c Mon Jun 17 12:04:38 2002 @@ -866,8 +866,7 @@ errors = &(CURRENT->errors); #if 0 mfm_tq.routine = (void (*)(void *)) mfm_initialise; - queue_task(&mfm_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&mfm_tq); #else mfm_initialise(); #endif diff -urNX dontdiff linux-2.5.22/drivers/atm/ambassador.c linux-2.5.22-bh/drivers/atm/ambassador.c --- linux-2.5.22/drivers/atm/ambassador.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/drivers/atm/ambassador.c Mon Jun 17 12:26:53 2002 @@ -926,8 +926,7 @@ if (irq_work) { #ifdef FILL_RX_POOLS_IN_BH - queue_task (&dev->bh, &tq_immediate); - mark_bh (IMMEDIATE_BH); + queue_immediate_task (&dev->bh); #else fill_rx_pools (dev); #endif diff -urNX dontdiff linux-2.5.22/drivers/atm/idt77252.c linux-2.5.22-bh/drivers/atm/idt77252.c --- linux-2.5.22/drivers/atm/idt77252.c Sun Jun 2 18:44:49 2002 +++ linux-2.5.22-bh/drivers/atm/idt77252.c Mon Jun 17 12:27:24 2002 @@ -2896,8 +2896,7 @@ if (stat & SAR_STAT_FBQ3A) card->irqstat[8]++; - queue_task(&card->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->tqueue); } out: diff -urNX dontdiff linux-2.5.22/drivers/block/floppy.c linux-2.5.22-bh/drivers/block/floppy.c --- linux-2.5.22/drivers/block/floppy.c Mon Jun 17 04:49:04 2002 +++ linux-2.5.22-bh/drivers/block/floppy.c Mon Jun 17 12:26:30 2002 @@ -1001,8 +1001,7 @@ static void schedule_bh( void (*handler)(void*) ) { floppy_tq.routine = (void *)(void *) handler; - queue_task(&floppy_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&floppy_tq); } static struct timer_list fd_timer; diff -urNX dontdiff linux-2.5.22/drivers/cdrom/cm206.c linux-2.5.22-bh/drivers/cdrom/cm206.c --- linux-2.5.22/drivers/cdrom/cm206.c Mon Jun 17 04:49:04 2002 +++ linux-2.5.22-bh/drivers/cdrom/cm206.c Mon Jun 17 05:42:50 2002 @@ -345,6 +345,8 @@ } } +static struct tasklet_struct cm206_tasklet; + /* The interrupt handler. When the cm260 generates an interrupt, very much care has to be taken in reading out the registers in the right order; in case of a receive_buffer_full interrupt, first the @@ -432,7 +434,7 @@ if (cd->background && (cd->adapter_last - cd->adapter_first == cd->max_sectors || cd->fifo_overflowed)) - mark_bh(CM206_BH); /* issue a stop read command */ + tasklet_schedule(&cm206_tasklet); /* issue a stop read command */ stats(interrupt); } @@ -701,7 +703,7 @@ 4 c_stop waits for receive_buffer_full: 0xff */ -void cm206_bh(void) +static void cm206_tasklet_func(unsigned long ignore) { debug(("bh: %d\n", cd->background)); switch (cd->background) { @@ -745,6 +747,8 @@ } } +static DECLARE_TASKLET(cm206_tasklet, cm206_tasklet_func, 0); + /* This command clears the dsb_possible_media_change flag, so we must * retain it. */ @@ -1503,7 +1507,6 @@ blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_cm206_request, &cm206_lock); blk_queue_hardsect_size(BLK_DEFAULT_QUEUE(MAJOR_NR), 2048); - init_bh(CM206_BH, cm206_bh); memset(cd, 0, sizeof(*cd)); /* give'm some reasonable value */ cd->sector_last = -1; /* flag no data buffered */ diff -urNX dontdiff linux-2.5.22/drivers/char/amiserial.c linux-2.5.22-bh/drivers/char/amiserial.c --- linux-2.5.22/drivers/char/amiserial.c Sun Jun 2 18:44:53 2002 +++ linux-2.5.22-bh/drivers/char/amiserial.c Mon Jun 17 13:02:51 2002 @@ -102,8 +102,6 @@ static char *serial_name = "Amiga-builtin serial driver"; -static DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -276,8 +274,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } static _INLINE_ void receive_chars(struct async_struct *info) @@ -560,11 +557,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { struct async_struct *info = (struct async_struct *) private_; @@ -2118,8 +2110,6 @@ if (!request_mem_region(CUSTOM_PHYSADDR+0x30, 4, "amiserial [Paula]")) return -EBUSY; - init_bh(SERIAL_BH, do_serial_bh); - IRQ_ports = NULL; show_serial_version(); @@ -2243,7 +2233,6 @@ /* printk("Unloading %s: version %s\n", serial_name, serial_version); */ save_flags(flags); cli(); - remove_bh(SERIAL_BH); if ((e1 = tty_unregister_driver(&serial_driver))) printk("SERIAL: failed to unregister serial driver (%d)\n", e1); diff -urNX dontdiff linux-2.5.22/drivers/char/cyclades.c linux-2.5.22-bh/drivers/char/cyclades.c --- linux-2.5.22/drivers/char/cyclades.c Sun Jun 2 18:44:43 2002 +++ linux-2.5.22-bh/drivers/char/cyclades.c Mon Jun 17 13:01:32 2002 @@ -712,8 +712,6 @@ #define JIFFIES_DIFF(n, j) ((j) - (n)) -static DECLARE_TASK_QUEUE(tq_cyclades); - static struct tty_driver cy_serial_driver, cy_callout_driver; static int serial_refcount; @@ -934,8 +932,7 @@ cy_sched_event(struct cyclades_port *info, int event) { info->event |= 1 << event; /* remember what kind of event and who */ - queue_task(&info->tqueue, &tq_cyclades); /* it belongs to */ - mark_bh(CYCLADES_BH); /* then trigger event */ + queue_immediate_task(&info->tqueue); /* it belongs to */ } /* cy_sched_event */ @@ -962,12 +959,6 @@ * had to poll every port to see if that port needed servicing. */ static void -do_cyclades_bh(void) -{ - run_task_queue(&tq_cyclades); -} /* do_cyclades_bh */ - -static void do_softint(void *private_) { struct cyclades_port *info = (struct cyclades_port *) private_; @@ -5513,8 +5504,6 @@ unsigned short chip_number; int nports; - init_bh(CYCLADES_BH, do_cyclades_bh); - show_version(); /* Initialize the tty_driver structure */ @@ -5791,7 +5780,6 @@ #endif /* CONFIG_CYZ_INTR */ save_flags(flags); cli(); - remove_bh(CYCLADES_BH); if ((e1 = tty_unregister_driver(&cy_serial_driver))) printk("cyc: failed to unregister Cyclades serial driver(%d)\n", diff -urNX dontdiff linux-2.5.22/drivers/char/drm/gamma_dma.c linux-2.5.22-bh/drivers/char/drm/gamma_dma.c --- linux-2.5.22/drivers/char/drm/gamma_dma.c Sun Jun 2 18:44:53 2002 +++ linux-2.5.22-bh/drivers/char/drm/gamma_dma.c Mon Jun 17 11:54:32 2002 @@ -126,8 +126,7 @@ clear_bit(0, &dev->dma_flag); /* Dispatch new buffer */ - queue_task(&dev->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&dev->tq); } } diff -urNX dontdiff linux-2.5.22/drivers/char/drm/i830_dma.c linux-2.5.22-bh/drivers/char/drm/i830_dma.c --- linux-2.5.22/drivers/char/drm/i830_dma.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/drivers/char/drm/i830_dma.c Mon Jun 17 11:53:32 2002 @@ -1077,8 +1077,7 @@ else return; - queue_task(&dev->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&dev->tq); } void DRM(dma_immediate_bh)(void *device) diff -urNX dontdiff linux-2.5.22/drivers/char/dz.c linux-2.5.22-bh/drivers/char/dz.c --- linux-2.5.22/drivers/char/dz.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/drivers/char/dz.c Mon Jun 17 13:01:09 2002 @@ -73,8 +73,6 @@ #define DZ_INTR_DEBUG 1 -DECLARE_TASK_QUEUE(tq_serial); - static struct dz_serial *lines[4]; static unsigned char tmp_buffer[256]; @@ -189,8 +187,7 @@ static inline void dz_sched_event (struct dz_serial *info, int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } /* @@ -400,11 +397,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh (void) -{ - run_task_queue (&tq_serial); -} - static void do_softint (void *private_data) { struct dz_serial *info = (struct dz_serial *) private_data; @@ -1326,9 +1318,6 @@ { int i, flags; struct dz_serial *info; - - /* Setup base handler, and timer table. */ - init_bh(SERIAL_BH, do_serial_bh); show_serial_version(); diff -urNX dontdiff linux-2.5.22/drivers/char/esp.c linux-2.5.22-bh/drivers/char/esp.c --- linux-2.5.22/drivers/char/esp.c Sun Jun 2 18:44:38 2002 +++ linux-2.5.22-bh/drivers/char/esp.c Mon Jun 17 13:00:25 2002 @@ -107,8 +107,6 @@ static char serial_name[] __initdata = "ESP serial driver"; static char serial_version[] __initdata = "2.2"; -static DECLARE_TASK_QUEUE(tq_esp); - static struct tty_driver esp_driver, esp_callout_driver; static int serial_refcount; @@ -278,8 +276,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_esp); - mark_bh(ESP_BH); + queue_immediate_task(&info->tqueue); } static _INLINE_ struct esp_pio_buffer *get_pio_buffer(void) { @@ -770,11 +767,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_esp); -} - static void do_softint(void *private_) { struct esp_struct *info = (struct esp_struct *) private_; @@ -2511,8 +2503,6 @@ struct esp_struct *last_primary = 0; int esp[] = {0x100,0x140,0x180,0x200,0x240,0x280,0x300,0x380}; - init_bh(ESP_BH, do_serial_bh); - for (i = 0; i < NR_PRIMARY; i++) { if (irq[i] != 0) { if ((irq[i] < 2) || (irq[i] > 15) || (irq[i] == 6) || @@ -2715,7 +2705,6 @@ /* printk("Unloading %s: version %s\n", serial_name, serial_version); */ save_flags(flags); cli(); - remove_bh(ESP_BH); if ((e1 = tty_unregister_driver(&esp_driver))) printk("SERIAL: failed to unregister serial driver (%d)\n", e1); diff -urNX dontdiff linux-2.5.22/drivers/char/ip2/i2lib.c linux-2.5.22-bh/drivers/char/ip2/i2lib.c --- linux-2.5.22/drivers/char/ip2/i2lib.c Sun Jun 2 18:44:49 2002 +++ linux-2.5.22-bh/drivers/char/ip2/i2lib.c Mon Jun 17 11:53:14 2002 @@ -1582,8 +1582,7 @@ WRITE_UNLOCK_IRQRESTORE(&pB->read_fifo_spinlock,bflags); #ifdef USE_IQ - queue_task(&pCh->tqueue_input, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&pCh->tqueue_input); #else do_input(pCh); #endif @@ -1820,8 +1819,7 @@ } /* End of switch on status type */ if (dss_change) { #ifdef USE_IQ - queue_task(&pCh->tqueue_status, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&pCh->tqueue_status); #else do_status(pCh); #endif diff -urNX dontdiff linux-2.5.22/drivers/char/ip2main.c linux-2.5.22-bh/drivers/char/ip2main.c --- linux-2.5.22/drivers/char/ip2main.c Sun Jun 2 18:44:50 2002 +++ linux-2.5.22-bh/drivers/char/ip2main.c Mon Jun 17 12:04:22 2002 @@ -1386,10 +1386,7 @@ iiDisableMailIrq(pB); // Park the board on the immediate queue for processing. - queue_task(&pB->tqueue_interrupt, &tq_immediate); - -// Make sure the immediate queue is flagged to fire. - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&pB->tqueue_interrupt); } #else // We are using immediate servicing here. This sucks and can diff -urNX dontdiff linux-2.5.22/drivers/char/isicom.c linux-2.5.22-bh/drivers/char/isicom.c --- linux-2.5.22/drivers/char/isicom.c Mon Jun 17 04:49:04 2002 +++ linux-2.5.22-bh/drivers/char/isicom.c Mon Jun 17 13:00:39 2002 @@ -84,8 +84,6 @@ static struct isi_board isi_card[BOARD_COUNT]; static struct isi_port isi_ports[PORT_COUNT]; -DECLARE_TASK_QUEUE(tq_isicom); - static struct timer_list tx; static char re_schedule = 1; #ifdef ISICOM_DEBUG @@ -360,8 +358,7 @@ extern inline void schedule_bh(struct isi_port * port) { - queue_task(&port->bh_tqueue, &tq_isicom); - mark_bh(ISICOM_BH); + queue_immediate_task(&port->bh_tqueue); } /* Transmitter */ @@ -487,13 +484,6 @@ /* Interrupt handlers */ -static void do_isicom_bh(void) -{ - run_task_queue(&tq_isicom); -} - - - static void isicom_bottomhalf(void * data) { struct isi_port * port = (struct isi_port *) data; @@ -1886,10 +1876,6 @@ return 0; } - /* initialize bottom half */ - init_bh(ISICOM_BH, do_isicom_bh); - - memset(isi_ports, 0, sizeof(isi_ports)); for (card = 0; card < BOARD_COUNT; card++) { port = &isi_ports[card * 16]; @@ -2037,8 +2023,6 @@ set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ); - remove_bh(ISICOM_BH); - #ifdef ISICOM_DEBUG printk("ISICOM: isicom_tx tx_count = %ld.\n", tx_count); #endif diff -urNX dontdiff linux-2.5.22/drivers/char/pcmcia/synclink_cs.c linux-2.5.22-bh/drivers/char/pcmcia/synclink_cs.c --- linux-2.5.22/drivers/char/pcmcia/synclink_cs.c Sun Jun 2 18:44:46 2002 +++ linux-2.5.22-bh/drivers/char/pcmcia/synclink_cs.c Mon Jun 17 11:54:59 2002 @@ -1460,8 +1460,7 @@ if ( debug_level >= DEBUG_LEVEL_ISR ) printk("%s(%d):%s queueing bh task.\n", __FILE__,__LINE__,info->device_name); - queue_task(&info->task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&info->task); info->bh_requested = 1; } diff -urNX dontdiff linux-2.5.22/drivers/char/pcxx.c linux-2.5.22-bh/drivers/char/pcxx.c --- linux-2.5.22/drivers/char/pcxx.c Sun Jun 2 18:44:40 2002 +++ linux-2.5.22-bh/drivers/char/pcxx.c Mon Jun 17 13:00:54 2002 @@ -150,8 +150,6 @@ static struct timer_list pcxx_timer; -DECLARE_TASK_QUEUE(tq_pcxx); - static void pcxxpoll(unsigned long dummy); static void pcxxdelay(int); static void fepcmd(struct channel *, int, int, int, int, int); @@ -170,7 +168,6 @@ static void pcxxparam(struct tty_struct *, struct channel *ch); static void do_softint(void *); static inline void pcxe_sched_event(struct channel *, int); -static void do_pcxe_bh(void); static void pcxe_start(struct tty_struct *); static void pcxe_stop(struct tty_struct *); static void pcxe_throttle(struct tty_struct *); @@ -237,7 +234,6 @@ save_flags(flags); cli(); del_timer_sync(&pcxx_timer); - remove_bh(DIGI_BH); if ((e1 = tty_unregister_driver(&pcxe_driver))) printk("SERIAL: failed to unregister serial driver (%d)\n", e1); @@ -327,8 +323,7 @@ static inline void pcxe_sched_event(struct channel *info, int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_pcxx); - mark_bh(DIGI_BH); + queue_immediate_task(&info->tqueue); } static void pcxx_error(int line, char *msg) @@ -1222,8 +1217,6 @@ } memset(pcxe_termios_locked,0,sizeof(struct termios *)*nbdevs); - init_bh(DIGI_BH,do_pcxe_bh); - init_timer(&pcxx_timer); pcxx_timer.function = pcxxpoll; @@ -2372,12 +2365,6 @@ wake_up_interruptible(&info->open_wait); restore_flags(flags); } -} - - -static void do_pcxe_bh(void) -{ - run_task_queue(&tq_pcxx); } diff -urNX dontdiff linux-2.5.22/drivers/char/random.c linux-2.5.22-bh/drivers/char/random.c --- linux-2.5.22/drivers/char/random.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/drivers/char/random.c Mon Jun 17 12:58:18 2002 @@ -252,6 +252,7 @@ #include #include #include +#include #include #include diff -urNX dontdiff linux-2.5.22/drivers/char/rio/func.h linux-2.5.22-bh/drivers/char/rio/func.h --- linux-2.5.22/drivers/char/rio/func.h Sun Jun 2 18:44:49 2002 +++ linux-2.5.22-bh/drivers/char/rio/func.h Mon Jun 17 06:44:20 2002 @@ -39,6 +39,8 @@ #endif #endif +#include + /* rioboot.c */ int RIOBootCodeRTA(struct rio_info *, struct DownLoad *); int RIOBootCodeHOST(struct rio_info *, register struct DownLoad *); diff -urNX dontdiff linux-2.5.22/drivers/char/riscom8.c linux-2.5.22-bh/drivers/char/riscom8.c --- linux-2.5.22/drivers/char/riscom8.c Sun Jun 2 18:44:49 2002 +++ linux-2.5.22-bh/drivers/char/riscom8.c Mon Jun 17 13:02:18 2002 @@ -81,8 +81,6 @@ #define RS_EVENT_WRITE_WAKEUP 0 -static DECLARE_TASK_QUEUE(tq_riscom); - #define RISCOM_TYPE_NORMAL 1 #define RISCOM_TYPE_CALLOUT 2 @@ -339,17 +337,8 @@ static inline void rc_mark_event(struct riscom_port * port, int event) { - /* - * I'm not quite happy with current scheme all serial - * drivers use their own BH routine. - * It seems this easily can be done with one BH routine - * serving for all serial drivers. - * For now I must introduce another one - RISCOM8_BH. - * Still hope this will be changed in near future. - */ set_bit(event, &port->event); - queue_task(&port->tqueue, &tq_riscom); - mark_bh(RISCOM8_BH); + queue_immediate_task(&port->tqueue); } static inline struct riscom_port * rc_get_port(struct riscom_board const * bp, @@ -1720,11 +1709,6 @@ } } -static void do_riscom_bh(void) -{ - run_task_queue(&tq_riscom); -} - static void do_softint(void *private_) { struct riscom_port *port = (struct riscom_port *) private_; @@ -1751,7 +1735,6 @@ printk(KERN_ERR "rc: Couldn't get free page.\n"); return 1; } - init_bh(RISCOM8_BH, do_riscom_bh); memset(IRQ_to_board, 0, sizeof(IRQ_to_board)); memset(&riscom_driver, 0, sizeof(riscom_driver)); riscom_driver.magic = TTY_DRIVER_MAGIC; @@ -1830,7 +1813,6 @@ save_flags(flags); cli(); - remove_bh(RISCOM8_BH); free_page((unsigned long)tmp_buf); tty_unregister_driver(&riscom_driver); tty_unregister_driver(&riscom_callout_driver); diff -urNX dontdiff linux-2.5.22/drivers/char/serial.c linux-2.5.22-bh/drivers/char/serial.c --- linux-2.5.22/drivers/char/serial.c Sun Jun 2 18:44:45 2002 +++ linux-2.5.22-bh/drivers/char/serial.c Mon Jun 17 13:01:48 2002 @@ -245,8 +245,6 @@ static char *serial_name = "Serial driver"; -static DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -560,8 +558,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } static _INLINE_ void receive_chars(struct async_struct *info, @@ -1036,11 +1033,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { struct async_struct *info = (struct async_struct *) private_; @@ -5373,7 +5365,6 @@ int i; struct serial_state * state; - init_bh(SERIAL_BH, do_serial_bh); init_timer(&serial_timer); serial_timer.function = rs_timer; mod_timer(&serial_timer, jiffies + RS_STROBE_TIME); @@ -5702,7 +5693,6 @@ /* printk("Unloading %s: version %s\n", serial_name, serial_version); */ del_timer_sync(&serial_timer); save_flags(flags); cli(); - remove_bh(SERIAL_BH); if ((e1 = tty_unregister_driver(&serial_driver))) printk("serial: failed to unregister serial driver (%d)\n", e1); diff -urNX dontdiff linux-2.5.22/drivers/char/serial167.c linux-2.5.22-bh/drivers/char/serial167.c --- linux-2.5.22/drivers/char/serial167.c Sun Jun 2 18:44:48 2002 +++ linux-2.5.22-bh/drivers/char/serial167.c Mon Jun 17 13:02:05 2002 @@ -99,8 +99,6 @@ #define SERIAL_TYPE_CALLOUT 2 -DECLARE_TASK_QUEUE(tq_cyclades); - struct tty_driver cy_serial_driver, cy_callout_driver; extern int serial_console; static struct cyclades_port *serial_console_info = NULL; @@ -390,8 +388,7 @@ cy_sched_event(struct cyclades_port *info, int event) { info->event |= 1 << event; /* remember what kind of event and who */ - queue_task(&info->tqueue, &tq_cyclades); /* it belongs to */ - mark_bh(CYCLADES_BH); /* then trigger event */ + queue_immediate_task(&info->tqueue); /* it belongs to */ } /* cy_sched_event */ @@ -746,12 +743,6 @@ * had to poll every port to see if that port needed servicing. */ static void -do_cyclades_bh(void) -{ - run_task_queue(&tq_cyclades); -} /* do_cyclades_bh */ - -static void do_softint(void *private_) { struct cyclades_port *info = (struct cyclades_port *) private_; @@ -2443,8 +2434,6 @@ printk(KERN_ERR "Couldn't register MVME166/7 callout driver\n"); goto cleanup_serial_driver; } - - init_bh(CYCLADES_BH, do_cyclades_bh); port_num = 0; info = cy_port; diff -urNX dontdiff linux-2.5.22/drivers/char/sh-sci.c linux-2.5.22-bh/drivers/char/sh-sci.c --- linux-2.5.22/drivers/char/sh-sci.c Sun Jun 2 18:44:48 2002 +++ linux-2.5.22-bh/drivers/char/sh-sci.c Mon Jun 17 12:03:52 2002 @@ -431,8 +431,7 @@ static inline void sci_sched_event(struct sci_port *port, int event) { port->event |= 1 << event; - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); } static void sci_transmit_chars(struct sci_port *port) diff -urNX dontdiff linux-2.5.22/drivers/char/specialix.c linux-2.5.22-bh/drivers/char/specialix.c --- linux-2.5.22/drivers/char/specialix.c Sun Jun 2 18:44:52 2002 +++ linux-2.5.22-bh/drivers/char/specialix.c Mon Jun 17 13:02:30 2002 @@ -172,8 +172,6 @@ #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif -DECLARE_TASK_QUEUE(tq_specialix); - #undef RS_EVENT_WRITE_WAKEUP #define RS_EVENT_WRITE_WAKEUP 0 @@ -601,18 +599,8 @@ extern inline void sx_mark_event(struct specialix_port * port, int event) { - /* - * I'm not quite happy with current scheme all serial - * drivers use their own BH routine. - * It seems this easily can be done with one BH routine - * serving for all serial drivers. - * For now I must introduce another one - SPECIALIX_BH. - * Still hope this will be changed in near future. - * -- Dmitry. - */ set_bit(event, &port->event); - queue_task(&port->tqueue, &tq_specialix); - mark_bh(SPECIALIX_BH); + queue_immediate_task(&port->tqueue); } @@ -2197,12 +2185,6 @@ } -static void do_specialix_bh(void) -{ - run_task_queue(&tq_specialix); -} - - static void do_softint(void *private_) { struct specialix_port *port = (struct specialix_port *) private_; @@ -2230,7 +2212,6 @@ printk(KERN_ERR "sx: Couldn't get free page.\n"); return 1; } - init_bh(SPECIALIX_BH, do_specialix_bh); memset(&specialix_driver, 0, sizeof(specialix_driver)); specialix_driver.magic = TTY_DRIVER_MAGIC; specialix_driver.name = "ttyW"; diff -urNX dontdiff linux-2.5.22/drivers/char/synclink.c linux-2.5.22-bh/drivers/char/synclink.c --- linux-2.5.22/drivers/char/synclink.c Sun Jun 2 18:44:47 2002 +++ linux-2.5.22-bh/drivers/char/synclink.c Mon Jun 17 12:02:05 2002 @@ -1757,8 +1757,7 @@ if ( debug_level >= DEBUG_LEVEL_ISR ) printk("%s(%d):%s queueing bh task.\n", __FILE__,__LINE__,info->device_name); - queue_task(&info->task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&info->task); info->bh_requested = 1; } diff -urNX dontdiff linux-2.5.22/drivers/char/synclinkmp.c linux-2.5.22-bh/drivers/char/synclinkmp.c --- linux-2.5.22/drivers/char/synclinkmp.c Sun Jun 2 18:44:43 2002 +++ linux-2.5.22-bh/drivers/char/synclinkmp.c Mon Jun 17 12:01:49 2002 @@ -2572,8 +2572,7 @@ if ( debug_level >= DEBUG_LEVEL_ISR ) printk("%s(%d):%s queueing bh task.\n", __FILE__,__LINE__,port->device_name); - queue_task(&port->task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->task); port->bh_requested = 1; } } diff -urNX dontdiff linux-2.5.22/drivers/isdn/act2000/act2000.h linux-2.5.22-bh/drivers/isdn/act2000/act2000.h --- linux-2.5.22/drivers/isdn/act2000/act2000.h Sun Jun 2 18:44:37 2002 +++ linux-2.5.22-bh/drivers/isdn/act2000/act2000.h Mon Jun 17 11:37:39 2002 @@ -179,20 +179,17 @@ extern __inline__ void act2000_schedule_tx(act2000_card *card) { - queue_task(&card->snd_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->snd_tq); } extern __inline__ void act2000_schedule_rx(act2000_card *card) { - queue_task(&card->rcv_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->rcv_tq); } extern __inline__ void act2000_schedule_poll(act2000_card *card) { - queue_task(&card->poll_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->poll_tq); } extern char *act2000_find_eaz(act2000_card *, char); diff -urNX dontdiff linux-2.5.22/drivers/isdn/capi/kcapi.c linux-2.5.22-bh/drivers/isdn/capi/kcapi.c --- linux-2.5.22/drivers/isdn/capi/kcapi.c Sun Jun 2 18:44:52 2002 +++ linux-2.5.22-bh/drivers/isdn/capi/kcapi.c Mon Jun 17 11:52:40 2002 @@ -359,8 +359,7 @@ } skb_queue_tail(&recv_queue, skb); - queue_task(&tq_recv_notify, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&tq_recv_notify); return; error: diff -urNX dontdiff linux-2.5.22/drivers/isdn/eicon/eicon.h linux-2.5.22-bh/drivers/isdn/eicon/eicon.h --- linux-2.5.22/drivers/isdn/eicon/eicon.h Sun Jun 2 18:44:45 2002 +++ linux-2.5.22-bh/drivers/isdn/eicon/eicon.h Mon Jun 17 11:28:18 2002 @@ -349,20 +349,17 @@ extern __inline__ void eicon_schedule_tx(eicon_card *card) { - queue_task(&card->snd_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->snd_tq); } extern __inline__ void eicon_schedule_rx(eicon_card *card) { - queue_task(&card->rcv_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->rcv_tq); } extern __inline__ void eicon_schedule_ack(eicon_card *card) { - queue_task(&card->ack_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->ack_tq); } extern int eicon_addcard(int, int, int, char *, int); diff -urNX dontdiff linux-2.5.22/drivers/isdn/eicon/linsys.c linux-2.5.22-bh/drivers/isdn/eicon/linsys.c --- linux-2.5.22/drivers/isdn/eicon/linsys.c Sun Jun 2 18:44:48 2002 +++ linux-2.5.22-bh/drivers/isdn/eicon/linsys.c Mon Jun 17 11:30:06 2002 @@ -84,8 +84,7 @@ DivasTask.routine = DivasDoDpc; DivasTask.data = (void *) 0; - queue_task(&DivasTask, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&DivasTask); return 0; } @@ -97,8 +96,7 @@ DivasTask.routine = DivasDoRequestDpc; DivasTask.data = (void *) 0; - queue_task(&DivasTask, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&DivasTask); return 0; } diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/amd7930.c linux-2.5.22-bh/drivers/isdn/hisax/amd7930.c --- linux-2.5.22/drivers/isdn/hisax/amd7930.c Sun Jun 2 18:44:47 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/amd7930.c Mon Jun 17 11:44:26 2002 @@ -121,16 +121,14 @@ } else { clear_bit(BC_FLG_BUSY, &bcs->Flag); bcs->event |= 1 << B_XMTBUFREADY; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } } static void Bchan_xmit_callback(struct BCState *bcs) { - queue_task(&bcs->hw.amd7930.tq_xmt, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->hw.amd7930.tq_xmt); } /* B channel transmission: two modes (three, if you count L1_MODE_NULL) @@ -262,8 +260,7 @@ (void *) &Bchan_recv_callback, (void *) bcs); } - queue_task(&hw->tq_rcv, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&hw->tq_rcv); } static void @@ -309,7 +306,7 @@ skb_queue_tail(&bcs->rqueue, hw->rv_skb); hw->rv_skb = skb; bcs->event |= 1 << B_RCVBUFREADY; - queue_task(&bcs->tqueue, &tq_immediate); + queue_immediate_task(&bcs->tqueue); } } else if (len > 0) { /* Small packet received */ @@ -320,8 +317,7 @@ memcpy(skb_put(skb, len), hw->rv_skb->tail, len); skb_queue_tail(&bcs->rqueue, skb); bcs->event |= 1 << B_RCVBUFREADY; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } } else { /* Reception Error */ @@ -337,8 +333,7 @@ RCV_BUFSIZE/RCV_BUFBLKS); skb_queue_tail(&bcs->rqueue, skb); bcs->event |= 1 << B_RCVBUFREADY; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } } @@ -482,8 +477,7 @@ task.routine = (void *) DChannel_proc_rcv; task.data = (void *) cs; - queue_task(&task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&task); } if (cs->debug & L1_DEB_ISAC_FIFO) { @@ -524,8 +518,7 @@ task.routine = (void *) DChannel_proc_xmt; task.data = (void *) cs; - queue_task(&task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&task); } static void @@ -658,8 +651,7 @@ task.sync = 0; task.routine = (void *) &amd7930_new_ph; task.data = (void *) cs; - queue_task(&task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&task); } void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/amd7930_fn.c linux-2.5.22-bh/drivers/isdn/hisax/amd7930_fn.c --- linux-2.5.22/drivers/isdn/hisax/amd7930_fn.c Mon Jun 17 04:49:05 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/amd7930_fn.c Mon Jun 17 11:50:01 2002 @@ -278,8 +278,7 @@ } test_and_set_bit(event, &cs->event); - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } static void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/avm_pci.c linux-2.5.22-bh/drivers/isdn/hisax/avm_pci.c --- linux-2.5.22/drivers/isdn/hisax/avm_pci.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/avm_pci.c Mon Jun 17 11:41:25 2002 @@ -201,8 +201,7 @@ hdlc_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/config.c linux-2.5.22-bh/drivers/isdn/hisax/config.c --- linux-2.5.22/drivers/isdn/hisax/config.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/config.c Mon Jun 17 11:48:53 2002 @@ -1818,8 +1818,7 @@ static void hisax_sched_event(struct IsdnCardState *cs, int event) { cs->event |= 1 << event; - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } static void hisax_bh(struct IsdnCardState *cs) @@ -1845,8 +1844,7 @@ static void hisax_b_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } static inline void D_L2L1(struct hisax_d_if *d_if, int pr, void *arg) diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/hfc_2bds0.c linux-2.5.22-bh/drivers/isdn/hisax/hfc_2bds0.c --- linux-2.5.22/drivers/isdn/hisax/hfc_2bds0.c Sun Jun 2 18:44:40 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/hfc_2bds0.c Mon Jun 17 11:39:08 2002 @@ -203,8 +203,7 @@ hfc_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } static struct sk_buff @@ -647,8 +646,7 @@ sched_event_D(struct IsdnCardState *cs, int event) { test_and_set_bit(event, &cs->event); - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } static diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/hfc_2bs0.c linux-2.5.22-bh/drivers/isdn/hisax/hfc_2bs0.c --- linux-2.5.22/drivers/isdn/hisax/hfc_2bs0.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/hfc_2bs0.c Mon Jun 17 11:40:00 2002 @@ -87,8 +87,7 @@ hfc_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } static void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/hfc_pci.c linux-2.5.22-bh/drivers/isdn/hisax/hfc_pci.c --- linux-2.5.22/drivers/isdn/hisax/hfc_pci.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/hfc_pci.c Mon Jun 17 11:44:52 2002 @@ -195,8 +195,7 @@ sched_event_D_pci(struct IsdnCardState *cs, int event) { test_and_set_bit(event, &cs->event); - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } /*********************************/ @@ -206,8 +205,7 @@ hfcpci_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } /************************************************/ diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/hfc_sx.c linux-2.5.22-bh/drivers/isdn/hisax/hfc_sx.c --- linux-2.5.22/drivers/isdn/hisax/hfc_sx.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/hfc_sx.c Mon Jun 17 11:39:42 2002 @@ -465,8 +465,7 @@ sched_event_D_sx(struct IsdnCardState *cs, int event) { test_and_set_bit(event, &cs->event); - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } /*********************************/ @@ -476,8 +475,7 @@ hfcsx_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } /************************************************/ diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/hscx.c linux-2.5.22-bh/drivers/isdn/hisax/hscx.c --- linux-2.5.22/drivers/isdn/hisax/hscx.c Sun Jun 2 18:44:39 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/hscx.c Mon Jun 17 11:37:57 2002 @@ -96,8 +96,7 @@ hscx_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/icc.c linux-2.5.22-bh/drivers/isdn/hisax/icc.c --- linux-2.5.22/drivers/isdn/hisax/icc.c Sun Jun 2 18:44:40 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/icc.c Mon Jun 17 11:38:19 2002 @@ -192,8 +192,7 @@ icc_sched_event(struct IsdnCardState *cs, int event) { test_and_set_bit(event, &cs->event); - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/ipacx.c linux-2.5.22-bh/drivers/isdn/hisax/ipacx.c --- linux-2.5.22/drivers/isdn/hisax/ipacx.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/ipacx.c Mon Jun 17 11:50:53 2002 @@ -311,8 +311,7 @@ dch_sched_event(struct IsdnCardState *cs, int event) { set_bit(event, &cs->event); - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } //---------------------------------------------------------- @@ -603,8 +602,7 @@ bch_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } //---------------------------------------------------------- diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/isac.c linux-2.5.22-bh/drivers/isdn/hisax/isac.c --- linux-2.5.22/drivers/isdn/hisax/isac.c Sun Jun 2 18:44:42 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/isac.c Mon Jun 17 11:40:19 2002 @@ -196,8 +196,7 @@ isac_sched_event(struct IsdnCardState *cs, int event) { test_and_set_bit(event, &cs->event); - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/isar.c linux-2.5.22-bh/drivers/isdn/hisax/isar.c --- linux-2.5.22/drivers/isdn/hisax/isar.c Sun Jun 2 18:44:48 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/isar.c Mon Jun 17 11:47:57 2002 @@ -448,8 +448,7 @@ isar_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } static inline void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/jade.c linux-2.5.22-bh/drivers/isdn/hisax/jade.c --- linux-2.5.22/drivers/isdn/hisax/jade.c Sun Jun 2 18:44:46 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/jade.c Mon Jun 17 11:41:11 2002 @@ -139,8 +139,7 @@ jade_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } static void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/netjet.c linux-2.5.22-bh/drivers/isdn/hisax/netjet.c --- linux-2.5.22/drivers/isdn/hisax/netjet.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/netjet.c Mon Jun 17 11:40:57 2002 @@ -435,8 +435,7 @@ skb_queue_tail(&bcs->rqueue, skb); } bcs->event |= 1 << B_RCVBUFREADY; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); if (bcs->cs->debug & L1_DEB_RECEIVE_FRAME) printframe(bcs->cs, bcs->hw.tiger.rcvbuf, count, "rec"); @@ -792,8 +791,7 @@ cnt - s_cnt); } bcs->event |= 1 << B_XMTBUFREADY; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } } } else if (test_and_clear_bit(BC_FLG_NOFRAME, &bcs->Flag)) { diff -urNX dontdiff linux-2.5.22/drivers/isdn/hisax/w6692.c linux-2.5.22-bh/drivers/isdn/hisax/w6692.c --- linux-2.5.22/drivers/isdn/hisax/w6692.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/hisax/w6692.c Mon Jun 17 11:49:26 2002 @@ -136,16 +136,14 @@ W6692_sched_event(struct IsdnCardState *cs, int event) { test_and_set_bit(event, &cs->event); - queue_task(&cs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&cs->tqueue); } static void W6692B_sched_event(struct BCState *bcs, int event) { bcs->event |= 1 << event; - queue_task(&bcs->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bcs->tqueue); } static void diff -urNX dontdiff linux-2.5.22/drivers/isdn/hysdn/boardergo.c linux-2.5.22-bh/drivers/isdn/hysdn/boardergo.c --- linux-2.5.22/drivers/isdn/hysdn/boardergo.c Sun Jun 2 18:44:50 2002 +++ linux-2.5.22-bh/drivers/isdn/hysdn/boardergo.c Mon Jun 17 11:34:54 2002 @@ -60,8 +60,7 @@ /* start kernel task immediately after leaving all interrupts */ if (!card->hw_lock) { - queue_task(&card->irq_queue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->irq_queue); } restore_flags(flags); } /* ergo_interrupt */ @@ -177,8 +176,7 @@ card->err_log_state = ERRLOG_STATE_STOP; /* request stop */ restore_flags(flags); - queue_task(&card->irq_queue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->irq_queue); } /* ergo_set_errlog_state */ /******************************************/ diff -urNX dontdiff linux-2.5.22/drivers/isdn/hysdn/hycapi.c linux-2.5.22-bh/drivers/isdn/hysdn/hycapi.c --- linux-2.5.22/drivers/isdn/hysdn/hycapi.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/hysdn/hycapi.c Mon Jun 17 11:31:28 2002 @@ -131,8 +131,7 @@ } cinfo->tx_skb = skb; spin_unlock_irq(&cinfo->lock); - queue_task(&card->irq_queue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->irq_queue); } /*********************************************************** diff -urNX dontdiff linux-2.5.22/drivers/isdn/hysdn/hysdn_net.c linux-2.5.22-bh/drivers/isdn/hysdn/hysdn_net.c --- linux-2.5.22/drivers/isdn/hysdn/hysdn_net.c Sun Jun 2 18:44:40 2002 +++ linux-2.5.22-bh/drivers/isdn/hysdn/hysdn_net.c Mon Jun 17 11:31:10 2002 @@ -170,8 +170,7 @@ spin_unlock_irq(&lp->lock); if (lp->sk_count <= 3) { - queue_task(&((hysdn_card *) dev->priv)->irq_queue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&((hysdn_card *) dev->priv)->irq_queue); } return (0); /* success */ } /* net_send_packet */ diff -urNX dontdiff linux-2.5.22/drivers/isdn/hysdn/hysdn_sched.c linux-2.5.22-bh/drivers/isdn/hysdn/hysdn_sched.c --- linux-2.5.22/drivers/isdn/hysdn/hysdn_sched.c Sun Jun 2 18:44:42 2002 +++ linux-2.5.22-bh/drivers/isdn/hysdn/hysdn_sched.c Mon Jun 17 11:34:14 2002 @@ -175,8 +175,7 @@ card->async_busy = 1; /* request transfer */ /* now queue the task */ - queue_task(&card->irq_queue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->irq_queue); sti(); if (card->debug_flags & LOG_SCHED_ASYN) diff -urNX dontdiff linux-2.5.22/drivers/isdn/i4l/isdn_net.c linux-2.5.22-bh/drivers/isdn/i4l/isdn_net.c --- linux-2.5.22/drivers/isdn/i4l/isdn_net.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/isdn/i4l/isdn_net.c Mon Jun 17 11:30:50 2002 @@ -151,8 +151,7 @@ if (!(isdn_net_device_busy(lp))) { if (!skb_queue_empty(&lp->super_tx_queue)) { - queue_task(&lp->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&lp->tqueue); } else { isdn_net_device_wake_queue(lp); } @@ -997,8 +996,7 @@ // we can't grab the lock from irq context, // so we just queue the packet skb_queue_tail(&lp->super_tx_queue, skb); - queue_task(&lp->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&lp->tqueue); return; } diff -urNX dontdiff linux-2.5.22/drivers/isdn/pcbit/layer2.c linux-2.5.22-bh/drivers/isdn/pcbit/layer2.c --- linux-2.5.22/drivers/isdn/pcbit/layer2.c Sun Jun 2 18:44:52 2002 +++ linux-2.5.22-bh/drivers/isdn/pcbit/layer2.c Mon Jun 17 11:51:23 2002 @@ -81,8 +81,7 @@ static __inline__ void pcbit_sched_delivery(struct pcbit_dev *dev) { - queue_task(&dev->qdelivery, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&dev->qdelivery); } diff -urNX dontdiff linux-2.5.22/drivers/isdn/tpam/tpam_queues.c linux-2.5.22-bh/drivers/isdn/tpam/tpam_queues.c --- linux-2.5.22/drivers/isdn/tpam/tpam_queues.c Sun Jun 2 18:44:40 2002 +++ linux-2.5.22-bh/drivers/isdn/tpam/tpam_queues.c Mon Jun 17 11:52:20 2002 @@ -36,8 +36,7 @@ skb_queue_tail(&card->sendq, skb); /* queue the board's send task struct for immediate treatment */ - queue_task(&card->send_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->send_tq); } /* @@ -58,8 +57,7 @@ skb_queue_tail(&channel->sendq, skb); /* queue the channel's send task struct for immediate treatment */ - queue_task(&channel->card->send_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&channel->card->send_tq); } /* @@ -169,8 +167,7 @@ else { /* put the message in the receive queue */ skb_queue_tail(&card->recvq, skb); - queue_task(&card->recv_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->recv_tq); } return; } @@ -187,8 +184,7 @@ spin_unlock(&card->lock); /* schedule the send queue for execution */ - queue_task(&card->send_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&card->send_tq); return; } diff -urNX dontdiff linux-2.5.22/drivers/macintosh/macserial.c linux-2.5.22-bh/drivers/macintosh/macserial.c --- linux-2.5.22/drivers/macintosh/macserial.c Sun Jun 2 18:44:48 2002 +++ linux-2.5.22-bh/drivers/macintosh/macserial.c Mon Jun 17 13:03:52 2002 @@ -104,8 +104,6 @@ #endif #define ZS_CLOCK 3686400 /* Z8530 RTxC input clock rate */ -static DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -372,8 +370,7 @@ int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(MACSERIAL_BH); + queue_immediate_task(&info->tqueue); } /* Work out the flag value for a z8530 status value. */ @@ -721,11 +718,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using rs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { struct mac_serial *info = (struct mac_serial *) private_; @@ -2571,9 +2563,6 @@ int channel, i; unsigned long flags; struct mac_serial *info; - - /* Setup base handler, and timer table. */ - init_bh(MACSERIAL_BH, do_serial_bh); /* Find out how many Z8530 SCCs we have */ if (zs_chain == 0) diff -urNX dontdiff linux-2.5.22/drivers/message/fusion/mptlan.c linux-2.5.22-bh/drivers/message/fusion/mptlan.c --- linux-2.5.22/drivers/message/fusion/mptlan.c Sun Jun 2 18:44:49 2002 +++ linux-2.5.22-bh/drivers/message/fusion/mptlan.c Mon Jun 17 12:27:50 2002 @@ -855,8 +855,7 @@ struct mpt_lan_priv *priv = dev->priv; if (test_and_set_bit(0, &priv->post_buckets_active) == 0) { - queue_task(&priv->post_buckets_task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&priv->post_buckets_task); dioprintk((KERN_INFO MYNAM ": %s/%s: Queued post_buckets task.\n", IOC_AND_NETDEV_NAMES_s_s(dev) )); } diff -urNX dontdiff linux-2.5.22/drivers/message/i2o/i2o_lan.c linux-2.5.22-bh/drivers/message/i2o/i2o_lan.c --- linux-2.5.22/drivers/message/i2o/i2o_lan.c Sun Jun 2 18:44:43 2002 +++ linux-2.5.22-bh/drivers/message/i2o/i2o_lan.c Mon Jun 17 12:28:05 2002 @@ -386,8 +386,7 @@ if (atomic_read(&priv->buckets_out) <= priv->max_buckets_out - priv->bucket_thresh) { run_i2o_post_buckets_task.data = (void *)dev; - queue_task(&run_i2o_post_buckets_task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&run_i2o_post_buckets_task); } return; diff -urNX dontdiff linux-2.5.22/drivers/net/aironet4500_core.c linux-2.5.22-bh/drivers/net/aironet4500_core.c --- linux-2.5.22/drivers/net/aironet4500_core.c Sun Jun 2 18:44:38 2002 +++ linux-2.5.22-bh/drivers/net/aironet4500_core.c Mon Jun 17 11:19:05 2002 @@ -2203,8 +2203,7 @@ #define AWC_QUEUE_BH {\ if (!priv->bh_active && !priv->bh_running){\ priv->bh_active = 1;\ - queue_task(&priv->immediate_bh, &tq_immediate);\ - mark_bh(IMMEDIATE_BH);\ + queue_immediate_task(&priv->immediate_bh);\ }\ } diff -urNX dontdiff linux-2.5.22/drivers/net/hamradio/dmascc.c linux-2.5.22-bh/drivers/net/hamradio/dmascc.c --- linux-2.5.22/drivers/net/hamradio/dmascc.c Sun Jun 2 18:44:48 2002 +++ linux-2.5.22-bh/drivers/net/hamradio/dmascc.c Mon Jun 17 11:17:18 2002 @@ -1073,8 +1073,7 @@ priv->rx_head = (priv->rx_head + 1) % NUM_RX_BUF; priv->rx_count++; /* Mark bottom half handler */ - queue_task(&priv->rx_task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&priv->rx_task); } else { priv->stats.rx_errors++; priv->stats.rx_over_errors++; diff -urNX dontdiff linux-2.5.22/drivers/net/plip.c linux-2.5.22-bh/drivers/net/plip.c --- linux-2.5.22/drivers/net/plip.c Sun Jun 2 18:44:53 2002 +++ linux-2.5.22-bh/drivers/net/plip.c Mon Jun 17 11:23:14 2002 @@ -380,8 +380,7 @@ struct net_local *nl = (struct net_local *)dev->priv; if (nl->is_deferred) { - queue_task(&nl->immediate, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&nl->immediate); } } @@ -741,8 +740,7 @@ if (snd->state != PLIP_PK_DONE) { nl->connection = PLIP_CN_SEND; spin_unlock_irq(&nl->lock); - queue_task(&nl->immediate, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&nl->immediate); enable_parport_interrupts (dev); ENABLE(dev->irq); return OK; @@ -998,8 +996,7 @@ rcv->state = PLIP_PK_TRIGGER; nl->connection = PLIP_CN_RECEIVE; nl->timeout_count = 0; - queue_task(&nl->immediate, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&nl->immediate); break; case PLIP_CN_RECEIVE: @@ -1052,8 +1049,7 @@ nl->connection = PLIP_CN_SEND; nl->timeout_count = 0; } - queue_task(&nl->immediate, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&nl->immediate); spin_unlock_irq(&nl->lock); return 0; diff -urNX dontdiff linux-2.5.22/drivers/net/tlan.c linux-2.5.22-bh/drivers/net/tlan.c --- linux-2.5.22/drivers/net/tlan.c Sun Jun 2 18:44:42 2002 +++ linux-2.5.22-bh/drivers/net/tlan.c Mon Jun 17 11:20:48 2002 @@ -1681,8 +1681,7 @@ TLan_ReadAndClearStats( dev, TLAN_RECORD ); outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD ); - queue_task(&priv->tlan_tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&priv->tlan_tqueue); netif_wake_queue(dev); ack = 0; diff -urNX dontdiff linux-2.5.22/drivers/net/wan/sdlamain.c linux-2.5.22-bh/drivers/net/wan/sdlamain.c --- linux-2.5.22/drivers/net/wan/sdlamain.c Mon Jun 17 04:49:06 2002 +++ linux-2.5.22-bh/drivers/net/wan/sdlamain.c Mon Jun 17 11:19:58 2002 @@ -234,9 +234,9 @@ * On each rx_interrupt, the whole task queue * (wanpipe_tq_custom) will be queued into - * IMMEDIATE_BH via wanpipe_mark_bh() call. + * tq_immediate via wanpipe_mark_bh() call. - * The IMMEDIATE_BH will execute run_wanpipe_tq() + * The tq_immediate will execute run_wanpipe_tq() * function, which will execute all pending, * tasks in wanpipe_tq_custom queue */ @@ -1306,8 +1306,7 @@ void wanpipe_mark_bh (void) { if (!test_and_set_bit(0,(void*)&wanpipe_bh_critical)){ - queue_task(&wanpipe_tq_task,&tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&wanpipe_tq_task); clear_bit(0,(void*)&wanpipe_bh_critical); } } diff -urNX dontdiff linux-2.5.22/drivers/pcmcia/pci_socket.c linux-2.5.22-bh/drivers/pcmcia/pci_socket.c --- linux-2.5.22/drivers/pcmcia/pci_socket.c Sun Jun 2 18:44:49 2002 +++ linux-2.5.22-bh/drivers/pcmcia/pci_socket.c Mon Jun 17 13:10:15 2002 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include diff -urNX dontdiff linux-2.5.22/drivers/pcmcia/yenta.c linux-2.5.22-bh/drivers/pcmcia/yenta.c --- linux-2.5.22/drivers/pcmcia/yenta.c Mon Jun 17 04:49:06 2002 +++ linux-2.5.22-bh/drivers/pcmcia/yenta.c Mon Jun 17 13:11:16 2002 @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include diff -urNX dontdiff linux-2.5.22/drivers/s390/char/con3215.c linux-2.5.22-bh/drivers/s390/char/con3215.c --- linux-2.5.22/drivers/s390/char/con3215.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/s390/char/con3215.c Mon Jun 17 12:11:34 2002 @@ -381,8 +381,7 @@ raw->tqueue.sync = 0; raw->tqueue.routine = raw3215_softint; raw->tqueue.data = raw; - queue_task(&raw->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&raw->tqueue); } /* diff -urNX dontdiff linux-2.5.22/drivers/s390/char/ctrlchar.c linux-2.5.22-bh/drivers/s390/char/ctrlchar.c --- linux-2.5.22/drivers/s390/char/ctrlchar.c Sun Jun 2 18:44:53 2002 +++ linux-2.5.22-bh/drivers/s390/char/ctrlchar.c Mon Jun 17 12:12:15 2002 @@ -67,8 +67,7 @@ if (len == 3) { ctrlchar_sysrq_key = buf[2]; ctrlchar_tq.data = tty; - queue_task(&ctrlchar_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&ctrlchar_tq); return (char *)-1; } break; diff -urNX dontdiff linux-2.5.22/drivers/s390/char/tapeblock.c linux-2.5.22-bh/drivers/s390/char/tapeblock.c --- linux-2.5.22/drivers/s390/char/tapeblock.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/s390/char/tapeblock.c Mon Jun 17 12:11:48 2002 @@ -415,8 +415,7 @@ td->blk_data.bh_tq.routine = (void *) (void *) run_tapeblock_exec_IO; td->blk_data.bh_tq.data = td; - queue_task (&td->blk_data.bh_tq, &tq_immediate); - mark_bh (IMMEDIATE_BH); + queue_immediate_task (&td->blk_data.bh_tq); return; } diff -urNX dontdiff linux-2.5.22/drivers/s390/char/tubfs.c linux-2.5.22-bh/drivers/s390/char/tubfs.c --- linux-2.5.22/drivers/s390/char/tubfs.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/s390/char/tubfs.c Mon Jun 17 12:11:06 2002 @@ -277,8 +277,7 @@ tubp->flags |= TUB_BHPENDING; tubp->tqueue.routine = fs3270_bh; tubp->tqueue.data = tubp; - queue_task(&tubp->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&tubp->tqueue); } /* diff -urNX dontdiff linux-2.5.22/drivers/s390/char/tubtty.c linux-2.5.22-bh/drivers/s390/char/tubtty.c --- linux-2.5.22/drivers/s390/char/tubtty.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/s390/char/tubtty.c Mon Jun 17 12:12:01 2002 @@ -665,8 +665,7 @@ tubp->flags |= TUB_BHPENDING; tubp->tqueue.routine = tty3270_bh; tubp->tqueue.data = tubp; - queue_task(&tubp->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&tubp->tqueue); } /* diff -urNX dontdiff linux-2.5.22/drivers/s390/net/ctctty.c linux-2.5.22-bh/drivers/s390/net/ctctty.c --- linux-2.5.22/drivers/s390/net/ctctty.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/s390/net/ctctty.c Mon Jun 17 12:14:01 2002 @@ -272,8 +272,7 @@ */ skb_queue_tail(&info->rx_queue, skb); /* Schedule dequeuing */ - queue_task(&info->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&info->tq); } static int @@ -390,8 +389,7 @@ skb_reserve(skb, skb_res); *(skb_put(skb, 1)) = c; skb_queue_head(&info->tx_queue, skb); - queue_task(&info->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&info->tq); } static void @@ -400,8 +398,7 @@ if (ctc_tty_shuttingdown) return; info->flags |= CTC_ASYNC_TX_LINESTAT; - queue_task(&info->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&info->tq); } static void @@ -562,8 +559,7 @@ } if (skb_queue_len(&info->tx_queue)) { info->lsr &= ~UART_LSR_TEMT; - queue_task(&info->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&info->tq); } if (from_user) up(&info->write_sem); @@ -628,8 +624,7 @@ return; if (tty->stopped || tty->hw_stopped || (!skb_queue_len(&info->tx_queue))) return; - queue_task(&info->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&info->tq); } /* @@ -1182,8 +1177,7 @@ info->lsr |= UART_LSR_TEMT; again |= ctc_tty_readmodem(info); if (again) { - queue_task(&info->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&info->tq); } } spin_unlock_irqrestore(&ctc_tty_lock, saveflags); diff -urNX dontdiff linux-2.5.22/drivers/s390/net/iucv.c linux-2.5.22-bh/drivers/s390/net/iucv.c --- linux-2.5.22/drivers/s390/net/iucv.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/s390/net/iucv.c Mon Jun 17 12:12:31 2002 @@ -2202,8 +2202,7 @@ spin_unlock(&iucv_irq_queue_lock); if (atomic_compare_and_swap (0, 1, &iucv_bh_scheduled) == 0) { - queue_task (&iucv_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task (&iucv_tq); } irq_exit(cpu, 0x4000); diff -urNX dontdiff linux-2.5.22/drivers/s390/net/lcs.c linux-2.5.22-bh/drivers/s390/net/lcs.c --- linux-2.5.22/drivers/s390/net/lcs.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/drivers/s390/net/lcs.c Mon Jun 17 12:14:24 2002 @@ -1444,8 +1444,7 @@ * needing mod usage counts */ lcs_debug_event(2, "lcs_queue_write write=%p\n", write); write->resume_queued = TRUE; - queue_task(&write->resume_task, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&write->resume_task); } static void diff -urNX dontdiff linux-2.5.22/drivers/sbus/audio/dmy.c linux-2.5.22-bh/drivers/sbus/audio/dmy.c --- linux-2.5.22/drivers/sbus/audio/dmy.c Sun Jun 2 18:44:44 2002 +++ linux-2.5.22-bh/drivers/sbus/audio/dmy.c Mon Jun 17 12:09:52 2002 @@ -552,8 +552,7 @@ dummy_chip->tqueue.routine = dummy_output_done_task; dummy_chip->tqueue.data = drv; - queue_task(&dummy_chip->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&dummy_chip->tqueue); } static void dummy_start_input(struct sparcaudio_driver *drv, __u8 * buffer, diff -urNX dontdiff linux-2.5.22/drivers/sbus/char/aurora.c linux-2.5.22-bh/drivers/sbus/char/aurora.c --- linux-2.5.22/drivers/sbus/char/aurora.c Sun Jun 2 18:44:42 2002 +++ linux-2.5.22-bh/drivers/sbus/char/aurora.c Mon Jun 17 13:03:01 2002 @@ -105,8 +105,6 @@ static struct termios * aurora_termios[AURORA_TNPORTS] = { NULL, }; static struct termios * aurora_termios_locked[AURORA_TNPORTS] = { NULL, }; -DECLARE_TASK_QUEUE(tq_aurora); - static inline int aurora_paranoia_check(struct Aurora_port const * port, kdev_t device, const char *routine) { @@ -437,8 +435,7 @@ printk("aurora_mark_event: start\n"); #endif set_bit(event, &port->event); - queue_task(&port->tqueue, &tq_aurora); - mark_bh(AURORA_BH); + queue_immediate_task(&port->tqueue); #ifdef AURORA_DEBUG printk("aurora_mark_event: end\n"); #endif @@ -2267,11 +2264,6 @@ #endif } -static void do_aurora_bh(void) -{ - run_task_queue(&tq_aurora); -} - static void do_softint(void *private_) { struct Aurora_port *port = (struct Aurora_port *) private_; @@ -2308,7 +2300,6 @@ printk(KERN_ERR "aurora: Couldn't get free page.\n"); return 1; } - init_bh(AURORA_BH, do_aurora_bh); /* memset(IRQ_to_board, 0, sizeof(IRQ_to_board));*/ memset(&aurora_driver, 0, sizeof(aurora_driver)); aurora_driver.magic = TTY_DRIVER_MAGIC; diff -urNX dontdiff linux-2.5.22/drivers/sbus/char/sab82532.c linux-2.5.22-bh/drivers/sbus/char/sab82532.c --- linux-2.5.22/drivers/sbus/char/sab82532.c Sun Jun 2 18:44:47 2002 +++ linux-2.5.22-bh/drivers/sbus/char/sab82532.c Mon Jun 17 13:03:23 2002 @@ -42,14 +42,6 @@ #include "sunserial.h" -static DECLARE_TASK_QUEUE(tq_serial); - -/* This is (one of many) a special gross hack to allow SU and - * SAB serials to co-exist on the same machine. -DaveM - */ -#undef SERIAL_BH -#define SERIAL_BH AURORA_BH - static struct tty_driver serial_driver, callout_driver; static int sab82532_refcount; @@ -313,8 +305,7 @@ static void sab82532_sched_event(struct sab82532 *info, int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } static void receive_chars(struct sab82532 *info, @@ -654,11 +645,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using sab82532_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { struct sab82532 *info = (struct sab82532 *)private_; @@ -2225,8 +2211,6 @@ if (!sab82532_chain) return -ENODEV; - init_bh(SERIAL_BH, do_serial_bh); - show_serial_version(); /* Initialize the tty_driver structure */ @@ -2441,7 +2425,6 @@ /* printk("Unloading %s: version %s\n", serial_name, serial_version); */ save_flags(flags); cli(); - remove_bh(SERIAL_BH); if ((e1 = tty_unregister_driver(&serial_driver))) printk("SERIAL: failed to unregister serial driver (%d)\n", e1); diff -urNX dontdiff linux-2.5.22/drivers/sbus/char/su.c linux-2.5.22-bh/drivers/sbus/char/su.c --- linux-2.5.22/drivers/sbus/char/su.c Sun Jun 2 18:44:43 2002 +++ linux-2.5.22-bh/drivers/sbus/char/su.c Mon Jun 17 13:03:14 2002 @@ -173,8 +173,6 @@ static char *serial_name = "PCIO serial driver"; static char serial_version[16]; -static DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -345,8 +343,7 @@ su_sched_event(struct su_struct *info, int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } static void @@ -683,11 +680,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using su_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { struct su_struct *info = (struct su_struct *) private_; @@ -2480,7 +2472,6 @@ int i; struct su_struct *info; - init_bh(SERIAL_BH, do_serial_bh); show_su_version(); /* Initialize the tty_driver structure */ diff -urNX dontdiff linux-2.5.22/drivers/sbus/char/zs.c linux-2.5.22-bh/drivers/sbus/char/zs.c --- linux-2.5.22/drivers/sbus/char/zs.c Sun Jun 2 18:44:53 2002 +++ linux-2.5.22-bh/drivers/sbus/char/zs.c Mon Jun 17 13:03:38 2002 @@ -135,8 +135,6 @@ #define ZS_CLOCK 4915200 /* Zilog input clock rate */ -DECLARE_TASK_QUEUE(tq_serial); - static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -479,8 +477,7 @@ static void zs_sched_event(struct sun_serial *info, int event) { info->event |= 1 << event; - queue_task(&info->tqueue, &tq_serial); - mark_bh(SERIAL_BH); + queue_immediate_task(&info->tqueue); } #ifndef __sparc_v9__ @@ -731,11 +728,6 @@ * interrupt driver proper are done; the interrupt driver schedules * them using zs_sched_event(), and they get done here. */ -static void do_serial_bh(void) -{ - run_task_queue(&tq_serial); -} - static void do_softint(void *private_) { struct sun_serial *info = (struct sun_serial *) private_; @@ -2430,9 +2422,6 @@ unsigned long flags; struct sun_serial *info; char dummy; - - /* Setup base handler, and timer table. */ - init_bh(SERIAL_BH, do_serial_bh); show_serial_version(); diff -urNX dontdiff linux-2.5.22/drivers/scsi/aha152x.c linux-2.5.22-bh/drivers/scsi/aha152x.c --- linux-2.5.22/drivers/scsi/aha152x.c Mon Jun 17 04:49:06 2002 +++ linux-2.5.22-bh/drivers/scsi/aha152x.c Mon Jun 17 12:06:55 2002 @@ -1941,8 +1941,7 @@ /* Poke the BH handler */ HOSTDATA(shpnt)->service++; aha152x_tq.routine = (void *) run; - queue_task(&aha152x_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&aha152x_tq); } /* diff -urNX dontdiff linux-2.5.22/drivers/scsi/atari_NCR5380.c linux-2.5.22-bh/drivers/scsi/atari_NCR5380.c --- linux-2.5.22/drivers/scsi/atari_NCR5380.c Sun Jun 2 18:44:51 2002 +++ linux-2.5.22-bh/drivers/scsi/atari_NCR5380.c Mon Jun 17 12:07:45 2002 @@ -654,8 +654,7 @@ queue it on the 'immediate' task queue, to be processed immediately after the current interrupt processing has finished. */ - queue_task(&NCR5380_tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&NCR5380_tqueue); } /* else: nothing to do: the running NCR5380_main() will pick up any newly queued command. */ diff -urNX dontdiff linux-2.5.22/drivers/scsi/imm.c linux-2.5.22-bh/drivers/scsi/imm.c --- linux-2.5.22/drivers/scsi/imm.c Sun Jun 2 18:44:53 2002 +++ linux-2.5.22-bh/drivers/scsi/imm.c Mon Jun 17 12:09:13 2002 @@ -1105,8 +1105,7 @@ imm_hosts[host_no].imm_tq.data = imm_hosts + host_no; imm_hosts[host_no].imm_tq.sync = 0; - queue_task(&imm_hosts[host_no].imm_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&imm_hosts[host_no].imm_tq); return 0; } diff -urNX dontdiff linux-2.5.22/drivers/scsi/mac_NCR5380.c linux-2.5.22-bh/drivers/scsi/mac_NCR5380.c --- linux-2.5.22/drivers/scsi/mac_NCR5380.c Sun Jun 2 18:44:44 2002 +++ linux-2.5.22-bh/drivers/scsi/mac_NCR5380.c Mon Jun 17 12:07:28 2002 @@ -672,8 +672,7 @@ queue it on the 'immediate' task queue, to be processed immediately after the current interrupt processing has finished. */ - queue_task(&NCR5380_tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&NCR5380_tqueue); } /* else: nothing to do: the running NCR5380_main() will pick up any newly queued command. */ diff -urNX dontdiff linux-2.5.22/drivers/scsi/oktagon_esp.c linux-2.5.22-bh/drivers/scsi/oktagon_esp.c --- linux-2.5.22/drivers/scsi/oktagon_esp.c Sun Jun 2 18:44:40 2002 +++ linux-2.5.22-bh/drivers/scsi/oktagon_esp.c Mon Jun 17 12:05:48 2002 @@ -516,8 +516,7 @@ if(dma_on) { tq_fake_dma.sync = 0; - queue_task(&tq_fake_dma,&tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&tq_fake_dma); } #else while(len && !dma_irq_p(esp)) diff -urNX dontdiff linux-2.5.22/drivers/scsi/ppa.c linux-2.5.22-bh/drivers/scsi/ppa.c --- linux-2.5.22/drivers/scsi/ppa.c Sun Jun 2 18:44:39 2002 +++ linux-2.5.22-bh/drivers/scsi/ppa.c Mon Jun 17 12:05:26 2002 @@ -986,8 +986,7 @@ ppa_hosts[host_no].ppa_tq.data = ppa_hosts + host_no; ppa_hosts[host_no].ppa_tq.sync = 0; - queue_task(&ppa_hosts[host_no].ppa_tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&ppa_hosts[host_no].ppa_tq); return 0; } diff -urNX dontdiff linux-2.5.22/drivers/scsi/scsi.c linux-2.5.22-bh/drivers/scsi/scsi.c --- linux-2.5.22/drivers/scsi/scsi.c Mon Jun 17 04:49:06 2002 +++ linux-2.5.22-bh/drivers/scsi/scsi.c Mon Jun 17 04:54:55 2002 @@ -1089,6 +1089,9 @@ SCSI_LOG_MLQUEUE(3, printk("Leaving scsi_do_cmd()\n")); } +void scsi_tasklet_func(unsigned long); +static DECLARE_TASKLET(scsi_tasklet, scsi_tasklet_func, 0); + /* * This function is the mid-level interrupt routine, which decides how * to handle error conditions. Each invocation of this function must @@ -1186,7 +1189,7 @@ /* * Mark the bottom half handler to be run. */ - mark_bh(SCSI_BH); + tasklet_hi_schedule(&scsi_tasklet); } /* @@ -1212,7 +1215,7 @@ * half queue. Thus the only time we hold the lock here is when * we wish to atomically remove the contents of the queue. */ -void scsi_bottom_half_handler(void) +void scsi_tasklet_func(unsigned long ignore) { Scsi_Cmnd *SCpnt; Scsi_Cmnd *SCnext; @@ -2544,11 +2547,6 @@ if (scsihosts) printk(KERN_INFO "scsi: host order: %s\n", scsihosts); scsi_host_no_init (scsihosts); - /* - * This is where the processing takes place for most everything - * when commands are completed. - */ - init_bh(SCSI_BH, scsi_bottom_half_handler); return 0; } @@ -2558,7 +2556,7 @@ Scsi_Host_Name *shn, *shn2 = NULL; int i; - remove_bh(SCSI_BH); + tasklet_kill(&scsi_tasklet); devfs_unregister (scsi_devfs_handle); for (shn = scsi_host_no_list;shn;shn = shn->next) { diff -urNX dontdiff linux-2.5.22/drivers/scsi/sun3_NCR5380.c linux-2.5.22-bh/drivers/scsi/sun3_NCR5380.c --- linux-2.5.22/drivers/scsi/sun3_NCR5380.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/drivers/scsi/sun3_NCR5380.c Mon Jun 17 12:07:15 2002 @@ -660,8 +660,7 @@ queue it on the 'immediate' task queue, to be processed immediately after the current interrupt processing has finished. */ - queue_task(&NCR5380_tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&NCR5380_tqueue); } /* else: nothing to do: the running NCR5380_main() will pick up any newly queued command. */ diff -urNX dontdiff linux-2.5.22/drivers/usb/class/bluetty.c linux-2.5.22-bh/drivers/usb/class/bluetty.c --- linux-2.5.22/drivers/usb/class/bluetty.c Sun Jun 2 18:44:43 2002 +++ linux-2.5.22-bh/drivers/usb/class/bluetty.c Mon Jun 17 12:24:50 2002 @@ -1007,8 +1007,7 @@ } /* wake up our little function to let the tty layer know that something happened */ - queue_task(&bluetooth->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&bluetooth->tqueue); return; } diff -urNX dontdiff linux-2.5.22/drivers/usb/class/cdc-acm.c linux-2.5.22-bh/drivers/usb/class/cdc-acm.c --- linux-2.5.22/drivers/usb/class/cdc-acm.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/drivers/usb/class/cdc-acm.c Mon Jun 17 12:24:33 2002 @@ -272,8 +272,7 @@ if (urb->status) dbg("nonzero write bulk status received: %d", urb->status); - queue_task(&acm->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&acm->tqueue); } static void acm_softint(void *private) diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/cyberjack.c linux-2.5.22-bh/drivers/usb/serial/cyberjack.c --- linux-2.5.22/drivers/usb/serial/cyberjack.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/cyberjack.c Mon Jun 17 12:24:18 2002 @@ -430,8 +430,7 @@ /* Throw away data. No better idea what to do with it. */ priv->wrfilled=0; priv->wrsent=0; - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } @@ -447,13 +446,11 @@ priv->wrsent=0; } - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/empeg.c linux-2.5.22-bh/drivers/usb/serial/empeg.c --- linux-2.5.22/drivers/usb/serial/empeg.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/empeg.c Mon Jun 17 12:18:01 2002 @@ -359,8 +359,7 @@ return; } - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/ftdi_sio.c linux-2.5.22-bh/drivers/usb/serial/ftdi_sio.c --- linux-2.5.22/drivers/usb/serial/ftdi_sio.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/ftdi_sio.c Mon Jun 17 12:16:50 2002 @@ -477,8 +477,7 @@ dbg("nonzero write bulk status received: %d", urb->status); return; } - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } /* ftdi_sio_write_bulk_callback */ diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/ipaq.c linux-2.5.22-bh/drivers/usb/serial/ipaq.c --- linux-2.5.22/drivers/usb/serial/ipaq.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/ipaq.c Mon Jun 17 12:17:07 2002 @@ -446,8 +446,7 @@ priv->active = 0; spin_unlock_irqrestore(&write_list_lock, flags); } - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/ir-usb.c linux-2.5.22-bh/drivers/usb/serial/ir-usb.c --- linux-2.5.22/drivers/usb/serial/ir-usb.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/ir-usb.c Mon Jun 17 12:18:39 2002 @@ -422,8 +422,7 @@ urb->actual_length, urb->transfer_buffer); - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/keyspan.c linux-2.5.22-bh/drivers/usb/serial/keyspan.c --- linux-2.5.22/drivers/usb/serial/keyspan.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/drivers/usb/serial/keyspan.c Mon Jun 17 12:16:32 2002 @@ -447,8 +447,7 @@ dbg ("%s - urb %d", __FUNCTION__, urb == p_priv->out_urbs[1]); if (port->open_count) { - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); } } diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/kl5kusb105.c linux-2.5.22-bh/drivers/usb/serial/kl5kusb105.c --- linux-2.5.22/drivers/usb/serial/kl5kusb105.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/kl5kusb105.c Mon Jun 17 12:18:58 2002 @@ -576,8 +576,7 @@ } /* from generic_write_bulk_callback */ - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } /* klsi_105_write_bulk_completion_callback */ diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/mct_u232.c linux-2.5.22-bh/drivers/usb/serial/mct_u232.c --- linux-2.5.22/drivers/usb/serial/mct_u232.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/mct_u232.c Mon Jun 17 12:21:22 2002 @@ -502,8 +502,7 @@ } else { /* from generic_write_bulk_callback */ - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); } return; diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/omninet.c linux-2.5.22-bh/drivers/usb/serial/omninet.c --- linux-2.5.22/drivers/usb/serial/omninet.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/omninet.c Mon Jun 17 12:17:37 2002 @@ -352,8 +352,7 @@ return; } - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); // dbg("omninet_write_bulk_callback, tty %0x\n", tty); diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/pl2303.c linux-2.5.22-bh/drivers/usb/serial/pl2303.c --- linux-2.5.22/drivers/usb/serial/pl2303.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/pl2303.c Mon Jun 17 12:18:24 2002 @@ -697,8 +697,7 @@ return; } - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/usbserial.c linux-2.5.22-bh/drivers/usb/serial/usbserial.c --- linux-2.5.22/drivers/usb/serial/usbserial.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/usbserial.c Mon Jun 17 12:17:50 2002 @@ -1101,8 +1101,7 @@ return; } - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } diff -urNX dontdiff linux-2.5.22/drivers/usb/serial/visor.c linux-2.5.22-bh/drivers/usb/serial/visor.c --- linux-2.5.22/drivers/usb/serial/visor.c Mon Jun 17 04:49:07 2002 +++ linux-2.5.22-bh/drivers/usb/serial/visor.c Mon Jun 17 12:17:22 2002 @@ -453,8 +453,7 @@ /* free up the transfer buffer, as usb_free_urb() does not do this */ kfree (urb->transfer_buffer); - queue_task(&port->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&port->tqueue); return; } diff -urNX dontdiff linux-2.5.22/include/asm-s390/qdio.h linux-2.5.22-bh/include/asm-s390/qdio.h --- linux-2.5.22/include/asm-s390/qdio.h Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/include/asm-s390/qdio.h Mon Jun 17 07:25:31 2002 @@ -82,8 +82,6 @@ #define QDIO_CLEANUP_CLEAR_TIMEOUT 20000 #define QDIO_CLEANUP_HALT_TIMEOUT 10000 -#define QDIO_BH AURORA_BH - #define QDIO_IRQ_BUCKETS 256 /* heavy..., but does only use a few bytes, but be rather faster in cases of collisions (if there really is a collision, it is diff -urNX dontdiff linux-2.5.22/include/asm-s390x/qdio.h linux-2.5.22-bh/include/asm-s390x/qdio.h --- linux-2.5.22/include/asm-s390x/qdio.h Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/include/asm-s390x/qdio.h Mon Jun 17 07:25:22 2002 @@ -83,8 +83,6 @@ #define QDIO_CLEANUP_CLEAR_TIMEOUT 20000 #define QDIO_CLEANUP_HALT_TIMEOUT 10000 -#define QDIO_BH AURORA_BH - #define QDIO_IRQ_BUCKETS 256 /* heavy..., but does only use a few bytes, but be rather faster in cases of collisions (if there really is a collision, it is diff -urNX dontdiff linux-2.5.22/include/linux/interrupt.h linux-2.5.22-bh/include/linux/interrupt.h --- linux-2.5.22/include/linux/interrupt.h Thu Jun 6 06:57:51 2002 +++ linux-2.5.22-bh/include/linux/interrupt.h Mon Jun 17 13:22:41 2002 @@ -22,28 +22,6 @@ struct irqaction *next; }; - -/* Who gets which entry in bh_base. Things which will occur most often - should come first */ - -enum { - TIMER_BH = 0, - TQUEUE_BH, - DIGI_BH, - SERIAL_BH, - RISCOM8_BH, - SPECIALIX_BH, - AURORA_BH, - ESP_BH, - SCSI_BH, - IMMEDIATE_BH, - CYCLADES_BH, - CM206_BH, - JS_BH, - MACSERIAL_BH, - ISICOM_BH -}; - #include #include @@ -117,6 +95,7 @@ #define DECLARE_TASKLET_DISABLED(name, func, data) \ struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data } +extern struct tasklet_struct immediate_tasklet; enum { @@ -209,22 +188,6 @@ #define SMP_TIMER_DEFINE(name, task) #endif /* CONFIG_SMP */ - - -/* Old BH definitions */ - -extern struct tasklet_struct bh_task_vec[]; - -/* It is exported _ONLY_ for wait_on_irq(). */ -extern spinlock_t global_bh_lock; - -static inline void mark_bh(int nr) -{ - tasklet_hi_schedule(bh_task_vec+nr); -} - -extern void init_bh(int nr, void (*routine)(void)); -extern void remove_bh(int nr); /* diff -urNX dontdiff linux-2.5.22/include/linux/sched.h linux-2.5.22-bh/include/linux/sched.h --- linux-2.5.22/include/linux/sched.h Mon Jun 17 04:49:09 2002 +++ linux-2.5.22-bh/include/linux/sched.h Mon Jun 17 12:49:29 2002 @@ -7,7 +7,6 @@ #include #include -#include #include #include #include @@ -160,7 +159,6 @@ extern signed long FASTCALL(schedule_timeout(signed long timeout)); asmlinkage void schedule(void); -extern int schedule_task(struct tq_struct *task); extern void flush_scheduled_tasks(void); extern int start_context_thread(void); extern int current_is_keventd(void); diff -urNX dontdiff linux-2.5.22/include/linux/tqueue.h linux-2.5.22-bh/include/linux/tqueue.h --- linux-2.5.22/include/linux/tqueue.h Thu Jun 6 06:57:51 2002 +++ linux-2.5.22-bh/include/linux/tqueue.h Mon Jun 17 12:50:29 2002 @@ -16,6 +16,7 @@ #include #include #include +#include #include /* @@ -109,6 +110,15 @@ } return ret; } + +static inline void queue_immediate_task(struct tq_struct *tq) +{ + queue_task(tq, &tq_immediate); + tasklet_schedule(&immediate_tasklet); +} + +/* Schedule a tq to run in process context */ +extern int schedule_task(struct tq_struct *task); /* * Call all "bottom halfs" on a given list. diff -urNX dontdiff linux-2.5.22/kernel/context.c linux-2.5.22-bh/kernel/context.c --- linux-2.5.22/kernel/context.c Sun Jun 2 18:44:47 2002 +++ linux-2.5.22-bh/kernel/context.c Mon Jun 17 12:53:16 2002 @@ -20,6 +20,7 @@ #include #include #include +#include static DECLARE_TASK_QUEUE(tq_context); static DECLARE_WAIT_QUEUE_HEAD(context_task_wq); diff -urNX dontdiff linux-2.5.22/kernel/kmod.c linux-2.5.22-bh/kernel/kmod.c --- linux-2.5.22/kernel/kmod.c Sun Jun 2 18:44:45 2002 +++ linux-2.5.22-bh/kernel/kmod.c Mon Jun 17 12:52:57 2002 @@ -28,6 +28,7 @@ #include #include #include +#include #include diff -urNX dontdiff linux-2.5.22/kernel/sched.c linux-2.5.22-bh/kernel/sched.c --- linux-2.5.22/kernel/sched.c Mon Jun 17 04:49:11 2002 +++ linux-2.5.22-bh/kernel/sched.c Mon Jun 17 04:55:10 2002 @@ -1634,8 +1634,6 @@ extern void init_timervecs(void); extern void timer_bh(void); -extern void tqueue_bh(void); -extern void immediate_bh(void); void __init sched_init(void) { @@ -1672,8 +1670,6 @@ init_timervecs(); init_bh(TIMER_BH, timer_bh); - init_bh(TQUEUE_BH, tqueue_bh); - init_bh(IMMEDIATE_BH, immediate_bh); /* * The boot idle thread does lazy MMU switching as well: diff -urNX dontdiff linux-2.5.22/kernel/softirq.c linux-2.5.22-bh/kernel/softirq.c --- linux-2.5.22/kernel/softirq.c Sun Jun 2 18:44:44 2002 +++ linux-2.5.22-bh/kernel/softirq.c Mon Jun 17 13:26:26 2002 @@ -7,6 +7,8 @@ * due bh_mask_count not atomic handling. Copyright (C) 1998 Andrea Arcangeli * * Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903) + * + * Bottom halves finally killed by Matthew Wilcox in 2002. */ #include @@ -272,68 +274,13 @@ -/* Old style BHs */ - -static void (*bh_base[32])(void); -struct tasklet_struct bh_task_vec[32]; - -/* BHs are serialized by spinlock global_bh_lock. - - It is still possible to make synchronize_bh() as - spin_unlock_wait(&global_bh_lock). This operation is not used - by kernel now, so that this lock is not made private only - due to wait_on_irq(). - - It can be removed only after auditing all the BHs. - */ -spinlock_t global_bh_lock = SPIN_LOCK_UNLOCKED; - -static void bh_action(unsigned long nr) -{ - int cpu = smp_processor_id(); - - if (!spin_trylock(&global_bh_lock)) - goto resched; - - if (!hardirq_trylock(cpu)) - goto resched_unlock; - - if (bh_base[nr]) - bh_base[nr](); - - hardirq_endlock(cpu); - spin_unlock(&global_bh_lock); - return; - -resched_unlock: - spin_unlock(&global_bh_lock); -resched: - mark_bh(nr); -} - -void init_bh(int nr, void (*routine)(void)) -{ - bh_base[nr] = routine; - mb(); -} - -void remove_bh(int nr) -{ - tasklet_kill(bh_task_vec+nr); - bh_base[nr] = NULL; -} - void __init softirq_init() { - int i; - - for (i=0; i<32; i++) - tasklet_init(bh_task_vec+i, bh_action, i); - open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL); open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL); } +/* Invoke every task on a queue */ void __run_task_queue(task_queue *list) { struct list_head head, *next; diff -urNX dontdiff linux-2.5.22/kernel/sys.c linux-2.5.22-bh/kernel/sys.c --- linux-2.5.22/kernel/sys.c Sun Jun 2 18:44:41 2002 +++ linux-2.5.22-bh/kernel/sys.c Mon Jun 17 12:52:35 2002 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include diff -urNX dontdiff linux-2.5.22/kernel/timer.c linux-2.5.22-bh/kernel/timer.c --- linux-2.5.22/kernel/timer.c Sun Jun 9 06:09:49 2002 +++ linux-2.5.22-bh/kernel/timer.c Mon Jun 17 12:52:09 2002 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -333,16 +334,20 @@ spinlock_t tqueue_lock = SPIN_LOCK_UNLOCKED; -void tqueue_bh(void) +static void tqueue_tasklet_func(unsigned long ignore) { run_task_queue(&tq_timer); } -void immediate_bh(void) +static DECLARE_TASKLET(tqueue_tasklet, tqueue_tasklet_func, 0); + +static void immediate_tasklet_func(unsigned long ignore) { run_task_queue(&tq_immediate); } +DECLARE_TASKLET(immediate_tasklet, immediate_tasklet_func, 0); + /* * this routine handles the overflow of the microsecond field * @@ -677,7 +682,7 @@ #endif mark_bh(TIMER_BH); if (TQ_ACTIVE(tq_timer)) - mark_bh(TQUEUE_BH); + tasklet_schedule(&tqueue_tasklet); } #if !defined(__alpha__) && !defined(__ia64__) diff -urNX dontdiff linux-2.5.22/net/irda/ircomm/ircomm_param.c linux-2.5.22-bh/net/irda/ircomm/ircomm_param.c --- linux-2.5.22/net/irda/ircomm/ircomm_param.c Sun Jun 2 18:44:49 2002 +++ linux-2.5.22-bh/net/irda/ircomm/ircomm_param.c Mon Jun 17 12:32:27 2002 @@ -164,8 +164,7 @@ if (flush) { /* ircomm_tty_do_softint will take care of the rest */ - queue_task(&self->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&self->tqueue); } return count; diff -urNX dontdiff linux-2.5.22/net/irda/ircomm/ircomm_tty.c linux-2.5.22-bh/net/irda/ircomm/ircomm_tty.c --- linux-2.5.22/net/irda/ircomm/ircomm_tty.c Mon Jun 17 04:49:11 2002 +++ linux-2.5.22-bh/net/irda/ircomm/ircomm_tty.c Mon Jun 17 12:31:19 2002 @@ -619,8 +619,7 @@ * Let do_softint() do this to avoid race condition with * do_softint() ;-) */ - queue_task(&self->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&self->tqueue); } /* @@ -796,8 +795,7 @@ * its 256 byte tx buffer). We will then defragment and send out * all this data as one single packet. */ - queue_task(&self->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&self->tqueue); return len; } @@ -1120,8 +1118,7 @@ /* Wake up processes blocked on open */ wake_up_interruptible(&self->open_wait); - queue_task(&self->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&self->tqueue); return; } } else { @@ -1234,8 +1231,7 @@ tty->hw_stopped = 0; /* ircomm_tty_do_softint will take care of the rest */ - queue_task(&self->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&self->tqueue); break; default: /* If we get here, something is very wrong, better stop */ case FLOW_STOP: diff -urNX dontdiff linux-2.5.22/net/irda/ircomm/ircomm_tty_attach.c linux-2.5.22-bh/net/irda/ircomm/ircomm_tty_attach.c --- linux-2.5.22/net/irda/ircomm/ircomm_tty_attach.c Sun Jun 2 18:44:47 2002 +++ linux-2.5.22-bh/net/irda/ircomm/ircomm_tty_attach.c Mon Jun 17 12:32:01 2002 @@ -533,8 +533,7 @@ wake_up_interruptible(&self->open_wait); } - queue_task(&self->tqueue, &tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_immediate_task(&self->tqueue); } /*