Page MenuHomeFreeBSD

vnode_if: Remove some branching around SDT probes in VOP wrappers
ClosedPublic

Authored by markj on May 20 2025, 12:04 AM.
Tags
None
Referenced Files
Unknown Object (File)
Mon, Oct 13, 4:28 AM
Unknown Object (File)
Sat, Sep 27, 10:33 PM
Unknown Object (File)
Fri, Sep 26, 10:31 PM
Unknown Object (File)
Tue, Sep 23, 1:31 PM
Unknown Object (File)
Sep 15 2025, 11:46 AM
Unknown Object (File)
Sep 15 2025, 5:18 AM
Unknown Object (File)
Sep 4 2025, 7:02 AM
Unknown Object (File)
Sep 3 2025, 12:03 AM
Subscribers

Details

Summary

Now that SDT is implemented using hot-patching, SDT_PROBE* no longer
introduces a branch instruction, so the SDT_PROBES_ENABLED() check in
each VOP_*_APV() is not really worth preserving.

Test Plan

Disassembly of VOP_READ_APV before the change:

Dump of assembler code for function VOP_READ_APV:                    
   0xffffffff81134ba0 <+0>:     push   %rbp                                
   0xffffffff81134ba1 <+1>:     mov    %rsp,%rbp                        
   0xffffffff81134ba4 <+4>:     push   %r14          
   0xffffffff81134ba6 <+6>:     push   %rbx                               
   0xffffffff81134ba7 <+7>:     mov    %rsi,%rbx   
   0xffffffff81134baa <+10>:    mov    %rdi,%r14                                                                                                                                                                                                                                                                              
   0xffffffff81134bad <+13>:    cmpb   $0x0,0x6cb4fa(%rip)        # 0xffffffff818000ae <sdt_probes_enabled>                                                                                                                                                                                                                   
   0xffffffff81134bb4 <+20>:    jne    0xffffffff81134bd3 <VOP_READ_APV+51>                                                                                                                                                                                                                                                   
   0xffffffff81134bb6 <+22>:    mov    %rbx,%rdi                                                                                                                                                                                                                                                                              
   0xffffffff81134bb9 <+25>:    call   *0x90(%r14)                                                                                                                                                                                                                                                                            
   0xffffffff81134bc0 <+32>:    mov    %rbx,%rdi                                                                                                                                                                                                                                                                              
   0xffffffff81134bc3 <+35>:    mov    %eax,%esi                                                                                                                                                                                                                                                                              
   0xffffffff81134bc5 <+37>:    mov    %eax,%ebx                                                                                                                                                                                                                                                                              
   0xffffffff81134bc7 <+39>:    call   0xffffffff80c5d460 <vop_read_post>                                                                                                                                                                                                                                                     
   0xffffffff81134bcc <+44>:    mov    %ebx,%eax                                                                                                                                                                                                                                                                              
   0xffffffff81134bce <+46>:    pop    %rbx                                                                                                                                                                                                                                                                                   
   0xffffffff81134bcf <+47>:    pop    %r14                                                                                                                                                                                                                                                                                   
   0xffffffff81134bd1 <+49>:    pop    %rbp                              
   0xffffffff81134bd2 <+50>:    ret                                                                                                                            
   0xffffffff81134bd3 <+51>:    nopw   (%rax,%rax,1)                      
   0xffffffff81134bd8 <+56>:    mov    %rbx,%rdi                                                                                                               
   0xffffffff81134bdb <+59>:    call   *0x90(%r14)                       
   0xffffffff81134be2 <+66>:    nopw   (%rax,%rax,1)
   0xffffffff81134be7 <+71>:    jmp    0xffffffff81134bc0 <VOP_READ_APV+32>
   0xffffffff81134be9 <+73>:    mov    0x82e059(%rip),%edi        # 0xffffffff81962c48 <sdt_vfs_vop_vop_read_return+88>
   0xffffffff81134bef <+79>:    mov    0x8(%rbx),%rsi                     
   0xffffffff81134bf3 <+83>:    movslq %eax,%rcx  
   0xffffffff81134bf6 <+86>:    mov    %rbx,%rdx                       
   0xffffffff81134bf9 <+89>:    xor    %r8d,%r8d
   0xffffffff81134bfc <+92>:    xor    %r9d,%r9d                     
   0xffffffff81134bff <+95>:    mov    %eax,%r14d    
   0xffffffff81134c02 <+98>:    call   0xffffffff80b63e60 <sdt_probe>     
   0xffffffff81134c07 <+103>:   mov    %r14d,%eax              
   0xffffffff81134c0a <+106>:   jmp    0xffffffff81134bc0 <VOP_READ_APV+32>                                                                                    
   0xffffffff81134c0c <+108>:   mov    0x82df5e(%rip),%edi        # 0xffffffff81962b70 <sdt_vfs_vop_vop_read_entry+88>
   0xffffffff81134c12 <+114>:   mov    0x8(%rbx),%rsi                    
   0xffffffff81134c16 <+118>:   mov    %rbx,%rdx  
   0xffffffff81134c19 <+121>:   xor    %ecx,%ecx                       
   0xffffffff81134c1b <+123>:   xor    %r8d,%r8d                                                                                                               
   0xffffffff81134c1e <+126>:   xor    %r9d,%r9d                                                                                                                                                                                                                                                                              
   0xffffffff81134c21 <+129>:   call   0xffffffff80b63e60 <sdt_probe>                                                                                                                                                                                                                                                         
   0xffffffff81134c26 <+134>:   jmp    0xffffffff81134bd8 <VOP_READ_APV+56>

after:

Dump of assembler code for function VOP_READ_APV:
   0xffffffff81136a70 <+0>:     push   %rbp
   0xffffffff81136a71 <+1>:     mov    %rsp,%rbp
   0xffffffff81136a74 <+4>:     push   %r14
   0xffffffff81136a76 <+6>:     push   %rbx
   0xffffffff81136a77 <+7>:     mov    %rsi,%rbx
   0xffffffff81136a7a <+10>:    mov    %rdi,%r14
   0xffffffff81136a7d <+13>:    nopw   (%rax,%rax,1)
   0xffffffff81136a82 <+18>:    mov    %rbx,%rdi
   0xffffffff81136a85 <+21>:    call   *0x90(%r14)
   0xffffffff81136a8c <+28>:    nopw   (%rax,%rax,1)
   0xffffffff81136a91 <+33>:    mov    %rbx,%rdi
   0xffffffff81136a94 <+36>:    mov    %eax,%esi
   0xffffffff81136a96 <+38>:    mov    %eax,%ebx
   0xffffffff81136a98 <+40>:    call   0xffffffff80c5f8f0 <vop_read_post>
   0xffffffff81136a9d <+45>:    mov    %ebx,%eax
   0xffffffff81136a9f <+47>:    pop    %rbx
   0xffffffff81136aa0 <+48>:    pop    %r14
   0xffffffff81136aa2 <+50>:    pop    %rbp
   0xffffffff81136aa3 <+51>:    ret
   0xffffffff81136aa4 <+52>:    mov    0x82d0c6(%rip),%edi        # 0xffffffff81963b70 <sdt_vfs_vop_vop_read_entry+88>
   0xffffffff81136aaa <+58>:    mov    0x8(%rbx),%rsi
   0xffffffff81136aae <+62>:    mov    %rbx,%rdx
   0xffffffff81136ab1 <+65>:    xor    %ecx,%ecx
   0xffffffff81136ab3 <+67>:    xor    %r8d,%r8d
   0xffffffff81136ab6 <+70>:    xor    %r9d,%r9d
   0xffffffff81136ab9 <+73>:    call   0xffffffff80b64050 <sdt_probe>
   0xffffffff81136abe <+78>:    jmp    0xffffffff81136a82 <VOP_READ_APV+18>
   0xffffffff81136ac0 <+80>:    mov    0x82d182(%rip),%edi        # 0xffffffff81963c48 <sdt_vfs_vop_vop_read_return+88>
   0xffffffff81136ac6 <+86>:    mov    0x8(%rbx),%rsi
   0xffffffff81136aca <+90>:    movslq %eax,%rcx
   0xffffffff81136acd <+93>:    mov    %rbx,%rdx
   0xffffffff81136ad0 <+96>:    xor    %r8d,%r8d
   0xffffffff81136ad3 <+99>:    xor    %r9d,%r9d
   0xffffffff81136ad6 <+102>:   mov    %eax,%r14d
   0xffffffff81136ad9 <+105>:   call   0xffffffff80b64050 <sdt_probe>
   0xffffffff81136ade <+110>:   mov    %r14d,%eax
   0xffffffff81136ae1 <+113>:   jmp    0xffffffff81136a91 <VOP_READ_APV+33>

So when probes are disabled, the code is very slightly less dense, but we manage to remove a branch.

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Not Applicable
Unit
Tests Not Applicable