From: Nicolin Chen <nicolinc@nvidia.com>
To: Robin Murphy <robin.murphy@arm.com>
Cc: <jgg@nvidia.com>, <will@kernel.org>, <eric.auger@redhat.com>,
<kevin.tian@intel.com>, <baolu.lu@linux.intel.com>,
<joro@8bytes.org>, <shameerali.kolothum.thodi@huawei.com>,
<jean-philippe@linaro.org>,
<linux-arm-kernel@lists.infradead.org>, <iommu@lists.linux.dev>,
<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v1 14/14] iommu/arm-smmu-v3: Add arm_smmu_cache_invalidate_user
Date: Thu, 9 Mar 2023 19:51:21 -0800 [thread overview]
Message-ID: <ZAqpOQ+DDvEfq0Dg@Asurada-Nvidia> (raw)
In-Reply-To: <1467e666-1b6c-c285-3f79-f8e8b088718b@arm.com>
On Thu, Mar 09, 2023 at 02:49:14PM +0000, Robin Murphy wrote:
> External email: Use caution opening links or attachments
>
>
> On 2023-03-09 10:53, Nicolin Chen wrote:
> > Add arm_smmu_cache_invalidate_user() function for user space to invalidate
> > TLB entries and Context Descriptors, since either an IO page table entrie
> > or a Context Descriptor in the user space is still cached by the hardware.
> >
> > The input user_data is defined in "struct iommu_hwpt_invalidate_arm_smmuv3"
> > that contains the essential data for corresponding invalidation commands.
> >
> > Co-developed-by: Eric Auger <eric.auger@redhat.com>
> > Signed-off-by: Eric Auger <eric.auger@redhat.com>
> > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
> > ---
> > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 56 +++++++++++++++++++++
> > 1 file changed, 56 insertions(+)
> >
> > diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> > index ac63185ae268..7d73eab5e7f4 100644
> > --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> > +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> > @@ -2880,9 +2880,65 @@ static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid)
> > arm_smmu_sva_remove_dev_pasid(domain, dev, pasid);
> > }
> >
> > +static void arm_smmu_cache_invalidate_user(struct iommu_domain *domain,
> > + void *user_data)
> > +{
> > + struct iommu_hwpt_invalidate_arm_smmuv3 *inv_info = user_data;
> > + struct arm_smmu_cmdq_ent cmd = { .opcode = inv_info->opcode };
> > + struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
> > + struct arm_smmu_device *smmu = smmu_domain->smmu;
> > + size_t granule_size = inv_info->granule_size;
> > + unsigned long iova = 0;
> > + size_t size = 0;
> > + int ssid = 0;
> > +
> > + if (!smmu || !smmu_domain->s2 || domain->type != IOMMU_DOMAIN_NESTED)
> > + return;
> > +
> > + switch (inv_info->opcode) {
> > + case CMDQ_OP_CFGI_CD:
> > + case CMDQ_OP_CFGI_CD_ALL:
> > + return arm_smmu_sync_cd(smmu_domain, inv_info->ssid, true);
>
> Since we let the guest choose its own S1Fmt (and S1CDMax, yet not
> S1DSS?), how can we assume leaf = true here?
The s1dss is forwarded in the user_data structure too. So, the
driver should have set that too down to a nested STE. Will add
this missing pathway.
And you are right that the guest OS can use a 2-level table, so
we should set leaf = false to cover all cases, I think.
> > + case CMDQ_OP_TLBI_NH_VA:
> > + cmd.tlbi.asid = inv_info->asid;
> > + fallthrough;
> > + case CMDQ_OP_TLBI_NH_VAA:
> > + if (!granule_size || !(granule_size & smmu->pgsize_bitmap) ||
>
> Non-range invalidations with TG=0 are perfectly legal, and should not be
> ignored.
I assume that you are talking about the pgsize_bitmap check.
QEMU embeds a !tg case into the granule_size [1]. So it might
not be straightforward to cover that case. Let me see how to
untangle different cases and handle them accordingly.
[1] https://patchew.org/QEMU/20200824094811.15439-1-peter.maydell@linaro.org/20200824094811.15439-9-peter.maydell@linaro.org/
> > + granule_size & ~(1ULL << __ffs(granule_size)))
>
> If that's intended to mean is_power_of_2(), please just use is_power_of_2().
>
> > + return;
> > +
> > + iova = inv_info->range.start;
> > + size = inv_info->range.last - inv_info->range.start + 1;
>
> If the design here is that user_data is so deeply driver-specific and
> special to the point that it can't possibly be passed as a type-checked
> union of the known and publicly-visible UAPI types that it is, wouldn't
> it make sense to just encode the whole thing in the expected format and
> not have to make these kinds of niggling little conversions at both ends?
Hmm, that makes sense to me.
I just tracked back the history of Eric's previous work. There
was a mismatch between guest and host that RIL isn't supported
by the hardware. Now, guest can have whatever information it'd
need from the host to send supported instructions.
> > + if (!size)
> > + return;
> > +
> > + cmd.tlbi.vmid = smmu_domain->s2->s2_cfg.vmid;
> > + cmd.tlbi.leaf = inv_info->flags & IOMMU_SMMUV3_CMDQ_TLBI_VA_LEAF;
> > + __arm_smmu_tlb_inv_range(&cmd, iova, size, granule_size, smmu_domain);
> > + break;
> > + case CMDQ_OP_TLBI_NH_ASID:
> > + cmd.tlbi.asid = inv_info->asid;
> > + fallthrough;
> > + case CMDQ_OP_TLBI_NH_ALL:
> > + cmd.tlbi.vmid = smmu_domain->s2->s2_cfg.vmid;
> > + arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
> > + break;
> > + case CMDQ_OP_ATC_INV:
> > + ssid = inv_info->ssid;
> > + iova = inv_info->range.start;
> > + size = inv_info->range.last - inv_info->range.start + 1;
> > + break;
>
> Can we do any better than multiplying every single ATC_INV command, even
> for random bogus StreamIDs, into multiple commands across every physical
> device? In fact, I'm not entirely confident this isn't problematic, if
> the guest wishes to send invalidations for one device specifically while
> it's put some other device into a state where sending it a command would
> do something bad. At the very least, it's liable to be confusing if the
> guest sends a command for one StreamID but gets an error back for a
> different one.
We'd need here an sid translation from the guest value to the
host value to specify a device, so as not to multiply the cmd
with the device list, if I understand it correctly?
> And if we expect ATS, what about PRI? Per patch #4 you're currently
> offering that to the guest as well.
Oh, I should have probably blocked PRI. The PRI and the fault
injection will be followed after the basic 2-stage translation
patches. And I don't have a supporting hardware to test PRI.
>
> > + default:
> > + return;
>
> What about NSNH_ALL? That still needs to invalidate all the S1 context
> that the guest *thinks* it's invalidating.
NSNH_ALL is translated to NH_ALL at the guest level. But maybe
it should have been done here instead.
Thanks
Nic
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-03-10 3:52 UTC|newest]
Thread overview: 165+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-09 10:53 [PATCH v1 00/14] Add Nested Translation Support for SMMUv3 Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 01/14] iommu: Add iommu_get_unmanaged_domain helper Nicolin Chen
2023-03-09 12:51 ` Robin Murphy
2023-03-09 14:19 ` Jason Gunthorpe
2023-03-09 19:04 ` Robin Murphy
2023-03-10 0:23 ` Jason Gunthorpe
2023-03-10 8:41 ` Eric Auger
2023-03-10 15:55 ` Jason Gunthorpe
2023-03-16 1:21 ` Nicolin Chen
2023-03-16 18:42 ` Robin Murphy
2023-03-16 20:01 ` Nicolin Chen
2023-03-20 12:51 ` Jason Gunthorpe
2023-03-10 10:14 ` Eric Auger
2023-03-10 15:33 ` Jason Gunthorpe
2023-03-10 15:44 ` Shameerali Kolothum Thodi
2023-03-10 15:56 ` Jason Gunthorpe
2023-03-10 16:07 ` Shameerali Kolothum Thodi
2023-03-10 16:21 ` Jason Gunthorpe
2023-03-10 16:30 ` Shameerali Kolothum Thodi
2023-03-10 17:03 ` Jason Gunthorpe
2023-03-22 16:07 ` Eric Auger
2023-03-22 17:02 ` Jason Gunthorpe
2023-03-22 17:41 ` Eric Auger
2023-03-22 18:07 ` Jason Gunthorpe
2023-03-16 19:51 ` Nicolin Chen
2023-03-16 19:56 ` Shameerali Kolothum Thodi
2023-03-22 15:44 ` Eric Auger
2023-03-09 10:53 ` [PATCH v1 02/14] iommufd: Add nesting related data structures for ARM SMMUv3 Nicolin Chen
2023-03-09 13:42 ` Jean-Philippe Brucker
2023-03-09 14:48 ` Jason Gunthorpe
2023-03-09 18:26 ` Jean-Philippe Brucker
2023-03-09 21:01 ` Jason Gunthorpe
2023-03-10 12:16 ` Jean-Philippe Brucker
2023-03-10 14:52 ` Robin Murphy
2023-03-10 15:25 ` Jason Gunthorpe
2023-03-10 15:57 ` Robin Murphy
2023-03-10 16:03 ` Jason Gunthorpe
2023-03-17 10:10 ` Tian, Kevin
2023-03-17 10:04 ` Tian, Kevin
2023-03-10 4:50 ` Nicolin Chen
2023-03-10 12:54 ` Jean-Philippe Brucker
2023-03-10 14:00 ` Jason Gunthorpe
2023-03-10 16:06 ` Jason Gunthorpe
2023-03-16 0:59 ` Nicolin Chen
2023-03-09 15:26 ` Shameerali Kolothum Thodi
2023-03-09 15:40 ` Jason Gunthorpe
2023-03-09 15:51 ` Shameerali Kolothum Thodi
2023-03-09 15:59 ` Jason Gunthorpe
2023-03-09 16:07 ` Shameerali Kolothum Thodi
2023-03-10 5:26 ` Nicolin Chen
2023-03-10 5:36 ` Nicolin Chen
2023-03-10 12:55 ` Jason Gunthorpe
2023-03-10 5:18 ` Nicolin Chen
2023-03-10 5:04 ` Nicolin Chen
2023-03-10 11:33 ` Eric Auger
2023-03-10 12:51 ` Jason Gunthorpe
2023-03-17 10:17 ` Tian, Kevin
2023-03-09 10:53 ` [PATCH v1 03/14] iommufd/device: Setup MSI on kernel-managed domains Nicolin Chen
2023-03-10 16:45 ` Eric Auger
2023-03-11 0:17 ` Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 04/14] iommu/arm-smmu-v3: Add arm_smmu_hw_info Nicolin Chen
2023-03-09 13:03 ` Robin Murphy
2023-03-10 1:17 ` Nicolin Chen
2023-03-10 15:28 ` Robin Murphy
2023-03-16 0:13 ` Nicolin Chen
2023-03-16 15:19 ` Robin Murphy
2023-03-16 20:06 ` Nicolin Chen
2023-04-12 7:47 ` Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 05/14] iommu/arm-smmu-v3: Remove ARM_SMMU_DOMAIN_NESTED Nicolin Chen
2023-03-10 16:39 ` Eric Auger
2023-03-10 17:05 ` Jason Gunthorpe
2023-03-11 0:24 ` Nicolin Chen
2023-03-11 0:23 ` Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 06/14] iommu/arm-smmu-v3: Unset corresponding STE fields when s2_cfg is NULL Nicolin Chen
2023-03-09 13:13 ` Robin Murphy
2023-03-09 18:24 ` Shameerali Kolothum Thodi
2023-03-10 1:54 ` Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 07/14] iommu/arm-smmu-v3: Add STRTAB_STE_0_CFG_NESTED for 2-stage translation Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 08/14] iommu/arm-smmu-v3: Prepare for nested domain support Nicolin Chen
2023-03-10 20:39 ` Robin Murphy
2023-03-11 12:40 ` Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 09/14] iommu/arm-smmu-v3: Implement arm_smmu_get_unmanaged_domain Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 10/14] iommu/arm-smmu-v3: Pass in user_cfg to arm_smmu_domain_finalise Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 11/14] iommu/arm-smmu-v3: Add arm_smmu_domain_alloc_user Nicolin Chen
2023-03-24 15:28 ` Eric Auger
2023-03-24 17:40 ` Nicolin Chen
2023-03-24 17:50 ` Jason Gunthorpe
2023-03-24 18:00 ` Nicolin Chen
2023-03-24 15:33 ` Eric Auger
2023-03-24 17:43 ` Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 12/14] iommu/arm-smmu-v3: Support IOMMU_DOMAIN_NESTED type of allocations Nicolin Chen
2023-03-09 13:20 ` Robin Murphy
2023-03-09 14:28 ` Robin Murphy
2023-03-10 1:34 ` Nicolin Chen
2023-03-24 15:44 ` Eric Auger
2023-03-24 16:30 ` Jason Gunthorpe
2023-03-24 17:50 ` Nicolin Chen
2023-03-24 17:51 ` Jason Gunthorpe
2023-03-24 17:55 ` Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 13/14] iommu/arm-smmu-v3: Add CMDQ_OP_TLBI_NH_VAA and CMDQ_OP_TLBI_NH_ALL Nicolin Chen
2023-03-09 13:44 ` Robin Murphy
2023-03-10 1:19 ` Nicolin Chen
2023-03-09 10:53 ` [PATCH v1 14/14] iommu/arm-smmu-v3: Add arm_smmu_cache_invalidate_user Nicolin Chen
2023-03-09 14:49 ` Robin Murphy
2023-03-09 15:31 ` Jason Gunthorpe
2023-03-10 4:20 ` Nicolin Chen
2023-03-10 16:19 ` Jason Gunthorpe
2023-03-11 11:56 ` Nicolin Chen
2023-03-11 12:53 ` Nicolin Chen
2023-03-20 13:03 ` Jason Gunthorpe
2023-03-20 15:56 ` Nicolin Chen
2023-03-20 16:04 ` Jason Gunthorpe
2023-03-20 16:59 ` Nicolin Chen
2023-03-20 18:45 ` Jason Gunthorpe
2023-03-20 21:22 ` Nicolin Chen
2023-03-20 22:19 ` Jason Gunthorpe
2023-03-22 20:57 ` Nicolin Chen
2023-03-23 12:17 ` Jason Gunthorpe
2023-03-17 9:41 ` Tian, Kevin
2023-03-17 14:24 ` Nicolin Chen
2023-03-20 12:59 ` Jason Gunthorpe
2023-03-20 16:12 ` Nicolin Chen
2023-03-20 18:00 ` Jason Gunthorpe
2023-03-21 8:34 ` Tian, Kevin
2023-03-21 11:48 ` Jason Gunthorpe
2023-03-22 6:42 ` Nicolin Chen
2023-03-22 12:43 ` Jason Gunthorpe
2023-03-22 17:11 ` Nicolin Chen
2023-03-22 17:28 ` Jason Gunthorpe
2023-03-22 19:21 ` Nicolin Chen
2023-03-22 19:41 ` Jason Gunthorpe
2023-03-22 20:43 ` Nicolin Chen
2023-03-23 12:16 ` Jason Gunthorpe
2023-03-23 18:13 ` Nicolin Chen
2023-03-23 18:27 ` Jason Gunthorpe
2023-03-24 9:02 ` Tian, Kevin
2023-03-24 14:57 ` Jason Gunthorpe
2023-03-24 17:35 ` Nicolin Chen
2023-03-28 3:03 ` Tian, Kevin
2023-03-24 8:47 ` Tian, Kevin
2023-03-24 14:44 ` Jason Gunthorpe
2023-03-28 2:48 ` Tian, Kevin
2023-03-28 12:26 ` Jason Gunthorpe
2023-03-31 8:09 ` Tian, Kevin
2023-03-17 9:24 ` Tian, Kevin
2023-03-10 3:51 ` Nicolin Chen [this message]
2023-03-10 17:53 ` Robin Murphy
2023-03-10 18:49 ` Jason Gunthorpe
2023-03-11 12:38 ` Nicolin Chen
2023-03-13 13:07 ` Robin Murphy
2023-03-16 0:01 ` Nicolin Chen
2023-03-16 14:58 ` Robin Murphy
2023-03-16 21:09 ` Nicolin Chen
2023-03-20 1:32 ` Nicolin Chen
2023-03-20 13:11 ` Jason Gunthorpe
2023-03-20 15:28 ` Nicolin Chen
2023-03-20 16:01 ` Jason Gunthorpe
2023-03-20 16:35 ` Nicolin Chen
2023-03-20 18:07 ` Jason Gunthorpe
2023-03-20 20:46 ` Nicolin Chen
2023-03-20 22:14 ` Jason Gunthorpe
2023-03-22 5:14 ` Nicolin Chen
2023-03-24 8:55 ` Tian, Kevin
2023-03-17 9:47 ` Tian, Kevin
2023-03-17 14:16 ` Nicolin Chen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZAqpOQ+DDvEfq0Dg@Asurada-Nvidia \
--to=nicolinc@nvidia.com \
--cc=baolu.lu@linux.intel.com \
--cc=eric.auger@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=jean-philippe@linaro.org \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robin.murphy@arm.com \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox