[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200511201656.GA2725@taurus.defre.kleine-koenig.org>
Date: Mon, 11 May 2020 22:16:56 +0200
From: Uwe Kleine-König <uwe@...ine-koenig.org>
To: Lu Baolu <baolu.lu@...ux.intel.com>, Joerg Roedel <jroedel@...e.de>
Cc: linux-kernel@...r.kernel.org, rafael.j.wysocki@...el.com,
tglx@...utronix.de, x86@...nel.org
Subject: Re: Failure to shutdown/reboot with intel_iommu=on
Hello again,
On Mon, May 11, 2020 at 09:59:31PM +0200, Uwe Kleine-König wrote:
> On 5/9/20 3:58 AM, Lu Baolu wrote:
> > Hi Uwe,
> >
> > Have you tried commenting out intel_disable_iommus() in
> > intel_iommu_shutdowan()?
> >
> > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> > index 0182cff2c7ac..532e62600f95 100644
> > --- a/drivers/iommu/intel-iommu.c
> > +++ b/drivers/iommu/intel-iommu.c
> > @@ -4928,8 +4928,10 @@ void intel_iommu_shutdown(void)
> > for_each_iommu(iommu, drhd)
> > iommu_disable_protect_mem_regions(iommu);
> >
> > +#if 0
> > /* Make sure the IOMMUs are switched off */
> > intel_disable_iommus();
> > +#endif
> >
> > up_write(&dmar_global_lock);
> > }
>
> I just tested that and it didn't help. The machine still hangs with the
> same symptoms as reported before.
I patched the file a bit differently:
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index ef0a5246700e..b76acae6a6ac 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -4922,16 +4922,24 @@ void intel_iommu_shutdown(void)
if (no_iommu || dmar_disabled)
return;
+ pr_warn("%s:%d\n", __func__, __LINE__);
down_write(&dmar_global_lock);
+ pr_warn("%s:%d\n", __func__, __LINE__);
/* Disable PMRs explicitly here. */
- for_each_iommu(iommu, drhd)
+ for_each_iommu(iommu, drhd) {
+ pr_warn("%s:%d\n", __func__, __LINE__);
iommu_disable_protect_mem_regions(iommu);
+ pr_warn("%s:%d\n", __func__, __LINE__);
+ }
+ pr_warn("%s:%d\n", __func__, __LINE__);
/* Make sure the IOMMUs are switched off */
intel_disable_iommus();
+ pr_warn("%s:%d\n", __func__, __LINE__);
up_write(&dmar_global_lock);
+ pr_warn("%s:%d\n", __func__, __LINE__);
}
static inline struct intel_iommu *dev_to_intel_iommu(struct device *dev)
and the output shows that the for_each_iommu loop runs twice and the
last pr_warn is reached, too. So the hang doesn't occur in
intel_iommu_shutdown() but later.
I don't know enough about x86 and iommus to judge what that means or
even if this was a useful test.
Best regards
Uwe
Download attachment "signature.asc" of type "application/pgp-signature" (489 bytes)
Powered by blists - more mailing lists