|
@@ -3428,17 +3428,18 @@ static unsigned long intel_alloc_iova(struct device *dev,
|
|
|
|
|
|
static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
|
|
static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
|
|
{
|
|
{
|
|
|
|
+ struct dmar_domain *domain, *tmp;
|
|
struct dmar_rmrr_unit *rmrr;
|
|
struct dmar_rmrr_unit *rmrr;
|
|
- struct dmar_domain *domain;
|
|
|
|
struct device *i_dev;
|
|
struct device *i_dev;
|
|
int i, ret;
|
|
int i, ret;
|
|
|
|
|
|
- domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH);
|
|
|
|
- if (!domain) {
|
|
|
|
- pr_err("Allocating domain for %s failed\n",
|
|
|
|
- dev_name(dev));
|
|
|
|
- return NULL;
|
|
|
|
- }
|
|
|
|
|
|
+ domain = find_domain(dev);
|
|
|
|
+ if (domain)
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
|
|
+ domain = find_or_alloc_domain(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH);
|
|
|
|
+ if (!domain)
|
|
|
|
+ goto out;
|
|
|
|
|
|
/* We have a new domain - setup possible RMRRs for the device */
|
|
/* We have a new domain - setup possible RMRRs for the device */
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
@@ -3457,6 +3458,18 @@ static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
|
|
}
|
|
}
|
|
rcu_read_unlock();
|
|
rcu_read_unlock();
|
|
|
|
|
|
|
|
+ tmp = set_domain_for_dev(dev, domain);
|
|
|
|
+ if (!tmp || domain != tmp) {
|
|
|
|
+ domain_exit(domain);
|
|
|
|
+ domain = tmp;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+out:
|
|
|
|
+
|
|
|
|
+ if (!domain)
|
|
|
|
+ pr_err("Allocating domain for %s failed\n", dev_name(dev));
|
|
|
|
+
|
|
|
|
+
|
|
return domain;
|
|
return domain;
|
|
}
|
|
}
|
|
|
|
|