forked from mirrors/linux
		
	PCI: Remove unused SR-IOV VF Migration support
This reverts commit 74bb1bcc7d ("PCI: handle SR-IOV Virtual Function
Migration"), removing this exported interface:
  pci_sriov_migration()
Since pci_sriov_migration() is unused, it is impossible to schedule
sriov_migration_task() or use any of the other migration infrastructure.
This is based on Stephen Hemminger's patch (see link below), but goes a bit
further.
Link: http://lkml.kernel.org/r/20131227132710.7190647c@nehalam.linuxnetplumber.net
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
CC: Stephen Hemminger <stephen@networkplumber.org>
			
			
This commit is contained in:
		
							parent
							
								
									4b180d97b1
								
							
						
					
					
						commit
						46cb7b1bd8
					
				
					 4 changed files with 0 additions and 131 deletions
				
			
		|  | @ -68,10 +68,6 @@ To disable SR-IOV capability: | ||||||
| 	echo  0 > \ | 	echo  0 > \ | ||||||
|         /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs |         /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs | ||||||
| 
 | 
 | ||||||
| To notify SR-IOV core of Virtual Function Migration: |  | ||||||
| (a) In the driver: |  | ||||||
| 	irqreturn_t pci_sriov_migration(struct pci_dev *dev); |  | ||||||
| 
 |  | ||||||
| 3.2 Usage example | 3.2 Usage example | ||||||
| 
 | 
 | ||||||
| Following piece of code illustrates the usage of the SR-IOV API. | Following piece of code illustrates the usage of the SR-IOV API. | ||||||
|  |  | ||||||
|  | @ -170,97 +170,6 @@ static void virtfn_remove(struct pci_dev *dev, int id, int reset) | ||||||
| 	pci_dev_put(dev); | 	pci_dev_put(dev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int sriov_migration(struct pci_dev *dev) |  | ||||||
| { |  | ||||||
| 	u16 status; |  | ||||||
| 	struct pci_sriov *iov = dev->sriov; |  | ||||||
| 
 |  | ||||||
| 	if (!iov->num_VFs) |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	if (!(iov->cap & PCI_SRIOV_CAP_VFM)) |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	pci_read_config_word(dev, iov->pos + PCI_SRIOV_STATUS, &status); |  | ||||||
| 	if (!(status & PCI_SRIOV_STATUS_VFM)) |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	schedule_work(&iov->mtask); |  | ||||||
| 
 |  | ||||||
| 	return 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void sriov_migration_task(struct work_struct *work) |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 	u8 state; |  | ||||||
| 	u16 status; |  | ||||||
| 	struct pci_sriov *iov = container_of(work, struct pci_sriov, mtask); |  | ||||||
| 
 |  | ||||||
| 	for (i = iov->initial_VFs; i < iov->num_VFs; i++) { |  | ||||||
| 		state = readb(iov->mstate + i); |  | ||||||
| 		if (state == PCI_SRIOV_VFM_MI) { |  | ||||||
| 			writeb(PCI_SRIOV_VFM_AV, iov->mstate + i); |  | ||||||
| 			state = readb(iov->mstate + i); |  | ||||||
| 			if (state == PCI_SRIOV_VFM_AV) |  | ||||||
| 				virtfn_add(iov->self, i, 1); |  | ||||||
| 		} else if (state == PCI_SRIOV_VFM_MO) { |  | ||||||
| 			virtfn_remove(iov->self, i, 1); |  | ||||||
| 			writeb(PCI_SRIOV_VFM_UA, iov->mstate + i); |  | ||||||
| 			state = readb(iov->mstate + i); |  | ||||||
| 			if (state == PCI_SRIOV_VFM_AV) |  | ||||||
| 				virtfn_add(iov->self, i, 0); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	pci_read_config_word(iov->self, iov->pos + PCI_SRIOV_STATUS, &status); |  | ||||||
| 	status &= ~PCI_SRIOV_STATUS_VFM; |  | ||||||
| 	pci_write_config_word(iov->self, iov->pos + PCI_SRIOV_STATUS, status); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int sriov_enable_migration(struct pci_dev *dev, int nr_virtfn) |  | ||||||
| { |  | ||||||
| 	int bir; |  | ||||||
| 	u32 table; |  | ||||||
| 	resource_size_t pa; |  | ||||||
| 	struct pci_sriov *iov = dev->sriov; |  | ||||||
| 
 |  | ||||||
| 	if (nr_virtfn <= iov->initial_VFs) |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	pci_read_config_dword(dev, iov->pos + PCI_SRIOV_VFM, &table); |  | ||||||
| 	bir = PCI_SRIOV_VFM_BIR(table); |  | ||||||
| 	if (bir > PCI_STD_RESOURCE_END) |  | ||||||
| 		return -EIO; |  | ||||||
| 
 |  | ||||||
| 	table = PCI_SRIOV_VFM_OFFSET(table); |  | ||||||
| 	if (table + nr_virtfn > pci_resource_len(dev, bir)) |  | ||||||
| 		return -EIO; |  | ||||||
| 
 |  | ||||||
| 	pa = pci_resource_start(dev, bir) + table; |  | ||||||
| 	iov->mstate = ioremap(pa, nr_virtfn); |  | ||||||
| 	if (!iov->mstate) |  | ||||||
| 		return -ENOMEM; |  | ||||||
| 
 |  | ||||||
| 	INIT_WORK(&iov->mtask, sriov_migration_task); |  | ||||||
| 
 |  | ||||||
| 	iov->ctrl |= PCI_SRIOV_CTRL_VFM | PCI_SRIOV_CTRL_INTR; |  | ||||||
| 	pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void sriov_disable_migration(struct pci_dev *dev) |  | ||||||
| { |  | ||||||
| 	struct pci_sriov *iov = dev->sriov; |  | ||||||
| 
 |  | ||||||
| 	iov->ctrl &= ~(PCI_SRIOV_CTRL_VFM | PCI_SRIOV_CTRL_INTR); |  | ||||||
| 	pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); |  | ||||||
| 
 |  | ||||||
| 	cancel_work_sync(&iov->mtask); |  | ||||||
| 	iounmap(iov->mstate); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | ||||||
| { | { | ||||||
| 	int rc; | 	int rc; | ||||||
|  | @ -351,12 +260,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | ||||||
| 			goto failed; | 			goto failed; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (iov->cap & PCI_SRIOV_CAP_VFM) { |  | ||||||
| 		rc = sriov_enable_migration(dev, nr_virtfn); |  | ||||||
| 		if (rc) |  | ||||||
| 			goto failed; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE); | 	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE); | ||||||
| 	iov->num_VFs = nr_virtfn; | 	iov->num_VFs = nr_virtfn; | ||||||
| 
 | 
 | ||||||
|  | @ -387,9 +290,6 @@ static void sriov_disable(struct pci_dev *dev) | ||||||
| 	if (!iov->num_VFs) | 	if (!iov->num_VFs) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (iov->cap & PCI_SRIOV_CAP_VFM) |  | ||||||
| 		sriov_disable_migration(dev); |  | ||||||
| 
 |  | ||||||
| 	for (i = 0; i < iov->num_VFs; i++) | 	for (i = 0; i < iov->num_VFs; i++) | ||||||
| 		virtfn_remove(dev, i, 0); | 		virtfn_remove(dev, i, 0); | ||||||
| 
 | 
 | ||||||
|  | @ -687,25 +587,6 @@ void pci_disable_sriov(struct pci_dev *dev) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL_GPL(pci_disable_sriov); | EXPORT_SYMBOL_GPL(pci_disable_sriov); | ||||||
| 
 | 
 | ||||||
| /**
 |  | ||||||
|  * pci_sriov_migration - notify SR-IOV core of Virtual Function Migration |  | ||||||
|  * @dev: the PCI device |  | ||||||
|  * |  | ||||||
|  * Returns IRQ_HANDLED if the IRQ is handled, or IRQ_NONE if not. |  | ||||||
|  * |  | ||||||
|  * Physical Function driver is responsible to register IRQ handler using |  | ||||||
|  * VF Migration Interrupt Message Number, and call this function when the |  | ||||||
|  * interrupt is generated by the hardware. |  | ||||||
|  */ |  | ||||||
| irqreturn_t pci_sriov_migration(struct pci_dev *dev) |  | ||||||
| { |  | ||||||
| 	if (!dev->is_physfn) |  | ||||||
| 		return IRQ_NONE; |  | ||||||
| 
 |  | ||||||
| 	return sriov_migration(dev) ? IRQ_HANDLED : IRQ_NONE; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL_GPL(pci_sriov_migration); |  | ||||||
| 
 |  | ||||||
| /**
 | /**
 | ||||||
|  * pci_num_vf - return number of VFs associated with a PF device_release_driver |  * pci_num_vf - return number of VFs associated with a PF device_release_driver | ||||||
|  * @dev: the PCI device |  * @dev: the PCI device | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| #ifndef DRIVERS_PCI_H | #ifndef DRIVERS_PCI_H | ||||||
| #define DRIVERS_PCI_H | #define DRIVERS_PCI_H | ||||||
| 
 | 
 | ||||||
| #include <linux/workqueue.h> |  | ||||||
| 
 |  | ||||||
| #define PCI_CFG_SPACE_SIZE	256 | #define PCI_CFG_SPACE_SIZE	256 | ||||||
| #define PCI_CFG_SPACE_EXP_SIZE	4096 | #define PCI_CFG_SPACE_EXP_SIZE	4096 | ||||||
| 
 | 
 | ||||||
|  | @ -240,8 +238,6 @@ struct pci_sriov { | ||||||
| 	struct pci_dev *dev;	/* lowest numbered PF */ | 	struct pci_dev *dev;	/* lowest numbered PF */ | ||||||
| 	struct pci_dev *self;	/* this PF */ | 	struct pci_dev *self;	/* this PF */ | ||||||
| 	struct mutex lock;	/* lock for VF bus */ | 	struct mutex lock;	/* lock for VF bus */ | ||||||
| 	struct work_struct mtask; /* VF Migration task */ |  | ||||||
| 	u8 __iomem *mstate;	/* VF Migration State Array */ |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_PCI_ATS | #ifdef CONFIG_PCI_ATS | ||||||
|  |  | ||||||
|  | @ -29,7 +29,6 @@ | ||||||
| #include <linux/atomic.h> | #include <linux/atomic.h> | ||||||
| #include <linux/device.h> | #include <linux/device.h> | ||||||
| #include <linux/io.h> | #include <linux/io.h> | ||||||
| #include <linux/irqreturn.h> |  | ||||||
| #include <uapi/linux/pci.h> | #include <uapi/linux/pci.h> | ||||||
| 
 | 
 | ||||||
| #include <linux/pci_ids.h> | #include <linux/pci_ids.h> | ||||||
|  | @ -1577,7 +1576,6 @@ void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar); | ||||||
| #ifdef CONFIG_PCI_IOV | #ifdef CONFIG_PCI_IOV | ||||||
| int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); | int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); | ||||||
| void pci_disable_sriov(struct pci_dev *dev); | void pci_disable_sriov(struct pci_dev *dev); | ||||||
| irqreturn_t pci_sriov_migration(struct pci_dev *dev); |  | ||||||
| int pci_num_vf(struct pci_dev *dev); | int pci_num_vf(struct pci_dev *dev); | ||||||
| int pci_vfs_assigned(struct pci_dev *dev); | int pci_vfs_assigned(struct pci_dev *dev); | ||||||
| int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); | int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); | ||||||
|  | @ -1586,8 +1584,6 @@ int pci_sriov_get_totalvfs(struct pci_dev *dev); | ||||||
| static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn) | static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn) | ||||||
| { return -ENODEV; } | { return -ENODEV; } | ||||||
| static inline void pci_disable_sriov(struct pci_dev *dev) { } | static inline void pci_disable_sriov(struct pci_dev *dev) { } | ||||||
| static inline irqreturn_t pci_sriov_migration(struct pci_dev *dev) |  | ||||||
| { return IRQ_NONE; } |  | ||||||
| static inline int pci_num_vf(struct pci_dev *dev) { return 0; } | static inline int pci_num_vf(struct pci_dev *dev) { return 0; } | ||||||
| static inline int pci_vfs_assigned(struct pci_dev *dev) | static inline int pci_vfs_assigned(struct pci_dev *dev) | ||||||
| { return 0; } | { return 0; } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Bjorn Helgaas
						Bjorn Helgaas