]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
parisc: Reduce kernel size by packing alternative tables
authorHelge Deller <deller@gmx.de>
Wed, 28 Sep 2022 21:31:20 +0000 (23:31 +0200)
committerHelge Deller <deller@gmx.de>
Tue, 11 Oct 2022 10:01:24 +0000 (12:01 +0200)
The values stored in the length and condition fields of the alternative
tables fit into 16 bits, so we can save 4 bytes per alternative table
entry.
Since a typical 32-bit kernel has more than 3000 entries this
saves > 12k of storage on disc.

bloat-o-meter shows a reduction of -0.01% by this change:
Total: Before=10196505, After=10195529, chg -0.01%

$ ls -la vmlinux vmlinux.before
-rwxr-xr-x  14437324 vmlinux
-rwxr-xr-x  14449512 vmlinux.before

Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/include/asm/alternative.h
arch/parisc/kernel/alternative.c

index 0ec54f43d6d250e69400f69be7ee3ea1461793bc..1ed45fd085d3b80ece36baf4c815fa91e709df63 100644 (file)
 
 struct alt_instr {
        s32 orig_offset;        /* offset to original instructions */
-       s32 len;                /* end of original instructions */
-       u32 cond;               /* see ALT_COND_XXX */
+       s16 len;                /* end of original instructions */
+       u16 cond;               /* see ALT_COND_XXX */
        u32 replacement;        /* replacement instruction or code */
-};
+} __packed;
 
 void set_kernel_text_rw(int enable_read_write);
 void apply_alternatives_all(void);
@@ -35,8 +35,9 @@ void apply_alternatives(struct alt_instr *start, struct alt_instr *end,
 /* Alternative SMP implementation. */
 #define ALTERNATIVE(cond, replacement)         "!0:"   \
        ".section .altinstructions, \"aw\"      !"      \
-       ".word (0b-4-.), 1, " __stringify(cond) ","     \
-               __stringify(replacement) "      !"      \
+       ".word (0b-4-.)                         !"      \
+       ".hword 1, " __stringify(cond) "        !"      \
+       ".word " __stringify(replacement) "     !"      \
        ".previous"
 
 #else
@@ -44,15 +45,17 @@ void apply_alternatives(struct alt_instr *start, struct alt_instr *end,
 /* to replace one single instructions by a new instruction */
 #define ALTERNATIVE(from, to, cond, replacement)\
        .section .altinstructions, "aw" !       \
-       .word (from - .), (to - from)/4 !       \
-       .word cond, replacement         !       \
+       .word (from - .)                !       \
+       .hword (to - from)/4, cond      !       \
+       .word replacement               !       \
        .previous
 
 /* to replace multiple instructions by new code */
 #define ALTERNATIVE_CODE(from, num_instructions, cond, new_instr_ptr)\
        .section .altinstructions, "aw" !       \
-       .word (from - .), -num_instructions !   \
-       .word cond, (new_instr_ptr - .) !       \
+       .word (from - .)                !       \
+       .hword -num_instructions, cond  !       \
+       .word (new_instr_ptr - .)       !       \
        .previous
 
 #endif  /*  __ASSEMBLY__  */
index daa1e9047275b0c1f683272a84f14642d1856117..66f5672c70bd469e6e1a261c4a7c080be1d808f5 100644 (file)
@@ -26,7 +26,7 @@ void __init_or_module apply_alternatives(struct alt_instr *start,
        struct alt_instr *entry;
        int index = 0, applied = 0;
        int num_cpus = num_online_cpus();
-       u32 cond_check;
+       u16 cond_check;
 
        cond_check = ALT_COND_ALWAYS |
                ((num_cpus == 1) ? ALT_COND_NO_SMP : 0) |
@@ -45,8 +45,9 @@ void __init_or_module apply_alternatives(struct alt_instr *start,
 
        for (entry = start; entry < end; entry++, index++) {
 
-               u32 *from, cond, replacement;
-               s32 len;
+               u32 *from, replacement;
+               u16 cond;
+               s16 len;
 
                from = (u32 *)((ulong)&entry->orig_offset + entry->orig_offset);
                len = entry->len;