All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Travis <travis@sgi.com>
To: David Rientjes <rientjes@google.com>
Cc: Yinghai Lu <yhlu.kernel@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Andi Kleen <ak@suse.de>,
	mingo@elte.hu, Christoph Lameter <clameter@sgi.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Eric Dumazet <dada1@cosmosbay.com>
Subject: Re: [PATCH 1/5] x86: Change size of node ids from u8 to u16 fixup
Date: Sat, 19 Jan 2008 16:41:19 -0800	[thread overview]
Message-ID: <479298AF.8040806@sgi.com> (raw)
In-Reply-To: <alpine.DEB.0.9999.0801191415360.28596@chino.kir.corp.google.com>

David Rientjes wrote:
> On Sat, 19 Jan 2008, Mike Travis wrote:
> 
>>> Yeah, NID_INVAL is negative so no unsigned type will work here, 
>>> unfortunately.  And that reduces the intended savings of your change since 
>>> the smaller type can only be used with a smaller CONFIG_NODES_SHIFT.
>>>
>> Excuse my ignorance but why wouldn't this work:
>>
>> static numanode_t pxm_to_node_map[MAX_PXM_DOMAINS]
>>                                 = { [0 ... MAX_PXM_DOMAINS - 1] = NUMA_NO_NODE };
>> ...
>>>> int acpi_map_pxm_to_node(int pxm)
>>>> {
>>>         int node = pxm_to_node_map[pxm];
>>>
>>>         if (node < 0)
>> 	   numanode_t node = pxm_to_node_map[pxm];
>>
> 
> Because NUMA_NO_NODE is 0xff on x86.  That's a valid node id for 
> configurations with CONFIG_NODES_SHIFT equal to or greater than 8.

Perhaps numanode_t should be set to u16 if MAX_NUMNODES > 255 to
allow for an invalid value of 255? 

#if MAX_NUMNODES > 255
typedef u16 numanode_t;
#else
typedef u8 numanode_t;
#endif

> 
>> 	   if (node != NUMA_NO_NODE) {
> 
> Wrong, this should be
> 
> 	node == NUMA_NO_NODE

Oops, yes you're right.

>>>>                 if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
>>>>                         return NID_INVAL;
>>>>                 node = first_unset_node(nodes_found_map);
>>>>                 __acpi_map_pxm_to_node(pxm, node);
>>>>                 node_set(node, nodes_found_map);
>>>>         }
> 
> The net result of this is that if a proximity domain is looked up through 
> acpi_map_pxm_to_node() and already has a mapping to node 255 (legal with 
> CONFIG_NODES_SHIFT == 8), this function will return NID_INVAL since the 
> weight of nodes_found_map is equal to MAX_NUMNODES.

> 
> You simply can't use valid node id's to signify invalid or unused node 
> ids.
> 
>> or change:
>> 	#define NID_INVAL       (-1)
>> to
>> 	#define NID_INVAL       ((numanode_t)(-1))
>> ...
>> 	   if (node != NID_INVAL) {
> 
> You mean
> 
> 	node == NID_INVAL
> 
>>>>                 if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
>>>>                         return NID_INVAL;
>>>>                 node = first_unset_node(nodes_found_map);
>>>>                 __acpi_map_pxm_to_node(pxm, node);
>>>>                 node_set(node, nodes_found_map);
>>>>         }
> 
> That's the equivalent of your NUMA_NO_NODE code above.  The fact remains 
> that (numanode_t)-1 is still a valid node id for MAX_NUMNODES >= 256.
> 
> So, as I said in my initial reply, the only way to get the savings you're 
> looking for is to use u8 for CONFIG_NODES_SHIFT <= 7 and then convert all 
> NID_INVAL users to use NUMA_NO_NODE.

Yes, I agree.  I'll do the changes you're suggesting.

> Additionally, Linux has always discouraged typedefs when they do not 
> define an architecture-specific size.  The savings from your patch for 
> CONFIG_NODES_SHIFT == 7 would be 256 bytes for this mapping.
> 
> It's simply not worth it.

So are you saying that I should just use u16 for all node ids whether
CONFIG_NODES_SHIFT > 7 or not?  Othersise, I would think that defining a
typedef is a fairly clean solution.

A quick grep shows that there are 35 arrays defined by MAX_NUMNODES in
x86_64, 38 in X86_32 (not verified.)  So it's not exactly a trivial
amount of memory.

> 
>> And btw, shouldn't the pxm value be sized to numanode_t size as well?
>> Will it ever be larger than the largest node id?
>>
> 
> Section 6.2.9 of ACPI 2.0 states that PXM's return an integer, so that 
> would be non-conforming to the standard.
> 
> Additionally, PXM's are not nodes, so casting them to anything called 
> numanode_t shows the semantic flaw in your patch.

Thanks for the info.  I wasn't sure exactly what the PXM value represents.
> 
> 		David

Thanks again,
Mike


WARNING: multiple messages have this Message-ID (diff)
From: Mike Travis <travis@sgi.com>
To: David Rientjes <rientjes@google.com>
Cc: Yinghai Lu <yhlu.kernel@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Andi Kleen <ak@suse.de>,
	mingo@elte.hu, Christoph Lameter <clameter@sgi.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Eric Dumazet <dada1@cosmosbay.com>
Subject: Re: [PATCH 1/5] x86: Change size of node ids from u8 to u16 fixup
Date: Sat, 19 Jan 2008 16:41:19 -0800	[thread overview]
Message-ID: <479298AF.8040806@sgi.com> (raw)
In-Reply-To: <alpine.DEB.0.9999.0801191415360.28596@chino.kir.corp.google.com>

David Rientjes wrote:
> On Sat, 19 Jan 2008, Mike Travis wrote:
> 
>>> Yeah, NID_INVAL is negative so no unsigned type will work here, 
>>> unfortunately.  And that reduces the intended savings of your change since 
>>> the smaller type can only be used with a smaller CONFIG_NODES_SHIFT.
>>>
>> Excuse my ignorance but why wouldn't this work:
>>
>> static numanode_t pxm_to_node_map[MAX_PXM_DOMAINS]
>>                                 = { [0 ... MAX_PXM_DOMAINS - 1] = NUMA_NO_NODE };
>> ...
>>>> int acpi_map_pxm_to_node(int pxm)
>>>> {
>>>         int node = pxm_to_node_map[pxm];
>>>
>>>         if (node < 0)
>> 	   numanode_t node = pxm_to_node_map[pxm];
>>
> 
> Because NUMA_NO_NODE is 0xff on x86.  That's a valid node id for 
> configurations with CONFIG_NODES_SHIFT equal to or greater than 8.

Perhaps numanode_t should be set to u16 if MAX_NUMNODES > 255 to
allow for an invalid value of 255? 

#if MAX_NUMNODES > 255
typedef u16 numanode_t;
#else
typedef u8 numanode_t;
#endif

> 
>> 	   if (node != NUMA_NO_NODE) {
> 
> Wrong, this should be
> 
> 	node == NUMA_NO_NODE

Oops, yes you're right.

>>>>                 if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
>>>>                         return NID_INVAL;
>>>>                 node = first_unset_node(nodes_found_map);
>>>>                 __acpi_map_pxm_to_node(pxm, node);
>>>>                 node_set(node, nodes_found_map);
>>>>         }
> 
> The net result of this is that if a proximity domain is looked up through 
> acpi_map_pxm_to_node() and already has a mapping to node 255 (legal with 
> CONFIG_NODES_SHIFT == 8), this function will return NID_INVAL since the 
> weight of nodes_found_map is equal to MAX_NUMNODES.

> 
> You simply can't use valid node id's to signify invalid or unused node 
> ids.
> 
>> or change:
>> 	#define NID_INVAL       (-1)
>> to
>> 	#define NID_INVAL       ((numanode_t)(-1))
>> ...
>> 	   if (node != NID_INVAL) {
> 
> You mean
> 
> 	node == NID_INVAL
> 
>>>>                 if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
>>>>                         return NID_INVAL;
>>>>                 node = first_unset_node(nodes_found_map);
>>>>                 __acpi_map_pxm_to_node(pxm, node);
>>>>                 node_set(node, nodes_found_map);
>>>>         }
> 
> That's the equivalent of your NUMA_NO_NODE code above.  The fact remains 
> that (numanode_t)-1 is still a valid node id for MAX_NUMNODES >= 256.
> 
> So, as I said in my initial reply, the only way to get the savings you're 
> looking for is to use u8 for CONFIG_NODES_SHIFT <= 7 and then convert all 
> NID_INVAL users to use NUMA_NO_NODE.

Yes, I agree.  I'll do the changes you're suggesting.

> Additionally, Linux has always discouraged typedefs when they do not 
> define an architecture-specific size.  The savings from your patch for 
> CONFIG_NODES_SHIFT == 7 would be 256 bytes for this mapping.
> 
> It's simply not worth it.

So are you saying that I should just use u16 for all node ids whether
CONFIG_NODES_SHIFT > 7 or not?  Othersise, I would think that defining a
typedef is a fairly clean solution.

A quick grep shows that there are 35 arrays defined by MAX_NUMNODES in
x86_64, 38 in X86_32 (not verified.)  So it's not exactly a trivial
amount of memory.

> 
>> And btw, shouldn't the pxm value be sized to numanode_t size as well?
>> Will it ever be larger than the largest node id?
>>
> 
> Section 6.2.9 of ACPI 2.0 states that PXM's return an integer, so that 
> would be non-conforming to the standard.
> 
> Additionally, PXM's are not nodes, so casting them to anything called 
> numanode_t shows the semantic flaw in your patch.

Thanks for the info.  I wasn't sure exactly what the PXM value represents.
> 
> 		David

Thanks again,
Mike

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2008-01-20  0:41 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-18 18:30 [PATCH 0/5] x86: Reduce memory usage for large count NR_CPUs fixup travis
2008-01-18 18:30 ` travis
2008-01-18 18:30 ` [PATCH 1/5] x86: Change size of node ids from u8 to u16 fixup travis
2008-01-18 18:30   ` travis
2008-01-18 19:56   ` Jan Engelhardt
2008-01-18 19:56     ` Jan Engelhardt
2008-01-18 19:59     ` Mike Travis
2008-01-18 19:59       ` Mike Travis
2008-01-19  4:03   ` Yinghai Lu
2008-01-19  4:03     ` Yinghai Lu
2008-01-19  4:36     ` David Rientjes
2008-01-19  4:36       ` David Rientjes
2008-01-19  4:43       ` Yinghai Lu
2008-01-19  4:43         ` Yinghai Lu
2008-01-19  5:17         ` David Rientjes
2008-01-19  5:17           ` David Rientjes
2008-01-19  6:20           ` Yinghai Lu
2008-01-19  6:20             ` Yinghai Lu
2008-01-19 21:25       ` Mike Travis
2008-01-19 21:25         ` Mike Travis
2008-01-19 22:33         ` David Rientjes
2008-01-19 22:33           ` David Rientjes
2008-01-20  0:41           ` Mike Travis [this message]
2008-01-20  0:41             ` Mike Travis
2008-01-20  1:31             ` Yinghai Lu
2008-01-20  1:31               ` Yinghai Lu
2008-01-20  6:22             ` David Rientjes
2008-01-20  6:22               ` David Rientjes
2008-01-18 18:30 ` [PATCH 2/5] x86: Change NR_CPUS arrays in numa_64 fixup travis
2008-01-18 18:30   ` travis
2008-01-18 18:30 ` [PATCH 3/5] x86: Change bios_cpu_apicid to percpu data variable fixup travis
2008-01-18 18:30   ` travis
2008-01-18 18:30 ` [PATCH 4/5] x86: Add config variables for SMP_MAX travis
2008-01-18 18:30   ` travis
2008-01-18 20:04   ` Ingo Oeser
2008-01-18 20:04     ` Ingo Oeser
2008-01-18 20:10     ` Christoph Lameter
2008-01-18 20:10       ` Christoph Lameter
2008-01-18 20:14     ` Mike Travis
2008-01-18 20:14       ` Mike Travis
2008-01-18 20:36       ` Andi Kleen
2008-01-18 20:36         ` Andi Kleen
2008-01-18 20:48         ` Mike Travis
2008-01-18 20:48           ` Mike Travis
2008-01-18 21:02         ` [PATCH 4/5] x86: Add config variables for SMP_MAX II Andi Kleen
2008-01-18 21:02           ` Andi Kleen
2008-01-18 20:48       ` [PATCH 4/5] x86: Add config variables for SMP_MAX Ingo Molnar
2008-01-18 20:48         ` Ingo Molnar
2008-01-18 20:55         ` Mike Travis
2008-01-18 20:55           ` Mike Travis
2008-01-18 20:58           ` Andi Kleen
2008-01-18 20:58             ` Andi Kleen
2008-01-28 16:45       ` Paul Jackson
2008-01-28 16:45         ` Paul Jackson
2008-01-28 17:00         ` Andi Kleen
2008-01-28 17:00           ` Andi Kleen
2008-01-18 20:46   ` Ingo Molnar
2008-01-18 20:46     ` Ingo Molnar
2008-01-19 14:52   ` Ingo Molnar
2008-01-19 15:15     ` Ingo Molnar
2008-01-19 15:15       ` Ingo Molnar
2008-01-19 15:24       ` Ingo Molnar
2008-01-19 15:24         ` Ingo Molnar
2008-01-19 21:52         ` Mike Travis
2008-01-19 21:52           ` Mike Travis
2008-01-19 23:24         ` Mike Travis
2008-01-19 23:24           ` Mike Travis
2008-01-20  1:14         ` Mike Travis
2008-01-20  1:14           ` Mike Travis
2008-01-19 21:39     ` Mike Travis
2008-01-19 21:39       ` Mike Travis
2008-01-18 18:30 ` [PATCH 5/5] x86: Add debug of invalid per_cpu map accesses travis
2008-01-18 18:30   ` travis
2008-01-18 18:33   ` Andi Kleen
2008-01-18 18:33     ` Andi Kleen
2008-01-18 18:49     ` Mike Travis
2008-01-18 18:49       ` Mike Travis
2008-01-18 18:56     ` Christoph Lameter
2008-01-18 18:56       ` Christoph Lameter
2008-01-18 20:49     ` Ingo Molnar
2008-01-18 20:49       ` Ingo Molnar

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=479298AF.8040806@sgi.com \
    --to=travis@sgi.com \
    --cc=ak@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=clameter@sgi.com \
    --cc=dada1@cosmosbay.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mingo@elte.hu \
    --cc=rientjes@google.com \
    --cc=yhlu.kernel@gmail.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.