[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


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Luca Fancellu <Luca.Fancellu@xxxxxxx>
  • Date: Wed, 19 Feb 2025 15:25:13 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5Wm5NzVlagE9VunbJNgABmclrs3CV+DbMwaQ1f9nzGY=; b=ogZeoGShZ2l5zuQPxaNt/628ZBXAkArojdQcwLeRh5eeGUJViREowppVZiMnUQoZ8ZJU50Mu8fT5/I8zViXLLZKAO5JPnCsSflFjchrt9XE1ouOyOo3NrixkbadNkA6vn4HV4RYT1GGXDmyjklLaO/lb4JpVJ0kdFrVqtU8Oo1MY08RtqsajVnJPXFu117AbRXuW/Fa/08eSUDk/HXuhaOrZ+ZQ0EjPdGyZvq3lL8FJqPq2V2z02WzSajrH7bFyCL4h+4WHxemNba+8eCTBi6UcAo5ERipdbFQi5tzmIjBVWkd38Aq008XvM0zKuJkf1NRBm7p+yVxFrikziP8AU3w==
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5Wm5NzVlagE9VunbJNgABmclrs3CV+DbMwaQ1f9nzGY=; b=totCxVqrYFexonbXbw1CJ4JduWSz+wZxsU8Kc9yP8xdcSKWjKUGMovI74Fvz8pcdPILoHcbidJJJ+s9aO2rLJX3qKDLNUwLgO11cO6z29Wg0uj/hpLclR34rrSeu84sbQIjKAsVp2iJG7393V3O99N8FWqfxmUBKkNs2ioc5g/C2dkhm0GnyEnAsOOWe+odhDPFCg07vbl8lXwQwKyWxvSj+FR4ORxzV6ymg8OBuZyJrRrZhjADiVB5ZWECTagXVZVXOVCrxOMx7SRHz84TPOr1ef6GTRcuNMcbk8DyjQijhnscSinfN8Kep5a9F626S5Qjc/at0QsycTEsuCWAvsA==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=P6IxgE8jHM/PcouFURzAzaX4RcDWJrNf97FFxmg4NX7trHDfK2RUyGkTgYcHClUeFLR7ln0w2+sem1VM336V9WnVjOJuj9bkzZHcli0EPC9ph5BD3eDymOHulxW5f9MxfWg5E3lAPNVTJjHHDgf/xtlidCiHTc1f5oBwhTFN+apP+5NIEzS4vQOQ72jmTtz0IbZhLmXaRZxDncKvxsMFOayqKWkRrbWQzsnk893sacx6aH+2Mt6UGpmmmsKoi4SDZ0yRan62C4ggblG3Ce0pDd+sef0Ik88YP1yC/sbx58/5adREdE/VTJv5N+iNP+xOvmc4YrmaVQiPqeybTMzw/Q==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wMOyqD8kF1rnXg7Mn9QsgUww/Cc4EcyArXpHdqwIx2D/QNiVTP7UtmZfdzE+mgdZfXRXRV0TEsN4/sBzK2iXjCEXjZ8hB+FFiH8fslbhHfAvFw3enBh5Bsizb6FOvOvQacKccoazKBSl/pSTzZI/e2w0San1Dnkh57Fjis173/164zwNVSKJWtyHsTn5BMOVYTOrh15RIuZAUzf3u/K+/HE4AQrKPaKGo2XgEmd5aHxNCt/VC7Ya+U/QogQLqC2WJZupbNkqLUgIbKxmkhtCumOXhKbvACL7cZRbkIngTnXKPEn/A+CVCmiOKLXKpEdFn3k6awDKwdMutG1+WDx35g==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Wed, 19 Feb 2025 15:25:46 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Thread-index: AQHbgeq9NiESuirZAUKjxGV4IoLUtLNOlIQAgAAFvICAAAbRgIAAH+aA
  • Thread-topic: [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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.