• Xiaochen Shen's avatar
    x86/resctrl: Remove superfluous kernfs_get() calls to prevent refcount leak · fd8d9db3
    Xiaochen Shen authored
    Willem reported growing of kernfs_node_cache entries in slabtop when
    repeatedly creating and removing resctrl subdirectories as well as when
    repeatedly mounting and unmounting the resctrl filesystem.
    
    On resource group (control as well as monitoring) creation via a mkdir
    an extra kernfs_node reference is obtained to ensure that the rdtgroup
    structure remains accessible for the rdtgroup_kn_unlock() calls where it
    is removed on deletion. The kernfs_node reference count is dropped by
    kernfs_put() in rdtgroup_kn_unlock().
    
    With the above explaining the need for one kernfs_get()/kernfs_put()
    pair in resctrl there are more places where a kernfs_node reference is
    obtained without a corresponding release. The excessive amount of
    reference count on kernfs nodes will never be dropped to 0 and the
    kernfs nodes will never be freed in the call paths of rmdir and umount.
    It leads to reference count leak and kernfs_node_cache memory leak.
    
    Remove the superfluous kernfs_get() calls and expand the existing
    comments surrounding the remaining kernfs_get()/kernfs_put() pair that
    remains in use.
    
    Superfluous kernfs_get() calls are removed from two areas:
    
      (1) In call paths of mount and mkdir, when kernfs nodes for "info",
      "mon_groups" and "mon_data" directories and sub-directories are
      created, the reference count of newly created kernfs node is set to 1.
      But after kernfs_create_dir() returns, superfluous kernfs_get() are
      called to take an additional reference.
    
      (2) kernfs_get() calls in rmdir call paths.
    
    Fixes: 17eafd07 ("x86/intel_rdt: Split resource group removal in two")
    Fixes: 4af4a88e ("x86/intel_rdt/cqm: Add mount,umount support")
    Fixes: f3cbeaca ("x86/intel_rdt/cqm: Add rmdir support")
    Fixes: d89b7379 ("x86/intel_rdt/cqm: Add mon_data")
    Fixes: c7d9aac6 ("x86/intel_rdt/cqm: Add mkdir support for RDT monitoring")
    Fixes: 5dc1d5c6 ("x86/intel_rdt: Simplify info and base file lists")
    Fixes: 60cf5e10 ("x86/intel_rdt: Add mkdir to resctrl file system")
    Fixes: 4e978d06 ("x86/intel_rdt: Add "info" files to resctrl file system")
    Reported-by: default avatarWillem de Bruijn <willemb@google.com>
    Signed-off-by: default avatarXiaochen Shen <xiaochen.shen@intel.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
    Tested-by: default avatarWillem de Bruijn <willemb@google.com>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/1604085053-31639-1-git-send-email-xiaochen.shen@intel.com
    fd8d9db3
rdtgroup.c 78.9 KB