public inbox for linux-kernel@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox