lkml.org 
[lkml]   [2011]   [Jun]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7/9] x86/amd-iommu: Allow dev_data->alias to be NULL
    Date
    Let dev_data->alias be just NULL if the device has no alias.

    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/kernel/amd_iommu.c | 77 +++++++++++++++++++++++--------------------
    1 files changed, 41 insertions(+), 36 deletions(-)

    diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
    index a15a172..2d914a4 100644
    --- a/arch/x86/kernel/amd_iommu.c
    +++ b/arch/x86/kernel/amd_iommu.c
    @@ -183,12 +183,14 @@ static int iommu_init_device(struct device *dev)
    return -ENOMEM;

    alias = amd_iommu_alias_table[dev_data->devid];
    - pdev = pci_get_bus_and_slot(PCI_BUS(alias), alias & 0xff);
    - if (pdev)
    - dev_data->alias = &pdev->dev;
    - else {
    - free_dev_data(dev_data);
    - return -ENOTSUPP;
    + if (alias != dev_data->devid) {
    + pdev = pci_get_bus_and_slot(PCI_BUS(alias), alias & 0xff);
    + if (pdev)
    + dev_data->alias = &pdev->dev;
    + else {
    + free_dev_data(dev_data);
    + return -ENOTSUPP;
    + }
    }

    dev->archdata.iommu = dev_data;
    @@ -1604,29 +1606,31 @@ static void do_detach(struct iommu_dev_data *dev_data)
    static int __attach_device(struct iommu_dev_data *dev_data,
    struct protection_domain *domain)
    {
    - struct iommu_dev_data *alias_data;
    int ret;

    - alias_data = get_dev_data(dev_data->alias);
    -
    - if (!alias_data)
    - return -EINVAL;
    -
    /* lock domain */
    spin_lock(&domain->lock);

    - /* Some sanity checks */
    - ret = -EBUSY;
    - if (alias_data->domain != NULL &&
    - alias_data->domain != domain)
    - goto out_unlock;
    + if (dev_data->alias != NULL) {
    + struct iommu_dev_data *alias_data;
    +
    + alias_data = get_dev_data(dev_data->alias);
    +
    + ret = -EINVAL;
    + if (!alias_data)
    + goto out_unlock;

    - if (dev_data->domain != NULL &&
    - dev_data->domain != domain)
    - goto out_unlock;
    + /* Some sanity checks */
    + ret = -EBUSY;
    + if (alias_data->domain != NULL &&
    + alias_data->domain != domain)
    + goto out_unlock;

    - /* Do real assignment */
    - if (dev_data->devid != alias_data->devid) {
    + if (dev_data->domain != NULL &&
    + dev_data->domain != domain)
    + goto out_unlock;
    +
    + /* Do real assignment */
    if (alias_data->domain == NULL)
    do_attach(alias_data, domain);

    @@ -1696,8 +1700,8 @@ static void __detach_device(struct iommu_dev_data *dev_data)

    spin_lock_irqsave(&domain->lock, flags);

    - alias_data = get_dev_data(dev_data->alias);
    - if (dev_data->devid != alias_data->devid) {
    + if (dev_data->alias) {
    + alias_data = get_dev_data(dev_data->alias);
    if (atomic_dec_and_test(&alias_data->bind))
    do_detach(alias_data);
    }
    @@ -1744,24 +1748,25 @@ static void detach_device(struct device *dev)
    */
    static struct protection_domain *domain_for_device(struct device *dev)
    {
    - struct protection_domain *dom;
    struct iommu_dev_data *dev_data, *alias_data;
    + struct protection_domain *dom = NULL;
    unsigned long flags;

    dev_data = get_dev_data(dev);
    - alias_data = get_dev_data(dev_data->alias);
    - if (!alias_data)
    - return NULL;

    - read_lock_irqsave(&amd_iommu_devtable_lock, flags);
    - dom = dev_data->domain;
    - if (dom == NULL &&
    - alias_data->domain != NULL) {
    - __attach_device(dev_data, alias_data->domain);
    - dom = alias_data->domain;
    - }
    + if (dev_data->domain)
    + return dev_data->domain;

    - read_unlock_irqrestore(&amd_iommu_devtable_lock, flags);
    + if (dev_data->alias != NULL) {
    + alias_data = get_dev_data(dev_data->alias);
    +
    + read_lock_irqsave(&amd_iommu_devtable_lock, flags);
    + if (alias_data->domain != NULL) {
    + __attach_device(dev_data, alias_data->domain);
    + dom = alias_data->domain;
    + }
    + read_unlock_irqrestore(&amd_iommu_devtable_lock, flags);
    + }

    return dom;
    }
    --
    1.7.4.1



    \
     
     \ /
      Last update: 2011-06-10 14:11    [W:3.239 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site