On Sat, Jun 14, 2025 at 12:14:36AM -0700, Nicolin Chen wrote: > NVIDIA Virtual Command Queue is one of the iommufd users exposing vIOMMU > features to user space VMs. Its hardware has a strict rule when mapping > and unmapping multiple global CMDQVs to/from a VM-owned VINTF, requiring > mappings in ascending order and unmappings in descending order. > > The tegra241-cmdqv driver can apply the rule for a mapping in the LVCMDQ > allocation handler. However, it can't do the same for an unmapping since > user space could start random destroy calls breaking the rule, while the > destroy op in the driver level can't reject a destroy call as it returns > void. > > Add iommufd_hw_queue_depend/undepend for-driver helpers, allowing LVCMDQ > allocator to refcount_inc() a sibling LVCMDQ object and LVCMDQ destroyer > to refcount_dec(), so that iommufd core will help block a random destroy > call that breaks the rule. > > This is a bit of compromise, because a driver might end up with abusing > the API that deadlocks the objects. So restrict the API to a dependency > between two driver-allocated objects of the same type, as iommufd would > unlikely build any core-level dependency in this case. And encourage to > use the macro version that currently supports the HW QUEUE objects only. > > Reviewed-by: Lu Baolu <baolu...@linux.intel.com> > Reviewed-by: Pranjal Shrivastava <pr...@google.com> > Signed-off-by: Nicolin Chen <nicol...@nvidia.com> > --- > include/linux/iommufd.h | 44 ++++++++++++++++++++++++++++++++++ > drivers/iommu/iommufd/driver.c | 28 ++++++++++++++++++++++ > 2 files changed, 72 insertions(+)
Reviewed-by: Jason Gunthorpe <j...@nvidia.com> Jason