From: Sebastien Dugue <sebastien.dugue@bull.net>
To: michael@ellerman.id.au
Cc: tinytim@us.ibm.com, linux-rt-users@vger.kernel.org,
jean-pierre.dion@bull.net, rostedt@goodmis.org,
linux-kernel@vger.kernel.org, linuxppc-dev@ozlabs.org,
paulus@samba.org, gilles.carry@ext.bull.net, tglx@linutronix.de
Subject: Re: [PATCH] powerpc - Initialize the irq radix tree earlier
Date: Thu, 31 Jul 2008 16:14:30 +0200 [thread overview]
Message-ID: <20080731161430.5de73ef8@bull.net> (raw)
In-Reply-To: <1217511566.19050.26.camel@localhost>
On Thu, 31 Jul 2008 23:39:26 +1000 Michael Ellerman <michael@ellerman.id.au=
> wrote:
> On Thu, 2008-07-31 at 15:26 +0200, Sebastien Dugue wrote:
> > On Thu, 31 Jul 2008 23:01:39 +1000 Michael Ellerman <michael@ellerman.i=
d.au> wrote:
> >=20
> > > On Thu, 2008-07-31 at 22:58 +1000, Michael Ellerman wrote:
> > > > On Thu, 2008-07-31 at 14:00 +0200, Sebastien Dugue wrote:
> > > > > On Thu, 31 Jul 2008 21:40:56 +1000 Michael Ellerman <michael@elle=
rman.id.au> wrote:
> > > > > >=20
> > > > > > This boot ordering stuff is pretty hairy, so I might have missed
> > > > > > something, but this is how the code is ordered AFAICT:
> > > > > > =EF=BB=BF
> > > > > > start_kernel()
> > > > > > init_IRQ()
> > > > > > ...
> > > > > > local_irq_enable()
> > > > > > ...
> > > > > > rest_init()
> > > > > > kernel_thread()
> > > > > > kernel_init()
> > > > > > smp_prepare_cpus()
> > > > > > smp_xics_probe() (via smp_ops->probe())
> > > > > >=20
> > > > > >=20
> > > > > > What's stopping us from taking an irq between local_irq_enable(=
) and
> > > > > > smp_xics_probe() ? Is it just that no one's request_irq()'ed t=
hem yet?
> > > > >=20
> > > > > It's hairy, I agree, but as you've mentioned no one has done a =
request_irq()
> > > > > at that point. The first one to do it is smp_xics_probe() for the=
IPI.
> > > >=20
> > > > Hmm, I don't think that's strong enough. I can trivially cause irqs=
to
> > > > fire during a kexec reboot just by mashing the keyboard.
> > > >=20
> > > > And during a kdump boot all sorts of stuff could be firing. Even du=
ring
> > > > a clean boot, from firmware, I don't think we can guarantee that
> > > > nothing's going to fire.
> > > >=20
> > > > .. after a bit of testing ..
> > > >=20
> > > > It seems it actually works (sort of).=20
> > > >=20
> > > > xics_remap_irq() calls irq_radix_revmap_lookup(), which calls:
> > > >=20
> > > > ptr =3D radix_tree_lookup(&host->revmap_data.tree, hwirq);
> > > >=20
> > > > And because =EF=BB=BFhost->revmap_data.tree was zalloc'ed we trip o=
n the first
> > > > check here:
> > >=20
> > > @#$% ctrl-enter =3D=3D send!
> > >=20
> > > Continuing ...
> > >=20
> > > void *radix_tree_lookup(struct radix_tree_root *root, unsigned long i=
ndex)
> > > {
> > > unsigned int height, shift;
> > > struct radix_tree_node *node, **slot;
> > >=20
> > > node =3D rcu_dereference(root->rnode);
> > > if (node =3D=3D NULL)
> > > return NULL;
> > >=20
> > > Which means =EF=BB=BFirq_radix_revmap_lookup() will return NO_IRQ, wh=
ich is cool.
> >=20
> > Which is what I intended so that as long as no IRQ is registered we
> > return NO_IRQ.
> >=20
> > >=20
> > >=20
> > > So I think it can fly, as long as we're happy that we can't reverse m=
ap
> > > anything until smp_xics_probe() - and I think that's true, as any irq=
we
> > > take will be invalid.
> >=20
> > That's true as no IRQs are registered before smp_xics_probe() and for=
any
> > interrupt we might get before that, irq_radix_revmap_lookup() will retu=
rn
> > NO_IRQ.
>=20
> Cool, we agree :)=20
>=20
> My only worry is that we might be relying on on the particular radix
> tree implementation a bit too much.
Well maybe we could revert back to testing a flag just like we
do for host->revmap_data.tree.gfp_mask !=3D 0. Dunno.
> Is it documented somewhere that
> the /very/ first check is for =EF=BB=BFroot->rnode !=3D NULL, and the res=
t of the
> root may be unintialised?
Not in anything I could read except in looking at the code.
>=20
> And I think it needs a big fat comment in the irq code saying that it's
> safe because revmap_data is zalloc'ed, and that means the radix lookup
> will fail (safely).
Yep, right. Will advertise this properly for the next round if this
remains the prefered solution.
Thanks,
Sebastien.
WARNING: multiple messages have this Message-ID (diff)
From: Sebastien Dugue <sebastien.dugue@bull.net>
To: michael@ellerman.id.au
Cc: linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org,
linux-rt-users@vger.kernel.org, benh@kernel.crashing.org,
paulus@samba.org, jean-pierre.dion@bull.net,
gilles.carry@ext.bull.net, tinytim@us.ibm.com,
tglx@linutronix.de, rostedt@goodmis.org
Subject: Re: [PATCH] powerpc - Initialize the irq radix tree earlier
Date: Thu, 31 Jul 2008 16:14:30 +0200 [thread overview]
Message-ID: <20080731161430.5de73ef8@bull.net> (raw)
In-Reply-To: <1217511566.19050.26.camel@localhost>
On Thu, 31 Jul 2008 23:39:26 +1000 Michael Ellerman <michael@ellerman.id.au> wrote:
> On Thu, 2008-07-31 at 15:26 +0200, Sebastien Dugue wrote:
> > On Thu, 31 Jul 2008 23:01:39 +1000 Michael Ellerman <michael@ellerman.id.au> wrote:
> >
> > > On Thu, 2008-07-31 at 22:58 +1000, Michael Ellerman wrote:
> > > > On Thu, 2008-07-31 at 14:00 +0200, Sebastien Dugue wrote:
> > > > > On Thu, 31 Jul 2008 21:40:56 +1000 Michael Ellerman <michael@ellerman.id.au> wrote:
> > > > > >
> > > > > > This boot ordering stuff is pretty hairy, so I might have missed
> > > > > > something, but this is how the code is ordered AFAICT:
> > > > > >
> > > > > > start_kernel()
> > > > > > init_IRQ()
> > > > > > ...
> > > > > > local_irq_enable()
> > > > > > ...
> > > > > > rest_init()
> > > > > > kernel_thread()
> > > > > > kernel_init()
> > > > > > smp_prepare_cpus()
> > > > > > smp_xics_probe() (via smp_ops->probe())
> > > > > >
> > > > > >
> > > > > > What's stopping us from taking an irq between local_irq_enable() and
> > > > > > smp_xics_probe() ? Is it just that no one's request_irq()'ed them yet?
> > > > >
> > > > > It's hairy, I agree, but as you've mentioned no one has done a request_irq()
> > > > > at that point. The first one to do it is smp_xics_probe() for the IPI.
> > > >
> > > > Hmm, I don't think that's strong enough. I can trivially cause irqs to
> > > > fire during a kexec reboot just by mashing the keyboard.
> > > >
> > > > And during a kdump boot all sorts of stuff could be firing. Even during
> > > > a clean boot, from firmware, I don't think we can guarantee that
> > > > nothing's going to fire.
> > > >
> > > > .. after a bit of testing ..
> > > >
> > > > It seems it actually works (sort of).
> > > >
> > > > xics_remap_irq() calls irq_radix_revmap_lookup(), which calls:
> > > >
> > > > ptr = radix_tree_lookup(&host->revmap_data.tree, hwirq);
> > > >
> > > > And because host->revmap_data.tree was zalloc'ed we trip on the first
> > > > check here:
> > >
> > > @#$% ctrl-enter == send!
> > >
> > > Continuing ...
> > >
> > > void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
> > > {
> > > unsigned int height, shift;
> > > struct radix_tree_node *node, **slot;
> > >
> > > node = rcu_dereference(root->rnode);
> > > if (node == NULL)
> > > return NULL;
> > >
> > > Which means irq_radix_revmap_lookup() will return NO_IRQ, which is cool.
> >
> > Which is what I intended so that as long as no IRQ is registered we
> > return NO_IRQ.
> >
> > >
> > >
> > > So I think it can fly, as long as we're happy that we can't reverse map
> > > anything until smp_xics_probe() - and I think that's true, as any irq we
> > > take will be invalid.
> >
> > That's true as no IRQs are registered before smp_xics_probe() and for any
> > interrupt we might get before that, irq_radix_revmap_lookup() will return
> > NO_IRQ.
>
> Cool, we agree :)
>
> My only worry is that we might be relying on on the particular radix
> tree implementation a bit too much.
Well maybe we could revert back to testing a flag just like we
do for host->revmap_data.tree.gfp_mask != 0. Dunno.
> Is it documented somewhere that
> the /very/ first check is for root->rnode != NULL, and the rest of the
> root may be unintialised?
Not in anything I could read except in looking at the code.
>
> And I think it needs a big fat comment in the irq code saying that it's
> safe because revmap_data is zalloc'ed, and that means the radix lookup
> will fail (safely).
Yep, right. Will advertise this properly for the next round if this
remains the prefered solution.
Thanks,
Sebastien.
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: Sebastien Dugue <sebastien.dugue@bull.net>
To: michael@ellerman.id.au
Cc: linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org,
linux-rt-users@vger.kernel.org, benh@kernel.crashing.org,
paulus@samba.org, jean-pierre.dion@bull.net,
gilles.carry@ext.bull.net, tinytim@us.ibm.com,
tglx@linutronix.de, rostedt@goodmis.org
Subject: Re: [PATCH] powerpc - Initialize the irq radix tree earlier
Date: Thu, 31 Jul 2008 16:14:30 +0200 [thread overview]
Message-ID: <20080731161430.5de73ef8@bull.net> (raw)
In-Reply-To: <1217511566.19050.26.camel@localhost>
On Thu, 31 Jul 2008 23:39:26 +1000 Michael Ellerman <michael@ellerman.id.au> wrote:
> On Thu, 2008-07-31 at 15:26 +0200, Sebastien Dugue wrote:
> > On Thu, 31 Jul 2008 23:01:39 +1000 Michael Ellerman <michael@ellerman.id.au> wrote:
> >
> > > On Thu, 2008-07-31 at 22:58 +1000, Michael Ellerman wrote:
> > > > On Thu, 2008-07-31 at 14:00 +0200, Sebastien Dugue wrote:
> > > > > On Thu, 31 Jul 2008 21:40:56 +1000 Michael Ellerman <michael@ellerman.id.au> wrote:
> > > > > >
> > > > > > This boot ordering stuff is pretty hairy, so I might have missed
> > > > > > something, but this is how the code is ordered AFAICT:
> > > > > >
> > > > > > start_kernel()
> > > > > > init_IRQ()
> > > > > > ...
> > > > > > local_irq_enable()
> > > > > > ...
> > > > > > rest_init()
> > > > > > kernel_thread()
> > > > > > kernel_init()
> > > > > > smp_prepare_cpus()
> > > > > > smp_xics_probe() (via smp_ops->probe())
> > > > > >
> > > > > >
> > > > > > What's stopping us from taking an irq between local_irq_enable() and
> > > > > > smp_xics_probe() ? Is it just that no one's request_irq()'ed them yet?
> > > > >
> > > > > It's hairy, I agree, but as you've mentioned no one has done a request_irq()
> > > > > at that point. The first one to do it is smp_xics_probe() for the IPI.
> > > >
> > > > Hmm, I don't think that's strong enough. I can trivially cause irqs to
> > > > fire during a kexec reboot just by mashing the keyboard.
> > > >
> > > > And during a kdump boot all sorts of stuff could be firing. Even during
> > > > a clean boot, from firmware, I don't think we can guarantee that
> > > > nothing's going to fire.
> > > >
> > > > .. after a bit of testing ..
> > > >
> > > > It seems it actually works (sort of).
> > > >
> > > > xics_remap_irq() calls irq_radix_revmap_lookup(), which calls:
> > > >
> > > > ptr = radix_tree_lookup(&host->revmap_data.tree, hwirq);
> > > >
> > > > And because host->revmap_data.tree was zalloc'ed we trip on the first
> > > > check here:
> > >
> > > @#$% ctrl-enter == send!
> > >
> > > Continuing ...
> > >
> > > void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
> > > {
> > > unsigned int height, shift;
> > > struct radix_tree_node *node, **slot;
> > >
> > > node = rcu_dereference(root->rnode);
> > > if (node == NULL)
> > > return NULL;
> > >
> > > Which means irq_radix_revmap_lookup() will return NO_IRQ, which is cool.
> >
> > Which is what I intended so that as long as no IRQ is registered we
> > return NO_IRQ.
> >
> > >
> > >
> > > So I think it can fly, as long as we're happy that we can't reverse map
> > > anything until smp_xics_probe() - and I think that's true, as any irq we
> > > take will be invalid.
> >
> > That's true as no IRQs are registered before smp_xics_probe() and for any
> > interrupt we might get before that, irq_radix_revmap_lookup() will return
> > NO_IRQ.
>
> Cool, we agree :)
>
> My only worry is that we might be relying on on the particular radix
> tree implementation a bit too much.
Well maybe we could revert back to testing a flag just like we
do for host->revmap_data.tree.gfp_mask != 0. Dunno.
> Is it documented somewhere that
> the /very/ first check is for root->rnode != NULL, and the rest of the
> root may be unintialised?
Not in anything I could read except in looking at the code.
>
> And I think it needs a big fat comment in the irq code saying that it's
> safe because revmap_data is zalloc'ed, and that means the radix lookup
> will fail (safely).
Yep, right. Will advertise this properly for the next round if this
remains the prefered solution.
Thanks,
Sebastien.
next prev parent reply other threads:[~2008-07-31 14:14 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-31 9:40 [PATCH 0/3] powerpc - Make the irq reverse mapping tree lockless Sebastien Dugue
2008-07-31 9:40 ` Sebastien Dugue
2008-07-31 9:40 ` [PATCH] powerpc - Initialize the irq radix tree earlier Sebastien Dugue
2008-07-31 9:40 ` Sebastien Dugue
2008-07-31 11:40 ` Michael Ellerman
2008-07-31 11:40 ` Michael Ellerman
2008-07-31 12:00 ` Sebastien Dugue
2008-07-31 12:00 ` Sebastien Dugue
2008-07-31 12:00 ` Sebastien Dugue
2008-07-31 12:10 ` Sebastien Dugue
2008-07-31 12:10 ` Sebastien Dugue
2008-07-31 12:10 ` Sebastien Dugue
2008-07-31 12:58 ` Michael Ellerman
2008-07-31 12:58 ` Michael Ellerman
2008-07-31 13:01 ` Michael Ellerman
2008-07-31 13:01 ` Michael Ellerman
2008-07-31 13:26 ` Sebastien Dugue
2008-07-31 13:26 ` Sebastien Dugue
2008-07-31 13:26 ` Sebastien Dugue
2008-07-31 13:39 ` Michael Ellerman
2008-07-31 13:39 ` Michael Ellerman
2008-07-31 14:14 ` Sebastien Dugue [this message]
2008-07-31 14:14 ` Sebastien Dugue
2008-07-31 14:14 ` Sebastien Dugue
2008-07-31 9:40 ` [PATCH] powerpc - Separate the irq radix tree insertion and lookup Sebastien Dugue
2008-07-31 9:40 ` Sebastien Dugue
2008-07-31 9:40 ` [PATCH] powerpc - Make the irq reverse mapping radix tree lockless Sebastien Dugue
2008-07-31 9:40 ` Sebastien Dugue
2008-07-31 10:12 ` [PATCH 0/3] powerpc - Make the irq reverse mapping " Sebastien Dugue
2008-07-31 10:12 ` Sebastien Dugue
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=20080731161430.5de73ef8@bull.net \
--to=sebastien.dugue@bull.net \
--cc=gilles.carry@ext.bull.net \
--cc=jean-pierre.dion@bull.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-users@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=michael@ellerman.id.au \
--cc=paulus@samba.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=tinytim@us.ibm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.