Release 4.7 drivers/xen/xen-pciback/passthrough.c
  
  
/*
 * PCI Backend - Provides restricted access to the real PCI bus topology
 *               to the frontend
 *
 *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
 */
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/mutex.h>
#include "pciback.h"
struct passthrough_dev_data {
	/* Access to dev_list must be protected by lock */
	
struct list_head dev_list;
	
struct mutex lock;
};
static struct pci_dev *__xen_pcibk_get_pci_dev(struct xen_pcibk_device *pdev,
					       unsigned int domain,
					       unsigned int bus,
					       unsigned int devfn)
{
	struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
	struct pci_dev_entry *dev_entry;
	struct pci_dev *dev = NULL;
	mutex_lock(&dev_data->lock);
	list_for_each_entry(dev_entry, &dev_data->dev_list, list) {
		if (domain == (unsigned int)pci_domain_nr(dev_entry->dev->bus)
		    && bus == (unsigned int)dev_entry->dev->bus->number
		    && devfn == dev_entry->dev->devfn) {
			dev = dev_entry->dev;
			break;
		}
	}
	mutex_unlock(&dev_data->lock);
	return dev;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| konrad rzeszutek wilk | konrad rzeszutek wilk | 121 | 98.37% | 3 | 75.00% | 
| jan beulich | jan beulich | 2 | 1.63% | 1 | 25.00% | 
 | Total | 123 | 100.00% | 4 | 100.00% | 
static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,
				   struct pci_dev *dev,
				   int devid, publish_pci_dev_cb publish_cb)
{
	struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
	struct pci_dev_entry *dev_entry;
	unsigned int domain, bus, devfn;
	int err;
	dev_entry = kmalloc(sizeof(*dev_entry), GFP_KERNEL);
	if (!dev_entry)
		return -ENOMEM;
	dev_entry->dev = dev;
	mutex_lock(&dev_data->lock);
	list_add_tail(&dev_entry->list, &dev_data->dev_list);
	mutex_unlock(&dev_data->lock);
	/* Publish this device. */
	domain = (unsigned int)pci_domain_nr(dev->bus);
	bus = (unsigned int)dev->bus->number;
	devfn = dev->devfn;
	err = publish_cb(pdev, domain, bus, devfn, devid);
	return err;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| konrad rzeszutek wilk | konrad rzeszutek wilk | 152 | 98.70% | 3 | 75.00% | 
| jan beulich | jan beulich | 2 | 1.30% | 1 | 25.00% | 
 | Total | 154 | 100.00% | 4 | 100.00% | 
static void __xen_pcibk_release_pci_dev(struct xen_pcibk_device *pdev,
					struct pci_dev *dev, bool lock)
{
	struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
	struct pci_dev_entry *dev_entry, *t;
	struct pci_dev *found_dev = NULL;
	mutex_lock(&dev_data->lock);
	list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) {
		if (dev_entry->dev == dev) {
			list_del(&dev_entry->list);
			found_dev = dev_entry->dev;
			kfree(dev_entry);
		}
	}
	mutex_unlock(&dev_data->lock);
	if (found_dev) {
		if (lock)
			device_lock(&found_dev->dev);
		pcistub_put_pci_dev(found_dev);
		if (lock)
			device_unlock(&found_dev->dev);
	}
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| konrad rzeszutek wilk | konrad rzeszutek wilk | 133 | 98.52% | 4 | 80.00% | 
| jan beulich | jan beulich | 2 | 1.48% | 1 | 20.00% | 
 | Total | 135 | 100.00% | 5 | 100.00% | 
static int __xen_pcibk_init_devices(struct xen_pcibk_device *pdev)
{
	struct passthrough_dev_data *dev_data;
	dev_data = kmalloc(sizeof(*dev_data), GFP_KERNEL);
	if (!dev_data)
		return -ENOMEM;
	mutex_init(&dev_data->lock);
	INIT_LIST_HEAD(&dev_data->dev_list);
	pdev->pci_dev_data = dev_data;
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| konrad rzeszutek wilk | konrad rzeszutek wilk | 62 | 98.41% | 3 | 75.00% | 
| jan beulich | jan beulich | 1 | 1.59% | 1 | 25.00% | 
 | Total | 63 | 100.00% | 4 | 100.00% | 
static int __xen_pcibk_publish_pci_roots(struct xen_pcibk_device *pdev,
					 publish_pci_root_cb publish_root_cb)
{
	int err = 0;
	struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
	struct pci_dev_entry *dev_entry, *e;
	struct pci_dev *dev;
	int found;
	unsigned int domain, bus;
	mutex_lock(&dev_data->lock);
	list_for_each_entry(dev_entry, &dev_data->dev_list, list) {
		/* Only publish this device as a root if none of its
                 * parent bridges are exported
                 */
		found = 0;
		dev = dev_entry->dev->bus->self;
		for (; !found && dev != NULL; dev = dev->bus->self) {
			list_for_each_entry(e, &dev_data->dev_list, list) {
				if (dev == e->dev) {
					found = 1;
					break;
				}
			}
		}
		domain = (unsigned int)pci_domain_nr(dev_entry->dev->bus);
		bus = (unsigned int)dev_entry->dev->bus->number;
		if (!found) {
			err = publish_root_cb(pdev, domain, bus);
			if (err)
				break;
		}
	}
	mutex_unlock(&dev_data->lock);
	return err;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| konrad rzeszutek wilk | konrad rzeszutek wilk | 188 | 98.43% | 3 | 75.00% | 
| jan beulich | jan beulich | 3 | 1.57% | 1 | 25.00% | 
 | Total | 191 | 100.00% | 4 | 100.00% | 
static void __xen_pcibk_release_devices(struct xen_pcibk_device *pdev)
{
	struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
	struct pci_dev_entry *dev_entry, *t;
	list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) {
		struct pci_dev *dev = dev_entry->dev;
		list_del(&dev_entry->list);
		device_lock(&dev->dev);
		pcistub_put_pci_dev(dev);
		device_unlock(&dev->dev);
		kfree(dev_entry);
	}
	kfree(dev_data);
	pdev->pci_dev_data = NULL;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| konrad rzeszutek wilk | konrad rzeszutek wilk | 94 | 100.00% | 4 | 100.00% | 
 | Total | 94 | 100.00% | 4 | 100.00% | 
static int __xen_pcibk_get_pcifront_dev(struct pci_dev *pcidev,
					struct xen_pcibk_device *pdev,
					unsigned int *domain, unsigned int *bus,
					unsigned int *devfn)
{
	*domain = pci_domain_nr(pcidev->bus);
	*bus = pcidev->bus->number;
	*devfn = pcidev->devfn;
	return 1;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| konrad rzeszutek wilk | konrad rzeszutek wilk | 60 | 100.00% | 3 | 100.00% | 
 | Total | 60 | 100.00% | 3 | 100.00% | 
const struct xen_pcibk_backend xen_pcibk_passthrough_backend = {
	.name           = "passthrough",
	.init           = __xen_pcibk_init_devices,
	.free		= __xen_pcibk_release_devices,
	.find           = __xen_pcibk_get_pcifront_dev,
	.publish        = __xen_pcibk_publish_pci_roots,
	.release        = __xen_pcibk_release_pci_dev,
	.add            = __xen_pcibk_add_pci_dev,
	.get            = __xen_pcibk_get_pci_dev,
};
Overall Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| konrad rzeszutek wilk | konrad rzeszutek wilk | 880 | 98.43% | 4 | 66.67% | 
| jan beulich | jan beulich | 14 | 1.57% | 2 | 33.33% | 
 | Total | 894 | 100.00% | 6 | 100.00% | 
  
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.