Re: linux-kernel janitorial RFP: Mark static arrays as const

4 messages, 2 authors, 2021-03-08 · open the first message on its own page

Re: linux-kernel janitorial RFP: Mark static arrays as const

From: Joe Perches <joe@perches.com>
Date: 2021-03-03 18:41:30

On Wed, 2021-03-03 at 10:41 +0100, Rasmus Villemoes wrote:
On 02/03/2021 18.42, Joe Perches wrote:
quoted
Here is a possible opportunity to reduce data usage in the kernel.

$ git grep -P -n '^static\s+(?!const|struct)(?:\w+\s+){1,3}\w+\s*\[\s*\]' drivers/ | \
  grep -v __initdata | \
  wc -l
3250

Meaning there are ~3000 declarations of arrays with what appears to be
file static const content that are not marked const.

So there are many static arrays that could be marked const to move the
compiled object code from data to text minimizing the total amount of
exposed r/w data.
You can add const if you like, but it will rarely change the generated
code. gcc is already smart enough to take a static array whose contents
are provably never modified within the TU and put it in .rodata:
At least some or perhaps even most of the time, true, but the gcc compiler
from v5 through at least v10 seems inconsistent about when it does the
appropriate conversion.

See the example I posted:
https://lore.kernel.org/lkml/6b8b250a06a98ce42120a14824531a8641f5e8aa.camel@perches.com/

It was a randomly chosen source file conversion btw, I had no prior
knowledge of whether the text/data use would change.

I'm unsure about clang consistently moving static but provably const arrays
from data to text.  I rarely use clang.  At least for v11 it seems to be
better though.  I didn't try 10.1.



_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Re: linux-kernel janitorial RFP: Mark static arrays as const

From: Julia Lawall <julia.lawall@inria.fr>
Date: 2021-03-07 19:15:01


On Wed, 3 Mar 2021, Joe Perches wrote:
On Wed, 2021-03-03 at 10:41 +0100, Rasmus Villemoes wrote:
quoted
On 02/03/2021 18.42, Joe Perches wrote:
quoted
Here is a possible opportunity to reduce data usage in the kernel.

$ git grep -P -n '^static\s+(?!const|struct)(?:\w+\s+){1,3}\w+\s*\[\s*\]' drivers/ | \
  grep -v __initdata | \
  wc -l
3250

Meaning there are ~3000 declarations of arrays with what appears to be
file static const content that are not marked const.

So there are many static arrays that could be marked const to move the
compiled object code from data to text minimizing the total amount of
exposed r/w data.
You can add const if you like, but it will rarely change the generated
code. gcc is already smart enough to take a static array whose contents
are provably never modified within the TU and put it in .rodata:
At least some or perhaps even most of the time, true, but the gcc compiler
from v5 through at least v10 seems inconsistent about when it does the
appropriate conversion.

See the example I posted:
https://lore.kernel.org/lkml/6b8b250a06a98ce42120a14824531a8641f5e8aa.camel@perches.com/

It was a randomly chosen source file conversion btw, I had no prior
knowledge of whether the text/data use would change.

I'm unsure about clang consistently moving static but provably const arrays
from data to text.  I rarely use clang.  At least for v11 it seems to be
better though.  I didn't try 10.1.
I tried the relevnt drivers in drivers/input/joystick.  I got only one
driver that changed with gcc 9.3, which was
drivers/input/joystick/analog.c.  It actually got larger:

original:

   text    data     bss     dec     hex filename
  22607   10560     320   33487    82cf drivers/input/joystick/analog.o

after adding const:

   text    data     bss     dec     hex filename
  22728   10816     320   33864    8448 drivers/input/joystick/analog.o

This was the only case where bss was not 0, but I don't know if there is a
connection.

julia

Re: linux-kernel janitorial RFP: Mark static arrays as const

From: Joe Perches <joe@perches.com>
Date: 2021-03-08 05:40:25

On Sun, 2021-03-07 at 20:14 +0100, Julia Lawall wrote:
On Wed, 3 Mar 2021, Joe Perches wrote:
quoted
On Wed, 2021-03-03 at 10:41 +0100, Rasmus Villemoes wrote:
quoted
On 02/03/2021 18.42, Joe Perches wrote:
quoted
Here is a possible opportunity to reduce data usage in the kernel.

$ git grep -P -n '^static\s+(?!const|struct)(?:\w+\s+){1,3}\w+\s*\[\s*\]' drivers/ | \
  grep -v __initdata | \
  wc -l
3250

Meaning there are ~3000 declarations of arrays with what appears to be
file static const content that are not marked const.

So there are many static arrays that could be marked const to move the
compiled object code from data to text minimizing the total amount of
exposed r/w data.
You can add const if you like, but it will rarely change the generated
code. gcc is already smart enough to take a static array whose contents
are provably never modified within the TU and put it in .rodata:
At least some or perhaps even most of the time, true, but the gcc compiler
from v5 through at least v10 seems inconsistent about when it does the
appropriate conversion.

See the example I posted:
https://lore.kernel.org/lkml/6b8b250a06a98ce42120a14824531a8641f5e8aa.camel@perches.com/

It was a randomly chosen source file conversion btw, I had no prior
knowledge of whether the text/data use would change.

I'm unsure about clang consistently moving static but provably const arrays
from data to text.  I rarely use clang.  At least for v11 it seems to be
better though.  I didn't try 10.1.
I tried the relevnt drivers in drivers/input/joystick.  I got only one
driver that changed with gcc 9.3, which was
drivers/input/joystick/analog.c.  It actually got larger:

original:

   text    data     bss     dec     hex filename
  22607   10560     320   33487    82cf drivers/input/joystick/analog.o

after adding const:

   text    data     bss     dec     hex filename
  22728   10816     320   33864    8448 drivers/input/joystick/analog.o

This was the only case where bss was not 0, but I don't know if there is a
connection.
You really need consider using defconfig so whatever object code
does not have tracing/debugging support.

For instance, this code with defconfig and analog joystick:

Original:

$ size drivers/input/joystick/analog.o
   text	   data	    bss	    dec	    hex	filename
   8115	    261	    224	   8600	   2198	drivers/input/joystick/analog.o

with const:

$ size drivers/input/joystick/analog.o
   text	   data	    bss	    dec	    hex	filename
   8179	    201	    224	   8604	   219c	drivers/input/joystick/analog.o



_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Re: linux-kernel janitorial RFP: Mark static arrays as const

From: Julia Lawall <julia.lawall@inria.fr>
Date: 2021-03-08 06:55:57


On Sun, 7 Mar 2021, Joe Perches wrote:
On Sun, 2021-03-07 at 20:14 +0100, Julia Lawall wrote:
quoted
On Wed, 3 Mar 2021, Joe Perches wrote:
quoted
On Wed, 2021-03-03 at 10:41 +0100, Rasmus Villemoes wrote:
quoted
On 02/03/2021 18.42, Joe Perches wrote:
quoted
Here is a possible opportunity to reduce data usage in the kernel.

$ git grep -P -n '^static\s+(?!const|struct)(?:\w+\s+){1,3}\w+\s*\[\s*\]' drivers/ | \
  grep -v __initdata | \
  wc -l
3250

Meaning there are ~3000 declarations of arrays with what appears to be
file static const content that are not marked const.

So there are many static arrays that could be marked const to move the
compiled object code from data to text minimizing the total amount of
exposed r/w data.
You can add const if you like, but it will rarely change the generated
code. gcc is already smart enough to take a static array whose contents
are provably never modified within the TU and put it in .rodata:
At least some or perhaps even most of the time, true, but the gcc compiler
from v5 through at least v10 seems inconsistent about when it does the
appropriate conversion.

See the example I posted:
https://lore.kernel.org/lkml/6b8b250a06a98ce42120a14824531a8641f5e8aa.camel@perches.com/

It was a randomly chosen source file conversion btw, I had no prior
knowledge of whether the text/data use would change.

I'm unsure about clang consistently moving static but provably const arrays
from data to text.  I rarely use clang.  At least for v11 it seems to be
better though.  I didn't try 10.1.
I tried the relevnt drivers in drivers/input/joystick.  I got only one
driver that changed with gcc 9.3, which was
drivers/input/joystick/analog.c.  It actually got larger:

original:

   text    data     bss     dec     hex filename
  22607   10560     320   33487    82cf drivers/input/joystick/analog.o

after adding const:

   text    data     bss     dec     hex filename
  22728   10816     320   33864    8448 drivers/input/joystick/analog.o

This was the only case where bss was not 0, but I don't know if there is a
connection.
You really need consider using defconfig so whatever object code
does not have tracing/debugging support.

For instance, this code with defconfig and analog joystick:

Original:

$ size drivers/input/joystick/analog.o
   text	   data	    bss	    dec	    hex	filename
   8115	    261	    224	   8600	   2198	drivers/input/joystick/analog.o

with const:

$ size drivers/input/joystick/analog.o
   text	   data	    bss	    dec	    hex	filename
   8179	    201	    224	   8604	   219c	drivers/input/joystick/analog.o
Thanks for the suggestion.  It occurred to me that in one case my
transformation was wrong, because the array was multi-level, and a sub
array was being stored in a structure field that was not declared as
const.  So the argument that the compiler would figure out to put the
array in .rodata didn't make sense.  But I still go the same sizes for
that file.  So I'll try the whole thing again.

thanks,
julia
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help