From: Peter Zijlstra <peterz@infradead.org>
To: Chanho Min <chanho0207@gmail.com>
Cc: linux-kernel@vger.kernel.org, Ingo Molnar <mingo@elte.hu>,
chanho.min@lge.com, rostedt <rostedt@goodmis.org>
Subject: Re: [PATCH] sched_rt: the task in irq context can be migrated during context switching
Date: Thu, 05 Jan 2012 18:55:32 +0100 [thread overview]
Message-ID: <1325786132.3508.1.camel@twins> (raw)
In-Reply-To: <CAOAMb1BHA=5fm7KTewYyke6u-8DP0iUuJMpgQw54vNeXFsGpoQ@mail.gmail.com>
On Thu, 2012-01-05 at 20:00 +0900, Chanho Min wrote:
> This issue happens under the following conditions
> 1. preemption is off
> 2. __ARCH_WANT_INTERRUPTS_ON_CTXSW is defined.
> 3. RT scheduling class
> 4. SMP system
>
> Sequence is as follows:
> 1.suppose current task is A. start schedule()
> 2.task A is enqueued pushable task at the entry of schedule()
> __schedule
> prev = rq->curr;
> ...
> put_prev_task
> put_prev_task_rt
> enqueue_pushable_task
> 4.pick the task B as next task.
> next = pick_next_task(rq);
> 3.rq->curr set to task B and context_switch is started.
> rq->curr = next;
> 4.At the entry of context_swtich, release this cpu's rq->lock.
> context_switch
> prepare_task_switch
> prepare_lock_switch
> raw_spin_unlock_irq(&rq->lock);
> 5.Shortly after rq->lock is released, interrupt is occurred and start
> IRQ context
> 6.try_to_wake_up() which called by ISR acquires rq->lock
> try_to_wake_up
> ttwu_remote
> rq = __task_rq_lock(p)
> ttwu_do_wakeup(rq, p, wake_flags);
> task_woken_rt
> 7.push_rt_task picks the task A which is enqueued before.
> task_woken_rt
> push_rt_tasks(rq)
> next_task = pick_next_pushable_task(rq)
> 8.At find_lock_lowest_rq(), If double_lock_balance() returns 0,
> lowest_rq can be the remote rq.
> (But,If preemption is on, double_lock_balance always return 1 and it
> does't happen.)
> push_rt_task
> find_lock_lowest_rq
> if (double_lock_balance(rq, lowest_rq))..
> 9.find_lock_lowest_rq return the available rq. task A is migrated to
> the remote cpu/rq.
> push_rt_task
> ...
> deactivate_task(rq, next_task, 0);
> set_task_cpu(next_task, lowest_rq->cpu);
> activate_task(lowest_rq, next_task, 0);
> 10. But, task A is on irq context at this cpu.
> So, task A is scheduled by two cpus at the same time until restore from IRQ.
> Task A's stack is corrupted. Unexpected problem is occurred.
>
> In recent ARM, I saw the patch to remove
> __ARCH_WANT_INTERRUPTS_ON_CTXSW is posted.
> But, if that feature is adopted by the others architecture or to
> remain in the release version,,this can occur.
> This is my patch to fix it. Any opinions will be appreciated.
So the problem is quite real, as already said we don't need to worry
about the future, but we might want to fix this in previous kernels.
What I'm not entirely sure of is the proposed solution, Steven don't we
get in trouble by simply bailing out on the push?
> Signed-off-by: Chanho Min <chanho.min@lge.com>
> ---
> kernel/sched_rt.c | 5 +++++
> 1 files changed, 5 insertions(+), 0 deletions(-)
>
> diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
> index 583a136..59e66e3 100644
> --- a/kernel/sched_rt.c
> +++ b/kernel/sched_rt.c
> @@ -1388,6 +1388,11 @@ static int push_rt_task(struct rq *rq)
> if (!next_task)
> return 0;
>
> +#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
> + if (unlikely(task_running(rq, next_task)))
> + return 0;
> +#endif
> +
> retry:
> if (unlikely(next_task == rq->curr)) {
> WARN_ON(1);
> --
next prev parent reply other threads:[~2012-01-05 17:55 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-05 11:00 [PATCH] sched_rt: the task in irq context can be migrated during context switching Chanho Min
2012-01-05 14:25 ` Peter Zijlstra
2012-01-05 17:55 ` Peter Zijlstra [this message]
2012-01-05 18:15 ` Steven Rostedt
2012-01-05 21:45 ` Peter Zijlstra
2012-01-10 8:13 ` Chanho Min
2012-01-10 9:23 ` Peter Zijlstra
2012-01-10 9:42 ` Namhyung Kim
2012-01-28 4:05 ` Chanho Min
2012-01-28 12:06 ` [tip:sched/core] sched/rt: Fix task stack corruption under __ARCH_WANT_INTERRUPTS_ON_CTXSW tip-bot for Chanho Min
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1325786132.3508.1.camel@twins \
--to=peterz@infradead.org \
--cc=chanho.min@lge.com \
--cc=chanho0207@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox