• Bart Van Assche's avatar
    block: Micro-optimize get_max_segment_size() · 95465318
    Bart Van Assche authored
    This patch removes a conditional jump from get_max_segment_size(). The
    x86-64 assembler code for this function without this patch is as follows:
    
    206             return min_not_zero(mask - offset + 1,
       0x0000000000000118 <+72>:    not    %rax
       0x000000000000011b <+75>:    and    0x8(%r10),%rax
       0x000000000000011f <+79>:    add    $0x1,%rax
       0x0000000000000123 <+83>:    je     0x138 <bvec_split_segs+104>
       0x0000000000000125 <+85>:    cmp    %rdx,%rax
       0x0000000000000128 <+88>:    mov    %rdx,%r12
       0x000000000000012b <+91>:    cmovbe %rax,%r12
       0x000000000000012f <+95>:    test   %rdx,%rdx
       0x0000000000000132 <+98>:    mov    %eax,%edx
       0x0000000000000134 <+100>:   cmovne %r12d,%edx
    
    With this patch applied:
    
    206             return min(mask - offset, (unsigned long)lim->max_segment_size - 1) + 1;
       0x000000000000003f <+63>:    mov    0x28(%rdi),%ebp
       0x0000000000000042 <+66>:    not    %rax
       0x0000000000000045 <+69>:    and    0x8(%rdi),%rax
       0x0000000000000049 <+73>:    sub    $0x1,%rbp
       0x000000000000004d <+77>:    cmp    %rbp,%rax
       0x0000000000000050 <+80>:    cmova  %rbp,%rax
       0x0000000000000054 <+84>:    add    $0x1,%eax
    Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Keith Busch <kbusch@kernel.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
    Link: https://lore.kernel.org/r/20221025191755.1711437-4-bvanassche@acm.orgReviewed-by: default avatarKeith Busch <kbusch@kernel.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    95465318
blk-merge.c 30.6 KB