Re: [PATCH mips-next 1/2] MIPS: module: optimize module relocations processing

2021-01-17 Thread Jiaxun Yang

在 2021/1/16 下午11:02, Alexander Lobakin 写道:

For now, module relocation functions are implemented as an array
of handlers of type reloc_handler_t.

Convert that array into a single switch-case function to:
  - remove unused arguments;
  - change the return type of simple handlers to void;
  - remove the array and don't use any data at all;
  - avoid using indirect calls;
  - allow the compiler to inline and greatly optimize
the relocation function[s].

The result on MIPS32 R2 with GCC 10.2 -O2 is:

scripts/bloat-o-meter -c arch/mips/kernel/__module.o arch/mips/kernel/module.o
add/remove: 1/11 grow/shrink: 1/0 up/down: 876/-1436 (-560)
Function old new   delta
apply_relocate   4561148+692
apply_r_mips_pc- 184+184
apply_r_mips_none  8   -  -8
apply_r_mips_32   16   - -16
apply_r_mips_64   76   - -76
apply_r_mips_highest  88   - -88
apply_r_mips_higher  108   --108
apply_r_mips_26  132   --132
apply_r_mips_pc26160   --160
apply_r_mips_pc21160   --160
apply_r_mips_pc16160   --160
apply_r_mips_hi16172   --172
apply_r_mips_lo16356   --356
Total: Before=2608, After=2048, chg -21.47%
add/remove: 0/0 grow/shrink: 0/0 up/down: 0/0 (0)
Data old new   delta
Total: Before=12, After=12, chg +0.00%
add/remove: 0/1 grow/shrink: 0/0 up/down: 0/-248 (-248)
RO Data  old new   delta
reloc_handlers   248   --248
Total: Before=248, After=0, chg -100.00%

All functions were collapsed into a single one that is called
directly by $(srctree)/kernel/module.c.

Signed-off-by: Alexander Lobakin 


Reviewed-by: Jiaxun Yang 


---
  arch/mips/kernel/module.c | 109 ++
  1 file changed, 52 insertions(+), 57 deletions(-)

diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c
index 3c0c3d1260c1..14f46d17500a 100644
--- a/arch/mips/kernel/module.c
+++ b/arch/mips/kernel/module.c
@@ -40,22 +40,13 @@ void *module_alloc(unsigned long size)
  }
  #endif
  
-static int apply_r_mips_none(struct module *me, u32 *location,

-u32 base, Elf_Addr v, bool rela)
-{
-   return 0;
-}
-
-static int apply_r_mips_32(struct module *me, u32 *location,
-  u32 base, Elf_Addr v, bool rela)
+static void apply_r_mips_32(u32 *location, u32 base, Elf_Addr v)
  {
*location = base + v;
-
-   return 0;
  }
  
-static int apply_r_mips_26(struct module *me, u32 *location,

-  u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_26(struct module *me, u32 *location, u32 base,
+  Elf_Addr v)
  {
if (v % 4) {
pr_err("module %s: dangerous R_MIPS_26 relocation\n",
@@ -75,8 +66,8 @@ static int apply_r_mips_26(struct module *me, u32 *location,
return 0;
  }
  
-static int apply_r_mips_hi16(struct module *me, u32 *location,

-u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_hi16(struct module *me, u32 *location, Elf_Addr v,
+bool rela)
  {
struct mips_hi16 *n;
  
@@ -217,26 +208,25 @@ static int apply_r_mips_pc(struct module *me, u32 *location, u32 base,

return 0;
  }
  
-static int apply_r_mips_pc16(struct module *me, u32 *location,

-u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_pc16(struct module *me, u32 *location, u32 base,
+Elf_Addr v)
  {
return apply_r_mips_pc(me, location, base, v, 16);
  }
  
-static int apply_r_mips_pc21(struct module *me, u32 *location,

-u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_pc21(struct module *me, u32 *location, u32 base,
+Elf_Addr v)
  {
return apply_r_mips_pc(me, location, base, v, 21);
  }
  
-static int apply_r_mips_pc26(struct module *me, u32 *location,

-u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_pc26(struct module *me, u32 *location, u32 base,
+Elf_Addr v)
  {
return apply_r_mips_pc(me, location, base, v, 26);
  }
  
-static int apply_r_mips_64(struct module *me, u32 *location,

-  u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_64(u32 *location, Elf_Addr v, bool rela)
  {
if (WARN_ON(!rela))
return -EINVAL;
@@ -246,8 +236,7 @@ static int 

[PATCH mips-next 1/2] MIPS: module: optimize module relocations processing

2021-01-16 Thread Alexander Lobakin
For now, module relocation functions are implemented as an array
of handlers of type reloc_handler_t.

Convert that array into a single switch-case function to:
 - remove unused arguments;
 - change the return type of simple handlers to void;
 - remove the array and don't use any data at all;
 - avoid using indirect calls;
 - allow the compiler to inline and greatly optimize
   the relocation function[s].

The result on MIPS32 R2 with GCC 10.2 -O2 is:

scripts/bloat-o-meter -c arch/mips/kernel/__module.o arch/mips/kernel/module.o
add/remove: 1/11 grow/shrink: 1/0 up/down: 876/-1436 (-560)
Function old new   delta
apply_relocate   4561148+692
apply_r_mips_pc- 184+184
apply_r_mips_none  8   -  -8
apply_r_mips_32   16   - -16
apply_r_mips_64   76   - -76
apply_r_mips_highest  88   - -88
apply_r_mips_higher  108   --108
apply_r_mips_26  132   --132
apply_r_mips_pc26160   --160
apply_r_mips_pc21160   --160
apply_r_mips_pc16160   --160
apply_r_mips_hi16172   --172
apply_r_mips_lo16356   --356
Total: Before=2608, After=2048, chg -21.47%
add/remove: 0/0 grow/shrink: 0/0 up/down: 0/0 (0)
Data old new   delta
Total: Before=12, After=12, chg +0.00%
add/remove: 0/1 grow/shrink: 0/0 up/down: 0/-248 (-248)
RO Data  old new   delta
reloc_handlers   248   --248
Total: Before=248, After=0, chg -100.00%

All functions were collapsed into a single one that is called
directly by $(srctree)/kernel/module.c.

Signed-off-by: Alexander Lobakin 
---
 arch/mips/kernel/module.c | 109 ++
 1 file changed, 52 insertions(+), 57 deletions(-)

diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c
index 3c0c3d1260c1..14f46d17500a 100644
--- a/arch/mips/kernel/module.c
+++ b/arch/mips/kernel/module.c
@@ -40,22 +40,13 @@ void *module_alloc(unsigned long size)
 }
 #endif
 
-static int apply_r_mips_none(struct module *me, u32 *location,
-u32 base, Elf_Addr v, bool rela)
-{
-   return 0;
-}
-
-static int apply_r_mips_32(struct module *me, u32 *location,
-  u32 base, Elf_Addr v, bool rela)
+static void apply_r_mips_32(u32 *location, u32 base, Elf_Addr v)
 {
*location = base + v;
-
-   return 0;
 }
 
-static int apply_r_mips_26(struct module *me, u32 *location,
-  u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_26(struct module *me, u32 *location, u32 base,
+  Elf_Addr v)
 {
if (v % 4) {
pr_err("module %s: dangerous R_MIPS_26 relocation\n",
@@ -75,8 +66,8 @@ static int apply_r_mips_26(struct module *me, u32 *location,
return 0;
 }
 
-static int apply_r_mips_hi16(struct module *me, u32 *location,
-u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_hi16(struct module *me, u32 *location, Elf_Addr v,
+bool rela)
 {
struct mips_hi16 *n;
 
@@ -217,26 +208,25 @@ static int apply_r_mips_pc(struct module *me, u32 
*location, u32 base,
return 0;
 }
 
-static int apply_r_mips_pc16(struct module *me, u32 *location,
-u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_pc16(struct module *me, u32 *location, u32 base,
+Elf_Addr v)
 {
return apply_r_mips_pc(me, location, base, v, 16);
 }
 
-static int apply_r_mips_pc21(struct module *me, u32 *location,
-u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_pc21(struct module *me, u32 *location, u32 base,
+Elf_Addr v)
 {
return apply_r_mips_pc(me, location, base, v, 21);
 }
 
-static int apply_r_mips_pc26(struct module *me, u32 *location,
-u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_pc26(struct module *me, u32 *location, u32 base,
+Elf_Addr v)
 {
return apply_r_mips_pc(me, location, base, v, 26);
 }
 
-static int apply_r_mips_64(struct module *me, u32 *location,
-  u32 base, Elf_Addr v, bool rela)
+static int apply_r_mips_64(u32 *location, Elf_Addr v, bool rela)
 {
if (WARN_ON(!rela))
return -EINVAL;
@@ -246,8 +236,7 @@ static int apply_r_mips_64(struct module *me, u32 *location,
return 0;
 }
 
-static int apply_r_mips_higher(struct module *me, u32