* [PATCH 0/2] Fix remaining RMRR issues @ 2015-10-01 14:34 Joerg Roedel 2015-10-01 14:34 ` [PATCH 1/2] iommu/vt-d: Split iommu_prepare_identity_map Joerg Roedel 2015-10-01 14:34 ` [PATCH 2/2] iommu/vt-d: Create RMRR mappings in newly allocated domains Joerg Roedel 0 siblings, 2 replies; 4+ messages in thread From: Joerg Roedel @ 2015-10-01 14:34 UTC (permalink / raw) To: iommu; +Cc: David Woodhouse, Alex Williamson, linux-kernel, Joerg Roedel Hi, here is a patch-set to fix a remaining RMRR issue in the VT-d driver. The problem was that RMRR mappings are only created for boot-time (or hotplug-time) allocated domains. Domains allocated on demand don't get RMRR mappings, which is bad for the kdump case, for example. With this patch-set the on-demand domains also get RMRR mappings. Regards, Joerg Joerg Roedel (2): iommu/vt-d: Split iommu_prepare_identity_map iommu/vt-d: Create RMRR mappings in newly allocated domains drivers/iommu/intel-iommu.c | 60 +++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 18 deletions(-) -- 1.9.1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] iommu/vt-d: Split iommu_prepare_identity_map 2015-10-01 14:34 [PATCH 0/2] Fix remaining RMRR issues Joerg Roedel @ 2015-10-01 14:34 ` Joerg Roedel 2015-10-01 14:47 ` kbuild test robot 2015-10-01 14:34 ` [PATCH 2/2] iommu/vt-d: Create RMRR mappings in newly allocated domains Joerg Roedel 1 sibling, 1 reply; 4+ messages in thread From: Joerg Roedel @ 2015-10-01 14:34 UTC (permalink / raw) To: iommu; +Cc: David Woodhouse, Alex Williamson, linux-kernel, Joerg Roedel From: Joerg Roedel <jroedel@suse.de> Split the part of the function that fetches the domain out and put the rest into into a domain_prepare_identity_map, so that the code can also be used with when the domain is already known. Signed-off-by: Joerg Roedel <jroedel@suse.de> --- drivers/iommu/intel-iommu.c | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 2d7349a..e182d81 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -2429,17 +2429,13 @@ static int iommu_domain_identity_map(struct dmar_domain *domain, DMA_PTE_READ|DMA_PTE_WRITE); } -static int iommu_prepare_identity_map(struct device *dev, - unsigned long long start, - unsigned long long end) +static int domain_prepare_identity_map(struct device *dev, + struct dmar_domain *domain, + unsigned long long start, + unsigned long long end) { - struct dmar_domain *domain; int ret; - domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH); - if (!domain) - return -ENOMEM; - /* For _hardware_ passthrough, don't bother. But for software passthrough, we do it anyway -- it may indicate a memory range which is reserved in E820, so which didn't get set @@ -2459,8 +2455,7 @@ static int iommu_prepare_identity_map(struct device *dev, dmi_get_system_info(DMI_BIOS_VENDOR), dmi_get_system_info(DMI_BIOS_VERSION), dmi_get_system_info(DMI_PRODUCT_VERSION)); - ret = -EIO; - goto error; + return -EIO; } if (end >> agaw_to_width(domain->agaw)) { @@ -2470,18 +2465,27 @@ static int iommu_prepare_identity_map(struct device *dev, dmi_get_system_info(DMI_BIOS_VENDOR), dmi_get_system_info(DMI_BIOS_VERSION), dmi_get_system_info(DMI_PRODUCT_VERSION)); - ret = -EIO; - goto error; + return -EIO; } - ret = iommu_domain_identity_map(domain, start, end); - if (ret) - goto error; + return iommu_domain_identity_map(domain, start, end); +} - return 0; +static int iommu_prepare_identity_map(struct device *dev, + unsigned long long start, + unsigned long long end) +{ + struct dmar_domain *domain; + int ret; + + domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH); + if (!domain) + return -ENOMEM; + + ret = domain_prepare_identity_map(dev, domain, start, end); + if (ret) + domain_exit(domain); - error: - domain_exit(domain); return ret; } -- 1.9.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] iommu/vt-d: Split iommu_prepare_identity_map 2015-10-01 14:34 ` [PATCH 1/2] iommu/vt-d: Split iommu_prepare_identity_map Joerg Roedel @ 2015-10-01 14:47 ` kbuild test robot 0 siblings, 0 replies; 4+ messages in thread From: kbuild test robot @ 2015-10-01 14:47 UTC (permalink / raw) To: Joerg Roedel Cc: kbuild-all, iommu, David Woodhouse, Alex Williamson, linux-kernel, Joerg Roedel [-- Attachment #1: Type: text/plain, Size: 3939 bytes --] Hi Joerg, [auto build test results on v4.3-rc3 -- if it's inappropriate base, please ignore] config: ia64-allyesconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout 75170658f4350889e0d0d404c5bb17179797bd47 # save the attached .config to linux build tree make.cross ARCH=ia64 All warnings (new ones prefixed by >>): drivers/iommu/intel-iommu.c: In function 'domain_prepare_identity_map': >> drivers/iommu/intel-iommu.c:2437:6: warning: unused variable 'ret' [-Wunused-variable] int ret; ^ vim +/ret +2437 drivers/iommu/intel-iommu.c ba395927 drivers/pci/intel-iommu.c Keshavamurthy, Anil S 2007-10-21 2421 /* ba395927 drivers/pci/intel-iommu.c Keshavamurthy, Anil S 2007-10-21 2422 * RMRR range might have overlap with physical memory range, ba395927 drivers/pci/intel-iommu.c Keshavamurthy, Anil S 2007-10-21 2423 * clear it first ba395927 drivers/pci/intel-iommu.c Keshavamurthy, Anil S 2007-10-21 2424 */ c5395d5c drivers/pci/intel-iommu.c David Woodhouse 2009-06-28 2425 dma_pte_clear_range(domain, first_vpfn, last_vpfn); ba395927 drivers/pci/intel-iommu.c Keshavamurthy, Anil S 2007-10-21 2426 c5395d5c drivers/pci/intel-iommu.c David Woodhouse 2009-06-28 2427 return domain_pfn_mapping(domain, first_vpfn, first_vpfn, c5395d5c drivers/pci/intel-iommu.c David Woodhouse 2009-06-28 2428 last_vpfn - first_vpfn + 1, ba395927 drivers/pci/intel-iommu.c Keshavamurthy, Anil S 2007-10-21 2429 DMA_PTE_READ|DMA_PTE_WRITE); b213203e drivers/pci/intel-iommu.c David Woodhouse 2009-06-26 2430 } b213203e drivers/pci/intel-iommu.c David Woodhouse 2009-06-26 2431 75170658 drivers/iommu/intel-iommu.c Joerg Roedel 2015-10-01 2432 static int domain_prepare_identity_map(struct device *dev, 75170658 drivers/iommu/intel-iommu.c Joerg Roedel 2015-10-01 2433 struct dmar_domain *domain, b213203e drivers/pci/intel-iommu.c David Woodhouse 2009-06-26 2434 unsigned long long start, b213203e drivers/pci/intel-iommu.c David Woodhouse 2009-06-26 2435 unsigned long long end) b213203e drivers/pci/intel-iommu.c David Woodhouse 2009-06-26 2436 { b213203e drivers/pci/intel-iommu.c David Woodhouse 2009-06-26 @2437 int ret; b213203e drivers/pci/intel-iommu.c David Woodhouse 2009-06-26 2438 19943b0e drivers/pci/intel-iommu.c David Woodhouse 2009-08-04 2439 /* For _hardware_ passthrough, don't bother. But for software 19943b0e drivers/pci/intel-iommu.c David Woodhouse 2009-08-04 2440 passthrough, we do it anyway -- it may indicate a memory 19943b0e drivers/pci/intel-iommu.c David Woodhouse 2009-08-04 2441 range which is reserved in E820, so which didn't get set 19943b0e drivers/pci/intel-iommu.c David Woodhouse 2009-08-04 2442 up to start with in si_domain */ 19943b0e drivers/pci/intel-iommu.c David Woodhouse 2009-08-04 2443 if (domain == si_domain && hw_pass_through) { 9f10e5bf drivers/iommu/intel-iommu.c Joerg Roedel 2015-06-12 2444 pr_warn("Ignoring identity map for HW passthrough device %s [0x%Lx - 0x%Lx]\n", 0b9d9753 drivers/iommu/intel-iommu.c David Woodhouse 2014-03-09 2445 dev_name(dev), start, end); :::::: The code at line 2437 was first introduced by commit :::::: b213203e475212a69ad6fedfb73464087e317148 intel-iommu: Create new iommu_domain_identity_map() function :::::: TO: David Woodhouse <David.Woodhouse@intel.com> :::::: CC: David Woodhouse <David.Woodhouse@intel.com> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/octet-stream, Size: 43732 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] iommu/vt-d: Create RMRR mappings in newly allocated domains 2015-10-01 14:34 [PATCH 0/2] Fix remaining RMRR issues Joerg Roedel 2015-10-01 14:34 ` [PATCH 1/2] iommu/vt-d: Split iommu_prepare_identity_map Joerg Roedel @ 2015-10-01 14:34 ` Joerg Roedel 1 sibling, 0 replies; 4+ messages in thread From: Joerg Roedel @ 2015-10-01 14:34 UTC (permalink / raw) To: iommu; +Cc: David Woodhouse, Alex Williamson, linux-kernel, Joerg Roedel From: Joerg Roedel <jroedel@suse.de> 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> --- drivers/iommu/intel-iommu.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index e182d81..e9ace17 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -3243,7 +3243,10 @@ static struct iova *intel_alloc_iova(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 device *i_dev; + int i, ret; domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH); if (!domain) { @@ -3252,6 +3255,23 @@ static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev) 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; } -- 1.9.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-10-01 14:48 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-10-01 14:34 [PATCH 0/2] Fix remaining RMRR issues Joerg Roedel 2015-10-01 14:34 ` [PATCH 1/2] iommu/vt-d: Split iommu_prepare_identity_map Joerg Roedel 2015-10-01 14:47 ` kbuild test robot 2015-10-01 14:34 ` [PATCH 2/2] iommu/vt-d: Create RMRR mappings in newly allocated domains Joerg Roedel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox