From: Jason Gunthorpe <jgg@nvidia.com>
To: Will Deacon <will@kernel.org>
Cc: iommu@lists.linux.dev, Joerg Roedel <joro@8bytes.org>,
linux-arm-kernel@lists.infradead.org,
Robin Murphy <robin.murphy@arm.com>,
Michael Shavit <mshavit@google.com>,
Nicolin Chen <nicolinc@nvidia.com>,
patches@lists.linux.dev, Ryan Roberts <ryan.roberts@arm.com>,
Mostafa Saleh <smostafa@google.com>
Subject: Re: [PATCH v2 08/10] iommu/arm-smmu-v3: Shrink the cdtab l1_desc array
Date: Tue, 9 Jul 2024 16:52:10 -0300 [thread overview]
Message-ID: <20240709195210.GN107163@nvidia.com> (raw)
In-Reply-To: <20240702184607.GB5167@willie-the-truck>
On Tue, Jul 02, 2024 at 07:46:07PM +0100, Will Deacon wrote:
> On Mon, Jun 10, 2024 at 09:31:17PM -0300, Jason Gunthorpe wrote:
> > The top of the 2 level CD table is (at most) 1024 entries big, and two
> > high order allocations are required. One of __le64 which is programmed
> > into the HW (8k) and one of struct arm_smmu_l1_ctx_desc which holds the
> > CPU pointer (16k).
> >
> > There are two copies of the l2ptr_dma, one is stored in the struct
> > arm_smmu_l1_ctx_desc, and another is encoded in the __le64 for the HW to
> > use. Instead of storing two copies just decode the value from the __le64.
> >
> > Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
> > ---
> > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 41 +++++++++------------
> > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 1 -
> > 2 files changed, 17 insertions(+), 25 deletions(-)
> >
> > 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 6245e2558e6a6a..dd65e27aebafd4 100644
> > --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> > +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> > @@ -1167,31 +1167,19 @@ static void arm_smmu_sync_cd(struct arm_smmu_master *master,
> > arm_smmu_cmdq_batch_submit(smmu, &cmds);
> > }
> >
> > -static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu,
> > - struct arm_smmu_l1_ctx_desc *l1_desc)
> > +static void arm_smmu_write_cd_l1_desc(__le64 *dst, dma_addr_t l2ptr_dma)
> > {
> > - size_t size = CTXDESC_L2_ENTRIES * (CTXDESC_CD_DWORDS << 3);
> > -
> > - l1_desc->l2ptr = dma_alloc_coherent(smmu->dev, size,
> > - &l1_desc->l2ptr_dma, GFP_KERNEL);
> > - if (!l1_desc->l2ptr) {
> > - dev_warn(smmu->dev,
> > - "failed to allocate context descriptor table\n");
> > - return -ENOMEM;
> > - }
> > - return 0;
> > -}
> > -
> > -static void arm_smmu_write_cd_l1_desc(__le64 *dst,
> > - struct arm_smmu_l1_ctx_desc *l1_desc)
> > -{
> > - u64 val = (l1_desc->l2ptr_dma & CTXDESC_L1_DESC_L2PTR_MASK) |
> > - CTXDESC_L1_DESC_V;
> > + u64 val = (l2ptr_dma & CTXDESC_L1_DESC_L2PTR_MASK) | CTXDESC_L1_DESC_V;
> >
> > /* The HW has 64 bit atomicity with stores to the L2 CD table */
> > WRITE_ONCE(*dst, cpu_to_le64(val));
> > }
> >
> > +static dma_addr_t arm_smmu_cd_l1_get_desc(const __le64 *src)
> > +{
> > + return le64_to_cpu(src) & CTXDESC_L1_DESC_L2PTR_MASK;
> > +}
>
> I'm assuming this is supposed to be *src,
Uh, wow, surprised that compiles, yes.
> in which case this could be
> accessing non-cacheable memory if the SMMU isn't coherent. That's why we
> shadow everything.
That is a confusing statement. I know it is a DMA coherent allocation,
but the driver does not avoid reading for DMA coherent memory in all
cases, and DMA coherent allocations are well defined to be readable
anyhow.
For instance the driver has always read back from coherent allocations
when working with the STE or CD:
strtab = dmam_alloc_coherent(smmu->dev, size, &cfg->strtab_dma,
GFP_KERNEL);
cfg->strtab.linear = strtab;
static void arm_smmu_write_strtab_ent(struct arm_smmu_master *master, u32 sid,
__le64 *dst)
{
u64 val = le64_to_cpu(dst[0]);
^^^^ dst points into strtab above
That's the same thing being done here, with no shadowing, no issue.
I know no reason why the first level cd table would be special that it
needs shadowing? It is just wasting memory. Let's fix it.
Jason
next prev parent reply other threads:[~2024-07-09 19:52 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-11 0:31 [PATCH v2 00/10] Tidy some minor things in the stream table/cd table area Jason Gunthorpe
2024-06-11 0:31 ` [PATCH v2 01/10] iommu/arm-smmu-v3: Do not zero the strtab twice Jason Gunthorpe
2024-06-11 0:50 ` Nicolin Chen
2024-06-11 23:52 ` Daniel Mentz
2024-06-12 11:46 ` Jason Gunthorpe
2024-06-11 0:31 ` [PATCH v2 02/10] iommu/arm-smmu-v3: Shrink the strtab l1_desc array Jason Gunthorpe
2024-06-11 0:55 ` Nicolin Chen
2024-06-11 0:31 ` [PATCH v2 03/10] iommu/arm-smmu-v3: Add arm_smmu_strtab_l1/2_idx() Jason Gunthorpe
2024-06-11 2:00 ` Nicolin Chen
2024-06-12 0:30 ` Daniel Mentz
2024-06-12 12:09 ` Jason Gunthorpe
2024-06-12 0:37 ` Daniel Mentz
2024-06-12 11:49 ` Jason Gunthorpe
2024-06-11 0:31 ` [PATCH v2 04/10] iommu/arm-smmu-v3: Add types for each level of the 2 level stream table Jason Gunthorpe
2024-06-11 2:13 ` Nicolin Chen
2024-06-11 0:31 ` [PATCH v2 05/10] iommu/arm-smmu-v3: Reorganize struct arm_smmu_strtab_cfg Jason Gunthorpe
2024-06-11 2:31 ` Nicolin Chen
2024-07-02 18:46 ` Will Deacon
2024-07-09 19:42 ` Jason Gunthorpe
2024-06-11 0:31 ` [PATCH v2 06/10] iommu/arm-smmu-v3: Remove strtab_base/cfg Jason Gunthorpe
2024-06-11 2:36 ` Nicolin Chen
2024-06-11 0:31 ` [PATCH v2 07/10] iommu/arm-smmu-v3: Do not use devm for the cd table allocations Jason Gunthorpe
2024-06-11 2:39 ` Nicolin Chen
2024-06-11 0:31 ` [PATCH v2 08/10] iommu/arm-smmu-v3: Shrink the cdtab l1_desc array Jason Gunthorpe
2024-06-11 3:02 ` Nicolin Chen
2024-07-02 18:46 ` Will Deacon
2024-07-09 19:52 ` Jason Gunthorpe [this message]
2024-07-09 23:53 ` Jason Gunthorpe
2024-06-11 0:31 ` [PATCH v2 09/10] iommu/arm-smmu-v3: Add types for each level of the CD table Jason Gunthorpe
2024-06-11 3:12 ` Nicolin Chen
2024-06-11 0:31 ` [PATCH v2 10/10] iommu/arm-smmu-v3: Reorganize struct arm_smmu_ctx_desc_cfg Jason Gunthorpe
2024-06-11 3:25 ` Nicolin Chen
2024-06-11 3:27 ` [PATCH v2 00/10] Tidy some minor things in the stream table/cd table area Nicolin Chen
2024-07-02 18:43 ` Will Deacon
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=20240709195210.GN107163@nvidia.com \
--to=jgg@nvidia.com \
--cc=iommu@lists.linux.dev \
--cc=joro@8bytes.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=mshavit@google.com \
--cc=nicolinc@nvidia.com \
--cc=patches@lists.linux.dev \
--cc=robin.murphy@arm.com \
--cc=ryan.roberts@arm.com \
--cc=smostafa@google.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;
as well as URLs for NNTP newsgroup(s).