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

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


  • To: "Chen, Jiqian" <Jiqian.Chen@xxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Wed, 25 Jun 2025 10:36:57 +0200
  • Autocrypt: addr=jbeulich@xxxxxxxx; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL
  • 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>
  • Delivery-date: Wed, 25 Jun 2025 08:37:22 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 25.06.2025 08:51, Chen, Jiqian wrote:
> On 2025/6/24 18:08, Jan Beulich wrote:
>> On 24.06.2025 11:29, Chen, Jiqian wrote:
>>> On 2025/6/24 16:05, Jan Beulich wrote:
>>>> On 24.06.2025 10:02, Chen, Jiqian wrote:
>>>>> On 2025/6/20 14:38, Jan Beulich wrote:
>>>>>> On 19.06.2025 08:39, Chen, Jiqian wrote:
>>>>>>> On 2025/6/18 22:05, Jan Beulich wrote:
>>>>>>>> On 12.06.2025 11:29, Jiqian Chen wrote:
>>>>>>>>> @@ -29,9 +30,22 @@ typedef int vpci_register_init_t(struct pci_dev 
>>>>>>>>> *dev);
>>>>>>>>>   */
>>>>>>>>>  #define VPCI_MAX_VIRT_DEV       (PCI_SLOT(~0) + 1)
>>>>>>>>>  
>>>>>>>>> -#define REGISTER_VPCI_INIT(x, p)                \
>>>>>>>>> -  static vpci_register_init_t *const x##_entry  \
>>>>>>>>> -               __used_section(".data.vpci." p) = (x)
>>>>>>>>> +#define REGISTER_VPCI_CAPABILITY(cap, finit, fclean, ext) \
>>>>>>>>> +    static const vpci_capability_t finit##_t = { \
>>>>>>>>> +        .id = (cap), \
>>>>>>>>> +        .init = (finit), \
>>>>>>>>> +        .cleanup = (fclean), \
>>>>>>>>> +        .is_ext = (ext), \
>>>>>>>>> +    }; \
>>>>>>>>> +    static const vpci_capability_t *const finit##_entry  \
>>>>>>>>> +        __used_section(".data.rel.ro.vpci") = &finit##_t
>>>>>>>>
>>>>>>>> Could you remind me why the extra level of indirection is necessary 
>>>>>>>> here?
>>>>>>>> That is, why can't .data.rel.ro.vpci be an array of vpci_capability_t?
>>>>>>> You mean I should change to be:
>>>>>>> #define REGISTER_VPCI_CAPABILITY(cap, finit, fclean, ext) \
>>>>>>>     static const vpci_capability_t finit##_t \
>>>>>>>         __used_section(".data.rel.ro.vpci") = { \
>>>>>>>         .id = (cap), \
>>>>>>>         .init = (finit), \
>>>>>>>         .cleanup = (fclean), \
>>>>>>>         .is_ext = (ext), \
>>>>>>>     }
>>>>>>>
>>>>>>> Right?
>>>>>>
>>>>>> Yes, subject to the earlier comments on the identifier choice.
>>>>> Got it.
>>>>> One more question, if change to be that, then how should I modify the 
>>>>> definition of VPCI_ARRAY?
>>>>> Is POINTER_ALIGN still right?
>>>>
>>>> Yes. The struct doesn't require bigger alignment afaics. (In fact in 
>>>> principle
>>>> no alignment should need specifying there, except that this would require
>>>> keeping the section separate in the final image. Which I don't think we 
>>>> want.)
>>>>
>>>>> Since I encountered errors that the values of __start_vpci_array are not 
>>>>> right when I use them in vpci_init_capabilities().
>>>>
>>>> Details please.
>>> After changing __start_vpci_array to be vpci_capability_t array, codes will 
>>> be (maybe I modified wrong somewhere):
>>>
>>> diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c
>>> index c51bbb8abb19..9f2f438b4fdd 100644
>>> --- a/xen/drivers/vpci/vpci.c
>>> +++ b/xen/drivers/vpci/vpci.c
>>> @@ -36,8 +36,8 @@ struct vpci_register {
>>>  };
>>>
>>>  #ifdef __XEN__
>>> -extern const vpci_capability_t *const __start_vpci_array[];
>>> -extern const vpci_capability_t *const __end_vpci_array[];
>>> +extern vpci_capability_t __start_vpci_array[];
>>> +extern vpci_capability_t __end_vpci_array[];
>>
>> Just fyi: You lost const here.
>>
>>> @@ -255,7 +255,7 @@ static int vpci_init_capabilities(struct pci_dev *pdev)
>>>  {
>>>      for ( unsigned int i = 0; i < NUM_VPCI_INIT; i++ )
>>>      {
>>> -        const vpci_capability_t *capability = __start_vpci_array[i];
>>> +        const vpci_capability_t *capability = &__start_vpci_array[i];
>>>          const unsigned int cap = capability->id;
>>>          const bool is_ext = capability->is_ext;
>>>          int rc;
>>> diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
>>> index f4ec1c25922d..77750dd4131a 100644
>>> --- a/xen/include/xen/vpci.h
>>> +++ b/xen/include/xen/vpci.h
>>> @@ -31,14 +31,13 @@ typedef struct {
>>>  #define VPCI_MAX_VIRT_DEV       (PCI_SLOT(~0) + 1)
>>>
>>>  #define REGISTER_VPCI_CAPABILITY(cap, finit, fclean, ext) \
>>> -    static const vpci_capability_t finit##_t = { \
>>> +    static vpci_capability_t finit##_entry \
>>> +        __used_section(".data.rel.ro.vpci") = { \
>>>          .id = (cap), \
>>>          .init = (finit), \
>>>          .cleanup = (fclean), \
>>>          .is_ext = (ext), \
>>> -    }; \
>>> -    static const vpci_capability_t *const finit##_entry  \
>>> -        __used_section(".data.rel.ro.vpci") = &finit##_t
>>> +    }
>>>
>>>  #define REGISTER_VPCI_CAP(cap, finit, fclean) \
>>>      REGISTER_VPCI_CAPABILITY(cap, finit, fclean, false)
>>>
>>> I print the value of NUM_VPCI_INIT, it is a strange number 
>>> (6148914691236517209).
>>
>> What are the addresses of the two symbols __start_vpci_array and 
>> __end_vpci_array?
> __end_vpci_array is 0xffff82d0404251b8
> __start_vpci_array is 0xffff82d040425160
> NUM_VPCI_INIT is 0x5555555555555559
> sizeof(vpci_capability_t) is 0x18

Oh, of course - there's a psABI peculiarity that you run into here: Aggregates
larger than 8 bytes are required to have 16-byte alignment. Hence while
sizeof() == 0x18 and __alignof() == 8, the section contributions still are
accompanied by ".align 16", and thus respective padding is inserted by
assembler and linker. IOW you end up with two 32-byte entries and a trailing
24-byte one. The easiest (and least problematic going forward) approach to
deal with that is probably going to be to add __aligned(16) to the struct
decl. (Whether to limit this to just x86 I'm not sure: While other psABI-s may
be different in this regard, we may want to be on the safe side.)

However, there looks to be another (gcc) anomaly: By default, half-way recent
gcc aligns this kind of object even to 32-byte boundaries, due to defaulting
to -malign-data=compat. We will want to consider to use -malign-data=abi
instead (supported by gcc5 and newer). I'm in the process of preparing a patch
to propose this more formally.

Jan



 


Rackspace

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