On Tue, Feb 25, 2025 at 08:41:27AM -0800, Nicolin Chen wrote: > On Tue, Feb 25, 2025 at 12:02:25PM -0400, Jason Gunthorpe wrote: > > On Mon, Feb 24, 2025 at 03:45:33PM -0800, Nicolin Chen wrote: > > > > > --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c > > > +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c > > > @@ -95,8 +95,6 @@ int arm_smmu_attach_prepare_vmaster(struct arm_smmu_attach_state *state, > > > > > > iommu_group_mutex_assert(state->master->dev); > > > > > > - if (domain->type != IOMMU_DOMAIN_NESTED) > > > - return 0; > > > nested_domain = to_smmu_nested_domain(domain); > > > > > > /* Skip invalid vSTE */ > > > @@ -122,19 +120,9 @@ void arm_smmu_attach_commit_vmaster(struct arm_smmu_attach_state *state) > > > { > > > struct arm_smmu_master *master = state->master; > > > > > > - mutex_lock(&master->smmu->streams_mutex); > > > - if (state->vmaster != master->vmaster) { > > > - kfree(master->vmaster); > > > - master->vmaster = state->vmaster; > > > - } > > > - mutex_unlock(&master->smmu->streams_mutex); > > > -} > > > - > > > -void arm_smmu_master_clear_vmaster(struct arm_smmu_master *master) > > > -{ > > > mutex_lock(&master->smmu->streams_mutex); > > > kfree(master->vmaster); > > > - master->vmaster = NULL; > > > + master->vmaster = state->vmaster; > > > mutex_unlock(&master->smmu->streams_mutex); > > > } > > > > I'd leave the clear_vmaster just for clarity. Commit should not be > > unpaired with prepare in the other functions. > > > > It looks fine with this on top too > > > > Reviewed-by: Jason Gunthorpe <jgg@xxxxxxxxxx> > > Ack. I added it back and a #ifdef to the vmaster: > > +void arm_smmu_master_clear_vmaster(struct arm_smmu_master *master) > +{ > + struct arm_smmu_attach_state state = { .master = master }; > + > + arm_smmu_attach_commit_vmaster(&state); > +} > [...] > @@ -824,6 +829,9 @@ struct arm_smmu_master { > struct arm_smmu_device *smmu; > struct device *dev; > struct arm_smmu_stream *streams; > +#ifdef CONFIG_ARM_SMMU_V3_IOMMUFD > + struct arm_smmu_vmaster *vmaster; /* use smmu->streams_mutex */ > +#endif > /* Locked by the iommu core using the group mutex */ > struct arm_smmu_ctx_desc_cfg cd_table; > unsigned int num_streams; > @@ -972,6 +980,9 @@ struct arm_smmu_attach_state { > bool disable_ats; > ioasid_t ssid; > /* Resulting state */ > +#ifdef CONFIG_ARM_SMMU_V3_IOMMUFD > + struct arm_smmu_vmaster *vmaster; > +#endif > bool ats_enabled; > }; > Umm.. I'm not too sure how I feel about these #ifdefs _between_ a struct definition. Given that currently, the arm_smmu_v3.h file doesn't have such `#ifdef CONFIG`s between structs. I'd say, in case CONFIG_ARM_SMMU_V3_IOMMUFD is turned off, we can simply leave the vmaster ptr NULL? -Praan