list_del() poisoning can generate 2 64-bit immediate loads but it also
can generate one 64-bit immediate load and an addition:

        48 b8 00 01 00 00 00 00 ad de   movabs rax,0xdead000000000100
        48 89 47 58                     mov    QWORD PTR [rdi+0x58],rax
        48 05 00 01 00 00   <=====>     add    rax,0x100
        48 89 47 60                     mov    QWORD PTR [rdi+0x60],rax

However on x86_64 not all constants are equal: those within [-128, 127]
range can be added with shorter "add r64, imm32" instruction:

        48 b8 00 01 00 00 00 00 ad de   movabs rax,0xdead000000000100
        48 89 47 58                     mov    QWORD PTR [rdi+0x58],rax
        48 83 c0 22     <======>        add    rax,0x22
        48 89 47 60                     mov    QWORD PTR [rdi+0x60],rax

Patch saves 2 bytes per some LIST_POISON2 usage.

(Slightly disappointing) space savings on F29 x86_64 config:

        add/remove: 0/0 grow/shrink: 0/2164 up/down: 0/-5184 (-5184)
        Function                                     old     new   delta
        zstd_get_workspace                           548     546      -2
                ...
        mlx4_delete_all_resources_for_slave         4826    4804     -22
        Total: Before=83304131, After=83298947, chg -0.01%

New constants are:

        0xdead000000000100
        0xdead000000000122

Note: LIST_POISON1 can't be changed to ...11 because something in page
allocator requires low bit unset.

Signed-off-by: Alexey Dobriyan <[email protected]>
---

 include/linux/poison.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/include/linux/poison.h
+++ b/include/linux/poison.h
@@ -21,7 +21,7 @@
  * non-initialized list entries.
  */
 #define LIST_POISON1  ((void *) 0x100 + POISON_POINTER_DELTA)
-#define LIST_POISON2  ((void *) 0x200 + POISON_POINTER_DELTA)
+#define LIST_POISON2  ((void *) 0x122 + POISON_POINTER_DELTA)
 
 /********** include/linux/timer.h **********/
 /*

Reply via email to