[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v6 2/8] vpci: Refactor REGISTER_VPCI_INIT


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: "Chen, Jiqian" <Jiqian.Chen@xxxxxxx>
  • Date: Fri, 27 Jun 2025 09:00:07 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none
  • 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=ng7bzFTycB91qXQHKOQ6Tum/xoMGMFl/6PBet7blNgg=; b=h1g8qld+MmX6/XNPX6X/CL+u/TklGk8f+gpsRcHjfwTu77LcP2PUtwmS8luQTAMcpnE78s6eO6gPLzpORo3Et8h4oU1bkOUGhOD3KydKFAWrQFNnepXU8Moyk+dtFG+AI36Lc5uEMMSm44q9SA+htZISX+UrHUuw1Bm6DC4o0hhVt/0ouQZ+Fm17j84tuIsEv3ndJnToNMk7nT0qtH8ofM2v7hEZGJFLueui2TtDiL056lWGq2Qz+QQcviF56ioBQLSxhP0DAcwo2MoNsvAsFHkPaaHuGJH+PooHP/33vUaMW7aVdYjrjcu3XZMY3lkHdSKGL7JVfLUc2bP/xTOLUg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VAXVazLpoxyN50AYlogPPvvxNjCmH1mS90Y9TUykKDcz9KiuENIXqoM2GK2/j1EYvQTEwRaTkmNmP5ROO+HNCp4H5r1f3jOxz2lL1rB/SQkcdf0EaA1Wc8AoqGvw8mBQ7vbLvkQtO5OkaQmdE7pX8v2D8NkhG65uUO/OtnGFxD87XfutjoONhsA3HeF3VYg2g6agGxVBt1ZwN1KsuDbcc/GSIehpo/YKhryLmDESPvMaBy0rIJo2U/7F05Lity8fDjNVtiXPRs7MyTQSFLJ3SVh1meQ4k32kIsu1ZdqRe2mlTbIC75K1s3J5EoFvZHHv2R+NOHgFO/3mc0NBLRHcyA==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com;
  • Cc: Roger Pau Monné <roger.pau@xxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, "Orzel, Michal" <Michal.Orzel@xxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, "Huang, Ray" <Ray.Huang@xxxxxxx>, "Chen, Jiqian" <Jiqian.Chen@xxxxxxx>
  • Delivery-date: Fri, 27 Jun 2025 09:00:26 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHb23yakGdVC9XxvEWnYcnp8zrTt7QI/QAAgAGa9QCAAQzVgIAG5D6A//99hgCAAJwoAP//hioAgAHew4D//5oCgAASTfCA//+FrwCAAIi+gP//u5+AgAGwYID//8AMgIABfE8A//+xAYAAFslbAA==
  • Thread-topic: [PATCH v6 2/8] vpci: Refactor REGISTER_VPCI_INIT

On 2025/6/27 14:05, Jan Beulich wrote:
> On 27.06.2025 04:59, Chen, Jiqian wrote:
>> On 2025/6/26 20:06, Jan Beulich wrote:
>>> On 26.06.2025 10:03, Chen, Jiqian wrote:
>>>> On 2025/6/25 22:07, Jan Beulich wrote:
>>>>> On 25.06.2025 12:16, Chen, Jiqian wrote:
>>>>>> On 2025/6/25 18:03, Jan Beulich wrote:
>>>>>>> Also, as said - you will need to check whether other architectures are
>>>>>>> different from x86-64 in this regard. We better wouldn't leave a trap 
>>>>>>> here,
>>>>>>> for them to fall into when they enable vPCI support. I.e. my 
>>>>>>> recommendation
>>>>>>> would be that if in doubt, we put the __aligned() there unconditionally.
>>>
>>> Note how I used __aligned() here. Why would you ...
>>>
>>>>>> That's difficult for me to check on all different platforms since I 
>>>>>> don't have them all.
>>>>>
>>>>> You don't need to have them. You'd need to carefully go through the 
>>>>> respective
>>>>> section(s) of their psABI-s.
>>>>>
>>>>>> So you mean I should remove "#ifdef CONFIG_X86"? Just let __aligned(16) 
>>>>>> for all platforms?
>>>>>
>>>>> Yes. And, as also said, with a suitable comment please.
>>>> Ah, my comment definitely needs your change suggestion.
>>>> I wrote a draft as below:
>>>>
>>>> /*
>>>>  * Size of vpci_capability is lager than 8 bytes. When it is used as the 
>>>> entry
>>>>  * of __start_vpci_array in section, it is 16-byte aligned by assembler, 
>>>> that
>>>>  * causes the array length (__end_vpci_array - __start_vpci_array) wrong, 
>>>> so
>>>>  * force its definition to use 16-byte aligned here.
>>>>  */
>>>> struct vpci_capability {
>>>>     unsigned int id;
>>>>     bool is_ext;
>>>>     int (* init)(const struct pci_dev *pdev);
>>>>     int (* cleanup)(const struct pci_dev *pdev);
>>>> } __attribute__((aligned(16)));
>>>
>>> ... open-code that here?
>> That because when using __aligned() without CONFIG_X86, I got compile error
>> vpci.h:18:13: error: expected declaration specifiers or ‘...’ before numeric 
>> constant
>>    18 | } __aligned(16);
>>       |             ^~
>> I tried some methods, only open-code can fix it.
> 
> Well, that's odd. In e.g. xen/sched.h we have
> 
> struct domain
> {
>     ...
> } __aligned(PAGE_SIZE);
> 
> which clearly must be working fine. The error message from the compiler
> doesn't say very much alone. For informational diagnostics the compiler
> normally also emits may help, or else it would take looking at the
> pre-processed output to understand what's going on here.

I add some codes to print the macro __align, the codes are:

diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
index 51573baabc..8f6af1c822 100644
--- a/xen/include/xen/vpci.h
+++ b/xen/include/xen/vpci.h
@@ -13,12 +13,16 @@ typedef uint32_t vpci_read_t(const struct pci_dev *pdev, 
unsigned int reg,
 typedef void vpci_write_t(const struct pci_dev *pdev, unsigned int reg,
                           uint32_t val, void *data);

+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+#pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16)))
+
 struct vpci_capability {
     unsigned int id;
     bool is_ext;
     int (* init)(const struct pci_dev *pdev);
     int (* cleanup)(const struct pci_dev *pdev);
} __aligned(16);

The result are:

In file included from ./include/xen/sched.h:25,
                 from arch/x86/x86_64/asm-offsets.c:11:
./include/xen/vpci.h:18:9: note: ‘#pragma message: __aligned(16) expands to: 
__attribute__((__aligned__(16)))’
   18 | #pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16)))
      |         ^~~~~~~
In file included from ./include/xen/sched.h:25,
                 from drivers/vpci/vpci.c:20:
./include/xen/vpci.h:18:9: note: ‘#pragma message: __aligned(16) expands to: 
__attribute__((__aligned__(16)))’
   18 | #pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16)))
      |         ^~~~~~~
In file included from emul.h:88,
                 from vpci.c:18:
vpci.h:15:9: note: ‘#pragma message: __aligned(16) expands to: __aligned(16)’
   15 | #pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16)))
      |         ^~~~~~~
vpci.h:22:13: error: expected declaration specifiers or ‘...’ before numeric 
constant
   22 | } __aligned(16);
      |             ^~
In file included from emul.h:88,
                 from main.c:19:
vpci.h:15:9: note: ‘#pragma message: __aligned(16) expands to: __aligned(16)’
   15 | #pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16)))
      |         ^~~~~~~
vpci.h:22:13: error: expected declaration specifiers or ‘...’ before numeric 
constant
   22 | } __aligned(16);
      |             ^~
make[6]: *** [Makefile:18: test_vpci] Error 1
make[5]: *** [/home/cjq/code/upstream/xen/tools/tests/../../tools/Rules.mk:194: 
subdir-install-vpci] Error 2
make[4]: *** [/home/cjq/code/upstream/xen/tools/tests/../../tools/Rules.mk:189: 
subdirs-install] Error 2
make[3]: *** [/home/cjq/code/upstream/xen/tools/../tools/Rules.mk:194: 
subdir-install-tests] Error 2
make[2]: *** [/home/cjq/code/upstream/xen/tools/../tools/Rules.mk:189: 
subdirs-install] Error 2
make[1]: *** [Makefile:64: install] Error 2
make: *** [Makefile:147: install-tools] Error 2
make: *** Waiting for unfinished jobs....

> 
>>> As to the comment: First, it wants to be as close to what is being 
>>> commented as
>>> possible. Hence
>>>
>>> struct __aligned(16) vpci_capability {
>> This also got the compile error.
>>>
>>> is likely the better placement. Second, there's nothing here the assembler 
>>> does
>>> on its own. It's the compiler which does something (insert alignment 
>>> directives),
>>> and only to follow certain rules. (See "x86: don't have gcc over-align data"
>>> that I Cc-ed you on for some of the relevant aspects.) That is, you don't 
>>> want
>>> to "blame" any part of the tool chain, at least not where it's the 
>>> underlying
>>> ABI that mandates certain behavior. There's also no strong need to talk 
>>> about
>>> the specific effects that it would have if we didn't arrange things 
>>> properly.
>>> That is, talking about the effect on arrays in general is fine and helpful.
>>> Talking about __{start,end}_vpci_array imo is not.
>>>
>>> While further playing with the compiler, I noticed that adding __aligned(16)
>>> actually has a negative effect as long as that other patch isn't in use: The
>>> struct instances then are being aligned to even 32-byte boundaries (which 
>>> means
>>> __start_vpci_array would then also need aligning as much). When that other
>>> patch is in use, the __aligned() becomes unnecessary. Therefore I'm no 
>>> longer
>>> convinced using __aligned() is the best solution here.
>> Em, changing __start_vpci_array to be struct vpci_capability array cause 
>> those concerns, maybe keeping using struct pointer is a compromise method.
> 
> It would be a last resort, yes, but imo (a) we ought to strive to avoid
> unnecessary indirection and (b) the same underlying issue could become a
> problem elsewhere as well.
> 
> Jan

-- 
Best regards,
Jiqian Chen.

 


Rackspace

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