return -1;
 }
 
-static void flow_perturbation(unsigned long arg)
+static void flow_perturbation(struct timer_list *t)
 {
-       struct flow_filter *f = (struct flow_filter *)arg;
+       struct flow_filter *f = from_timer(f, t, perturb_timer);
 
        get_random_bytes(&f->hashrnd, 4);
        if (f->perturb_period)
                get_random_bytes(&fnew->hashrnd, 4);
        }
 
-       setup_deferrable_timer(&fnew->perturb_timer, flow_perturbation,
-                              (unsigned long)fnew);
+       timer_setup(&fnew->perturb_timer, flow_perturbation, TIMER_DEFERRABLE);
 
        netif_keep_dst(qdisc_dev(tp->q));
 
 
 }
 EXPORT_SYMBOL(dev_trans_start);
 
-static void dev_watchdog(unsigned long arg)
+static void dev_watchdog(struct timer_list *t)
 {
-       struct net_device *dev = (struct net_device *)arg;
+       struct net_device *dev = from_timer(dev, t, watchdog_timer);
 
        netif_tx_lock(dev);
        if (!qdisc_tx_is_noop(dev)) {
        if (dev_ingress_queue(dev))
                dev_init_scheduler_queue(dev, dev_ingress_queue(dev), &noop_qdisc);
 
-       setup_timer(&dev->watchdog_timer, dev_watchdog, (unsigned long)dev);
+       timer_setup(&dev->watchdog_timer, dev_watchdog, 0);
 }
 
 static void shutdown_scheduler_queue(struct net_device *dev,
 
        struct pie_vars vars;
        struct pie_stats stats;
        struct timer_list adapt_timer;
+       struct Qdisc *sch;
 };
 
 static void pie_params_init(struct pie_params *params)
                pie_vars_init(&q->vars);
 }
 
-static void pie_timer(unsigned long arg)
+static void pie_timer(struct timer_list *t)
 {
-       struct Qdisc *sch = (struct Qdisc *)arg;
-       struct pie_sched_data *q = qdisc_priv(sch);
+       struct pie_sched_data *q = from_timer(q, t, adapt_timer);
+       struct Qdisc *sch = q->sch;
        spinlock_t *root_lock = qdisc_lock(qdisc_root_sleeping(sch));
 
        spin_lock(root_lock);
        pie_vars_init(&q->vars);
        sch->limit = q->params.limit;
 
-       setup_timer(&q->adapt_timer, pie_timer, (unsigned long)sch);
+       q->sch = sch;
+       timer_setup(&q->adapt_timer, pie_timer, 0);
 
        if (opt) {
                int err = pie_change(sch, opt);
 
        u32                     limit;          /* HARD maximal queue length */
        unsigned char           flags;
        struct timer_list       adapt_timer;
+       struct Qdisc            *sch;
        struct red_parms        parms;
        struct red_vars         vars;
        struct red_stats        stats;
        return 0;
 }
 
-static inline void red_adaptative_timer(unsigned long arg)
+static inline void red_adaptative_timer(struct timer_list *t)
 {
-       struct Qdisc *sch = (struct Qdisc *)arg;
-       struct red_sched_data *q = qdisc_priv(sch);
+       struct red_sched_data *q = from_timer(q, t, adapt_timer);
+       struct Qdisc *sch = q->sch;
        spinlock_t *root_lock = qdisc_lock(qdisc_root_sleeping(sch));
 
        spin_lock(root_lock);
        struct red_sched_data *q = qdisc_priv(sch);
 
        q->qdisc = &noop_qdisc;
-       setup_timer(&q->adapt_timer, red_adaptative_timer, (unsigned long)sch);
+       q->sch = sch;
+       timer_setup(&q->adapt_timer, red_adaptative_timer, 0);
        return red_change(sch, opt);
 }
 
 
        int             perturb_period;
        unsigned int    quantum;        /* Allotment per round: MUST BE >= MTU */
        struct timer_list perturb_timer;
+       struct Qdisc    *sch;
 };
 
 /*
        qdisc_tree_reduce_backlog(sch, dropped, drop_len);
 }
 
-static void sfq_perturbation(unsigned long arg)
+static void sfq_perturbation(struct timer_list *t)
 {
-       struct Qdisc *sch = (struct Qdisc *)arg;
-       struct sfq_sched_data *q = qdisc_priv(sch);
+       struct sfq_sched_data *q = from_timer(q, t, perturb_timer);
+       struct Qdisc *sch = q->sch;
        spinlock_t *root_lock = qdisc_lock(qdisc_root_sleeping(sch));
 
        spin_lock(root_lock);
        int i;
        int err;
 
-       setup_deferrable_timer(&q->perturb_timer, sfq_perturbation,
-                              (unsigned long)sch);
+       timer_setup(&q->perturb_timer, sfq_perturbation, TIMER_DEFERRABLE);
 
        err = tcf_block_get(&q->block, &q->filter_list, sch);
        if (err)