Re: [PATCH 0/7] iommu cleanup and refactoring

From: Robin Murphy
Date: Tue Jan 25 2022 - 09:52:40 EST


On 2022-01-24 17:44, Jason Gunthorpe wrote:
On Mon, Jan 24, 2022 at 09:46:26AM +0000, Tian, Kevin wrote:
From: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
Sent: Monday, January 24, 2022 3:11 PM

Hi,

The guest pasid and aux-domain related code are dead code in current
iommu subtree. As we have reached a consensus that all these features
should be based on the new iommufd framework (which is under active
development), the first part of this series removes and cleanups all
the dead code.

The second part of this series refactors the iommu_domain by moving all
domain-specific ops from iommu_ops to a new domain_ops. This makes an
iommu_domain self-contained and represent the abstraction of an I/O
translation table in the IOMMU subsystem. With different type of
iommu_domain providing different set of ops, it's easier to support more
types of I/O translation tables.

You may want to give more background on this end goal. In general there
are four IOPT types in iommufd discussions:

1) The one currently tracked by iommu_domain, with a map/unmap semantics
2) The one managed by mm and shared to iommu via sva_bind/unbind ops
3) The one managed by userspace and bound to iommu via iommufd (require nesting)
4) The one managed by KVM (e.g. EPT) and shared to iommu via a TBD interface

Yes, at least from an iommufd perspective I'd like to see one struct
for all of these types, mainly so we can have a uniform alloc, attach
and detatch flow for all io page table types.

Agreed, certainly an IOMMU_DOMAIN_SVA type that can both encapsulate the mm and effectively replace iommu_sva seems like a logical and fairly small next step. We already have the paradigm of different domain types supporting different ops, so initially an SVA domain would simply allow bind/unbind rather than attach/detach/map/unmap.

It might then further be possible to hide SVA bind/unbind behind the attach/detach interface, but AFAICS we'd still need distinct flows for attaching/binding the whole device vs. attaching/binding to a PASID, since they are fundamentally different things in their own right, and the ideal API should give us the orthogonality to also bind a device to an SVA domain without PASID (e.g. for KVM stage 2, or userspace assignment of simpler fault/stall-tolerant devices), or attach PASIDs to regular iommu_domains.

That distinction could of course be consolidated by flipping to the other approach of explicitly allocating the PASID first, then wrapping it in a struct device that could then be passed through the same attach/detach interfaces and distinguished internally, but although I still have a fondness for that approach I know I'm about the only one :)

Cheers,
Robin.

If we want to use the iommu_domain, or make iommu_domain a sub-class
of a new struct, can be determined as we go along.

Regardless, I think this cleanup stands on its own. Moving the ops and
purging the dead code is clearly the right thing to do.

Thanks,
Jason