提交 49516342 编写于 作者: J Juri Lelli 提交者: Thomas Gleixner

sched/core: Make dl_b->lock IRQ safe

Fix this lockdep warning:

[   44.804600] =========================================================
[   44.805746] [ INFO: possible irq lock inversion dependency detected ]
[   44.805746] 3.14.0-rc2-test+ #14 Not tainted
[   44.805746] ---------------------------------------------------------
[   44.805746] bash/3674 just changed the state of lock:
[   44.805746]  (&dl_b->lock){+.....}, at: [<ffffffff8106ad15>] sched_rt_handler+0x132/0x248
[   44.805746] but this lock was taken by another, HARDIRQ-safe lock in the past:
[   44.805746]  (&rq->lock){-.-.-.}

and interrupts could create inverse lock ordering between them.

[   44.805746]
[   44.805746] other info that might help us debug this:
[   44.805746]  Possible interrupt unsafe locking scenario:
[   44.805746]
[   44.805746]        CPU0                    CPU1
[   44.805746]        ----                    ----
[   44.805746]   lock(&dl_b->lock);
[   44.805746]                                local_irq_disable();
[   44.805746]                                lock(&rq->lock);
[   44.805746]                                lock(&dl_b->lock);
[   44.805746]   <Interrupt>
[   44.805746]     lock(&rq->lock);

by making dl_b->lock acquiring always IRQ safe.

Cc: Ingo Molnar <mingo@redhat.com>
Signed-off-by: NJuri Lelli <juri.lelli@gmail.com>
Signed-off-by: NPeter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1392107067-19907-3-git-send-email-juri.lelli@gmail.comSigned-off-by: NThomas Gleixner <tglx@linutronix.de>
上级 e9e7cb38
...@@ -7422,6 +7422,7 @@ static int sched_dl_global_constraints(void) ...@@ -7422,6 +7422,7 @@ static int sched_dl_global_constraints(void)
u64 period = global_rt_period(); u64 period = global_rt_period();
u64 new_bw = to_ratio(period, runtime); u64 new_bw = to_ratio(period, runtime);
int cpu, ret = 0; int cpu, ret = 0;
unsigned long flags;
/* /*
* Here we want to check the bandwidth not being set to some * Here we want to check the bandwidth not being set to some
...@@ -7435,10 +7436,10 @@ static int sched_dl_global_constraints(void) ...@@ -7435,10 +7436,10 @@ static int sched_dl_global_constraints(void)
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
struct dl_bw *dl_b = dl_bw_of(cpu); struct dl_bw *dl_b = dl_bw_of(cpu);
raw_spin_lock(&dl_b->lock); raw_spin_lock_irqsave(&dl_b->lock, flags);
if (new_bw < dl_b->total_bw) if (new_bw < dl_b->total_bw)
ret = -EBUSY; ret = -EBUSY;
raw_spin_unlock(&dl_b->lock); raw_spin_unlock_irqrestore(&dl_b->lock, flags);
if (ret) if (ret)
break; break;
...@@ -7451,6 +7452,7 @@ static void sched_dl_do_global(void) ...@@ -7451,6 +7452,7 @@ static void sched_dl_do_global(void)
{ {
u64 new_bw = -1; u64 new_bw = -1;
int cpu; int cpu;
unsigned long flags;
def_dl_bandwidth.dl_period = global_rt_period(); def_dl_bandwidth.dl_period = global_rt_period();
def_dl_bandwidth.dl_runtime = global_rt_runtime(); def_dl_bandwidth.dl_runtime = global_rt_runtime();
...@@ -7464,9 +7466,9 @@ static void sched_dl_do_global(void) ...@@ -7464,9 +7466,9 @@ static void sched_dl_do_global(void)
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
struct dl_bw *dl_b = dl_bw_of(cpu); struct dl_bw *dl_b = dl_bw_of(cpu);
raw_spin_lock(&dl_b->lock); raw_spin_lock_irqsave(&dl_b->lock, flags);
dl_b->bw = new_bw; dl_b->bw = new_bw;
raw_spin_unlock(&dl_b->lock); raw_spin_unlock_irqrestore(&dl_b->lock, flags);
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册