block/aoe: discover_timer: Convert timers to use timer_setup()
authorKees Cook <keescook@chromium.org>
Wed, 30 Aug 2017 21:53:24 +0000 (14:53 -0700)
committerKees Cook <keescook@chromium.org>
Mon, 6 Nov 2017 20:50:09 +0000 (12:50 -0800)
In preparation for unconditionally passing the struct timer_list pointer to
all timer callbacks, switch to using the new timer_setup() and from_timer()
to pass the timer pointer explicitly.

This refactors the discover_timer to remove the needless locking and
state machine used for synchronizing timer death. Using del_timer_sync()
will already do the right thing.

Cc: Jens Axboe <axboe@kernel.dk>
Cc: "Ed L. Cashin" <ed.cashin@acm.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Kees Cook <keescook@chromium.org>
drivers/block/aoe/aoemain.c

index 4b987c2fefbe5ececb3ded4002c3075167a3082c..25148206697775f3444d677b29302a35e0fe5a04 100644 (file)
@@ -15,49 +15,19 @@ MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>");
 MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
 MODULE_VERSION(VERSION);
 
-enum { TINIT, TRUN, TKILL };
+static struct timer_list timer;
 
-static void
-discover_timer(ulong vp)
+static void discover_timer(struct timer_list *t)
 {
-       static struct timer_list t;
-       static volatile ulong die;
-       static spinlock_t lock;
-       ulong flags;
-       enum { DTIMERTICK = HZ * 60 }; /* one minute */
-
-       switch (vp) {
-       case TINIT:
-               init_timer(&t);
-               spin_lock_init(&lock);
-               t.data = TRUN;
-               t.function = discover_timer;
-               die = 0;
-       case TRUN:
-               spin_lock_irqsave(&lock, flags);
-               if (!die) {
-                       t.expires = jiffies + DTIMERTICK;
-                       add_timer(&t);
-               }
-               spin_unlock_irqrestore(&lock, flags);
-
-               aoecmd_cfg(0xffff, 0xff);
-               return;
-       case TKILL:
-               spin_lock_irqsave(&lock, flags);
-               die = 1;
-               spin_unlock_irqrestore(&lock, flags);
+       mod_timer(t, jiffies + HZ * 60); /* one minute */
 
-               del_timer_sync(&t);
-       default:
-               return;
-       }
+       aoecmd_cfg(0xffff, 0xff);
 }
 
 static void
 aoe_exit(void)
 {
-       discover_timer(TKILL);
+       del_timer_sync(&timer);
 
        aoenet_exit();
        unregister_blkdev(AOE_MAJOR, DEVICE_NAME);
@@ -93,7 +63,9 @@ aoe_init(void)
                goto blkreg_fail;
        }
        printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
-       discover_timer(TINIT);
+
+       timer_setup(&timer, discover_timer, 0);
+       discover_timer(&timer);
        return 0;
  blkreg_fail:
        aoecmd_exit();