|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/passthrough: Support a single iommu_domain(context bank) per xen domain per SMMU
On 3/20/2015 8:39 AM, Julien Grall wrote:
> Hello Robert,
>
> Thank you for the patch.
>
No problem. :)
>> xen/drivers/passthrough/arm/smmu.c | 113
>> ++++++++++++++++++++++++++++--------
>> 1 file changed, 88 insertions(+), 25 deletions(-)
>>
>> diff --git a/xen/drivers/passthrough/arm/smmu.c
>> b/xen/drivers/passthrough/arm/smmu.c
>> index a7a7da9..9b46054 100644
>
> [..]
>
>> @@ -1596,7 +1617,7 @@ static void arm_smmu_detach_dev(struct iommu_domain
>> *domain, struct device *dev)
>> if (!cfg)
>> return;
>>
>> - dev_iommu_domain(dev) = NULL;
>> + iommu_domain_remove_device(domain, dev);
>> arm_smmu_domain_remove_master(smmu_domain, cfg);
>> }
>
> I'd like to avoid modifying arm_smmu_attach_dev and arm_smmu_detach_dev
> as it's part of the Linux code.
>
> I think you can increment the reference counter in arm_smmu_assign_dev
> and arm_smmu_deassign_dev. That would avoid some possible race condition
> (see below).
>
I can definitely increment the reference counter in arm_smmu_assign_dev, but
arm_smmu_detach_dev doesn't return any results, so there isn't a guarantee that
the iommu_domain has actually been dereferenced for the device.
>> + if(domain->priv->smmu == smmu)
>> + {
>> + /* We have found a context already associated
>> with the same xen domain and SMMU */
>> + ret = arm_smmu_attach_dev(domain, dev);
>> + if (ret) {
>> + /*
>> + * TODO: If arm_smmu_attach_dev fails,
>> should we perform arm_smmu_domain_destroy,
>> + * eventhough another smmu_master is
>> configured correctly? If Not, what error
>> + * code should we use
>> + */
>
> The failure may be because we don't have any stream register available.
> So I don't think we should detach all the other devices within the same
> context.
>
Agreed.
>> + dev_err(dev, "cannot attach device to
>> already existing iommu_domain\n");
>> + return -ENXIO;
>> + }
Is this an appropriate return error?
>> +
>> + existing_ctxt_fnd = 1;
>> + break;
>> + }
>> +
>> + }
>> + spin_unlock(&xen_domain->lock);
>> + }
>> +
>> + if(!existing_ctxt_fnd){
>
> if (!existing_ctx_fnd) {
>
> [..]
>
>> @@ -2633,12 +2692,16 @@ static int arm_smmu_deassign_dev(struct domain *d,
>> struct device *dev)
>>
>> arm_smmu_detach_dev(domain, dev);
>>
>> - spin_lock(&xen_domain->lock);
>> - list_del(&domain->list);
>> - spin_unlock(&xen_domain->lock);
>> + if (domain->ref.counter == 0)
>> + {
>
> There is a possible race with the previous function. arm_smmu_assign_dev
> still have time to increment domain->ref and we will free a domain with
> 1 device assigned.
>
> Overall, I think the 2 functions should be completely protected by the
> xen_domain->lock.
Agreed. I will move the locks around.
Thanks,
Robbie VanVossen
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |