Re: linux-kernel janitorial RFP: Mark static arrays as const
On Wed, 2021-03-03 at 10:41 +0100, Rasmus Villemoes wrote:
On 02/03/2021 18.42, Joe Perches wrote:
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@... 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.
On Wed, 3 Mar 2021, Joe Perches wrote:
On Wed, 2021-03-03 at 10:41 +0100, Rasmus Villemoes wrote:
On 02/03/2021 18.42, Joe Perches wrote:
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@...
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
On Sun, 2021-03-07 at 20:14 +0100, Julia Lawall wrote:
On Wed, 3 Mar 2021, Joe Perches wrote:
On Wed, 2021-03-03 at 10:41 +0100, Rasmus Villemoes wrote:
On 02/03/2021 18.42, Joe Perches wrote:
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@...
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
On Sun, 7 Mar 2021, Joe Perches wrote:
On Sun, 2021-03-07 at 20:14 +0100, Julia Lawall wrote:
On Wed, 3 Mar 2021, Joe Perches wrote:
On Wed, 2021-03-03 at 10:41 +0100, Rasmus Villemoes wrote:
On 02/03/2021 18.42, Joe Perches wrote:
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@...
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
participants (2)
-
Joe Perches -
Julia Lawall