WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] RE: [Xen-changelog] [xen-unstable] vt-d: Fixpanic in msi_msg

To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>, Keir Fraser <keir.fraser@xxxxxxxxxxxxx>, Miroslav Rezanina <mrezanin@xxxxxxxxxx>
Subject: [Xen-devel] RE: [Xen-changelog] [xen-unstable] vt-d: Fixpanic in msi_msg_read_remap_rte with acpi=off
From: "Cui, Dexuan" <dexuan.cui@xxxxxxxxx>
Date: Fri, 16 Oct 2009 18:03:47 +0800
Accept-language: zh-CN, en-US
Acceptlanguage: zh-CN, en-US
Cc:
Delivery-date: Fri, 16 Oct 2009 03:03:31 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <200910160810.n9G8AEMj006946@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <200910160810.n9G8AEMj006946@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: AcpOOC2WMZHP9rJXSpWM9ZQfxjJ27QACxX5A
Thread-topic: [Xen-changelog] [xen-unstable] vt-d: Fixpanic in msi_msg_read_remap_rte with acpi=off
> Xen panics when "acpi=off noacpi" is set. 
(looks xen has not such a parameter "noacpi".)
I guess you meant: when "iommu=1 acpi=off", Xen panics.

But when I use c/s 20330 and use "iommu=1 acpi=off", I still get the the panic:

(XEN) Xen call trace:
(XEN)    [<ffff82c4801401b5>] ats_device+0x53/0x10e
(XEN)    [<ffff82c48013c8e5>] intel_iommu_domain_init+0xa8/0x200
(XEN)    [<ffff82c4801379dd>] iommu_domain_init+0x74/0x76
(XEN)    [<ffff82c48014c437>] arch_domain_create+0x544/0x94a
(XEN)    [<ffff82c48010676a>] domain_create+0x26c/0x3fd
(XEN)    [<ffff82c48024cdb5>] __start_xen+0x5264/0x557f

Actually when iommu=1 and acpi=off, in __start_xen() -> acpi_boot_init(), 
acpi_dmar_init() can't be invoked at all and hence parse_dmar_table() can't be 
invoked, as a result, we should not try to use VT-d at all, however, the global 
variable iommu_enabled is left set to 1.

So I don't think this changeset is the right fix. I think the correct one 
should be: in disable_acpi(), we force iommu_enabled to 0.


Thanks,
-- Dexuan



-----Original Message-----
From: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx 
[mailto:xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Xen 
patchbot-unstable
Sent: 2009?10?16? 16:10
To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] vt-d: Fixpanic in 
msi_msg_read_remap_rte with acpi=off

# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1255678127 -3600
# Node ID 2370e16ab6d3a1c9de43babec48c8f14121d19bc
# Parent  648c674fcc96b09fc8fb9428843fec08c8d2fc4e
vt-d: Fixpanic in msi_msg_read_remap_rte with acpi=off

Xen panics when "acpi=off noacpi" is set. Problem is caused by
dereferencing NULL pointer in drhd after calling
acpi_find_matched_drhd_unit. As acpi_find_matched_drhd_unit can
return NULL, checks has to be done before returned value is used.

From: Miroslav Rezanina <mrezanin@xxxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxxxxx>
---
 xen/drivers/passthrough/vtd/intremap.c |    6 ++++--
 xen/drivers/passthrough/vtd/iommu.c    |    5 +++--
 2 files changed, 7 insertions(+), 4 deletions(-)

diff -r 648c674fcc96 -r 2370e16ab6d3 xen/drivers/passthrough/vtd/intremap.c
--- a/xen/drivers/passthrough/vtd/intremap.c    Fri Oct 16 08:25:17 2009 +0100
+++ b/xen/drivers/passthrough/vtd/intremap.c    Fri Oct 16 08:28:47 2009 +0100
@@ -563,7 +563,8 @@ void msi_msg_read_remap_rte(
     struct iommu *iommu = NULL;
     struct ir_ctrl *ir_ctrl;
 
-    drhd = acpi_find_matched_drhd_unit(pdev);
+    if ( (drhd = acpi_find_matched_drhd_unit(pdev)) == NULL )
+        return;
     iommu = drhd->iommu;
 
     ir_ctrl = iommu_ir_ctrl(iommu);
@@ -581,7 +582,8 @@ void msi_msg_write_remap_rte(
     struct iommu *iommu = NULL;
     struct ir_ctrl *ir_ctrl;
 
-    drhd = acpi_find_matched_drhd_unit(pdev);
+    if ( (drhd = acpi_find_matched_drhd_unit(pdev)) == NULL )
+        return;
     iommu = drhd->iommu;
 
     ir_ctrl = iommu_ir_ctrl(iommu);
diff -r 648c674fcc96 -r 2370e16ab6d3 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c       Fri Oct 16 08:25:17 2009 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c       Fri Oct 16 08:28:47 2009 +0100
@@ -1343,7 +1343,8 @@ static int reassign_device_ownership(
     if (!pdev)
         return -ENODEV;
 
-    drhd = acpi_find_matched_drhd_unit(pdev);
+    if ( (drhd = acpi_find_matched_drhd_unit(pdev)) == NULL )
+        return -ENODEV;
     pdev_iommu = drhd->iommu;
     domain_context_unmap(source, bus, devfn);
 
@@ -1357,7 +1358,7 @@ static int reassign_device_ownership(
     for_each_pdev ( source, pdev )
     {
         drhd = acpi_find_matched_drhd_unit(pdev);
-        if ( drhd->iommu == pdev_iommu )
+        if ( drhd && drhd->iommu == pdev_iommu )
         {
             found = 1;
             break;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel