|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 1/2] xen/passthrough: Provide stub functions when !HAS_PASSTHROUGH
> On 19 Feb 2025, at 13:30, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>
> On 19.02.2025 14:06, Luca Fancellu wrote:
>>> On 19 Feb 2025, at 12:45, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>>> On 18.02.2025 10:51, Luca Fancellu wrote:
>>>> --- a/xen/include/xen/iommu.h
>>>> +++ b/xen/include/xen/iommu.h
>>>> @@ -110,6 +110,8 @@ extern int8_t iommu_hwdom_reserved;
>>>>
>>>> extern unsigned int iommu_dev_iotlb_timeout;
>>>>
>>>> +#ifdef CONFIG_HAS_PASSTHROUGH
>>>> +
>>>> int iommu_setup(void);
>>>> int iommu_hardware_setup(void);
>>>>
>>>> @@ -122,6 +124,28 @@ int arch_iommu_domain_init(struct domain *d);
>>>> void arch_iommu_check_autotranslated_hwdom(struct domain *d);
>>>> void arch_iommu_hwdom_init(struct domain *d);
>>>>
>>>> +#else
>>>> +
>>>> +static inline int iommu_setup(void)
>>>> +{
>>>> + return -ENODEV;
>>>> +}
>>>> +
>>>> +static inline int iommu_domain_init(struct domain *d, unsigned int opts)
>>>> +{
>>>> + /*
>>>> + * When !HAS_PASSTHROUGH, iommu_enabled is set to false and the
>>>> expected
>>>> + * behaviour of this function is to return success in that case.
>>>> + */
>>>> + return 0;
>>>> +}
>>>
>>> Hmm. Would the function be anywhere near likely to do anything else than
>>> what it's expected to do? My original concern here was with "opts"
>>> perhaps asking for something that cannot be supported. But that was wrong
>>> thinking on my part. Here what you do is effectively open-code what the
>>> real iommu_domain_init() would do: Return success when !is_iommu_enabled().
>>> Which in turn follows from !iommu_enabled when !HAS_PASSTHROUGH.
>>>
>>> On that basis I'd be okay if the comment was dropped again. Else it imo
>>> wants re-wording to get closer to the explanation above.
>>
>> Would it be ok for you a comment saying:
>> “This stub returns the same as the real iommu_domain_init()
>> function: success when !is_iommu_enabled(), which value is based on
>> iommu_enabled
>> that is false when !HAS_PASSTHROUGH"
>
> I'm sorry, but this is too verbose for my taste. What's wrong with the more
> terse
>
> "Return as the real iommu_domain_init() would: Success when
> !is_iommu_enabled(), following from !iommu_enabled when !HAS_PASSTHROUGH"
>
> ?
nothing wrong, I’ll use that, thanks for confirming.
>
>>>> @@ -383,12 +429,12 @@ struct domain_iommu {
>>>> #define iommu_set_feature(d, f) set_bit(f, dom_iommu(d)->features)
>>>> #define iommu_clear_feature(d, f) clear_bit(f, dom_iommu(d)->features)
>>>>
>>>> +#ifdef CONFIG_HAS_PASSTHROUGH
>>>> /* Are we using the domain P2M table as its IOMMU pagetable? */
>>>> #define iommu_use_hap_pt(d) (IS_ENABLED(CONFIG_HVM) && \
>>>> dom_iommu(d)->hap_pt_share)
>>>>
>>>> /* Does the IOMMU pagetable need to be kept synchronized with the P2M */
>>>> -#ifdef CONFIG_HAS_PASSTHROUGH
>>>> #define need_iommu_pt_sync(d) (dom_iommu(d)->need_sync)
>>>>
>>>> int iommu_do_domctl(struct xen_domctl *domctl, struct domain *d,
>>>
>>> Coming back to my v2 comment: Why exactly is this change needed here? If
>>> things build fine without the macro being defined when !HAS_PASSTHROUGH,
>>> surely they will also build fine with it being defined?
>>
>> I’ve defined an empty stub on an header included only on MPU systems for the
>> p2m module, this is why it is building
>
> But that wasn't part of the patch, was it? I.e. with this series alone
> applied, things still don't build?
yes, before building there are other bits needed, this is only a small step
towards that.
>
>> I didn’t modify p2m_set_way_flush() which lives in arm common code, because
>> it will be used also on MPU systems (R82 has MPU at EL2 but MMU/MPU at EL1)
>> and I would like to stay the same and be used by MMU/MPU subsystems.
>>
>>> As per the
>>> respective revlog entry, this change looks to belong into whatever is
>>> going to be done to deal with the one Arm use of the macro. Or maybe
>>> it's unneeded altogether.
>>
>> I didn’t understand that you were opposing to protecting iommu_use_hap_pt()
>> when
>> !HAS_PASSTHROUGH, I thought you were referring only to the stub in the #else
>> branch.
>> Can I ask why?
>
> Sure. And no, I'm not against the extra protection. I'm against unnecessary
> code churn. That is, any such a re-arrangement wants to have some kind of
> justification.
ok, yes the justification is that MPU system will be built with
!HAS_PASSTHROUGH,
but there is a common function (p2m_set_way_flush) to MMU/MPU subsystem that
I would like to keep common, to do so I have to hide the macro in this
particular
configuration and afterwards I have two choices:
1) provide a stub implementation on the Arm side
2) provide a stub implementation in iommu.h
number 2 felt better because it could be applied on any Xen configuration
without
HAS_PASSTHROUGH, even if at the moment there is only MPU.
Number 1 let the possibility for the specific configuration to choose what to
do in absence
of HAS_PASSTHROUGH.
Now I would like your view on what would be acceptable here.
>
>> in any case when !HAS_PASSTHROUGH, this macro is not usable
>> since dom_iommu() is resolved to a membed that doesn’t exist in the
>> configuration,
>> am I missing something?
>
> You very likely aren't, yet the macro's presence also does no harm. We
> have lots of macros and declarations which are usable only in certain
> configurations. Sometimes this just happens to be that way, sometimes it's
> actually deliberate (e.g. to facilitate DCE).
Ok, in this particular case, as I explained above, this macro is one of the
thing preventing
Arm MPU side to build, otherwise I wouldn’t have touched it.
Cheers,
Luca
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |