Linux IOMMU Development
 help / color / mirror / Atom feed
From: Robin Murphy <robin.murphy@arm.com>
To: Jason Gunthorpe <jgg@nvidia.com>, "Tian, Kevin" <kevin.tian@intel.com>
Cc: "Rodel, Jorg" <jroedel@suse.de>,
	Qian Cai <quic_qiancai@quicinc.com>,
	"iommu@lists.linux-foundation.org"
	<iommu@lists.linux-foundation.org>, Will Deacon <will@kernel.org>
Subject: Re: [PATCH v2] iommu: iommu_group_claim_dma_owner() must always assign a domain
Date: Thu, 5 May 2022 19:56:59 +0100	[thread overview]
Message-ID: <1b8bf74a-cafa-822f-8843-0d1caf3f56ac@arm.com> (raw)
In-Reply-To: <20220505153320.GS49344@nvidia.com>

On 2022-05-05 16:33, Jason Gunthorpe wrote:
> On Thu, May 05, 2022 at 10:56:28AM +0000, Tian, Kevin wrote:
>>> From: Jason Gunthorpe <jgg@nvidia.com>
>>> Sent: Thursday, May 5, 2022 3:09 AM
>>>
>>> Once the group enters 'owned' mode it can never be assigned back to the
>>> default_domain or to a NULL domain. It must always be actively assigned to
>>
>> worth pointing out that a NULL domain is not always translated to DMA
>> blocked on all platforms. That was a wrong assumption before this patch.
> 
> This is described in a comment blow
> 
>>> @@ -2040,7 +2037,8 @@ static int __iommu_attach_group(struct
>>> iommu_domain *domain,
>>>   {
>>>   	int ret;
>>>
>>> -	if (group->domain && group->domain != group->default_domain)
>>> +	if (group->domain && group->domain != group->default_domain &&
>>> +	    group->domain != group->blocking_domain)
>>>   		return -EBUSY;
>>>
>>>   	ret = __iommu_group_for_each_dev(group, domain,
>>
>> Suppose this can be also replaced by __iommu_group_attach_domain()?
> 
> It can, but lets do this as a follow patching since it is a bit big
> 
>>> @@ -2072,38 +2070,68 @@ static int
>>> iommu_group_do_detach_device(struct device *dev, void *data)
>>>   	return 0;
>>>   }
>>>
>>> -static void __iommu_detach_group(struct iommu_domain *domain,
>>> -				 struct iommu_group *group)
>>> +static int __iommu_group_attach_domain(struct iommu_group *group,
>>> +				       struct iommu_domain *new_domain)
>>>   {
>>>   	int ret;
>>>
>>> +	if (group->domain == new_domain)
>>> +		return 0;
>>> +
>>>   	/*
>>> -	 * If the group has been claimed already, do not re-attach the default
>>> -	 * domain.
>>> +	 * New drivers should support default domains and so the
>>> detach_dev() op
>>> +	 * will never be called. Otherwise the NULL domain indicates the
>>> +	 * translation for the group should be set so it will work with the
>>
>> translation should be 'blocked'?
> 
> No, not blocked.
> 
>>> +	 * platform DMA ops.
>>
>> I didn't get the meaning of the last sentence.
> 
> It is as discussed with Robin, NULL means to return the group back to
> some platform defined translation, and in some cases this means
> returning back to work with the platform's DMA ops - presumably if it
> isn't using the dma api.
> 
>>> +	/*
>>> +	 * Changing the domain is done by calling attach on the new domain.
>>> +	 * Drivers should implement this so that DMA is always translated by
>>
>> what does 'this' mean?
> 
> The code below - attach_dev called in a loop for each dev in the group.
> 
>>> +	 * either the new, old, or a blocking domain. DMA should never
>>
>> isn't the blocking domain passed in as the new domain?
> 
> Soemtimes. This is a statement about the required
> atomicity. New/old/block are all valid translations during the
> operation. Identity is not.
>   
>>> +	 * untranslated.
>>> +	 *
>>> +	 * Note that this is called in error unwind paths, attaching to a
>>> +	 * domain that has already been attached cannot fail.
>>
>> this is called in the normal path. Where does error unwind happen?
> 
> Any place that checks the return and does WARN_ON
> 
> Also the loop over each dev doesn't error unwind so it assumes that if
> the first dev succeeds then all subsequent devs will succeed.
>>>   /**
>>>    * iommu_group_claim_dma_owner() - Set DMA ownership of a group
>>>    * @group: The group.
>>> @@ -3111,9 +3162,15 @@ int iommu_group_claim_dma_owner(struct
>>> iommu_group *group, void *owner)
>>>   			goto unlock_out;
>>>   		}
>>>
>>> +		ret = __iommu_group_alloc_blocking_domain(group);
>>> +		if (ret)
>>> +			goto unlock_out;
>>> +
>>> +		ret = __iommu_group_attach_domain(group,
>>> +						  group->blocking_domain);
>>> +		if (ret)
>>> +			goto unlock_out;
>>>   		group->owner = owner;
>>
>> Here can use __iommu_group_attach_core_domain() if calling it after
>> setting group->owner.
> 
> That is obfuscating. This function must always and only attach the
> blocking_domain.
> 
> So, I'm going to leave this patch as-is since it has been tested now
> and we need to get the series back into iommu-next ASAP.

Ack to that, there are certainly further improvements to consider once 
we've got known-working code into a released kernel, but let's not get 
ahead of ourselves just now.

(I'm pretty sure we could get away with a single blocking domain per 
IOMMU instance, rather than per group, but I deliberately saved that one 
for later - right now one per group to match default domains is simpler 
to reason about and less churny in the context of the current ownership 
patches)

Cheers,
Robin.
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

  reply	other threads:[~2022-05-05 18:57 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-04 19:08 [PATCH v2] iommu: iommu_group_claim_dma_owner() must always assign a domain Jason Gunthorpe via iommu
2022-05-05 10:56 ` Tian, Kevin
2022-05-05 15:33   ` Jason Gunthorpe via iommu
2022-05-05 18:56     ` Robin Murphy [this message]
2022-05-05 19:27       ` Jason Gunthorpe via iommu
2022-05-05 20:07         ` Robin Murphy
2022-05-06  9:41         ` Baolu Lu
2022-05-05 23:28     ` Tian, Kevin
2022-05-06  9:32       ` Robin Murphy
2022-05-06 13:10         ` Jason Gunthorpe via iommu
2022-05-06 13:35           ` Robin Murphy
2022-05-06 13:54             ` Jason Gunthorpe via iommu
2022-05-09  9:59               ` Robin Murphy
2022-05-09 17:26                 ` Jason Gunthorpe via iommu
2022-05-09 22:06                   ` Robin Murphy
2022-05-09 23:35                     ` Jason Gunthorpe via iommu

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=1b8bf74a-cafa-822f-8843-0d1caf3f56ac@arm.com \
    --to=robin.murphy@arm.com \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jgg@nvidia.com \
    --cc=jroedel@suse.de \
    --cc=kevin.tian@intel.com \
    --cc=quic_qiancai@quicinc.com \
    --cc=will@kernel.org \
    /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