• Damien Le Moal's avatar
    PCI: endpoint: Automatically create a function specific attributes group · 70b3740f
    Damien Le Moal authored
    A PCI endpoint function driver can define function specific attributes
    under its function configfs directory using the add_cfs() endpoint driver
    operation. This is done by tying up the mkdir operation for the function
    configfs directory to a call to the add_cfs() operation.  However, there
    are no checks preventing the user from repeatedly creating function
    specific attribute directories with different names, resulting in the same
    endpoint specific attributes group being added multiple times, which also
    result in an invalid reference counting for the attribute groups. E.g.,
    using the pci-epf-ntb function driver as an example, the user creates the
    function as follows:
    
      $ modprobe pci-epf-ntb
      $ cd /sys/kernel/config/pci_ep/functions/pci_epf_ntb
      $ mkdir func0
      $ tree func0
      func0/
      |-- baseclass_code
      |-- cache_line_size
      |-- ...
      `-- vendorid
    
      $ mkdir func0/attrs
      $ tree func0
      func0/
      |-- attrs
      |   |-- db_count
      |   |-- mw1
      |   |-- mw2
      |   |-- mw3
      |   |-- mw4
      |   |-- num_mws
      |   `-- spad_count
      |-- baseclass_code
      |-- cache_line_size
      |-- ...
      `-- vendorid
    
    At this point, the function can be started by linking the EP controller.
    However, if the user mistakenly creates again a directory:
    
      $ mkdir func0/attrs2
      $ tree func0
      func0/
      |-- attrs
      |   |-- db_count
      |   |-- mw1
      |   |-- mw2
      |   |-- mw3
      |   |-- mw4
      |   |-- num_mws
      |   `-- spad_count
      |-- attrs2
      |   |-- db_count
      |   |-- mw1
      |   |-- mw2
      |   |-- mw3
      |   |-- mw4
      |   |-- num_mws
      |   `-- spad_count
      |-- baseclass_code
      |-- cache_line_size
      |-- ...
      `-- vendorid
    
    The endpoint function specific attributes are duplicated and cause a crash
    when the endpoint function device is torn down:
    
      refcount_t: addition on 0; use-after-free.
      WARNING: CPU: 2 PID: 834 at lib/refcount.c:25 refcount_warn_saturate+0xc8/0x144
      CPU: 2 PID: 834 Comm: rmdir Not tainted 6.3.0-rc1 #1
      Hardware name: Pine64 RockPro64 v2.1 (DT)
      pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
      ...
      Call trace:
      refcount_warn_saturate+0xc8/0x144
      config_item_get+0x7c/0x80
      configfs_rmdir+0x17c/0x30c
      vfs_rmdir+0x8c/0x204
      do_rmdir+0x158/0x184
      __arm64_sys_unlinkat+0x64/0x80
      invoke_syscall+0x48/0x114
      ...
    
    Fix this by modifying pci_epf_cfs_work() to execute the new function
    pci_ep_cfs_add_type_group() which itself calls pci_epf_type_add_cfs() to
    obtain the function specific attribute group and the group name (directory
    name) from the endpoint function driver. If the function driver defines an
    attribute group, pci_ep_cfs_add_type_group() then proceeds to register this
    group using configfs_register_group(), thus automatically exposing the
    function type specific configfs attributes to the user. E.g.:
    
      $ modprobe pci-epf-ntb
      $ cd /sys/kernel/config/pci_ep/functions/pci_epf_ntb
      $ mkdir func0
      $ tree func0
      func0/
      |-- baseclass_code
      |-- cache_line_size
      |-- ...
      |-- pci_epf_ntb.0
      |   |-- db_count
      |   |-- mw1
      |   |-- mw2
      |   |-- mw3
      |   |-- mw4
      |   |-- num_mws
      |   `-- spad_count
      |-- primary
      |-- ...
      `-- vendorid
    
    With this change, there is no need for the user to create or delete
    directories in the endpoint function attributes directory. The
    pci_epf_type_group_ops group operations are thus removed.
    
    Also update the documentation for the pci-epf-ntb and pci-epf-vntb function
    drivers to reflect this change, removing the explanations showing the need
    to manually create the sub-directory for the function specific attributes.
    
    Link: https://lore.kernel.org/r/20230415023542.77601-2-dlemoal@kernel.orgSigned-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Signed-off-by: default avatarLorenzo Pieralisi <lpieralisi@kernel.org>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarManivannan Sadhasivam <mani@kernel.org>
    70b3740f
pci-vntb-howto.rst 5.41 KB