• W
    arm64/mpam: remove kernfs_get() calls() and add kernfs_put() calls to prevent refcount leak · 01a2ee3e
    Wang ShaoBo 提交于
    hulk inclusion
    category: bugfix
    bugzilla: https://gitee.com/openeuler/kernel/issues/I61CPK
    CVE: NA
    
    --------------------------------
    
    Refer to the two commits:
    
      commit fd8d9db3 ("x86/resctrl: Remove superfluous kernfs_get() calls
      to prevent refcount leak")
    
      commit 75899924 ("x86/resctrl: Add necessary kernfs_put() calls to
      prevent refcount leak")
    
    there are some 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.
    
    For example, reference count leak is observed in these two cases:
    
      (1) mount -t resctrl none /sys/fs/resctrl
          mkdir /sys/fs/resctrl/c1
          mkdir /sys/fs/resctrl/c1/mon_groups/m1
          umount /sys/fs/resctrl
    
      (2) mkdir /sys/fs/resctrl/c1
          mkdir /sys/fs/resctrl/c1/mon_groups/m1
          rmdir /sys/fs/resctrl/c1
    
    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.
    
    Necessary kernfs_put() calls are added by following changes:
    
      (1) Introduce rdtgroup removal helper rdtgroup_remove() to wrap up
      kernfs_put() and kfree().
    
      (2) Call rdtgroup_remove() in rdtgroup removal path where the rdtgroup
      structure is about to be freed by kfree().
    
      (3) Call rdtgroup_remove() or kernfs_put() as appropriate in the error
      exit paths of mkdir where an extra reference is taken by kernfs_get().
    Signed-off-by: NWang ShaoBo <bobo.shaobowang@huawei.com>
    Signed-off-by: NJialin Zhang <zhangjialin11@huawei.com>
    Reviewed-by: NXie XiuQi <xiexiuqi@huawei.com>
    Reviewed-by: NXie XiuQi <xiexiuqi@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    01a2ee3e
resctrlfs.c 27.2 KB