mirror of https://gitee.com/openkylin/linux.git
pkt_sched: Convert qdisc_watchdog to tasklet_hrtimer
None of this stuff should execute in hw IRQ context, therefore use a tasklet_hrtimer so that it runs in softirq context. Signed-off-by: David S. Miller <davem@davemloft.net> Acked-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
649bf17829
commit
ee5f9757ea
|
@ -61,8 +61,8 @@ psched_tdiff_bounded(psched_time_t tv1, psched_time_t tv2, psched_time_t bound)
|
|||
}
|
||||
|
||||
struct qdisc_watchdog {
|
||||
struct hrtimer timer;
|
||||
struct Qdisc *qdisc;
|
||||
struct tasklet_hrtimer timer;
|
||||
struct Qdisc *qdisc;
|
||||
};
|
||||
|
||||
extern void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc);
|
||||
|
|
|
@ -468,8 +468,8 @@ static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer)
|
|||
|
||||
void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc)
|
||||
{
|
||||
hrtimer_init(&wd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
wd->timer.function = qdisc_watchdog;
|
||||
tasklet_hrtimer_init(&wd->timer, qdisc_watchdog,
|
||||
CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
wd->qdisc = qdisc;
|
||||
}
|
||||
EXPORT_SYMBOL(qdisc_watchdog_init);
|
||||
|
@ -485,13 +485,13 @@ void qdisc_watchdog_schedule(struct qdisc_watchdog *wd, psched_time_t expires)
|
|||
wd->qdisc->flags |= TCQ_F_THROTTLED;
|
||||
time = ktime_set(0, 0);
|
||||
time = ktime_add_ns(time, PSCHED_TICKS2NS(expires));
|
||||
hrtimer_start(&wd->timer, time, HRTIMER_MODE_ABS);
|
||||
tasklet_hrtimer_start(&wd->timer, time, HRTIMER_MODE_ABS);
|
||||
}
|
||||
EXPORT_SYMBOL(qdisc_watchdog_schedule);
|
||||
|
||||
void qdisc_watchdog_cancel(struct qdisc_watchdog *wd)
|
||||
{
|
||||
hrtimer_cancel(&wd->timer);
|
||||
tasklet_hrtimer_cancel(&wd->timer);
|
||||
wd->qdisc->flags &= ~TCQ_F_THROTTLED;
|
||||
}
|
||||
EXPORT_SYMBOL(qdisc_watchdog_cancel);
|
||||
|
|
Loading…
Reference in New Issue