PCI/sysfs: Compile pci-sysfs.c only if CONFIG_SYSFS=y
authorLukas Wunner <lukas@wunner.de>
Mon, 30 Oct 2023 12:32:12 +0000 (13:32 +0100)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 5 Mar 2024 22:08:43 +0000 (16:08 -0600)
It is possible to enable CONFIG_PCI but disable CONFIG_SYSFS and for
space-constrained devices such as routers, such a configuration may
actually make sense.

However pci-sysfs.c is compiled even if CONFIG_SYSFS is disabled,
unnecessarily increasing the kernel's size.

To rectify that:

* Move pci_mmap_fits() to mmap.c.  It is not only needed by
  pci-sysfs.c, but also proc.c.

* Move pci_dev_type to probe.c and make it private.  It references
  pci_dev_attr_groups in pci-sysfs.c.  Make that public instead for
  consistency with pci_dev_groups, pcibus_groups and pci_bus_groups,
  which are likewise public and referenced by struct definitions in
  pci-driver.c and probe.c.

* Define pci_dev_groups, pci_dev_attr_groups, pcibus_groups and
  pci_bus_groups to NULL if CONFIG_SYSFS is disabled.  Provide empty
  static inlines for pci_{create,remove}_legacy_files() and
  pci_{create,remove}_sysfs_dev_files().

Result:

vmlinux size is reduced by 122996 bytes in my arm 32-bit test build.

Link: https://lore.kernel.org/r/85ca95ae8e4d57ccf082c5c069b8b21eb141846e.1698668982.git.lukas@wunner.de
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
drivers/pci/Makefile
drivers/pci/mmap.c
drivers/pci/pci-sysfs.c
drivers/pci/pci.h
drivers/pci/probe.c

index cc8b4e01e29de5439c1671896d5dd53f77a3b9c4..96f4759f2bd31400afabc3d75cd0d1a48eace79c 100644 (file)
@@ -4,7 +4,7 @@
 
 obj-$(CONFIG_PCI)              += access.o bus.o probe.o host-bridge.o \
                                   remove.o pci.o pci-driver.o search.o \
-                                  pci-sysfs.o rom.o setup-res.o irq.o vpd.o \
+                                  rom.o setup-res.o irq.o vpd.o \
                                   setup-bus.o vc.o mmap.o setup-irq.o
 
 obj-$(CONFIG_PCI)              += msi/
@@ -12,7 +12,7 @@ obj-$(CONFIG_PCI)             += pcie/
 
 ifdef CONFIG_PCI
 obj-$(CONFIG_PROC_FS)          += proc.o
-obj-$(CONFIG_SYSFS)            += slot.o
+obj-$(CONFIG_SYSFS)            += pci-sysfs.o slot.o
 obj-$(CONFIG_ACPI)             += pci-acpi.o
 endif
 
index 4504039056d1b54978bcbbdb8fca0360297a7ca6..8da3347a95c47a655dbf0cba643bd4235cd2ba28 100644 (file)
@@ -11,6 +11,8 @@
 #include <linux/mm.h>
 #include <linux/pci.h>
 
+#include "pci.h"
+
 #ifdef ARCH_GENERIC_PCI_MMAP_RESOURCE
 
 static const struct vm_operations_struct pci_phys_vm_ops = {
@@ -50,3 +52,30 @@ int pci_mmap_resource_range(struct pci_dev *pdev, int bar,
 }
 
 #endif
+
+#if (defined(CONFIG_SYSFS) || defined(CONFIG_PROC_FS)) && \
+    (defined(HAVE_PCI_MMAP) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE))
+
+int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
+                 enum pci_mmap_api mmap_api)
+{
+       resource_size_t pci_start = 0, pci_end;
+       unsigned long nr, start, size;
+
+       if (pci_resource_len(pdev, resno) == 0)
+               return 0;
+       nr = vma_pages(vma);
+       start = vma->vm_pgoff;
+       size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
+       if (mmap_api == PCI_MMAP_PROCFS) {
+               pci_resource_to_user(pdev, resno, &pdev->resource[resno],
+                                    &pci_start, &pci_end);
+               pci_start >>= PAGE_SHIFT;
+       }
+       if (start >= pci_start && start < pci_start + size &&
+           start + nr <= pci_start + size)
+               return 1;
+       return 0;
+}
+
+#endif
index 2321fdfefd7db2682f230cc6267a7bc9b23f75e3..44ed30df08c321698e38d9d5cff3895a8d1caa95 100644 (file)
@@ -1022,29 +1022,6 @@ void pci_remove_legacy_files(struct pci_bus *b)
 #endif /* HAVE_PCI_LEGACY */
 
 #if defined(HAVE_PCI_MMAP) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE)
-
-int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
-                 enum pci_mmap_api mmap_api)
-{
-       unsigned long nr, start, size;
-       resource_size_t pci_start = 0, pci_end;
-
-       if (pci_resource_len(pdev, resno) == 0)
-               return 0;
-       nr = vma_pages(vma);
-       start = vma->vm_pgoff;
-       size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
-       if (mmap_api == PCI_MMAP_PROCFS) {
-               pci_resource_to_user(pdev, resno, &pdev->resource[resno],
-                                    &pci_start, &pci_end);
-               pci_start >>= PAGE_SHIFT;
-       }
-       if (start >= pci_start && start < pci_start + size &&
-                       start + nr <= pci_start + size)
-               return 1;
-       return 0;
-}
-
 /**
  * pci_mmap_resource - map a PCI resource into user memory space
  * @kobj: kobject for mapping
@@ -1660,7 +1637,7 @@ static const struct attribute_group pcie_dev_attr_group = {
        .is_visible = pcie_dev_attrs_are_visible,
 };
 
-static const struct attribute_group *pci_dev_attr_groups[] = {
+const struct attribute_group *pci_dev_attr_groups[] = {
        &pci_dev_attr_group,
        &pci_dev_hp_attr_group,
 #ifdef CONFIG_PCI_IOV
@@ -1677,7 +1654,3 @@ static const struct attribute_group *pci_dev_attr_groups[] = {
 #endif
        NULL,
 };
-
-const struct device_type pci_dev_type = {
-       .groups = pci_dev_attr_groups,
-};
index 2336a8d1edab27646220794a3a4cdd085ba7b3e9..74d7f66b64a8752f2721101368ab796b2668ea49 100644 (file)
@@ -31,8 +31,6 @@ bool pcie_cap_has_rtctl(const struct pci_dev *dev);
 
 /* Functions internal to the PCI core code */
 
-int pci_create_sysfs_dev_files(struct pci_dev *pdev);
-void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
 void pci_cleanup_rom(struct pci_dev *dev);
 #ifdef CONFIG_DMI
 extern const struct attribute_group pci_dev_smbios_attr_group;
@@ -152,7 +150,7 @@ static inline int pci_proc_detach_bus(struct pci_bus *bus) { return 0; }
 /* Functions for PCI Hotplug drivers to use */
 int pci_hp_add_bridge(struct pci_dev *dev);
 
-#ifdef HAVE_PCI_LEGACY
+#if defined(CONFIG_SYSFS) && defined(HAVE_PCI_LEGACY)
 void pci_create_legacy_files(struct pci_bus *bus);
 void pci_remove_legacy_files(struct pci_bus *bus);
 #else
@@ -185,10 +183,22 @@ static inline int pci_no_d1d2(struct pci_dev *dev)
        return (dev->no_d1d2 || parent_dstates);
 
 }
+
+#ifdef CONFIG_SYSFS
+int pci_create_sysfs_dev_files(struct pci_dev *pdev);
+void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
 extern const struct attribute_group *pci_dev_groups[];
+extern const struct attribute_group *pci_dev_attr_groups[];
 extern const struct attribute_group *pcibus_groups[];
-extern const struct device_type pci_dev_type;
 extern const struct attribute_group *pci_bus_groups[];
+#else
+static inline int pci_create_sysfs_dev_files(struct pci_dev *pdev) { return 0; }
+static inline void pci_remove_sysfs_dev_files(struct pci_dev *pdev) { }
+#define pci_dev_groups NULL
+#define pci_dev_attr_groups NULL
+#define pcibus_groups NULL
+#define pci_bus_groups NULL
+#endif
 
 extern unsigned long pci_hotplug_io_size;
 extern unsigned long pci_hotplug_mmio_size;
index b7335be56008f76ce0da493b56b40a35928af756..c1496e683e700591a404f8b1785c5b320af8869e 100644 (file)
@@ -2357,6 +2357,10 @@ static void pci_release_dev(struct device *dev)
        kfree(pci_dev);
 }
 
+static const struct device_type pci_dev_type = {
+       .groups = pci_dev_attr_groups,
+};
+
 struct pci_dev *pci_alloc_dev(struct pci_bus *bus)
 {
        struct pci_dev *dev;