|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 1/7] xen/arm: Improve readability of check for registered devices
On 6/7/23 03:27, Julien Grall wrote:
> Hi Stewart,
>
> On 07/06/2023 04:02, Stewart Hildebrand wrote:
>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
>>
>> Improve readability of check for devices already registered with the SMMU
>> with
>> legacy mmu-masters DT bindings by using is_protected.
>
> I am unconvinced with this change because...
>
>>
>> There are 2 device tree bindings for registering a device with the SMMU:
>> * mmu-masters (legacy, SMMUv1/2 only)
>> * iommus
>>
>> A device tree may include both mmu-masters and iommus properties (although
>> it is
>> unnecessary to do so). When a device appears in the mmu-masters list,
>> np->is_protected and dev->iommu_fwspec both get set by the SMMUv1/2 driver.
>> The
>> function iommu_add_dt_device() is subsequently invoked for devices that have
>> an
>> iommus specification.
>>
>> The check as it was before this patch:
>>
>> if ( dev_iommu_fwspec_get(dev) )
>> return 0;
>>
>> and the new check:
>>
>> if ( dt_device_is_protected(np) )
>> return 0;
>>
>> are guarding against the same corner case: when a device has both mmu-masters
>> and iommus specifications in the device tree. The is_protected naming is more
>> descriptive.
>>
>> If np->is_protected is not set (i.e. false), but dev->iommu_fwspec is set,
>> it is
>> an error condition, so return an error in this case.
>>
>> Expand the comment to further clarify the corner case.
>>
>> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
>> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
>> ---
>> v3->v4:
>> * new patch: this change was split from ("xen/arm: Move is_protected flag to
>> struct device")
>> ---
>> xen/drivers/passthrough/device_tree.c | 11 ++++++++---
>> 1 file changed, 8 insertions(+), 3 deletions(-)
>>
>> diff --git a/xen/drivers/passthrough/device_tree.c
>> b/xen/drivers/passthrough/device_tree.c
>> index 1c32d7b50cce..d9b63da7260a 100644
>> --- a/xen/drivers/passthrough/device_tree.c
>> +++ b/xen/drivers/passthrough/device_tree.c
>> @@ -141,12 +141,17 @@ int iommu_add_dt_device(struct dt_device_node *np)
>> return -EINVAL;
>>
>> /*
>> - * The device may already have been registered. As there is no harm in
>> - * it just return success early.
>> + * Devices that appear in the legacy mmu-masters list may have already
>> been
>> + * registered with the SMMU. In case a device has both a mmu-masters
>> entry
>> + * and iommus property, there is no need to register it again. In this
>> case
>> + * simply return success early.
>> */
>> - if ( dev_iommu_fwspec_get(dev) )
>> + if ( dt_device_is_protected(np) )
> ... we now have two checks and it implies that it would be normal for
> dt_device_is_protected() to be false and ...
>
>> return 0;
>>
>> + if ( dev_iommu_fwspec_get(dev) )
>
> ... this returning a non-zero value. Is there any other benefits with
> adding the two checks?
No, I can't think of any good rationale for the 2nd check. After splitting this
change from the other patch ("xen/arm: Move is_protected flag to struct
device"), I simply wanted to evaluate it on its own.
> If the others agree with the double check, then I think this should gain
> an ASSERT_UNREACHABLE() because AFAIU this is a programming error.
Right, if the 2nd check was justified, there should be an ASSERT_UNREACHABLE(),
good point. But I don't think the 2nd check is justified.
If the 2nd check is dropped (keeping only the is_protected check), then do you
think the change is justified?
>> + return -EEXIST;
>> +
>> /*
>> * According to the Documentation/devicetree/bindings/iommu/iommu.txt
>> * from Linux.
>
> Cheers,
>
> --
> Julien Grall
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |