|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/arm: smmuv1: remove iommu group when deassign a device
Hi Mykyta,
> On 17 Jun 2022, at 12:15 pm, Mykyta Poturai <mykyta.poturai@xxxxxxxxx> wrote:
>
>> Hi Mykyta,
>>
>>> On 16 Jun 2022, at 8:48 am, Mykyta Poturai <mykyta.poturai@xxxxxxxxx> wrote:
>>>
>>> Hi Julien, Rahul
>>> I've encountered a similar problem with IMX8 GPU recently. It wasn't probing
>>> properly after the domain reboot. After some digging, I came to the same
>>> solution as Rahul and found this thread. I also encountered the occasional
>>> "Unexpected global fault, this could be serious" error message when
>>> destroying
>>> a domain with an actively-working GPU.
>>>
>>>> Hmmmm.... Looking at the code, arm_smmu_alloc_smes() doesn't seem to use
>>>> the domain information. So why would it need to be done every time it is
>>>> assigned?
>>> Indeed after removing the arm_smmu_master_free_smes() call, both reboot and
>>> global
>>> fault issues are gone. If I understand correctly, device removing is not yet
>>> supported, so I can't find a proper place for the
>>> arm_smmu_master_free_smes() call.
>>> Should we remove the function completely or just left it commented for
>>> later or
>>> something else?
>>>
>>> Rahul, are you still working on this or could I send my patch?
>>
>> Yes, I have this on my to-do list but I was busy with other work and it got
>> delayed.
>>
>> I created another solution for this issue, in which we don’t need to call
>> arm_smmu_master_free_smes()
>> in arm_smmu_detach_dev() but we can configure the s2cr value to type fault
>> in detach function.
>>
>> Will call new function arm_smmu_domain_remove_master() in detach function
>> that will revert the changes done
>> by arm_smmu_domain_add_master() in attach function.
>>
>> I don’t have any board to test the patch. If it is okay, Could you please
>> test the patch and let me know the result.
>>
>> diff --git a/xen/drivers/passthrough/arm/smmu.c
>> b/xen/drivers/passthrough/arm/smmu.c
>> index 69511683b4..da3adf8e7f 100644
>> --- a/xen/drivers/passthrough/arm/smmu.c
>> +++ b/xen/drivers/passthrough/arm/smmu.c
>> @@ -1598,21 +1598,6 @@ out_err:
>> return ret;
>> }
>>
>> -static void arm_smmu_master_free_smes(struct arm_smmu_master_cfg *cfg)
>> -{
>> - struct arm_smmu_device *smmu = cfg->smmu;
>> - int i, idx;
>> - struct iommu_fwspec *fwspec = arm_smmu_get_fwspec(cfg);
>> -
>> - spin_lock(&smmu->stream_map_lock);
>> - for_each_cfg_sme(cfg, i, idx, fwspec->num_ids) {
>> - if (arm_smmu_free_sme(smmu, idx))
>> - arm_smmu_write_sme(smmu, idx);
>> - cfg->smendx[i] = INVALID_SMENDX;
>> - }
>> - spin_unlock(&smmu->stream_map_lock);
>> -}
>> -
>> static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain,
>> struct arm_smmu_master_cfg *cfg)
>> {
>> @@ -1635,6 +1620,20 @@ static int arm_smmu_domain_add_master(struct
>> arm_smmu_domain *smmu_domain,
>> return 0;
>> }
>>
>> +static void arm_smmu_domain_remove_master(struct arm_smmu_domain
>> *smmu_domain,
>> + struct arm_smmu_master_cfg *cfg)
>> +{
>> + struct arm_smmu_device *smmu = smmu_domain->smmu;
>> + struct arm_smmu_s2cr *s2cr = smmu->s2crs;
>> + struct iommu_fwspec *fwspec = arm_smmu_get_fwspec(cfg);
>> + int i, idx;
>> +
>> + for_each_cfg_sme(cfg, i, idx, fwspec->num_ids) {
>> + s2cr[idx] = s2cr_init_val;
>> + arm_smmu_write_s2cr(smmu, idx);
>> + }
>> +}
>> +
>> static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device
>> *dev)
>> {
>> int ret;
>> @@ -1684,10 +1683,11 @@ static int arm_smmu_attach_dev(struct iommu_domain
>> *domain, struct device *dev)
>>
>> static void arm_smmu_detach_dev(struct iommu_domain *domain, struct device
>> *dev)
>> {
>> + struct arm_smmu_domain *smmu_domain = domain->priv;
>> struct arm_smmu_master_cfg *cfg = find_smmu_master_cfg(dev);
>>
>> if (cfg)
>> - arm_smmu_master_free_smes(cfg);
>> + return arm_smmu_domain_remove_master(smmu_domain, cfg);
>>
>> }
>>
>> Regards,
>> Rahul
>
> Hello Rahul,
>
> For me, this patch fixed the issue with the GPU not probing after domain
> reboot.
Thanks for testing the patch.
> But not fixed the "Unexpected Global fault" that occasionally happens when
> destroying
> the domain with an actively working GPU. Although, I am not sure if this issue
> is relevant here.
Can you please if possible share the more details and logs so that I can look
if this issue is relevant here ?
Thanks in advance.
Regards,
Rahul
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |