* preempt_schedule_irq() loop question
@ 2019-01-16 12:50 Valentin Schneider
2019-01-16 13:45 ` Peter Zijlstra
0 siblings, 1 reply; 4+ messages in thread
From: Valentin Schneider @ 2019-01-16 12:50 UTC (permalink / raw)
To: Ingo Molnar, linux-kernel
Cc: Peter Zijlstra, Catalin Marinas, Will Deacon, Mark Rutland,
Julien Thierry
Hi,
I've been wandering around preempt_schedule_irq() in sched/core.c, and
got curious regarding how the arch code calls it.
The main part of preempt_schedule_irq() is:
do {
preempt_disable();
local_irq_enable();
__schedule(true);
local_irq_disable();
sched_preempt_enable_no_resched();
} while (need_resched());
Yet all the arch entry.S I looked at (I stopped after arm64, arm, x86_32,
MIPS, powerpc) wrap the call to preempt_schedule_irq() in another
do { ... } while (need_resched())
For instance, this is what's done in arm64:
1: bl preempt_schedule_irq // irq en/disable is done inside
ldr x0, [tsk, #TSK_TI_FLAGS] // get new tasks TI_FLAGS
tbnz x0, #TIF_NEED_RESCHED, 1b // needs rescheduling?
I naively thought this could be attributed to something like
preempt_schedule_irq() historically not having an inner loop, but it seems
to have been there since the beginning of time (or at least up to the point
where the git history stops).
I don't see why we need to have these nested loops - AFAICT the one in
preempt_schedule_irq() would suffice. What am I missing?
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: preempt_schedule_irq() loop question
2019-01-16 12:50 preempt_schedule_irq() loop question Valentin Schneider
@ 2019-01-16 13:45 ` Peter Zijlstra
2019-01-16 14:57 ` Thomas Gleixner
0 siblings, 1 reply; 4+ messages in thread
From: Peter Zijlstra @ 2019-01-16 13:45 UTC (permalink / raw)
To: Valentin Schneider
Cc: Ingo Molnar, linux-kernel, Catalin Marinas, Will Deacon,
Mark Rutland, Julien Thierry, Thomas Gleixner
On Wed, Jan 16, 2019 at 12:50:42PM +0000, Valentin Schneider wrote:
> Hi,
>
> I've been wandering around preempt_schedule_irq() in sched/core.c, and
> got curious regarding how the arch code calls it.
>
> The main part of preempt_schedule_irq() is:
>
> do {
> preempt_disable();
> local_irq_enable();
> __schedule(true);
> local_irq_disable();
> sched_preempt_enable_no_resched();
> } while (need_resched());
>
> Yet all the arch entry.S I looked at (I stopped after arm64, arm, x86_32,
> MIPS, powerpc) wrap the call to preempt_schedule_irq() in another
>
> do { ... } while (need_resched())
>
> For instance, this is what's done in arm64:
>
> 1: bl preempt_schedule_irq // irq en/disable is done inside
> ldr x0, [tsk, #TSK_TI_FLAGS] // get new tasks TI_FLAGS
> tbnz x0, #TIF_NEED_RESCHED, 1b // needs rescheduling?
>
>
> I naively thought this could be attributed to something like
> preempt_schedule_irq() historically not having an inner loop, but it seems
> to have been there since the beginning of time (or at least up to the point
> where the git history stops).
>
> I don't see why we need to have these nested loops - AFAICT the one in
> preempt_schedule_irq() would suffice. What am I missing?
I think you're quite right; but I wasn't doing kernel work back when rml
added the preemptible bits. Ingo, do you have any recollections that far
back?
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: preempt_schedule_irq() loop question
2019-01-16 13:45 ` Peter Zijlstra
@ 2019-01-16 14:57 ` Thomas Gleixner
2019-01-16 15:23 ` Valentin Schneider
0 siblings, 1 reply; 4+ messages in thread
From: Thomas Gleixner @ 2019-01-16 14:57 UTC (permalink / raw)
To: Peter Zijlstra
Cc: Valentin Schneider, Ingo Molnar, linux-kernel, Catalin Marinas,
Will Deacon, Mark Rutland, Julien Thierry
On Wed, 16 Jan 2019, Peter Zijlstra wrote:
> On Wed, Jan 16, 2019 at 12:50:42PM +0000, Valentin Schneider wrote:
> > Hi,
> >
> > I've been wandering around preempt_schedule_irq() in sched/core.c, and
> > got curious regarding how the arch code calls it.
> >
> > The main part of preempt_schedule_irq() is:
> >
> > do {
> > preempt_disable();
> > local_irq_enable();
> > __schedule(true);
> > local_irq_disable();
> > sched_preempt_enable_no_resched();
> > } while (need_resched());
> >
> > Yet all the arch entry.S I looked at (I stopped after arm64, arm, x86_32,
> > MIPS, powerpc) wrap the call to preempt_schedule_irq() in another
> >
> > do { ... } while (need_resched())
> >
> > For instance, this is what's done in arm64:
> >
> > 1: bl preempt_schedule_irq // irq en/disable is done inside
> > ldr x0, [tsk, #TSK_TI_FLAGS] // get new tasks TI_FLAGS
> > tbnz x0, #TIF_NEED_RESCHED, 1b // needs rescheduling?
> >
> >
> > I naively thought this could be attributed to something like
> > preempt_schedule_irq() historically not having an inner loop, but it seems
> > to have been there since the beginning of time (or at least up to the point
> > where the git history stops).
> >
> > I don't see why we need to have these nested loops - AFAICT the one in
> > preempt_schedule_irq() would suffice. What am I missing?
>
> I think you're quite right; but I wasn't doing kernel work back when rml
> added the preemptible bits. Ingo, do you have any recollections that far
> back?
I just went back in the history tree and had to figure out that it's my
fault :)
preempt_schedule_irq() was introduced to plug a stupid race, but I did not
notice (and obviously nobody else) that this made the extra loop in the
entry code pointless. So it's just histerical raisins without any value.
Thanks,
tglx
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: preempt_schedule_irq() loop question
2019-01-16 14:57 ` Thomas Gleixner
@ 2019-01-16 15:23 ` Valentin Schneider
0 siblings, 0 replies; 4+ messages in thread
From: Valentin Schneider @ 2019-01-16 15:23 UTC (permalink / raw)
To: Thomas Gleixner, Peter Zijlstra
Cc: Ingo Molnar, linux-kernel, Catalin Marinas, Will Deacon,
Mark Rutland, Julien Thierry
On 16/01/2019 14:57, Thomas Gleixner wrote:
[...]
>
> I just went back in the history tree and had to figure out that it's my
> fault :)
>
> preempt_schedule_irq() was introduced to plug a stupid race, but I did not
> notice (and obviously nobody else) that this made the extra loop in the
> entry code pointless. So it's just histerical raisins without any value.
>
I see, thanks for clearing that up! Credit goes to Julien & Will for
unearthing the oddity.
> Thanks,
>
> tglx
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-01-16 15:23 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-16 12:50 preempt_schedule_irq() loop question Valentin Schneider
2019-01-16 13:45 ` Peter Zijlstra
2019-01-16 14:57 ` Thomas Gleixner
2019-01-16 15:23 ` Valentin Schneider
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).