linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Valentin Schneider <valentin.schneider@arm.com>,
	Ingo Molnar <mingo@kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Julien Thierry <julien.thierry@arm.com>
Subject: Re: preempt_schedule_irq() loop question
Date: Wed, 16 Jan 2019 15:57:28 +0100 (CET)	[thread overview]
Message-ID: <alpine.DEB.2.21.1901161550460.1749@nanos.tec.linutronix.de> (raw)
In-Reply-To: <20190116134521.GG10803@hirez.programming.kicks-ass.net>

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


  reply	other threads:[~2019-01-16 14:57 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-16 12:50 Valentin Schneider
2019-01-16 13:45 ` Peter Zijlstra
2019-01-16 14:57   ` Thomas Gleixner [this message]
2019-01-16 15:23     ` Valentin Schneider

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=alpine.DEB.2.21.1901161550460.1749@nanos.tec.linutronix.de \
    --to=tglx@linutronix.de \
    --cc=catalin.marinas@arm.com \
    --cc=julien.thierry@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=valentin.schneider@arm.com \
    --cc=will.deacon@arm.com \
    --subject='Re: preempt_schedule_irq() loop question' \
    /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

This is a public inbox, see mirroring instructions
on how to clone and mirror all data and code used for this inbox