On Tue, Feb 16, 2021 at 10:12:12AM -0600, Bjorn Helgaas wrote: > > > > > > But I still don't like the fact that we're calling > > > sysfs_create_files() and sysfs_remove_files() directly. It makes > > > complication and opportunities for errors. > > > > It is not different from any other code that we have in the kernel. > > It *is* different. There is a general rule that drivers should not > call sysfs_* [1]. The PCI core is arguably not a "driver," but it is > still true that callers of sysfs_create_files() are very special, and > I'd prefer not to add another one. I think the point of [1] is people should be setting up their sysfs in the struct device attribute groups/etc before doing device_add() and allowing the driver core to handle everything. This can be done in a lot of cases, eg we have examples of building a dynamic list of attributes In other cases, calling wrappers like device_create_file() introduces a bit more type safety, so adding a device_create_files() would be trivial enough Other places in PCI are using syfs_create_group() (and there are over 400 calls to this function in all sorts of device drivers): drivers/pci/msi.c: ret = sysfs_create_groups(&pdev->dev.kobj, msi_irq_groups); drivers/pci/p2pdma.c: error = sysfs_create_group(&pdev->dev.kobj, &p2pmem_group); drivers/pci/pci-label.c: return sysfs_create_group(&pdev->dev.kobj, &smbios_attr_group); drivers/pci/pci-label.c: return sysfs_create_group(&pdev->dev.kobj, &acpi_attr_group); For post-driver_add() stuff, maybe this should do the same, a "srio_vf/" group? And a minor cleanup would change these to use device_create_bin_file(): drivers/pci/pci-sysfs.c: retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr); drivers/pci/pci-sysfs.c: retval = sysfs_create_bin_file(&pdev->dev.kobj, &pcie_config_attr); drivers/pci/pci-sysfs.c: retval = sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr); drivers/pci/pci-sysfs.c: retval = sysfs_create_bin_file(&pdev->dev.kobj, attr); drivers/pci/vpd.c: retval = sysfs_create_bin_file(&dev->dev.kobj, attr); I haven't worked out why pci_create_firmware_label_files() and all of this needs to be after device_add() though.. Would be slick to put that in the normal attribute list - we've got some examples of dynamic pre-device_add() attribute lists in the tree (eg tpm, rdma) that work nicely. Jason