iommu.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* Some questions about arm_lpae_install_table
@ 2020-11-03  3:00 Kunkun Jiang
  2020-11-03  9:11 ` Will Deacon
  0 siblings, 1 reply; 5+ messages in thread
From: Kunkun Jiang @ 2020-11-03  3:00 UTC (permalink / raw)
  To: robin.murphy, iommu, Will Deacon; +Cc: wanghaibin.wang, zhukeqian1

Hi Robin,

Recently, I have read and learned the code related to io-pgtable-arm.c. 
There
are two question on arm_lpae_install_table.

1、the first

> static arm_lpae_iopte arm_lpae_install_table(arm_lpae_iopte *table,
>                                              arm_lpae_iopte *ptep,
>                                              arm_lpae_iopte curr,
>                                              struct io_pgtable_cfg *cfg)
> {
>         arm_lpae_iopte old, new;
>
>         new = __pa(table) | ARM_LPAE_PTE_TYPE_TABLE;
>         if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_NS)
>                 new |= ARM_LPAE_PTE_NSTABLE;
>
>        /*
>          * Ensure the table itself is visible before its PTE can be.
>          * Whilst we could get away with cmpxchg64_release below, this
>          * doesn't have any ordering semantics when !CONFIG_SMP.
>          */
>         dma_wmb();
>
>         old = cmpxchg64_relaxed(ptep, curr, new);
>
>         if (cfg->coherent_walk || (old & ARM_LPAE_PTE_SW_SYNC))
>                 return old;
>
>         /* Even if it's not ours, there's no point waiting; just kick 
> it */
>         __arm_lpae_sync_pte(ptep, cfg);
>         if (old == curr)
>                 WRITE_ONCE(*ptep, new | ARM_LPAE_PTE_SW_SYNC);
>
>         return old;
> }

If another thread changes the ptep between cmpxchg64_relaxed and
WRITE_ONCE(*ptep, new | ARM_LPAE_PTE_SW_SYNC), the operation
WRITE_ONCE will overwrite the change.

2、the second

> for (i = 0; i < tablesz / sizeof(pte); i++, blk_paddr += split_sz) {
>                 /* Unmap! */
>                 if (i == unmap_idx)
> continue;
>
>                 __arm_lpae_init_pte(data, blk_paddr, pte, lvl, 
> &tablep[i]);
> }
>
> pte = arm_lpae_install_table(tablep, ptep, blk_pte, cfg);

When altering a translation table descriptor include split a block into
constituent granules, the Armv8-A and SMMUv3 architectures require
a break-before-make procedure. But in the function arm_lpae_split_blk_unmap,
it changes a block descriptor to an equivalent span of page translations
directly. Is it appropriate to do so?

The above two questions may be my wrong thinking. Coude you please
give me more hints?

Thanks,
Kunkun Jiang






_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-11-04 11:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-03  3:00 Some questions about arm_lpae_install_table Kunkun Jiang
2020-11-03  9:11 ` Will Deacon
2020-11-03 10:21   ` Robin Murphy
2020-11-04  7:17     ` Kunkun Jiang
2020-11-04 11:15       ` Robin Murphy

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).