[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <BN9PR11MB5276F533DC882B182F1A4C268C972@BN9PR11MB5276.namprd11.prod.outlook.com>
Date: Fri, 30 Aug 2024 00:29:51 +0000
From: "Tian, Kevin" <kevin.tian@...el.com>
To: Markus Rathgeb <maggu2810@...il.com>
CC: Linux regressions mailing list <regressions@...ts.linux.dev>, Lu Baolu
<baolu.lu@...ux.intel.com>, Will Deacon <will@...nel.org>, David Woodhouse
<dwmw2@...radead.org>, Joerg Roedel <joro@...tes.org>,
"iommu@...ts.linux.dev" <iommu@...ts.linux.dev>, LKML
<linux-kernel@...r.kernel.org>, Jacob Pan <jacob.jun.pan@...ux.intel.com>,
Adam Williamson <awilliam@...hat.com>
Subject: RE: [regression] usb and thunderbould are misbehaving or broken due
to iommu/vt-d change
> From: Markus Rathgeb <maggu2810@...il.com>
> Sent: Thursday, August 29, 2024 4:34 PM
>
> With respect to my previous comment I tested to fix it myself (I am
> not a kernel hacker and do not know anything about iommu etc.).
>
> After applying the following change to the v6.11-rc5 it seems to fix my
> problem.
> I can connect, disconnect and connect the dock and USB is working and
> no DMAR error.
>
as said there was already a fix posted which is similar to below:
https://lore.kernel.org/linux-iommu/20240815124857.70038-1-baolu.lu@linux.intel.com/
>
>
>
> From 5f621c079f0f8bce9895ae05a9cd81b001a58089 Mon Sep 17 00:00:00
> 2001
> From: Markus Rathgeb <maggu2810@...il.com>
> Date: Thu, 29 Aug 2024 09:37:17 +0200
> Subject: [PATCH] fix: iommu/vt-d: Add helper to flush caches for context
> change
>
> Signed-off-by: Markus Rathgeb <maggu2810@...il.com>
> ---
> drivers/iommu/intel/iommu.c | 7 +++++--
> drivers/iommu/intel/iommu.h | 3 ++-
> drivers/iommu/intel/pasid.c | 4 ++--
> 3 files changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
> index 9ff8b83c19a3..e92e06e604b2 100644
> --- a/drivers/iommu/intel/iommu.c
> +++ b/drivers/iommu/intel/iommu.c
> @@ -1944,6 +1944,7 @@ static void domain_context_clear_one(struct
> device_domain_info *info, u8 bus, u8
> {
> struct intel_iommu *iommu = info->iommu;
> struct context_entry *context;
> + u16 did_old;
>
> spin_lock(&iommu->lock);
> context = iommu_context_addr(iommu, bus, devfn, 0);
> @@ -1952,10 +1953,12 @@ static void domain_context_clear_one(struct
> device_domain_info *info, u8 bus, u8
> return;
> }
>
> + did_old = context_domain_id(context);
> +
> context_clear_entry(context);
> __iommu_flush_cache(iommu, context, sizeof(*context));
> spin_unlock(&iommu->lock);
> - intel_context_flush_present(info, context, true);
> + intel_context_flush_present(info, context, did_old, true);
> }
>
> static int domain_setup_first_level(struct intel_iommu *iommu,
> @@ -4269,7 +4272,7 @@ static int context_flip_pri(struct
> device_domain_info *info, bool enable)
>
> if (!ecap_coherent(iommu->ecap))
> clflush_cache_range(context, sizeof(*context));
> - intel_context_flush_present(info, context, true);
> + intel_context_flush_present(info, context,
> context_domain_id(context), true);
> spin_unlock(&iommu->lock);
>
> return 0;
> diff --git a/drivers/iommu/intel/iommu.h b/drivers/iommu/intel/iommu.h
> index b67c14da1240..0a4ce98faa60 100644
> --- a/drivers/iommu/intel/iommu.h
> +++ b/drivers/iommu/intel/iommu.h
> @@ -988,7 +988,7 @@ static inline int context_domain_id(struct
> context_entry *c)
> return((c->hi >> 8) & 0xffff);
> }
>
> -static inline void context_clear_entry(struct context_entry *context)
> +static inline void context_clear_entry(struct context_entry *context)
> {
> context->lo = 0;
> context->hi = 0;
> @@ -1154,6 +1154,7 @@ void cache_tag_flush_range_np(struct
> dmar_domain
> *domain, unsigned long start,
>
> void intel_context_flush_present(struct device_domain_info *info,
> struct context_entry *context,
> + u16 did,
> bool affect_domains);
>
> #ifdef CONFIG_INTEL_IOMMU_SVM
> diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c
> index 5792c817cefa..cb4bbb45ac2a 100644
> --- a/drivers/iommu/intel/pasid.c
> +++ b/drivers/iommu/intel/pasid.c
> @@ -694,7 +694,7 @@ static void device_pasid_table_teardown(struct
> device *dev, u8 bus, u8 devfn)
> context_clear_entry(context);
> __iommu_flush_cache(iommu, context, sizeof(*context));
> spin_unlock(&iommu->lock);
> - intel_context_flush_present(info, context, false);
> + intel_context_flush_present(info, context,
> context_domain_id(context), false);
> }
>
> static int pci_pasid_table_teardown(struct pci_dev *pdev, u16 alias,
> void *data)
> @@ -885,10 +885,10 @@ static void __context_flush_dev_iotlb(struct
> device_domain_info *info)
> */
> void intel_context_flush_present(struct device_domain_info *info,
> struct context_entry *context,
> + u16 did,
> bool flush_domains)
> {
> struct intel_iommu *iommu = info->iommu;
> - u16 did = context_domain_id(context);
> struct pasid_entry *pte;
> int i;
>
> --
> 2.46.0
Powered by blists - more mailing lists