[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6 2/8] vpci: Refactor REGISTER_VPCI_INIT
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? At the first glance the changes above are what I would have expected. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |