|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/arm: smmuv1: Set s2cr to type fault when the devices are deassigned
Hi Julien,
> On 9 Aug 2022, at 7:19 pm, Julien Grall <julien@xxxxxxx> wrote:
>
> Hi Rahul,
>
> title: The driver is for both smmuv1 and v2. Are you suggesting the issue
> only occurs on v1?
Issue occurs on both v1 & v2. I will fix this in next version.
>
> On 05/08/2022 16:43, Rahul Singh wrote:
>> When devices are deassigned/assigned, SMMU global fault is observed
>> because SMEs are freed in detach function and not allocated again when
>> the device is assigned back to the guest.
>> Don't free the SMEs when devices are deassigned, set the s2cr to type
>> fault. This way the SMMU will generate a fault if a DMA access is done
>> by a device not assigned to a guest
>> Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx>
>
> AFAICT, this is fixing 0435784cc75d ("xen/arm: smmuv1: Intelligent SMR
> allocation"). If I am correct, can you add a Fixes tag?
Yes, I will add the fixes tag.
>
>> ---
>> xen/drivers/passthrough/arm/smmu.c | 32 +++++++++++++++---------------
>> 1 file changed, 16 insertions(+), 16 deletions(-)
>> diff --git a/xen/drivers/passthrough/arm/smmu.c
>> b/xen/drivers/passthrough/arm/smmu.c
>> index 69511683b4..141948decd 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)
>
> IIUC, the function needs to be moved because you need to use
> arm_smmu_write_s2cr(). If so, I would suggest to mention in the commit
> message because at first it seems unwarranted.
Ack. I will add that in commit msg.
>
>> -{
>> - 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)
>> +{
>> + int i, idx;
>
> NIT: I would suggest to take the opportunity to switch to "unsigned int" and
> ...
Ack.
>
>> + struct arm_smmu_device *smmu = smmu_domain->smmu;
>> + struct arm_smmu_s2cr *s2cr = smmu->s2crs;
>> + struct iommu_fwspec *fwspec = arm_smmu_get_fwspec(cfg);
>
> ... use const here. "cfg" and "smmu" can't be consistent but "smmu_domain"
> technically could (thanks to how C works). That said, I quite dislike it as
> the code ends up to be confusing...
Ack.
>
>> +
>> + 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);
>
> Why are you using adding a 'return' here?
Not required. I will remove “return”.
Regards,
Rahul
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |