• Josef Bacik's avatar
    btrfs: cache that we don't have security.capability set · ed9b50a1
    Josef Bacik authored
    When profiling a workload I noticed we were constantly calling getxattr.
    These were mostly coming from __remove_privs, which will lookup if
    security.capability exists to remove it.  However instrumenting getxattr
    showed we get called nearly constantly on an idle machine on a lot of
    accesses.
    
    These are wasteful and not free.  Other security LSMs have a way to
    cache their results, but capability doesn't have this, so it's asking us
    all the time for the xattr.
    
    Fix this by setting a flag in our inode that it doesn't have a
    security.capability xattr.  We set this on new inodes and after a failed
    lookup of security.capability.  If we set this xattr at all we'll clear
    the flag.
    
    I haven't found a test in fsperf that this makes a visible difference
    on, but I assume fs_mark related tests would show it clearly.  This is a
    perf report output of the smallfiles100k run where it shows 20% of our
    time spent in __remove_privs because we're looking up the non-existent
    xattr.
    
    --21.86%--btrfs_write_check.constprop.0
      --21.62%--__file_remove_privs
        --21.55%--security_inode_need_killpriv
          --21.54%--cap_inode_need_killpriv
            --21.53%--__vfs_getxattr
              --20.89%--btrfs_getxattr
    
    Obviously this is just CPU time in a mostly IO bound test, so the actual
    effect of removing this callchain is minimal.  However in just normal
    testing of an idle system tracing showed around 100 getxattr calls per
    minute, and with this patch there are 0.
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ed9b50a1
btrfs_inode.h 18.2 KB