On 05/04/2019 17:39, Will Deacon wrote: >>> I'm wondering whether we can't take this a bit further and re-organise the >>> data structures to make this a little simpler overall. Something along the >>> lines of: >>> >>> struct arm_smmu_master_data { >>> struct list_head list; // masters in the same domain >>> struct arm_smmu_device *smmu; >>> unsigned int num_sids; >>> u32 *sids; // Points into fwspec >>> struct arm_smmu_domain *domain; // NULL -> !assigned >>> }; >>> >>> and then just add a list_head into struct arm_smmu_domain to track the >>> masters that have been attached (if you're feeling brave, you could put >>> this into the s1_cfg). >> >> I'm not sure about that last bit, shouldn't the list of masters apply to >> both s1 and s2? > > I was assuming that (a) we were only using ATS with stage-1 and (b) we only > need the masters list for ATC invalidation. Did I go wrong somewhere? Hmm, I messed that up in patch 3, actually. I'm still unsure about it, but in the end I was meaning to enable ATS for both stage-1 and stage-2 domains. We could make it stage-1 only, but VFIO can assign a device with a stage-1 domain to userspace. That's the case with QEMU, which doesn't use VFIO_TYPE1_NESTING_IOMMU at the moment. So I don't think limiting ATS to stage-1 protects against anything. For (b), the master list will likely also be used for PASID support, to invalidate cached CDs for each device in a domain, but that's only stage-1. Then the current patchsets for nested translation also rely on the master list to bind guest PASID tables to all devices attached to a domain. But with those patches, s1_cfg and s2_cfg aren't in an enum anymore and we could still keep the list in s1_cfg. Thanks, Jean