mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	PCI/sysfs: Compile pci-sysfs.c only if CONFIG_SYSFS=y
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>
			
			
This commit is contained in:
		
							parent
							
								
									6613476e22
								
							
						
					
					
						commit
						be9c3a4c8b
					
				
					 5 changed files with 50 additions and 34 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue