intel-iommu: Fix double lock in get_domain_for_dev()
authorJiri Slaby <jirislaby@gmail.com>
Mon, 14 Jun 2010 15:17:32 +0000 (17:17 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Tue, 15 Jun 2010 09:50:46 +0000 (10:50 +0100)
commit00dfff77e7184140dc45724c7232e99302f6bf97
tree16f6096b5ab13a42c7119e3d5f9c0b21817eacaf
parent25cbff1660d3f4c059a178a1e5b851be6d70c5e8
intel-iommu: Fix double lock in get_domain_for_dev()

stanse found the following double lock.

In get_domain_for_dev:
  spin_lock_irqsave(&device_domain_lock, flags);
  domain_exit(domain);
    domain_remove_dev_info(domain);
      spin_lock_irqsave(&device_domain_lock, flags);
      spin_unlock_irqrestore(&device_domain_lock, flags);
  spin_unlock_irqrestore(&device_domain_lock, flags);

This happens when the domain is created by another CPU at the same time
as this function is creating one, and the other CPU wins the race to
attach it to the device in question, so we have to destroy our own
newly-created one.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/pci/intel-iommu.c