From: Mostafa Saleh <smostafa@google.com>
To: Eric Auger <eric.auger@redhat.com>
Cc: qemu-arm@nongnu.org, peter.maydell@linaro.org,
qemu-devel@nongnu.org, jean-philippe@linaro.org,
alex.bennee@linaro.org, maz@kernel.org, nicolinc@nvidia.com,
julien@xen.org, richard.henderson@linaro.org,
marcin.juszkiewicz@linaro.org
Subject: Re: [RFC PATCH v3 12/18] hw/arm/smmu: Support nesting in the rest of commands
Date: Mon, 17 Jun 2024 14:58:42 +0000 [thread overview]
Message-ID: <ZnBPIibjKcjktnb1@google.com> (raw)
In-Reply-To: <27ca2ea6-94b6-4839-b127-6ac6bc1c7808@redhat.com>
Hi Eric,
On Mon, May 20, 2024 at 12:24:22PM +0200, Eric Auger wrote:
> Hi Mostafa,
>
> On 4/29/24 05:23, Mostafa Saleh wrote:
> > Some commands need rework for nesting, as they used to assume S1
> > and S2 are mutually exclusive:
> >
> > - CMD_TLBI_NH_ASID: Consider VMID if stage-2 is supported
> > - CMD_TLBI_NH_ALL: Consider VMID if stage-2 is supported, otherwise
> > invalidate everything, this required a new vmid invalidation
> > function for stage-1 only (ASID >= 0)
> >
> > Also, rework trace events to reflect the new implementation.
> >
> > Signed-off-by: Mostafa Saleh <smostafa@google.com>
> > ---
> > hw/arm/smmu-common.c | 36 +++++++++++++++++++++++++++++-------
> > hw/arm/smmuv3.c | 31 +++++++++++++++++++++++++++++--
> > hw/arm/trace-events | 6 ++++--
> > include/hw/arm/smmu-common.h | 3 ++-
> > 4 files changed, 64 insertions(+), 12 deletions(-)
> >
> > diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
> > index fa2460cf64..3ed0be05ef 100644
> > --- a/hw/arm/smmu-common.c
> > +++ b/hw/arm/smmu-common.c
> > @@ -147,13 +147,14 @@ void smmu_iotlb_inv_all(SMMUState *s)
> > g_hash_table_remove_all(s->iotlb);
> > }
> >
> > -static gboolean smmu_hash_remove_by_asid(gpointer key, gpointer value,
> > - gpointer user_data)
> > +static gboolean smmu_hash_remove_by_asid_vmid(gpointer key, gpointer value,
> > + gpointer user_data)
> Can't you introduce
>
> smmu_hash_remove_by_asid_vmid() separately and replace the smmu_iotlb_inv_asid() call in SMMU_CMD_TLBI_NH_ASID.
> Then you could focus on "if stage2 is supported" enhancements in this patch.
>
Sure, will do.
Thanks,
Mostafa
> > {
> > - int asid = *(int *)user_data;
> > + SMMUIOTLBPageInvInfo *info = (SMMUIOTLBPageInvInfo *)user_data;
> > SMMUIOTLBKey *iotlb_key = (SMMUIOTLBKey *)key;
> >
> > - return SMMU_IOTLB_ASID(*iotlb_key) == asid;
> > + return (SMMU_IOTLB_ASID(*iotlb_key) == info->asid) &&
> > + (SMMU_IOTLB_VMID(*iotlb_key) == info->vmid);
> > }
> >
> > static gboolean smmu_hash_remove_by_vmid(gpointer key, gpointer value,
> > @@ -165,6 +166,16 @@ static gboolean smmu_hash_remove_by_vmid(gpointer key, gpointer value,
> > return SMMU_IOTLB_VMID(*iotlb_key) == vmid;
> > }
> >
> > +static gboolean smmu_hash_remove_by_vmid_s1(gpointer key, gpointer value,
> > + gpointer user_data)
> > +{
> > + int vmid = *(int *)user_data;
> > + SMMUIOTLBKey *iotlb_key = (SMMUIOTLBKey *)key;
> > +
> > + return (SMMU_IOTLB_VMID(*iotlb_key) == vmid) &&
> > + (SMMU_IOTLB_ASID(*iotlb_key) >= 0);
> > +}
> > +
> > static gboolean smmu_hash_remove_by_asid_vmid_iova(gpointer key, gpointer value,
> > gpointer user_data)
> > {
> > @@ -258,10 +269,15 @@ void smmu_iotlb_inv_ipa(SMMUState *s, int vmid, dma_addr_t ipa, uint8_t tg,
> > &info);
> > }
> >
> > -void smmu_iotlb_inv_asid(SMMUState *s, int asid)
> > +void smmu_iotlb_inv_asid_vmid(SMMUState *s, int asid, int vmid)
> > {
> > - trace_smmu_iotlb_inv_asid(asid);
> > - g_hash_table_foreach_remove(s->iotlb, smmu_hash_remove_by_asid, &asid);
> > + SMMUIOTLBPageInvInfo info = {
> > + .asid = asid,
> > + .vmid = vmid,
> > + };
> > +
> > + trace_smmu_iotlb_inv_asid_vmid(asid, vmid);
> > + g_hash_table_foreach_remove(s->iotlb, smmu_hash_remove_by_asid_vmid, &info);
> > }
> >
> > void smmu_iotlb_inv_vmid(SMMUState *s, int vmid)
> > @@ -270,6 +286,12 @@ void smmu_iotlb_inv_vmid(SMMUState *s, int vmid)
> > g_hash_table_foreach_remove(s->iotlb, smmu_hash_remove_by_vmid, &vmid);
> > }
> >
> > +inline void smmu_iotlb_inv_vmid_s1(SMMUState *s, int vmid)
> > +{
> > + trace_smmu_iotlb_inv_vmid_s1(vmid);
> > + g_hash_table_foreach_remove(s->iotlb, smmu_hash_remove_by_vmid_s1, &vmid);
> > +}
> > +
> > /* VMSAv8-64 Translation */
> >
> > /**
> > diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
> > index 82d918d9b5..e0fd494646 100644
> > --- a/hw/arm/smmuv3.c
> > +++ b/hw/arm/smmuv3.c
> > @@ -1303,25 +1303,52 @@ static int smmuv3_cmdq_consume(SMMUv3State *s)
> > case SMMU_CMD_TLBI_NH_ASID:
> > {
> > int asid = CMD_ASID(&cmd);
> > + int vmid = -1;
> >
> > if (!STAGE1_SUPPORTED(s)) {
> > cmd_error = SMMU_CERROR_ILL;
> > break;
> > }
> >
> > + /*
> > + * VMID is only matched when stage 2 is supported for the Security
> > + * state corresponding to the command queue that the command was
> > + * issued in.
> > + * QEMU ignores the field by setting to -1, similarly to what STE
> > + * decoding does. And invalidation commands ignore VMID < 0.
> > + */
> > + if (STAGE2_SUPPORTED(s)) {
> > + vmid = CMD_VMID(&cmd);
> > + }
> > +
> > trace_smmuv3_cmdq_tlbi_nh_asid(asid);
> > smmu_inv_notifiers_all(&s->smmu_state);
> > - smmu_iotlb_inv_asid(bs, asid);
> > + smmu_iotlb_inv_asid_vmid(bs, asid, vmid);
> > break;
> > }
> > case SMMU_CMD_TLBI_NH_ALL:
> > + {
> > + int vmid = -1;
> > +
> > if (!STAGE1_SUPPORTED(s)) {
> > cmd_error = SMMU_CERROR_ILL;
> > break;
> > }
> > +
> > + /*
> > + * If stage-2 is supported, invalidate for this VMID only, otherwise
> > + * invalidate the whole thing, see SMMU_CMD_TLBI_NH_ASID()
> > + */
> > + if (STAGE2_SUPPORTED(s)) {
> > + vmid = CMD_VMID(&cmd);
> > + trace_smmuv3_cmdq_tlbi_nh(vmid);
> > + smmu_iotlb_inv_vmid_s1(bs, vmid);
> > + break;
> > + }
> > QEMU_FALLTHROUGH;
> > + }
> > case SMMU_CMD_TLBI_NSNH_ALL:
> > - trace_smmuv3_cmdq_tlbi_nh();
> > + trace_smmuv3_cmdq_tlbi_nsnh();
> > smmu_inv_notifiers_all(&s->smmu_state);
> > smmu_iotlb_inv_all(bs);
> > break;
> > diff --git a/hw/arm/trace-events b/hw/arm/trace-events
> > index 7d9c1703da..593cc571da 100644
> > --- a/hw/arm/trace-events
> > +++ b/hw/arm/trace-events
> > @@ -11,8 +11,9 @@ smmu_ptw_page_pte(int stage, int level, uint64_t iova, uint64_t baseaddr, uint6
> > smmu_ptw_block_pte(int stage, int level, uint64_t baseaddr, uint64_t pteaddr, uint64_t pte, uint64_t iova, uint64_t gpa, int bsize_mb) "stage=%d level=%d base@=0x%"PRIx64" pte@=0x%"PRIx64" pte=0x%"PRIx64" iova=0x%"PRIx64" block address = 0x%"PRIx64" block size = %d MiB"
> > smmu_get_pte(uint64_t baseaddr, int index, uint64_t pteaddr, uint64_t pte) "baseaddr=0x%"PRIx64" index=0x%x, pteaddr=0x%"PRIx64", pte=0x%"PRIx64
> > smmu_iotlb_inv_all(void) "IOTLB invalidate all"
> > -smmu_iotlb_inv_asid(int asid) "IOTLB invalidate asid=%d"
> > +smmu_iotlb_inv_asid_vmid(int asid, int vmid) "IOTLB invalidate asid=%d vmid=%d"
> > smmu_iotlb_inv_vmid(int vmid) "IOTLB invalidate vmid=%d"
> > +smmu_iotlb_inv_vmid_s1(int vmid) "IOTLB invalidate vmid=%d"
> > smmu_iotlb_inv_iova(int asid, uint64_t addr) "IOTLB invalidate asid=%d addr=0x%"PRIx64
> > smmu_inv_notifiers_mr(const char *name) "iommu mr=%s"
> > smmu_iotlb_lookup_hit(int asid, int vmid, uint64_t addr, uint32_t hit, uint32_t miss, uint32_t p) "IOTLB cache HIT asid=%d vmid=%d addr=0x%"PRIx64" hit=%d miss=%d hit rate=%d"
> > @@ -47,7 +48,8 @@ smmuv3_cmdq_cfgi_cd(uint32_t sid) "sid=0x%x"
> > smmuv3_config_cache_hit(uint32_t sid, uint32_t hits, uint32_t misses, uint32_t perc) "Config cache HIT for sid=0x%x (hits=%d, misses=%d, hit rate=%d)"
> > smmuv3_config_cache_miss(uint32_t sid, uint32_t hits, uint32_t misses, uint32_t perc) "Config cache MISS for sid=0x%x (hits=%d, misses=%d, hit rate=%d)"
> > smmuv3_range_inval(int vmid, int asid, uint64_t addr, uint8_t tg, uint64_t num_pages, uint8_t ttl, bool leaf, int stage) "vmid=%d asid=%d addr=0x%"PRIx64" tg=%d num_pages=0x%"PRIx64" ttl=%d leaf=%d stage=%d"
> > -smmuv3_cmdq_tlbi_nh(void) ""
> > +smmuv3_cmdq_tlbi_nh(int vmid) "vmid=%d"
> > +smmuv3_cmdq_tlbi_nsnh(void) ""
> > smmuv3_cmdq_tlbi_nh_asid(int asid) "asid=%d"
> > smmuv3_cmdq_tlbi_s12_vmid(int vmid) "vmid=%d"
> > smmuv3_config_cache_inv(uint32_t sid) "Config cache INV for sid=0x%x"
> > diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
> > index de032fdfd1..361e639630 100644
> > --- a/include/hw/arm/smmu-common.h
> > +++ b/include/hw/arm/smmu-common.h
> > @@ -212,8 +212,9 @@ void smmu_iotlb_insert(SMMUState *bs, SMMUTransCfg *cfg, SMMUTLBEntry *entry);
> > SMMUIOTLBKey smmu_get_iotlb_key(int asid, int vmid, uint64_t iova,
> > uint8_t tg, uint8_t level);
> > void smmu_iotlb_inv_all(SMMUState *s);
> > -void smmu_iotlb_inv_asid(SMMUState *s, int asid);
> > +void smmu_iotlb_inv_asid_vmid(SMMUState *s, int asid, int vmid);
> > void smmu_iotlb_inv_vmid(SMMUState *s, int vmid);
> > +void smmu_iotlb_inv_vmid_s1(SMMUState *s, int vmid);
> > void smmu_iotlb_inv_iova(SMMUState *s, int asid, int vmid, dma_addr_t iova,
> > uint8_t tg, uint64_t num_pages, uint8_t ttl);
> > void smmu_iotlb_inv_ipa(SMMUState *s, int vmid, dma_addr_t ipa, uint8_t tg,
> Otherwise looks good to me
>
> Eric
>
next prev parent reply other threads:[~2024-06-17 14:58 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-29 3:23 [RFC PATCH v3 00/18] SMMUv3 nested translation support Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 01/18] hw/arm/smmu-common: Add missing size check for stage-1 Mostafa Saleh
2024-05-13 11:30 ` Eric Auger
2024-04-29 3:23 ` [RFC PATCH v3 02/18] hw/arm/smmu: Fix IPA for stage-2 events Mostafa Saleh
2024-05-13 11:47 ` Eric Auger
2024-05-16 14:43 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 03/18] hw/arm/smmuv3: Fix encoding of CLASS in events Mostafa Saleh
2024-05-15 12:27 ` Eric Auger
2024-05-16 14:50 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 04/18] hw/arm/smmu: Use enum for SMMU stage Mostafa Saleh
2024-05-15 20:25 ` Alex Bennée
2024-04-29 3:23 ` [RFC PATCH v3 05/18] hw/arm/smmu: Split smmuv3_translate() Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 06/18] hw/arm/smmu: Consolidate ASID and VMID types Mostafa Saleh
2024-05-15 12:41 ` Eric Auger
2024-06-17 14:55 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 07/18] hw/arm/smmuv3: Translate CD and TT using stage-2 table Mostafa Saleh
2024-05-15 13:15 ` Eric Auger
2024-05-16 16:11 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 08/18] hw/arm/smmu-common: Add support for nested TLB Mostafa Saleh
2024-05-15 13:48 ` Eric Auger
2024-05-16 15:20 ` Mostafa Saleh
2024-05-20 8:20 ` Eric Auger
2024-05-22 12:44 ` Mostafa Saleh
2024-06-17 14:56 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 09/18] hw/arm/smmu-common: Rework TLB lookup for nesting Mostafa Saleh
2024-05-15 13:54 ` Eric Auger
2024-05-16 15:30 ` Mostafa Saleh
2024-05-20 8:27 ` Eric Auger
2024-05-22 12:47 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 10/18] hw/arm/smmu-common: Support nested translation Mostafa Saleh
2024-05-20 9:48 ` Eric Auger
2024-06-17 14:57 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 11/18] hw/arm/smmu: Support nesting in smmuv3_range_inval() Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 12/18] hw/arm/smmu: Support nesting in the rest of commands Mostafa Saleh
2024-05-20 10:24 ` Eric Auger
2024-06-17 14:58 ` Mostafa Saleh [this message]
2024-04-29 3:23 ` [RFC PATCH v3 13/18] hw/arm/smmuv3: Support nested SMMUs in smmuv3_notify_iova() Mostafa Saleh
2024-05-20 10:37 ` Eric Auger
2024-06-17 15:02 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 14/18] hw/arm/smmuv3: Support and advertise nesting Mostafa Saleh
2024-05-20 13:16 ` Eric Auger
2024-06-17 15:03 ` Mostafa Saleh
2024-04-29 3:23 ` [RFC PATCH v3 15/18] hw/arm/smmuv3: Advertise S2FWB Mostafa Saleh
2024-05-20 13:30 ` Eric Auger
2024-06-17 15:04 ` Mostafa Saleh
2024-04-29 3:24 ` [RFC PATCH v3 16/18] hw/arm/smmu: Refactor SMMU OAS Mostafa Saleh
2024-05-20 13:59 ` Eric Auger
2024-04-29 3:24 ` [RFC PATCH v3 17/18] hw/arm/smmuv3: Add property for OAS Mostafa Saleh
2024-05-21 9:32 ` Eric Auger
2024-06-27 11:50 ` Mostafa Saleh
2024-04-29 3:24 ` [RFC PATCH v3 18/18] hw/arm/virt: Set SMMU OAS based on CPU PARANGE Mostafa Saleh
2024-05-21 9:43 ` Eric Auger
2024-05-24 17:22 ` Julien Grall
2024-06-27 11:44 ` Mostafa Saleh
2024-05-13 13:57 ` [RFC PATCH v3 00/18] SMMUv3 nested translation support Julien Grall
2024-05-21 9:47 ` Eric Auger
2024-05-27 16:12 ` Mostafa Saleh
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=ZnBPIibjKcjktnb1@google.com \
--to=smostafa@google.com \
--cc=alex.bennee@linaro.org \
--cc=eric.auger@redhat.com \
--cc=jean-philippe@linaro.org \
--cc=julien@xen.org \
--cc=marcin.juszkiewicz@linaro.org \
--cc=maz@kernel.org \
--cc=nicolinc@nvidia.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.