[RFC PATCH 08/11] iommu/riscv: Add dirty tracking support for second-stage domains
Jason Gunthorpe
jgg at ziepe.ca
Tue Apr 28 06:38:00 PDT 2026
On Tue, Apr 28, 2026 at 09:13:56PM +0800, fangyu.yu at linux.alibaba.com wrote:
> @@ -1247,6 +1247,84 @@ static int riscv_iommu_attach_paging_domain(struct iommu_domain *iommu_domain,
> return 0;
> }
>
> +/*
> + * Enable or disable hardware A/D bit updates (GADE) in the device context for
> + * all devices attached to a second-stage domain. When dirty tracking is
> + * enabled the IOMMU hardware will set the dirty bit in PTEs on write access,
> + * making them visible to read_and_clear_dirty().
> + */
> +static int riscv_iommu_set_dirty_tracking(struct iommu_domain *iommu_domain,
> + bool enable)
> +{
> + struct riscv_iommu_domain *domain = iommu_domain_to_riscv(iommu_domain);
> + struct riscv_iommu_bond *bond;
> + struct riscv_iommu_device *iommu, *prev;
> + struct riscv_iommu_dc *dc;
> + struct iommu_fwspec *fwspec;
> + struct riscv_iommu_command cmd;
> + u64 tc;
> + int i;
> +
> + rcu_read_lock();
> +
> + list_for_each_entry_rcu(bond, &domain->bonds, list) {
> + iommu = dev_to_iommu(bond->dev);
> + fwspec = dev_iommu_fwspec_get(bond->dev);
> +
> + for (i = 0; i < fwspec->num_ids; i++) {
> + dc = riscv_iommu_get_dc(iommu, fwspec->ids[i]);
> + tc = READ_ONCE(dc->tc);
> + if (!(tc & RISCV_IOMMU_DC_TC_V))
> + continue;
> +
> + if (enable)
> + tc |= RISCV_IOMMU_DC_TC_GADE;
> + else
> + tc &= ~RISCV_IOMMU_DC_TC_GADE;
> + WRITE_ONCE(dc->tc, tc);
I'm pretty sure you don't need to do this. Just preset GADE when ever
a S2 domain is attached, rely on the pre-set D to avoid any HW cost
and you are fine. No need to change it dynamically unless something is
reall weird about riscv.
Jason
More information about the linux-riscv
mailing list