Linux IOMMU Development
 help / color / mirror / Atom feed
From: Vasant Hegde <vasant.hegde@amd.com>
To: Jason Gunthorpe <jgg@ziepe.ca>
Cc: iommu@lists.linux.dev, joro@8bytes.org, will@kernel.org,
	robin.murphy@arm.com, suravee.suthikulpanit@amd.com,
	yi.l.liu@intel.com, baolu.lu@linux.intel.com,
	kevin.tian@intel.com
Subject: Re: [PATCH 1/5] iommu: Enhance domain allocation code to take additional flags
Date: Mon, 26 Aug 2024 14:06:27 +0530	[thread overview]
Message-ID: <5fd22a04-ff5f-4763-a93f-268fefabaf7b@amd.com> (raw)
In-Reply-To: <20240821163147.GZ3468552@ziepe.ca>

Jason,


On 8/21/2024 10:01 PM, Jason Gunthorpe wrote:
> On Wed, Aug 21, 2024 at 01:35:50PM +0000, Vasant Hegde wrote:
>> From: Jason Gunthorpe <jgg@ziepe.ca>
>>
>> Currently drivers calls iommu_paging_domain_alloc(dev) to get an
>> UNAMANAGED domain. This is not sufficient to support PASID with
>> UNAMANAGED domain as some HW like AMD requires certain page table type
>> to support PASIDs.
>>
>> Also domain_alloc_paging() passes device as param for domain
>> allocation. This is not sufficient for AMD driver to decide the right
>> page table.
>>
>> Hence add iommu_paging_domain_alloc_flags() API which takes flags as
>> parameter. Also update default domain allocation path to use this new
>> API whenever device is PASID capable. HW driver should implement
>> domain_alloc_user() to allocate PASID capable domain.
>>
>> Finally introduce new flag (IOMMUFD_HWPT_ALLOC_PASID) to
>> domain_alloc_users() ops. If both IOMMU and device supports PASID it
>> will allocate domain. Otherwise return error.
>>
>> Signed-off-by: Jason Gunthorpe <jgg@ziepe.ca>
>> [Added __iommu_paging_domain_alloc_flags() and description - Vasant]
>> Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
>> ---
>> @Jason,
>>   Notice that I have added __iommu_paging_domain_alloc_flags() so that
>>   it can call iommu_domain_init() with appropriate domain type.
> 
> It is okay, but also the type could be fixed in
> __iommu_group_alloc_default_domain() using something like:
> 
> 		ret->type |= req_type;

Sorry. I didn't get it. You mean domain->type? If yes, its set in
iommu_domain_init(). (That's why I had to introduce
__iommu_group_alloc_default_domain()).


> 
>>   I think instead of having separate function it may be better to
>>   enhance __iommu_domain_alloc() such that:
>>     - Keep below changes from this patch
>>       - iommu_domain_init()
>>       - iommu_get_dma_cookie call inside iommu_setup_default_domain()
>>     - modify __iommu_domain_alloc() to additional param (flags)
>>     - iommu_paging_domain_alloc_flags() will call __iommu_domain_alloc()
> 
> My expectation was to basically remove iommu_domain_alloc() entirely
> once Lu's work is merged.
> 
> Instead we'd have these direct APIs:
>   iommu_domain_alloc_paging_flags()
>   iommu_group_alloc_blocking_domain()
>   iommu_group_alloc_identity_domain()

Sure (For AMD driver, we may have to tweak a bit to allocate_identity domain,
but doable).


> 
> And then iommu_group_alloc_default_domain() would just call them in
> the right order maybe like this:
> 
> 	if (req_type & __IOMMU_DOMAIN_PAGING)
> 		return iommu_domain_alloc_paging_flags();
> 	if (req_type && req_type != IOMMU_DOMAIN_IDENTITY)
> 		return ERR_PTR(-EOPNOTSUPP);
> 
> 	if (req_type || iommu_def_domain_type == IOMMU_DOMAIN_IDENTITY) {
> 		dom = iommu_group_alloc_identity_domain();
> 		if (req_type || !IS_ERR(dom))
> 			return dom;
> 		/*
> 		 * if iommu_def_domain_type == IDENTITY fails then fall through
> 		 * to PAGING
> 		 */
> 	}
> 
> 	/* iommu_def_domain_type is PAGING */
> 	dom = iommu_domain_alloc_paging_flags();
> 	if (IS_ERR(dom))
> 		return dom;
> 
> 	pr_warn("Failed to allocate default IOMMU domain of type %u for group %s - Falling back to IOMMU_DOMAIN_DMA",
> 		iommu_def_domain_type, group->name);
> 	return dom;
> 
> Which is the only place we need to make a decision based on a type
> input.
> 
> Hoping Lu's final few patches make it this cycle
> 
>> +static void iommu_domain_init(struct iommu_domain *domain, unsigned int type,
>> +			      const struct iommu_ops *ops)
>> +{
>> +	domain->type = type;
>> +	domain->owner = ops;
>> +	if (!domain->ops)
>> +		domain->ops = ops->default_domain_ops;
>> +
>> +	/*
>> +	 * If not already set, assume all sizes by default; the driver
>> +	 * may override this later
>> +	 */
>> +	if (!domain->pgsize_bitmap)
>> +		domain->pgsize_bitmap = ops->pgsize_bitmap;
>> +}
> 
> Pedantically the pgsize_bitmap is only needed for paging domains, but
> it is OK like this too.

Right. Lets keep it for now. I can do a cleanup patch later.


> 
>> @@ -359,11 +359,17 @@ struct iommu_vfio_ioas {
>>   *                                   enforced on device attachment
>>   * @IOMMU_HWPT_FAULT_ID_VALID: The fault_id field of hwpt allocation data is
>>   *                             valid.
>> + * @IOMMUFD_HWPT_ALLOC_PASID: When the domain is used on a device, with no
>> + *                            PASID, the device will support later attaching
>> + *                            a PASID as well. Some HW requires a specific
>> + *                            domain format on the device to allow PASID to
>> + *                            work.
> 
> Maybe:
> 
>  Requests a domain that can be used with PASID. The domain can be
>  attached to any PASID on the device. Any domain attached to the
>  non-PASID part of the device must also be flaged, otherwise attaching
>  a PASID will blocked.

Ok.

> 
> Yi will need to add a check that IOMMUFD_HWPT_ALLOC_PASID was
> specified on the RID domain while processing attach on the PASID
> domain.
> 
>>  enum iommufd_hwpt_alloc_flags {
>>  	IOMMU_HWPT_ALLOC_NEST_PARENT = 1 << 0,
>>  	IOMMU_HWPT_ALLOC_DIRTY_TRACKING = 1 << 1,
>>  	IOMMU_HWPT_FAULT_ID_VALID = 1 << 2,
>> +	IOMMUFD_HWPT_ALLOC_PASID = 1 << 3,
> 
> Let's keep the consistent spelling IOMMU_HWPT_ALLOC_PASID

Sorry. Its my fault. Will fix it.

> 
> I think the series looks OK. The naming of domain_alloc_user() is now
> a little bit weird, it has now turned into
> domain_alloc_paging_extended().

Ack. Do you want me to do it now -OR- May be wait until all changes settles down
(above described group() related changes, this series, Baolu's series, etc)?


-Vasant

  parent reply	other threads:[~2024-08-26  8:36 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-21 13:35 [PATCH 0/5] iommu: Domain allocation enhancements Vasant Hegde
2024-08-21 13:35 ` [PATCH 1/5] iommu: Enhance domain allocation code to take additional flags Vasant Hegde
2024-08-21 16:31   ` Jason Gunthorpe
2024-08-22  1:50     ` Baolu Lu
2024-08-22 12:43       ` Jason Gunthorpe
2024-08-23  2:47         ` Baolu Lu
2024-08-26  8:08           ` Tian, Kevin
2024-08-26  8:34             ` Baolu Lu
2024-08-26  8:59               ` Tian, Kevin
2024-08-26 13:51                 ` Jason Gunthorpe
2024-08-26  8:47           ` Vasant Hegde
2024-08-26 13:45           ` Jason Gunthorpe
2024-08-22 11:27     ` Yi Liu
2024-08-22 12:44       ` Jason Gunthorpe
2024-08-23  8:58         ` Yi Liu
2024-08-24 14:47           ` Vasant Hegde
2024-08-28 21:52             ` Jacob Pan
2024-08-29 10:51               ` Vasant Hegde
2024-08-29 12:10                 ` Jason Gunthorpe
2024-08-29 12:47                   ` Vasant Hegde
2024-08-29 13:11                     ` Jason Gunthorpe
2024-09-11 10:54                       ` Vasant Hegde
2024-08-29 17:40                     ` Jacob Pan
     [not found]                     ` <66d0b2a1.630a0220.1dd301.daceSMTPIN_ADDED_BROKEN@mx.google.com>
2024-08-30 15:00                       ` Jason Gunthorpe
2024-08-26  8:36     ` Vasant Hegde [this message]
2024-08-26 13:56       ` Jason Gunthorpe
2024-08-29 12:34         ` Vasant Hegde
2024-08-22  1:38   ` Baolu Lu
2024-08-22 12:40     ` Jason Gunthorpe
2024-08-23  2:04       ` Baolu Lu
2024-08-26  6:09     ` Vasant Hegde
2024-08-22  2:10   ` kernel test robot
2024-08-22  3:03   ` kernel test robot
2024-08-22  5:07   ` kernel test robot
2024-08-21 13:35 ` [PATCH 2/5] iommu/amd: Separate page table setup from domain allocation Vasant Hegde
2024-08-21 16:40   ` Jason Gunthorpe
2024-08-21 13:35 ` [PATCH 3/5] iommu/amd: Pass page table type to pdomain_setup_pgtable() Vasant Hegde
2024-08-21 13:35 ` [PATCH 4/5] iommu/amd: Enhance domain_alloc_user() to allocate PASID capable domain Vasant Hegde
2024-08-21 13:35 ` [PATCH 5/5] iommu/amd: Add iommu_ops->domain_alloc_paging support Vasant Hegde
2024-08-21 15:57   ` Jason Gunthorpe
2024-09-11 10:44     ` Vasant Hegde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5fd22a04-ff5f-4763-a93f-268fefabaf7b@amd.com \
    --to=vasant.hegde@amd.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=iommu@lists.linux.dev \
    --cc=jgg@ziepe.ca \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=robin.murphy@arm.com \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=will@kernel.org \
    --cc=yi.l.liu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox