From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2011-06-14 00:59:30
Just compiling pseries in the kernel causes it to override
memory_block_size_bytes() regardless of what is the runtime
platform.
This cleans up the implementation of that function, fixing
a bug or two while at it, so that it's harmless (and potentially
useful) for other platforms. Without this, bugs in that code
would trigger a WARN_ON() in drivers/base/memory.c when
booting some different platforms.
If/when we have another platform supporting memory hotplug we
might want to either move that out to a generic place or
make it a ppc_md. callback.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
@@ -20,24 +22,25 @@staticunsignedlongget_memblock_size(void){structdevice_node*np;-unsignedintmemblock_size=0;+unsignedintmemblock_size=MIN_MEMORY_BLOCK_SIZE;+structresourcer;np=of_find_node_by_path("/ibm,dynamic-reconfiguration-memory");if(np){-constunsignedlong*size;+const__be64*size;size=of_get_property(np,"ibm,lmb-size",NULL);-memblock_size=size?*size:0;-+if(size)+memblock_size=be64_to_cpup(size);of_node_put(np);-}else{+}elseif(machine_is(pseries)){+/* This fallback really only applies to pseries */unsignedintmemzero_size=0;-constunsignedint*regs;np=of_find_node_by_path("/memory@0");if(np){-regs=of_get_property(np,"reg",NULL);-memzero_size=regs?regs[3]:0;+if(!of_address_to_resource(np,0,&r))+memzero_size=resource_size(&r);of_node_put(np);}
@@ -50,16 +53,21 @@ static unsigned long get_memblock_size(void)sprintf(buf,"/memory@%x",memzero_size);np=of_find_node_by_path(buf);if(np){-regs=of_get_property(np,"reg",NULL);-memblock_size=regs?regs[3]:0;+if(!of_address_to_resource(np,0,&r))+memblock_size=resource_size(&r);of_node_put(np);}}}-returnmemblock_size;}+/* WARNING: This is going to override the generic definition whenever+*pseriesisbuilt-inregardlessofwhatplatformisactiveatboot+*time.Thisisfinefornowasthisistheonly"option"andit+*shouldworkeverywhere.Ifnot,we'llhavetoturnthisintoa+*ppc_md.callback+*/unsignedlongmemory_block_size_bytes(void){returnget_memblock_size();
Just compiling pseries in the kernel causes it to override
memory_block_size_bytes() regardless of what is the runtime
platform.
This cleans up the implementation of that function, fixing
a bug or two while at it, so that it's harmless (and potentially
useful) for other platforms. Without this, bugs in that code
would trigger a WARN_ON() in drivers/base/memory.c when
booting some different platforms.
If/when we have another platform supporting memory hotplug we
might want to either move that out to a generic place or
make it a ppc_md. callback.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
@@ -20,24 +22,25 @@staticunsignedlongget_memblock_size(void){structdevice_node*np;-unsignedintmemblock_size=0;+unsignedintmemblock_size=MIN_MEMORY_BLOCK_SIZE;+structresourcer;np=of_find_node_by_path("/ibm,dynamic-reconfiguration-memory");if(np){-constunsignedlong*size;+const__be64*size;size=of_get_property(np,"ibm,lmb-size",NULL);-memblock_size=size?*size:0;-+if(size)+memblock_size=be64_to_cpup(size);of_node_put(np);-}else{+}elseif(machine_is(pseries)){+/* This fallback really only applies to pseries */unsignedintmemzero_size=0;-constunsignedint*regs;np=of_find_node_by_path("/memory@0");if(np){-regs=of_get_property(np,"reg",NULL);-memzero_size=regs?regs[3]:0;+if(!of_address_to_resource(np,0,&r))+memzero_size=resource_size(&r);of_node_put(np);}
@@ -50,16 +53,21 @@ static unsigned long get_memblock_size(void)sprintf(buf,"/memory@%x",memzero_size);np=of_find_node_by_path(buf);if(np){-regs=of_get_property(np,"reg",NULL);-memblock_size=regs?regs[3]:0;+if(!of_address_to_resource(np,0,&r))+memblock_size=resource_size(&r);of_node_put(np);}}}-returnmemblock_size;}+/* WARNING: This is going to override the generic definition whenever+*pseriesisbuilt-inregardlessofwhatplatformisactiveatboot+*time.Thisisfinefornowasthisistheonly"option"andit+*shouldworkeverywhere.Ifnot,we'llhavetoturnthisintoa+*ppc_md.callback+*/
Just a small nit, please use the customary (multi-line) comment
style:
/*
* Comment .....
* ...... goes here.
*/
specified in Documentation/CodingStyle.
Thanks,
Ingo
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2011-07-01 23:15:35
On Fri, 2011-07-01 at 14:15 +0200, Ingo Molnar wrote:
quoted
+/* WARNING: This is going to override the generic definition whenever
+ * pseries is built-in regardless of what platform is active at boot
+ * time. This is fine for now as this is the only "option" and it
+ * should work everywhere. If not, we'll have to turn this into a
+ * ppc_md. callback
+ */
Just a small nit, please use the customary (multi-line) comment
style:
/*
* Comment .....
* ...... goes here.
*/
specified in Documentation/CodingStyle.
Ah ! Here goes my sneak attempts at violating coding style while nobody
notices :-)
No seriously, that sort of stuff shouldn't be such a hard rule... In
some cases the "official" way looks nicer, on some cases it's just a
waste of space, and I've grown to prefer my slightly more compact form,
at least depending on how the surrounding code looks like.
Since that's all powerpc arch code, I believe I'm entitled to that
little bit of flexibility in how the code looks like :-) It's not
like I'm GoingToPlayWithCaps() or switching to 3-char tabs :-)
Cheers,
Ben.
On Fri, 2011-07-01 at 14:15 +0200, Ingo Molnar wrote:
quoted
quoted
+/* WARNING: This is going to override the generic definition whenever
+ * pseries is built-in regardless of what platform is active at boot
+ * time. This is fine for now as this is the only "option" and it
+ * should work everywhere. If not, we'll have to turn this into a
+ * ppc_md. callback
+ */
Just a small nit, please use the customary (multi-line) comment
style:
/*
* Comment .....
* ...... goes here.
*/
specified in Documentation/CodingStyle.
Ah ! Here goes my sneak attempts at violating coding style while
nobody notices :-)
No seriously, that sort of stuff shouldn't be such a hard rule...
In some cases the "official" way looks nicer, on some cases it's
just a waste of space, and I've grown to prefer my slightly more
compact form, at least depending on how the surrounding code looks
like.
Since that's all powerpc arch code, I believe I'm entitled to that
little bit of flexibility in how the code looks like :-) It's not
like I'm GoingToPlayWithCaps() or switching to 3-char tabs :-)
It's certainly not a hard rule - but note that the file in question
(arch/powerpc/platforms/pseries/hotplug-memory.c) has a rather
inconsistent comment style, sometimes even within the same function:
/*
* Remove htab bolted mappings for this section of memory
*/
...
/* Ensure all vmalloc mappings are flushed in case they also
* hit that section of memory
*/
That kind of inconsistency within the same .c file and within the
same function is not defensible with a "style is a matter of taste"
argument.
As i said, it's just a small nit.
Thanks,
Ingo
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2011-07-02 14:15:26
On Sat, 2011-07-02 at 12:23 +0200, Ingo Molnar wrote:
It's certainly not a hard rule - but note that the file in question
(arch/powerpc/platforms/pseries/hotplug-memory.c) has a rather
inconsistent comment style, sometimes even within the same function:
/*
* Remove htab bolted mappings for this section of memory
*/
...
/* Ensure all vmalloc mappings are flushed in case they also
* hit that section of memory
*/
That kind of inconsistency within the same .c file and within the
same function is not defensible with a "style is a matter of taste"
argument.
Right, that's a matter of different people with different taste mucking
around with the same file I suppose.
Most of this probably predates my involvement as a maintainer but even
if not (and I really can't be bothered digging into the history), it
might very well be something I didn't pay attention to while reviewing.
Seriously, it's so low on the scale of what matters ... I'm sure we both
have more valuable stuff to spend our time and energy on :-)
Cheers,
Ben.