All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Paul Mundt <lethal@linux-sh.org>, Ingo Molnar <mingo@elte.hu>,
	Yinghai Lu <yinghai@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Mel Gorman <mel@csn.ul.ie>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] sparseirq: Enable early irq_desc allocation.
Date: Thu, 21 May 2009 13:26:26 -0700	[thread overview]
Message-ID: <4A15B8F2.9000804@kernel.org> (raw)
In-Reply-To: <20090521165647.GA320@linux-sh.org>



Paul Mundt wrote:
> Presently non-legacy IRQs have their irq_desc allocated with
> kzalloc_node(). This assumes that all callers of irq_to_desc_cpu_alloc()
> will be sufficiently late in the boot process that kmalloc is available.
> 
> While porting sparseirq support to sh this blew up immediately, as at the
> time that we register the CPU's interrupt vector map only bootmem is
> available.
> 
> This adds in a simple after_bootmem check to see where the allocation
> needs to come from, which is likewise provided by all of the platforms
> that support sparse irq today. :-)
> 
> Cc: Yinghai Lu <yinghai@kernel.org>
> Cc: Ingo Molnar <mingo@elte.hu>
> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
> 
> ---
> 
>  kernel/irq/handle.c |   17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
> index d82142b..5fb3a5c 100644
> --- a/kernel/irq/handle.c
> +++ b/kernel/irq/handle.c
> @@ -19,7 +19,7 @@
>  #include <linux/hash.h>
>  #include <trace/irq.h>
>  #include <linux/bootmem.h>
> -
> +#include <linux/mm.h>
>  #include "internals.h"
>  
>  /*
> @@ -81,13 +81,17 @@ static struct irq_desc irq_desc_init = {
>  	.lock       = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
>  };
>  
> -void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr)
> +void __ref init_kstat_irqs(struct irq_desc *desc, int cpu, int nr)
>  {
>  	int node;
>  	void *ptr;
>  
>  	node = cpu_to_node(cpu);
> -	ptr = kzalloc_node(nr * sizeof(*desc->kstat_irqs), GFP_ATOMIC, node);
> +	if (after_bootmem)
> +		ptr = kzalloc_node(nr * sizeof(*desc->kstat_irqs), GFP_ATOMIC, node);
> +	else
> +		ptr = alloc_bootmem_node(NODE_DATA(node),
> +				nr * sizeof(*desc->kstat_irqs));
>  
>  	/*
>  	 * don't overwite if can not get new one
> @@ -187,7 +191,7 @@ struct irq_desc *irq_to_desc(unsigned int irq)
>  	return NULL;
>  }
>  
> -struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
> +struct irq_desc * __ref irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
>  {
>  	struct irq_desc *desc;
>  	unsigned long flags;
> @@ -211,7 +215,10 @@ struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
>  		goto out_unlock;
>  
>  	node = cpu_to_node(cpu);
> -	desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
> +	if (after_bootmem)
> +		desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
> +	else
> +		desc = alloc_bootmem_node(NODE_DATA(node), sizeof(*desc));
>  	printk(KERN_DEBUG "  alloc irq_desc for %d on cpu %d node %d\n",
>  		 irq, cpu, node);
>  	if (!desc) {

can you check tip?
we change _cpu to node already.

also only sh have after_bootmem now.
arch/sh/mm/init.c:int after_bootmem = 0;
arch/sh/mm/init.c:      after_bootmem = 1;
arch/sh/mm/ioremap_64.c:        extern int after_bootmem;
arch/sh/mm/ioremap_64.c:        if (after_bootmem) {
include/linux/mm.h:extern int after_bootmem;

for x86 we have bootmem_state ...
arch/x86/include/asm/page_types.h:enum bootmem_state {
arch/x86/include/asm/page_types.h:extern enum bootmem_state bootmem_state;
arch/x86/kernel/setup.c:        bootmem_state = DURING_BOOTMEM;
arch/x86/mm/init.c:enum bootmem_state bootmem_state = BEFORE_BOOTMEM;
arch/x86/mm/init.c:     if (bootmem_state == BEFORE_BOOTMEM)
arch/x86/mm/init.c:     if (bootmem_state == BEFORE_BOOTMEM)
arch/x86/mm/init.c:     if (bootmem_state == BEFORE_BOOTMEM && !start) {
arch/x86/mm/init.c:     if (bootmem_state == BEFORE_BOOTMEM &&
arch/x86/mm/init.c:     if (bootmem_state == BEFORE_BOOTMEM)

Andrew,
do we need to move bootmem_state back to linux/mm.h?

YH




YH

  reply	other threads:[~2009-05-21 20:27 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-21 16:56 [PATCH] sparseirq: Enable early irq_desc allocation Paul Mundt
2009-05-21 20:26 ` Yinghai Lu [this message]
2009-05-22  1:40   ` Paul Mundt
2009-05-23 12:57     ` Ingo Molnar
2009-05-23 12:57     ` [tip:irq/numa] sparseirq: Allow " tip-bot for Paul Mundt

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=4A15B8F2.9000804@kernel.org \
    --to=yinghai@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=lethal@linux-sh.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mel@csn.ul.ie \
    --cc=mingo@elte.hu \
    /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.