[PATCH 1/3] powerpc - Initialize the irq radix tree earlier
Sebastien Dugue
sebastien.dugue at bull.net
Tue Aug 5 18:26:36 EST 2008
Hi Benjamin,
On Tue, 05 Aug 2008 11:03:46 +1000 Benjamin Herrenschmidt <benh at kernel.crashing.org> wrote:
> On Mon, 2008-08-04 at 13:08 +0200, Sebastien Dugue wrote:
> > The radix tree used for fast irq reverse mapping by the XICS is initialized
> > late in the boot process, after the first interrupt (IPI) gets registered
> > and after the first IPI is received.
> >
> > This patch moves the initialization of the XICS radix tree earlier into
> > the boot process in smp_xics_probe() (the mm is already up but no interrupts
> > have been registered at that point) to avoid having to insert a mapping into
> > the tree in interrupt context. This will help in simplifying the locking
> > constraints and move to a lockless radix tree in subsequent patches.
>
> I'm not too happy with the moving of the radix tree init to platform
> code.
>
> The fact that the revmap code uses a radix tree should be mostly
> transparent to the XICS code. I don't like adding this explicit code
> from xics to initialize it.
OK, I'm fine with that.
>
> I think the tree should still be initialized from generic code and it
> can be done as late as we want as interrupts work without the tree being
> there, they are just a bit slower.
>
> I believe the right approach is:
>
> - Remove the populating of the tree from the revmap function as
> you already do
> - Move it to irq_create_mapping() for the normal case
Agreed.
> - For pre-existing interrupt, have the generic code that initializes
> the radix tree walk through all interrupts and setup the revmap for
> them. If that needs locking vs. concurrent irq_create_mapping, it's
> easy to use one of the available spinlocks for that.
That's what I wanted to avoid to not add some new complexity, but I can
see that my approach makes some assumptions about initializations order
that I'm no longer comfortable with. Will do as you suggest as it's
way more explicit.
Thanks a lot for your comments.
Sebastien.
>
> Cheers,
> Ben.
>
>
> > Signed-off-by: Sebastien Dugue <sebastien.dugue at bull.net>
> > Cc: Paul Mackerras <paulus at samba.org>
> > Cc: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> > Cc: Michael Ellerman <michael at ellerman.id.au>
> > ---
> > arch/powerpc/kernel/irq.c | 17 -----------------
> > arch/powerpc/platforms/pseries/smp.c | 1 +
> > arch/powerpc/platforms/pseries/xics.c | 5 +++++
> > arch/powerpc/platforms/pseries/xics.h | 1 +
> > 4 files changed, 7 insertions(+), 17 deletions(-)
> >
> > diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> > index d972dec..9bef9f3 100644
> > --- a/arch/powerpc/kernel/irq.c
> > +++ b/arch/powerpc/kernel/irq.c
> > @@ -1016,23 +1016,6 @@ void irq_early_init(void)
> > get_irq_desc(i)->status |= IRQ_NOREQUEST;
> > }
> >
> > -/* We need to create the radix trees late */
> > -static int irq_late_init(void)
> > -{
> > - struct irq_host *h;
> > - unsigned long flags;
> > -
> > - irq_radix_wrlock(&flags);
> > - list_for_each_entry(h, &irq_hosts, link) {
> > - if (h->revmap_type == IRQ_HOST_MAP_TREE)
> > - INIT_RADIX_TREE(&h->revmap_data.tree, GFP_ATOMIC);
> > - }
> > - irq_radix_wrunlock(flags);
> > -
> > - return 0;
> > -}
> > -arch_initcall(irq_late_init);
> > -
> > #ifdef CONFIG_VIRQ_DEBUG
> > static int virq_debug_show(struct seq_file *m, void *private)
> > {
> > diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c
> > index 9d8f8c8..3d4429a 100644
> > --- a/arch/powerpc/platforms/pseries/smp.c
> > +++ b/arch/powerpc/platforms/pseries/smp.c
> > @@ -130,6 +130,7 @@ static void smp_xics_message_pass(int target, int msg)
> >
> > static int __init smp_xics_probe(void)
> > {
> > + xics_radix_revmap_init();
> > xics_request_IPIs();
> >
> > return cpus_weight(cpu_possible_map);
> > diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c
> > index 0fc830f..d6e28f9 100644
> > --- a/arch/powerpc/platforms/pseries/xics.c
> > +++ b/arch/powerpc/platforms/pseries/xics.c
> > @@ -556,6 +556,11 @@ static struct irq_host_ops xics_host_ops = {
> > .xlate = xics_host_xlate,
> > };
> >
> > +void __init xics_radix_revmap_init(void)
> > +{
> > + INIT_RADIX_TREE(&xics_host->revmap_data.tree, GFP_ATOMIC);
> > +}
> > +
> > static void __init xics_init_host(void)
> > {
> > if (firmware_has_feature(FW_FEATURE_LPAR))
> > diff --git a/arch/powerpc/platforms/pseries/xics.h b/arch/powerpc/platforms/pseries/xics.h
> > index 1c5321a..11490be 100644
> > --- a/arch/powerpc/platforms/pseries/xics.h
> > +++ b/arch/powerpc/platforms/pseries/xics.h
> > @@ -19,6 +19,7 @@ extern void xics_setup_cpu(void);
> > extern void xics_teardown_cpu(void);
> > extern void xics_kexec_teardown_cpu(int secondary);
> > extern void xics_cause_IPI(int cpu);
> > +extern void xics_radix_revmap_init(void);
> > extern void xics_request_IPIs(void);
> > extern void xics_migrate_irqs_away(void);
> >
>
>
More information about the Linuxppc-dev
mailing list