|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 08/11] xen/arm: Enable the existing x86 virtual PCI support for ARM.
Hi Jan,
As Rahul is on leave, I will answer you and make the changes needed.
> On 7 Oct 2021, at 14:43, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>
> On 06.10.2021 19:40, Rahul Singh wrote:
>> --- /dev/null
>> +++ b/xen/arch/arm/vpci.c
>> @@ -0,0 +1,102 @@
>> +/*
>> + * xen/arch/arm/vpci.c
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License as published by
>> + * the Free Software Foundation; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + */
>> +#include <xen/sched.h>
>> +
>> +#include <asm/mmio.h>
>> +
>> +#define REGISTER_OFFSET(addr) ( (addr) & 0x00000fff)
>
> Nit: Stray blank (like you had in an earlier version for MMCFG_BDF()).
> Also isn't this effectively part of the public interface (along with
> MMCFG_BDF()), alongside GUEST_VPCI_ECAM_{BASE,SIZE}?
I will move that in the next version to xen/pci.h and rename it
MMCFG_REG_OFFSET.
Would that be ok ?
>
>> +/* Do some sanity checks. */
>> +static bool vpci_mmio_access_allowed(unsigned int reg, unsigned int len)
>> +{
>> + /* Check access size. */
>> + if ( len > 8 )
>> + return false;
>
> struct hsr_dabt's size field doesn't allow len to be above 8. I could
> see that you may want to sanity check things, but that's not helpful
> if done incompletely. Elsewhere you assume the value to be non-zero,
> and ...
>
>> + /* Check that access is size aligned. */
>> + if ( (reg & (len - 1)) )
>
> ... right here you assume the value to be a power of 2. While I'm not
> a maintainer, I'd still like to suggest consistency: Do all pertinent
> checks or none of them (relying on the caller).
I will remove the check for len > 8 as dabt.size cannot have a value
greater than 3.
But I will have to introduce a check for len > 4 on 32 bit systems (see after).
>
> Independent of this - is bare metal Arm enforcing this same
> alignment restriction (unconditionally)? Iirc on x86 we felt we'd
> better synthesize misaligned accesses.
Unaligned IO access could be synthesise also on arm to but I would
rather not make such a change now without testing it (and there is
also a question of it making sense).
So if it is ok with you I will keep that check and discuss it with Rahul
when he is back. I will add a comment in the code to make that clear.
>
>> +static int vpci_mmio_read(struct vcpu *v, mmio_info_t *info,
>> + register_t *r, void *p)
>> +{
>> + unsigned int reg;
>> + pci_sbdf_t sbdf;
>> + unsigned long data = ~0UL;
>
> What use is this initializer? The error path further down doesn't
> forward the value into *r, and subsequently the value gets fully
> overwritten.
Right I will remove it.
>
>> + unsigned int size = 1U << info->dabt.size;
>> +
>> + sbdf.sbdf = MMCFG_BDF(info->gpa);
>
> This implies segment to be zero. While probably fine for now, I
> wonder if this wouldn't warrant a comment.
I will add the following comment just before:
/* We ignore segment part and always handle segment 0 */
>
>> + reg = REGISTER_OFFSET(info->gpa);
>> +
>> + if ( !vpci_mmio_access_allowed(reg, size) )
>> + return 0;
>> +
>> + data = vpci_read(sbdf, reg, min(4u, size));
>> + if ( size == 8 )
>> + data |= (uint64_t)vpci_read(sbdf, reg + 4, 4) << 32;
>
> Throughout this series I haven't been able to spot where the HAS_VPCI
> Kconfig symbol would get selected. Hence I cannot tell whether all of
> this is Arm64-specific. Otherwise I wonder whether size 8 actually
> can occur on Arm32.
Dabt.size could be 3 even on ARM32 but we should not allow 64bit
access on mmio regions on arm32.
So I will surround this code with ifdef CONFIG_ARM_64 and add a test
for len > 4 to prevent this case on 32bit.
To be completely right we should disable this also for 32bit guests but
this change would be a bit more invasive.
>
>> +static int vpci_mmio_write(struct vcpu *v, mmio_info_t *info,
>> + register_t r, void *p)
>> +{
>> + unsigned int reg;
>> + pci_sbdf_t sbdf;
>> + unsigned long data = r;
>
> A little like in the read function - what use is this local variable?
> Can't you use r directly?
We can and I will remove the data variable.
>
>> --- a/xen/drivers/passthrough/pci.c
>> +++ b/xen/drivers/passthrough/pci.c
>> @@ -766,6 +766,24 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn,
>> else
>> iommu_enable_device(pdev);
>
> Please note the context above; ...
>
>> +#ifdef CONFIG_ARM
>> + /*
>> + * On ARM PCI devices discovery will be done by Dom0. Add vpci handler
>> when
>> + * Dom0 inform XEN to add the PCI devices in XEN.
>> + */
>> + ret = vpci_add_handlers(pdev);
>> + if ( ret )
>> + {
>> + printk(XENLOG_ERR "setup of vPCI failed: %d\n", ret);
>> + pci_cleanup_msi(pdev);
>> + ret = iommu_remove_device(pdev);
>> + if ( pdev->domain )
>> + list_del(&pdev->domain_list);
>> + free_pdev(pseg, pdev);
>
> ... you unconditionally undo the if() part of the earlier conditional;
> is there any guarantee that the other path can't ever be taken, now
> and forever? If it can't be taken now (which I think is the case as
> long as Dom0 wouldn't report the same device twice), then at least some
> precaution wants taking. Maybe moving your addition into that if()
> could be an option.
>
> Furthermore I continue to wonder whether this ordering is indeed
> preferable over doing software setup before hardware arrangements. This
> would address the above issue as well as long as vpci_add_handlers() is
> idempotent. And it would likely simplify error cleanup.
I agree with you so I will move this code block before iommu part.
But digging deeper into this, I would have 2 questions:
- msi_cleanup was done there after a request from Stefano, but is not
done in case or iommu error, is there an issue to solve here ?
Same could also go for the free_pdev ?
- cleanup code was exactly the same as pci_remove_device code.
Should the question about the path also be checked there ?
Regards
Bertrand
>
> Jan
>
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |