]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] s390 update (9/27): bottom half removal.
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 4 Oct 2002 04:46:37 +0000 (21:46 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 4 Oct 2002 04:46:37 +0000 (21:46 -0700)
Replace IMMEDIATE_BH bottom half by tasklets in 3215, ctc and iucv driver.

drivers/s390/char/con3215.c
drivers/s390/char/tubfs.c
drivers/s390/char/tubio.h
drivers/s390/char/tubtty.c
drivers/s390/net/ctctty.c
drivers/s390/net/iucv.c

index 6718e92b7dd62ba16994f632e1f38df754e9ae53..c2ec4c4443bd0d59d0e6f359060e686c60283fb5 100644 (file)
@@ -89,7 +89,7 @@ typedef struct _raw3215_info {
         int written;                  /* number of bytes in write requests */
        devstat_t devstat;            /* device status structure for do_IO */
        struct tty_struct *tty;       /* pointer to tty structure if present */
-       struct tq_struct tqueue;      /* task queue to bottom half */
+       struct tasklet_struct tasklet;
        raw3215_req *queued_read;     /* pointer to queued read requests */
        raw3215_req *queued_write;    /* pointer to queued write requests */
        wait_queue_head_t empty_wait; /* wait queue for flushing */
@@ -341,7 +341,7 @@ extern inline void raw3215_try_io(raw3215_info *raw)
  * The bottom half handler routine for 3215 devices. It tries to start
  * the next IO and wakes up processes waiting on the tty.
  */
-static void raw3215_softint(void *data)
+static void raw3215_tasklet(void *data)
 {
        raw3215_info *raw;
        struct tty_struct *tty;
@@ -377,12 +377,7 @@ static inline void raw3215_sched_bh(raw3215_info *raw)
         if (raw->flags & RAW3215_BH_PENDING)
                 return;       /* already pending */
         raw->flags |= RAW3215_BH_PENDING;
-       INIT_LIST_HEAD(&raw->tqueue.list);
-       raw->tqueue.sync = 0;
-        raw->tqueue.routine = raw3215_softint;
-        raw->tqueue.data = raw;
-        queue_task(&raw->tqueue, &tq_immediate);
-        mark_bh(IMMEDIATE_BH);
+       tasklet_hi_schedule(&raw->tasklet);
 }
 
 /*
@@ -867,8 +862,9 @@ static int tty3215_open(struct tty_struct *tty, struct file * filp)
                        kfree(raw);
                        return -ENOMEM;
                }
-               raw->tqueue.routine = raw3215_softint;
-               raw->tqueue.data = raw;
+               tasklet_init(&raw->tasklet, 
+                            (void (*)(unsigned long)) raw3215_tasklet,
+                            (unsigned long) raw);
                 init_waitqueue_head(&raw->empty_wait);
                raw3215[line] = raw;
        }
@@ -1095,10 +1091,11 @@ void __init con3215_init(void)
         raw->inbuf = (char *) alloc_bootmem_low(RAW3215_INBUF_SIZE);
 
        /* Find the first console */
-       raw->irq = raw3215_find_dev(0);
+       raw->irq = irq;
        raw->flags |= RAW3215_FIXED;
-       raw->tqueue.routine = raw3215_softint;
-       raw->tqueue.data = raw;
+       tasklet_init(&raw->tasklet, 
+                    (void (*)(unsigned long)) raw3215_tasklet,
+                    (unsigned long) raw);
         init_waitqueue_head(&raw->empty_wait);
 
        /* Request the console irq */
index 8486d77a4d8c2f549e416649ab3df51fd456ee32..c69d82199dba3a201e7df0d35c611171ab1f52cf 100644 (file)
@@ -229,12 +229,12 @@ fs3270_io(tub_t *tubp, ccw1_t *ccwp)
  * fs3270_bh(tubp) -- Perform back-half processing
  */
 static void
-fs3270_bh(void *data)
+fs3270_tasklet(unsigned long data)
 {
        long flags;
        tub_t *tubp;
 
-       tubp = data;
+       tubp = (tub_t *) data;
        TUBLOCK(tubp->irq, flags);
        tubp->flags &= ~TUB_BHPENDING;
 
@@ -265,10 +265,9 @@ fs3270_sched_bh(tub_t *tubp)
        if (tubp->flags & TUB_BHPENDING)
                return;
        tubp->flags |= TUB_BHPENDING;
-       tubp->tqueue.routine = fs3270_bh;
-       tubp->tqueue.data = tubp;
-       queue_task(&tubp->tqueue, &tq_immediate);
-       mark_bh(IMMEDIATE_BH);
+       tasklet_init(&tubp->tasklet, fs3270_tasklet,
+                    (unsigned long) tubp);
+       tasklet_schedule(&tubp->tasklet);
 }
 
 /*
index 51c66392ace3d6384c52cf60def9dc00ea988ee0..95114ab66e569bd011b152a11683f91135d5364d 100644 (file)
@@ -234,7 +234,7 @@ typedef struct tub_s {
        enum tubstat    stat;
        enum tubcmd     cmd;
        int             flags;          /* See below for values */
-       struct tq_struct tqueue;
+       struct tasklet_struct tasklet;
 
        /* Stuff for fs-driver support */
        pid_t           fs_pid;         /* Pid if TBM_FS */
index 498ce01212243e899a639ee17ff03dd5b0b08142..2184e4c0e2c4f734bc30b94dac447463f03e9e68 100644 (file)
@@ -35,7 +35,7 @@ static int tty3270_write_proc(struct file *, const char *,
        unsigned long, void *);
 
 /* tty3270 utility functions */
-static void tty3270_bh(void *);
+static void tty3270_tasklet(unsigned long);
        void tty3270_sched_bh(tub_t *);
 static int tty3270_wait(tub_t *, long *);
        void tty3270_int(tub_t *, devstat_t *);
@@ -598,17 +598,18 @@ tty3270_hangup(struct tty_struct *tty)
 
 
 /*
- * tty3270_bh(tubp) -- Perform back-half processing
+ * tty3270_tasklet(tubp) -- Perform back-half processing
  */
 static void
-tty3270_bh(void *data)
+tty3270_tasklet(unsigned long data)
 {
        tub_t *tubp;
        ioinfo_t *ioinfop;
        long flags;
        struct tty_struct *tty;
 
-       ioinfop = ioinfo[(tubp = data)->irq];
+       tubp = (tub_t *) data;
+       ioinfop = ioinfo[tubp->irq];
        while (TUBTRYLOCK(tubp->irq, flags) == 0) {
                if (ioinfop->ui.flags.unready == 1)
                        return;
@@ -663,10 +664,9 @@ tty3270_sched_bh(tub_t *tubp)
        if (tubp->flags & TUB_BHPENDING)
                return;
        tubp->flags |= TUB_BHPENDING;
-       tubp->tqueue.routine = tty3270_bh;
-       tubp->tqueue.data = tubp;
-       queue_task(&tubp->tqueue, &tq_immediate);
-       mark_bh(IMMEDIATE_BH);
+       tasklet_init(&tubp->tasklet, tty3270_tasklet,
+                    (unsigned long) tubp);
+       tasklet_schedule(&tubp->tasklet);
 }
 
 /*
index 7bad7985d15d1f134c1700df8f21e3fd4a5133ad..b13fb7e6c2fb0fa7f23fa132d44822f929c6bf42 100644 (file)
@@ -86,7 +86,7 @@ typedef struct {
   wait_queue_head_t    open_wait;
   wait_queue_head_t    close_wait;
   struct semaphore      write_sem;
-  struct tq_struct      tq;
+  struct tasklet_struct tasklet;
   struct timer_list     stoptimer;
 } ctc_tty_info;
 
@@ -272,8 +272,7 @@ ctc_tty_netif_rx(struct sk_buff *skb)
         */
        skb_queue_tail(&info->rx_queue, skb);
        /* Schedule dequeuing */
-       queue_task(&info->tq, &tq_immediate);
-       mark_bh(IMMEDIATE_BH);
+       tasklet_schedule(&info->tasklet);
 }
 
 static int
@@ -390,8 +389,7 @@ ctc_tty_inject(ctc_tty_info *info, char c)
        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);
+       tasklet_schedule(&info->tasklet);
 }
 
 static void
@@ -400,8 +398,7 @@ ctc_tty_transmit_status(ctc_tty_info *info)
        if (ctc_tty_shuttingdown)
                return;
        info->flags |= CTC_ASYNC_TX_LINESTAT;
-       queue_task(&info->tq, &tq_immediate);
-       mark_bh(IMMEDIATE_BH);
+       tasklet_schedule(&info->tasklet);
 }
 
 static void
@@ -562,8 +559,7 @@ ctc_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int cou
        }
        if (skb_queue_len(&info->tx_queue)) {
                info->lsr &= ~UART_LSR_TEMT;
-               queue_task(&info->tq, &tq_immediate);
-               mark_bh(IMMEDIATE_BH);
+               tasklet_schedule(&info->tasklet);
        }
        if (from_user)
                up(&info->write_sem);
@@ -624,8 +620,7 @@ ctc_tty_flush_chars(struct tty_struct *tty)
                return;
        if (tty->stopped || tty->hw_stopped || (!skb_queue_len(&info->tx_queue)))
                return;
-       queue_task(&info->tq, &tq_immediate);
-       mark_bh(IMMEDIATE_BH);
+       tasklet_schedule(&info->tasklet);
 }
 
 /*
@@ -1161,8 +1156,9 @@ ctc_tty_hangup(struct tty_struct *tty)
  * the lower levels.
  */
 static void
-ctc_tty_task(ctc_tty_info *info)
+ctc_tty_task(unsigned long arg)
 {
+       ctc_tty_info *info = (void *)arg;
        unsigned long saveflags;
        int again;
 
@@ -1173,8 +1169,7 @@ ctc_tty_task(ctc_tty_info *info)
                        info->lsr |= UART_LSR_TEMT;
                again |= ctc_tty_readmodem(info);
                if (again) {
-                       queue_task(&info->tq, &tq_immediate);
-                       mark_bh(IMMEDIATE_BH);
+                       tasklet_schedule(&info->tasklet);
                }
        }
        spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
@@ -1234,14 +1229,8 @@ ctc_tty_init(void)
        for (i = 0; i < CTC_TTY_MAX_DEVICES; i++) {
                info = &driver->info[i];
                init_MUTEX(&info->write_sem);
-#if LINUX_VERSION_CODE >= 0x020400
-               INIT_LIST_HEAD(&info->tq.list);
-#else
-               info->tq.next    = NULL;
-#endif
-               info->tq.sync    = 0;
-               info->tq.routine = (void *)(void *)ctc_tty_task;
-               info->tq.data    = info;
+               tasklet_init(&info->tasklet, ctc_tty_task,
+                               (unsigned long) info);
                info->magic = CTC_ASYNC_MAGIC;
                info->line = i;
                info->tty = 0;
@@ -1322,10 +1311,6 @@ ctc_tty_cleanup(int final) {
                kfree(driver);
                driver = NULL;
        } else {
-               int i;
-
-               for (i = 0; i < CTC_TTY_MAX_DEVICES; i++)
-                       driver->info[i].tq.routine = NULL;
                tty_unregister_driver(&driver->ctc_tty_device);
        }
        spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
index 606a706a9c4682fb94b1162237c222cb7e85d77a..21dd6c3a5e1d37cef61e15691d9e4e4325d5a2e2 100644 (file)
@@ -41,9 +41,9 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/init.h>
-#include <linux/tqueue.h>
 #include <linux/interrupt.h>
 #include <linux/list.h>
+#include <linux/errno.h>
 #include <asm/atomic.h>
 #include "iucv.h"
 #include <asm/io.h>
@@ -99,16 +99,14 @@ typedef struct {
 static struct list_head  iucv_irq_queue;
 static spinlock_t iucv_irq_queue_lock = SPIN_LOCK_UNLOCKED;
 
-static struct tq_struct  iucv_tq;
-
-static atomic_t   iucv_bh_scheduled = ATOMIC_INIT (0);
-
 /*
  *Internal function prototypes
  */
-static void iucv_bh_handler(void);
+static void iucv_tasklet_handler(unsigned long);
 static void iucv_irq_handler(struct pt_regs *, __u16);
 
+static DECLARE_TASKLET(iucv_tasklet,iucv_tasklet_handler,0);
+
 /************ FUNCTION ID'S ****************************/
 
 #define ACCEPT          10
@@ -385,11 +383,6 @@ iucv_init(void)
        }
        memset(iucv_param_pool, 0, sizeof(iucv_param) * PARAM_POOL_SIZE);
 
-       /* Initialize task queue */
-       INIT_LIST_HEAD(&iucv_tq.list);
-       iucv_tq.sync = 0;
-       iucv_tq.routine = (void *)iucv_bh_handler;
-
        /* Initialize irq queue */
        INIT_LIST_HEAD(&iucv_irq_queue);
 
@@ -2177,7 +2170,7 @@ iucv_sever(__u16 pathid, __u8 user_data[16])
  * @code: irq code
  *
  * Handles external interrupts coming in from CP.
- * Places the interrupt buffer on a queue and schedules iucv_bh_handler().
+ * Places the interrupt buffer on a queue and schedules iucv_tasklet_handler().
  */
 static void
 iucv_irq_handler(struct pt_regs *regs, __u16 code)
@@ -2200,10 +2193,7 @@ iucv_irq_handler(struct pt_regs *regs, __u16 code)
        list_add_tail(&irqdata->queue, &iucv_irq_queue);
        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);
-       }
+       tasklet_schedule(&iucv_tasklet);
 
        irq_exit();
        return;
@@ -2214,7 +2204,7 @@ iucv_irq_handler(struct pt_regs *regs, __u16 code)
  * @int_buf: Pointer to copy of external interrupt buffer
  *
  * The workhorse for handling interrupts queued by iucv_irq_handler().
- * This function is called from the bottom half iucv_bh_handler().
+ * This function is called from the bottom half iucv_tasklet_handler().
  */
 static void
 iucv_do_int(iucv_GeneralInterrupt * int_buf)
@@ -2384,20 +2374,18 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
 }
 
 /**
- * iucv_bh_handler:
+ * iucv_tasklet_handler:
  *
  * This function loops over the queue of irq buffers and runs iucv_do_int()
  * on every queue element.
  */
 static void
-iucv_bh_handler(void)
+iucv_tasklet_handler(unsigned long ignored)
 {
        struct list_head head;
        struct list_head *next;
        ulong  flags;
 
-       atomic_set(&iucv_bh_scheduled, 0);
-
        spin_lock_irqsave(&iucv_irq_queue_lock, flags);
        list_add(&head, &iucv_irq_queue);
        list_del_init(&iucv_irq_queue);