From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/2] of, numa: Add function to disable of_node_to_nid().
Date: Fri, 28 Oct 2016 11:19:05 +0100 [thread overview]
Message-ID: <20161028101905.GA6343@arm.com> (raw)
In-Reply-To: <1477431061-7258-2-git-send-email-ddaney.cavm@gmail.com>
On Tue, Oct 25, 2016 at 02:31:00PM -0700, David Daney wrote:
> From: David Daney <david.daney@cavium.com>
>
> On arm64 NUMA kernels we can pass "numa=off" on the command line to
> disable NUMA. A side effect of this is that kmalloc_node() calls to
> non-zero nodes will crash the system with an OOPS:
>
> [ 0.000000] [<fffffc00081bba84>] __alloc_pages_nodemask+0xa4/0xe68
> [ 0.000000] [<fffffc00082163a8>] new_slab+0xd0/0x57c
> [ 0.000000] [<fffffc000821879c>] ___slab_alloc+0x2e4/0x514
> [ 0.000000] [<fffffc000823882c>] __slab_alloc+0x48/0x58
> [ 0.000000] [<fffffc00082195a0>] __kmalloc_node+0xd0/0x2e0
> [ 0.000000] [<fffffc00081119b8>] __irq_domain_add+0x7c/0x164
> [ 0.000000] [<fffffc0008b75d30>] its_probe+0x784/0x81c
> [ 0.000000] [<fffffc0008b75e10>] its_init+0x48/0x1b0
> .
> .
> .
>
> This is caused by code like this in kernel/irq/irqdomain.c
>
> domain = kzalloc_node(sizeof(*domain) + (sizeof(unsigned int) * size),
> GFP_KERNEL, of_node_to_nid(of_node));
>
> When NUMA is disabled, the concept of a node is really undefined, so
> of_node_to_nid() should unconditionally return NUMA_NO_NODE.
>
> Add __of_force_no_numa() to allow of_node_to_nid() to be forced to
> return NUMA_NO_NODE.
>
> The follow on patch will call this new function from the arm64 numa
> code.
>
> Reported-by: Gilbert Netzer <noname@pdc.kth.se>
> Signed-off-by: David Daney <david.daney@cavium.com>
> ---
> drivers/of/of_numa.c | 15 +++++++++++++++
> include/linux/of.h | 2 ++
> 2 files changed, 17 insertions(+)
>
> diff --git a/drivers/of/of_numa.c b/drivers/of/of_numa.c
> index f63d4b0d..2212299 100644
> --- a/drivers/of/of_numa.c
> +++ b/drivers/of/of_numa.c
> @@ -150,12 +150,27 @@ static int __init of_numa_parse_distance_map(void)
> return ret;
> }
>
> +static bool of_force_no_numa;
> +
> +void __of_force_no_numa(void)
> +{
> + of_force_no_numa = true;
> +}
> +
> int of_node_to_nid(struct device_node *device)
> {
> struct device_node *np;
> u32 nid;
> int r = -ENODATA;
>
> + /*
> + * If NUMA forced off, nodes are meaningless. Return
> + * NUMA_NO_NODE so that any node specific memory allocations
> + * can succeed from the default pool.
> + */
> + if (of_force_no_numa)
> + return NUMA_NO_NODE;
Why don't you just check if the nid you get back from the device is set in
numa_nodes_parsed and return NUMA_NO_NODE if not?
Will
WARNING: multiple messages have this Message-ID (diff)
From: Will Deacon <will.deacon@arm.com>
To: David Daney <ddaney.cavm@gmail.com>
Cc: linux-kernel@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
Frank Rowand <frowand.list@gmail.com>,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
Catalin Marinas <catalin.marinas@arm.com>,
Robert Richter <rric@kernel.org>,
Hanjun Guo <hanjun.guo@linaro.org>,
Ganapatrao Kulkarni <gkulkarni@caviumnetworks.com>,
Gilbert Netzer <noname@pdc.kth.se>,
David Daney <david.daney@cavium.com>
Subject: Re: [PATCH 1/2] of, numa: Add function to disable of_node_to_nid().
Date: Fri, 28 Oct 2016 11:19:05 +0100 [thread overview]
Message-ID: <20161028101905.GA6343@arm.com> (raw)
In-Reply-To: <1477431061-7258-2-git-send-email-ddaney.cavm@gmail.com>
On Tue, Oct 25, 2016 at 02:31:00PM -0700, David Daney wrote:
> From: David Daney <david.daney@cavium.com>
>
> On arm64 NUMA kernels we can pass "numa=off" on the command line to
> disable NUMA. A side effect of this is that kmalloc_node() calls to
> non-zero nodes will crash the system with an OOPS:
>
> [ 0.000000] [<fffffc00081bba84>] __alloc_pages_nodemask+0xa4/0xe68
> [ 0.000000] [<fffffc00082163a8>] new_slab+0xd0/0x57c
> [ 0.000000] [<fffffc000821879c>] ___slab_alloc+0x2e4/0x514
> [ 0.000000] [<fffffc000823882c>] __slab_alloc+0x48/0x58
> [ 0.000000] [<fffffc00082195a0>] __kmalloc_node+0xd0/0x2e0
> [ 0.000000] [<fffffc00081119b8>] __irq_domain_add+0x7c/0x164
> [ 0.000000] [<fffffc0008b75d30>] its_probe+0x784/0x81c
> [ 0.000000] [<fffffc0008b75e10>] its_init+0x48/0x1b0
> .
> .
> .
>
> This is caused by code like this in kernel/irq/irqdomain.c
>
> domain = kzalloc_node(sizeof(*domain) + (sizeof(unsigned int) * size),
> GFP_KERNEL, of_node_to_nid(of_node));
>
> When NUMA is disabled, the concept of a node is really undefined, so
> of_node_to_nid() should unconditionally return NUMA_NO_NODE.
>
> Add __of_force_no_numa() to allow of_node_to_nid() to be forced to
> return NUMA_NO_NODE.
>
> The follow on patch will call this new function from the arm64 numa
> code.
>
> Reported-by: Gilbert Netzer <noname@pdc.kth.se>
> Signed-off-by: David Daney <david.daney@cavium.com>
> ---
> drivers/of/of_numa.c | 15 +++++++++++++++
> include/linux/of.h | 2 ++
> 2 files changed, 17 insertions(+)
>
> diff --git a/drivers/of/of_numa.c b/drivers/of/of_numa.c
> index f63d4b0d..2212299 100644
> --- a/drivers/of/of_numa.c
> +++ b/drivers/of/of_numa.c
> @@ -150,12 +150,27 @@ static int __init of_numa_parse_distance_map(void)
> return ret;
> }
>
> +static bool of_force_no_numa;
> +
> +void __of_force_no_numa(void)
> +{
> + of_force_no_numa = true;
> +}
> +
> int of_node_to_nid(struct device_node *device)
> {
> struct device_node *np;
> u32 nid;
> int r = -ENODATA;
>
> + /*
> + * If NUMA forced off, nodes are meaningless. Return
> + * NUMA_NO_NODE so that any node specific memory allocations
> + * can succeed from the default pool.
> + */
> + if (of_force_no_numa)
> + return NUMA_NO_NODE;
Why don't you just check if the nid you get back from the device is set in
numa_nodes_parsed and return NUMA_NO_NODE if not?
Will
next prev parent reply other threads:[~2016-10-28 10:19 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-25 21:30 [PATCH 0/2] arm64, numa: Fix OOPS with numa=off David Daney
2016-10-25 21:30 ` David Daney
2016-10-25 21:30 ` David Daney
2016-10-25 21:31 ` [PATCH 1/2] of, numa: Add function to disable of_node_to_nid() David Daney
2016-10-25 21:31 ` David Daney
2016-10-25 21:31 ` David Daney
2016-10-26 13:43 ` Robert Richter
2016-10-26 13:43 ` Robert Richter
2016-10-26 13:43 ` Robert Richter
2016-10-26 17:00 ` David Daney
2016-10-26 17:00 ` David Daney
2016-10-26 17:00 ` David Daney
2016-10-26 22:21 ` Robert Richter
2016-10-26 22:21 ` Robert Richter
2016-10-26 22:21 ` Robert Richter
2016-10-28 1:50 ` Leizhen (ThunderTown)
2016-10-28 1:50 ` Leizhen (ThunderTown)
2016-10-28 1:50 ` Leizhen (ThunderTown)
2016-10-28 10:19 ` Will Deacon [this message]
2016-10-28 10:19 ` Will Deacon
2016-10-28 17:02 ` David Daney
2016-10-28 17:02 ` David Daney
2016-10-28 17:02 ` David Daney
2016-10-25 21:31 ` [PATCH 2/2] arm64, numa: Force of_node_to_nid to return NUMA_NO_NODE when numa=off David Daney
2016-10-25 21:31 ` David Daney
2016-10-25 21:31 ` David Daney
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=20161028101905.GA6343@arm.com \
--to=will.deacon@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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.