Forráskód Böngészése

iommu/vt-d: Create RMRR mappings in newly allocated domains

Currently the RMRR entries are created only at boot time.
This means they will vanish when the domain allocated at
boot time is destroyed.
This patch makes sure that also newly allocated domains will
get RMRR mappings.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
Joerg Roedel 10 éve
szülő
commit
b1ce5b79ae
1 módosított fájl, 20 hozzáadás és 0 törlés
  1. 20 0
      drivers/iommu/intel-iommu.c

+ 20 - 0
drivers/iommu/intel-iommu.c

@@ -3241,7 +3241,10 @@ static struct iova *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_rmrr_unit *rmrr;
 	struct dmar_domain *domain;
 	struct dmar_domain *domain;
+	struct device *i_dev;
+	int i, ret;
 
 
 	domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH);
 	domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH);
 	if (!domain) {
 	if (!domain) {
@@ -3250,6 +3253,23 @@ static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
 		return NULL;
 		return NULL;
 	}
 	}
 
 
+	/* We have a new domain - setup possible RMRRs for the device */
+	rcu_read_lock();
+	for_each_rmrr_units(rmrr) {
+		for_each_active_dev_scope(rmrr->devices, rmrr->devices_cnt,
+					  i, i_dev) {
+			if (i_dev != dev)
+				continue;
+
+			ret = domain_prepare_identity_map(dev, domain,
+							  rmrr->base_address,
+							  rmrr->end_address);
+			if (ret)
+				dev_err(dev, "Mapping reserved region failed\n");
+		}
+	}
+	rcu_read_unlock();
+
 	return domain;
 	return domain;
 }
 }