[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 08:21:32 +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=l5UVuIO3GysN4/UXKgvCjZjnkTdTUFeB0S5qGCTMhdk=; b=aPkGvGNpvRvsSCTgN5zOiB6FHGyg3OP8t53lQ1sjJv96S1k0fDizefUluYm1yDVwOI8KhSfTv/LyyOx7BewuUmE3A5TXiPuEuqIK1XpOb9PbE2Es/Qe7VfB5qrr3/28qIQTFvs7hN61XzG64CnTXeRteSAjBIf+6WA3ebvXfRgIeXEAzUbgzFjZOUDF07u+pmYUahbz7VEkeef7C8SasdL9sC6OKNKPbVCM17uE52XPEWP/WvLhC7b3lDknxafn1bTFQSwlf873HCK4GfVREIcYDRRG6Mk3jjhCQiUAI/HmGf4ha6UeNXnEJlMuhvYxfTVoAeWFhATsxChojZaC9WA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GEZwC4aW4c6SQ0scYVaVVgmHvA2HLMvOtVIXCe2r4IUrVjtRb3aDspCY6DiD47tAFw/M9nkwE8bp1ROGu4ZpY5PQ3t5wLG3L5AhRYypZaKTYCnoZz4G4XLtELvc1Q1XcOm5ChTjKpvyqmbL0dluPlBCOA2rDjZFgXN7FpacLU2ziQgtc3PQnlipkMEpcU93x8LSnEoIku377+AL83q83XusjIHmiEGQsvlaSb5M8ZLeBNzWursquLw0jj3X5RL61TqxHFDSKuDYB6fJK7htdrBtR3x5II7UU7ipCCD5y5Cuzc8KkgTF0FY4aRbMFB6ceYhI74Y4zw0T2EOfwTTypjg==
  • 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 08:21:45 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHb23yakGdVC9XxvEWnYcnp8zrTt7QI/QAAgAGa9QCAAQzVgIAG5D6A//99hgCAAJwoAP//hioAgAHew4D//5oCgAASTfCA//+FrwCAAIi+gP//u5+AgAGwYID//8AMgIABfE8A//+xAYAAFS19AAAATX0A
  • Thread-topic: [PATCH v6 2/8] vpci: Refactor REGISTER_VPCI_INIT

On 2025/6/27 16:16, Chen, Jiqian wrote:
> 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
> Yes, I see.
> That's so strange.
> Even I do below also get the error message. But if open-code, it works.
> 
> diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
> index 51573baabc..350eb5f289 100644
> --- a/xen/include/xen/vpci.h
> +++ b/xen/include/xen/vpci.h
> @@ -13,12 +13,17 @@ 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);
> 
> +#ifdef __aligned
> +#undef __aligned
> +#define __aligned(a) __attribute__((__aligned__(a)))
> +#endif
Sorry, this should be under the end of the struct, then it works.
It seems __aligned is over-write?

> +
>  struct vpci_capability {
>      unsigned int id;
>      bool is_ext;
>      int (* const init)(struct pci_dev *pdev);
>      int (* const cleanup)(struct pci_dev *pdev);
> } __aligned(16);
> 
> 
> Anyway, I will wait for your patch merged.
> 
>>
>> 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.
>>
>>>> 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®.