|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 05/11] vpci: Refactor REGISTER_VPCI_INIT
On 2025/5/7 16:04, Roger Pau Monné wrote:
> On Wed, May 07, 2025 at 05:59:52AM +0000, Chen, Jiqian wrote:
>> On 2025/5/6 22:37, Roger Pau Monné wrote:
>>> On Mon, Apr 21, 2025 at 02:18:57PM +0800, Jiqian Chen wrote:
>>>>
>>>> + if ( !is_ext )
>>>> + pos = pci_find_cap_offset(pdev->sbdf, cap);
>>>> + else
>>>> + pos = pci_find_ext_capability(pdev->sbdf, cap);
>>>> +
>>>> + if ( !pos || !capability->init )
>>>
>>> Isn't it bogus to have a vpci_capability_t entry with a NULL init
>>> function?
>> Since I don't add fini_x() function for capabilities and also add check "if
>> ( capability->fini )" below,
>> so I add this NULL check here.
>> I will remove it if you think it is unnecessary.
>> Should I also remove the NULL check for fini?
>
> I think `fini` is fine to be NULL, but I don't see a case for `init`
> being NULL?
>
> Maybe I'm missing some use-case, but I expect capabilities will always
> need some kind of initialization (iow: setting up handlers) otherwise
> it's just a no-op.
Got it. I will just remove the check of init.
>
>>>> + if ( rc )
>>>> + return rc;
>>>> + }
>>>> +
>>>> + return 0;
>>>> +}
>>>> +
>>>> void vpci_deassign_device(struct pci_dev *pdev)
>>>> {
>>>> unsigned int i;
>>>> @@ -128,7 +158,6 @@ void vpci_deassign_device(struct pci_dev *pdev)
>>>>
>>>> int vpci_assign_device(struct pci_dev *pdev)
>>>> {
>>>> - unsigned int i;
>>>> const unsigned long *ro_map;
>>>> int rc = 0;
>>>>
>>>> @@ -159,14 +188,13 @@ int vpci_assign_device(struct pci_dev *pdev)
>>>> goto out;
>>>> #endif
>>>>
>>>> - for ( i = 0; i < NUM_VPCI_INIT; i++ )
>>>> - {
>>>> - rc = __start_vpci_array[i](pdev);
>>>> - if ( rc )
>>>> - break;
>>>> - }
>>>> + rc = vpci_init_header(pdev);
>>>> + if ( rc )
>>>> + goto out;
>>>> +
>>>> + rc = vpci_init_capabilities(pdev);
>>>>
>>>> - out: __maybe_unused;
>>>> + out:
>>>> if ( rc )
>>>> vpci_deassign_device(pdev);
>>>>
>>>> diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
>>>> index 9d47b8c1a50e..8e815b418b7d 100644
>>>> --- a/xen/include/xen/vpci.h
>>>> +++ b/xen/include/xen/vpci.h
>>>> @@ -13,11 +13,12 @@ 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);
>>>>
>>>> -typedef int vpci_register_init_t(struct pci_dev *dev);
>>>> -
>>>> -#define VPCI_PRIORITY_HIGH "1"
>>>> -#define VPCI_PRIORITY_MIDDLE "5"
>>>> -#define VPCI_PRIORITY_LOW "9"
>>>> +typedef struct {
>>>> + unsigned int id;
>>>> + bool is_ext;
>>>> + int (*init)(struct pci_dev *pdev);
>>>> + void (*fini)(struct pci_dev *pdev);
>>>> +} vpci_capability_t;
>>>>
>>>> #define VPCI_ECAM_BDF(addr) (((addr) & 0x0ffff000) >> 12)
>>>>
>>>> @@ -29,9 +30,20 @@ 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_CAP(cap, x, y, ext) \
>>>
>>> x and y are not very helpful identifier names, better use some more
>>> descriptive naming, init and fini? Same below.
>> init and fini seems not good. They are conflict with the hook name of below
>> vpci_capability_t.
>> Maybe init_func and fini_func ?
>
> Oh, I see. Can I recommend to name fields init and destroy or cleanup
> (instead of fini), and then use finit and fdestroy/fclean as macro
> parameters?
>
> I don't think it's common in Xen to name cleanup functions 'fini'. I
> understand this is a question of taste, it's mostly for coherence with
> the rest of the code base.
OK, will change to "init cleanup" and "finit fclean"
>
> Thanks, Roger.
--
Best regards,
Jiqian Chen.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |