|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/3] xen/vpci: msix: move x86 specific code to x86 file
On 01.03.2022 14:34, Rahul Singh wrote:
>> On 24 Feb 2022, at 2:57 pm, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>>
>> On 15.02.2022 16:25, Rahul Singh wrote:
>>> vpci/msix.c file will be used for arm architecture when vpci msix
>>> support will be added to ARM, but there is x86 specific code in this
>>> file.
>>>
>>> Move x86 specific code to the x86/hvm/vmsi.c file to make sure common
>>> code will be used for other architecture.
>>
>> Could you provide some criteria by which code is considered x86-specific
>> (or not)? For example ...
>
> Code moved to x86 file is based on criteria that either the code will be
> unusable or will be different
> for ARM when MSIX support will be introduce for ARM.
That's a very abstract statement, which you can't really derive any
judgement from. It'll be necessary to see in how far the code is
indeed different. After all PCI, MSI, and MSI-X are largely arch-
agnostic.
>>> --- a/xen/arch/x86/hvm/vmsi.c
>>> +++ b/xen/arch/x86/hvm/vmsi.c
>>> @@ -925,4 +925,106 @@ int vpci_msix_arch_print(const struct vpci_msix *msix)
>>>
>>> return 0;
>>> }
>>> +
>>> +int vpci_make_msix_hole(const struct pci_dev *pdev)
>>> +{
>>> + struct domain *d = pdev->domain;
>>> + unsigned int i;
>>> +
>>> + if ( !pdev->vpci->msix )
>>> + return 0;
>>> +
>>> + /* Make sure there's a hole for the MSIX table/PBA in the p2m. */
>>> + for ( i = 0; i < ARRAY_SIZE(pdev->vpci->msix->tables); i++ )
>>> + {
>>> + unsigned long start = PFN_DOWN(vmsix_table_addr(pdev->vpci, i));
>>> + unsigned long end = PFN_DOWN(vmsix_table_addr(pdev->vpci, i) +
>>> + vmsix_table_size(pdev->vpci, i) - 1);
>>> +
>>> + for ( ; start <= end; start++ )
>>> + {
>>> + p2m_type_t t;
>>> + mfn_t mfn = get_gfn_query(d, start, &t);
>>> +
>>> + switch ( t )
>>> + {
>>> + case p2m_mmio_dm:
>>> + case p2m_invalid:
>>> + break;
>>> + case p2m_mmio_direct:
>>> + if ( mfn_x(mfn) == start )
>>> + {
>>> + clear_identity_p2m_entry(d, start);
>>> + break;
>>> + }
>>> + /* fallthrough. */
>>> + default:
>>> + put_gfn(d, start);
>>> + gprintk(XENLOG_WARNING,
>>> + "%pp: existing mapping (mfn: %" PRI_mfn
>>> + "type: %d) at %#lx clobbers MSIX MMIO area\n",
>>> + &pdev->sbdf, mfn_x(mfn), t, start);
>>> + return -EEXIST;
>>> + }
>>> + put_gfn(d, start);
>>> + }
>>> + }
>>> +
>>> + return 0;
>>> +}
>>
>> ... nothing in this function looks to be x86-specific, except maybe
>> functions like clear_identity_p2m_entry() may not currently be available
>> on Arm. But this doesn't make the code x86-specific.
>
> I will maybe be wrong but what I understand from the code is that for x86
> if there is no p2m entries setup for the region, accesses to them will be
> trapped
> into the hypervisor and can be handled by specific MMIO handler.
>
> But for ARM when we are registering the MMIO handler we have to provide
> the GPA also for the MMIO handler.
Question is: Is this just an effect resulting from different implementation,
or an inherent requirement? In the former case, harmonizing things may be an
alternative option.
> For ARM arch vpci_make_msix_hole() will be used to register the MMIO handler
> for the MSIX MMIO region.
>
> int vpci_make_msix_hole(const struct pci_dev *pdev)
> {
> struct vpci_msix *msix = pdev->vpci->msix;
> paddr_t addr,size;
>
> for ( int i = 0; msix && i < ARRAY_SIZE(msix->tables); i++ )
> {
>
> addr = vmsix_table_addr(pdev->vpci, i);
> size = vmsix_table_size(pdev->vpci, i) - 1;
>
> register_mmio_handler(pdev->domain, &vpci_msi_mmio_handler,
>
> addr, size, NULL);
>
> }
>
> return 0;
>
> }
>
> Therefore in this case there is difference how ARM handle this case.
>
>>
>>> +struct vpci_msix *vpci_msix_find(const struct domain *d, unsigned long
>>> addr)
>>> +{
>>> + struct vpci_msix *msix;
>>> +
>>> + list_for_each_entry ( msix, &d->arch.hvm.msix_tables, next )
>>> + {
>>> + const struct vpci_bar *bars = msix->pdev->vpci->header.bars;
>>> + unsigned int i;
>>> +
>>> + for ( i = 0; i < ARRAY_SIZE(msix->tables); i++ )
>>> + if ( bars[msix->tables[i] & PCI_MSIX_BIRMASK].enabled &&
>>> + VMSIX_ADDR_IN_RANGE(addr, msix->pdev->vpci, i) )
>>> + return msix;
>>> + }
>>> +
>>> + return NULL;
>>> +}
>>
>> Or take this one - I don't see anything x86-specific in here. The use
>> of d->arch.hvm merely points out that there may be a field which now
>> needs generalizing.
>
> Yes, you are right here I can avoid this change if I will introduce
> "struct list_head msix_tables" in "d->arch.hvm" for ARM also.
Wait - if you pass in the guest address at registration time, you
shouldn't have a need for a "find" function.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |