Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1700905 > unrolled thread

[PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev table if translation pre-enabled

Started byBaoquan He <bhe@redhat.com>
First post2017-08-01 13:40 +0200
Last post2017-08-04 15:10 +0200
Articles 3 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev table if translation pre-enabled Baoquan He <bhe@redhat.com> - 2017-08-01 13:40 +0200
    Re: [PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev  table if translation pre-enabled Joerg Roedel <jroedel@suse.de> - 2017-08-04 14:30 +0200
      Re: [PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev  table if translation pre-enabled Baoquan He <bhe@redhat.com> - 2017-08-04 15:10 +0200

#1700905 — [PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev table if translation pre-enabled

FromBaoquan He <bhe@redhat.com>
Date2017-08-01 13:40 +0200
Subject[PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev table if translation pre-enabled
Message-ID<u9DGP-3pR-39@gated-at.bofh.it>
AMD pointed out it's unsafe to update the device-table while iommu
is enabled. It turns out that device-table pointer update is split
up into two 32bit writes in the IOMMU hardware. So updating it while
the IOMMU is enabled could have some nasty side effects.

The safe way to work around this is to always allocate the device-table
below 4G, including the old device-table in normal kernel and the
device-table used for copying the content of the old device-table in kdump
kernel. Meanwhile we need check if the address of old device-table is
above 4G because it might has been touched accidentally in corrupted
1st kernel.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 drivers/iommu/amd_iommu_init.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index 6a77b99d08e4..8c6431ac5698 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -882,11 +882,15 @@ static int copy_device_table(void)
 			continue;
 
 		old_devtb_phys = entry & PAGE_MASK;
+		if (old_devtb_phys > 0x100000000ULL) {
+			pr_err("The address of old device table is above 4G, not trustworthy!/n");
+			return -1;
+		}
 		old_devtb = memremap(old_devtb_phys, dev_table_size, MEMREMAP_WB);
 		if (!old_devtb)
 			return -1;
 
-		gfp_flag = GFP_KERNEL | __GFP_ZERO;
+		gfp_flag = GFP_KERNEL | __GFP_ZERO | GFP_DMA32;
 		old_dev_tbl_cpy = (void *)__get_free_pages(gfp_flag,
 					get_order(dev_table_size));
 		if (old_dev_tbl_cpy == NULL) {
@@ -2436,7 +2440,8 @@ static int __init early_amd_iommu_init(void)
 
 	/* Device table - directly used by all IOMMUs */
 	ret = -ENOMEM;
-	amd_iommu_dev_table = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+	amd_iommu_dev_table = (void *)__get_free_pages(
+				      GFP_KERNEL | __GFP_ZERO | GFP_DMA32,
 				      get_order(dev_table_size));
 	if (amd_iommu_dev_table == NULL)
 		goto out;
-- 
2.5.5

[toc] | [next] | [standalone]


#1703933 — Re: [PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev table if translation pre-enabled

FromJoerg Roedel <jroedel@suse.de>
Date2017-08-04 14:30 +0200
SubjectRe: [PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev table if translation pre-enabled
Message-ID<uaJTQ-6TP-15@gated-at.bofh.it>
In reply to#1700905
On Tue, Aug 01, 2017 at 07:37:26PM +0800, Baoquan He wrote:
> AMD pointed out it's unsafe to update the device-table while iommu
> is enabled. It turns out that device-table pointer update is split
> up into two 32bit writes in the IOMMU hardware. So updating it while
> the IOMMU is enabled could have some nasty side effects.
> 
> The safe way to work around this is to always allocate the device-table
> below 4G, including the old device-table in normal kernel and the
> device-table used for copying the content of the old device-table in kdump
> kernel. Meanwhile we need check if the address of old device-table is
> above 4G because it might has been touched accidentally in corrupted
> 1st kernel.
> 
> Signed-off-by: Baoquan He <bhe@redhat.com>
> ---
>  drivers/iommu/amd_iommu_init.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
> index 6a77b99d08e4..8c6431ac5698 100644
> --- a/drivers/iommu/amd_iommu_init.c
> +++ b/drivers/iommu/amd_iommu_init.c
> @@ -882,11 +882,15 @@ static int copy_device_table(void)
>  			continue;
>  
>  		old_devtb_phys = entry & PAGE_MASK;
> +		if (old_devtb_phys > 0x100000000ULL) {

Needs to be '>='.

> +			pr_err("The address of old device table is above 4G, not trustworthy!/n");
> +			return -1;
> +		}

Okay, forget my previous comment about it, the check is added here

[toc] | [prev] | [next] | [standalone]


#1703953 — Re: [PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev table if translation pre-enabled

FromBaoquan He <bhe@redhat.com>
Date2017-08-04 15:10 +0200
SubjectRe: [PATCH v9 10/13] iommu/amd: Allocate memory below 4G for dev table if translation pre-enabled
Message-ID<uaKwx-7py-1@gated-at.bofh.it>
In reply to#1703933
On 08/04/17 at 02:25pm, Joerg Roedel wrote:
> On Tue, Aug 01, 2017 at 07:37:26PM +0800, Baoquan He wrote:
> > AMD pointed out it's unsafe to update the device-table while iommu
> > is enabled. It turns out that device-table pointer update is split
> > up into two 32bit writes in the IOMMU hardware. So updating it while
> > the IOMMU is enabled could have some nasty side effects.
> > 
> > The safe way to work around this is to always allocate the device-table
> > below 4G, including the old device-table in normal kernel and the
> > device-table used for copying the content of the old device-table in kdump
> > kernel. Meanwhile we need check if the address of old device-table is
> > above 4G because it might has been touched accidentally in corrupted
> > 1st kernel.
> > 
> > Signed-off-by: Baoquan He <bhe@redhat.com>
> > ---
> >  drivers/iommu/amd_iommu_init.c | 9 +++++++--
> >  1 file changed, 7 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
> > index 6a77b99d08e4..8c6431ac5698 100644
> > --- a/drivers/iommu/amd_iommu_init.c
> > +++ b/drivers/iommu/amd_iommu_init.c
> > @@ -882,11 +882,15 @@ static int copy_device_table(void)
> >  			continue;
> >  
> >  		old_devtb_phys = entry & PAGE_MASK;
> > +		if (old_devtb_phys > 0x100000000ULL) {
> 
> Needs to be '>='.

Will change.

> 
> > +			pr_err("The address of old device table is above 4G, not trustworthy!/n");
> > +			return -1;
> > +		}
> 
> Okay, forget my previous comment about it, the check is added here
> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web