[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] vpci: Add resizable bar support
On 2024/11/15 19:42, Roger Pau Monné wrote: > On Fri, Nov 15, 2024 at 03:04:22AM +0000, Chen, Jiqian wrote: >> On 2024/11/15 01:36, Roger Pau Monné wrote: >>> On Thu, Nov 14, 2024 at 04:52:18PM +0100, Roger Pau Monné wrote: >>>> On Thu, Nov 14, 2024 at 06:11:46AM +0000, Chen, Jiqian wrote: >>>>> On 2024/11/13 18:30, Roger Pau Monné wrote: >>>>>> On Wed, Nov 13, 2024 at 10:00:33AM +0000, Chen, Jiqian wrote: >>>>>>> On 2024/11/13 17:30, Roger Pau Monné wrote: >>>>>>>> On Wed, Nov 13, 2024 at 04:00:27PM +0800, Jiqian Chen wrote: >>>>>>>>> Some devices, like discrete GPU of amd, support resizable bar >>>>>>>>> capability, >>>>>>>>> but vpci of Xen doesn't support this feature, so they fail to resize >>>>>>>>> bars >>>>>>>>> and then cause probing failure. >>>>>>>>> >>>>>>>>> According to PCIe spec, each bar that support resizing has two >>>>>>>>> registers, >>>>>>>>> PCI_REBAR_CAP and PCI_REBAR_CTRL, so add these two registers and their >>>>>>>>> corresponding handler into vpci. >>>>>>>>> >>>>>>>>> PCI_REBAR_CAP is RO, only provide reading. >>>>>>>>> >>>>>>>>> PCI_REBAR_CTRL only has bar size is RW, so add write function to >>>>>>>>> support >>>>>>>>> setting the new size. >>>>>>>> >>>>>>>> I think the logic to handle resizable BAR could be much simpler. Some >>>>>>>> time ago I've made a patch to add support for it, but due to lack of >>>>>>>> hardware on my side to test it I've never submitted it. >>>>>>>> >>>>>>>> My approach would be to detect the presence of the >>>>>>>> PCI_EXT_CAP_ID_REBAR capability in init_header(), and if the >>>>>>>> capability is present force the sizing of BARs each time they are >>>>>>>> mapped in modify_bars(). I don't think we need to trap accesses to >>>>>>>> the capability itself, as resizing can only happen when memory >>>>>>>> decoding is not enabled for the device. It's enough to fetch the size >>>>>>>> of the BARs ahead of each enabling of memory decoding. >>>>>>>> >>>>>>>> Note that memory decoding implies mapping the BARs into the p2m, which >>>>>>>> is already an expensive operation, the extra sizing is unlikely to >>>>>>>> make much of a difference performance wise. >>>>>>>> >>>>>>>> I've found the following on my git tree and rebased on top of staging: >>>>>>> OK. >>>>>>> Do you need me to validate your patch in my environment? >>>>>> >>>>>> Yes please, I have no way to test it. Let's see what others think >>>>>> about the different approaches. >>>>> There are some errors with your method. >>>>> I attached the dmesg and xl dmesg logs. >>>>> From the dmesg logs, it seems that 0000:03:00.0 has addresse overlap with >>>>> 0000:03:00.1 >>>> >>>> Do you have the output of lspci with the BAR sizes/positions before >>>> and after the resizing? >>>> >>>>> >>>>> I think there is a place that needs to be modified regarding your method, >>>>> although this modification does not help with the above-mentioned errors, >>>>> it is that whether to support resizing is specific to which bar, rather >>>>> than just determining whether there is a Rebar capability. >>>> >>>> Do we really need such fine-grained information? It should be >>>> harmless (even if not strictly necessary) to size all BARs on the >>>> device before enabling memory decoding, even if some of them do not >>>> support resizing. >>>> >>>> I might have to provide a patch with additional messages to see what's >>>> going on. >>> >>> One nit that I've noticed with the patch I gave you previously is that >>> the check for a size change in modify_bars() should be done ahead of >>> pci_check_bar(), otherwise the check is possibly using an outdated >>> size. >>> >>> I've also added a debug message to notify when a BAR register is >>> written and report the new address. This is done unconditionally, but >>> if you think it's too chatty you can limit to only printing for the >>> device that has the ReBAR capability. >> Errors are the same. >> Attached the dmesg, xl dmesg, patch and lspci output. >> I will also continue to debug your method on my side to try to get some >> findings. > > Hello, > > I've been looking at the output, and it all seems fine, except the > 03:00.0 device that becomes broken at some point, note the lspci > output lists [virtual] next to the resource sizes. This means reading > for the registers returned 0, so the position and sizes are provided > from the internal OS information. > > I'm assuming the patch you sent to the list doesn't lead to such errors, Yes, the method of my patch doesn't lead to any errors. I attached the dmesg, xl dmesg and lspci logs of my method. > in which case I can only guess that fetching the size of the > BARs in modify_bars() causes issues with the device. > > To confirm this, can you try the following patch on top of your original > change? I tried below patch with my original patch, it didn't cause any errors. And the lspci showed without the "[virtual]". So, unfortunately, it is not related to the fetching size of Bars in modify_bars(). > This adds an extra pci_size_mem_bar() when the BARs > are resized. From my reading of the PCI specification sizing the BARs > after having changed the size through the ReBAR capability is allowed. > > Thanks, Roger. > > diff --git a/xen/drivers/vpci/rebar.c b/xen/drivers/vpci/rebar.c > index 84dbd84b0745..e371ba0ef92a 100644 > --- a/xen/drivers/vpci/rebar.c > +++ b/xen/drivers/vpci/rebar.c > @@ -40,6 +40,15 @@ static void cf_check rebar_ctrl_write(const struct pci_dev > *pdev, > PCI_REBAR_CTRL_BAR_UNIT; > > pci_conf_write32(pdev->sbdf, reg, val); > + > +{ > + uint64_t addr, size; > + > + pci_size_mem_bar(pdev->sbdf, PCI_BASE_ADDRESS_0 + index * 4, > + &addr, &size, 0); > + > + ASSERT(size == bars[index].size); > +} > } > > static int cf_check init_rebar(struct pci_dev *pdev) -- Best regards, Jiqian Chen. Attachment:
Jiqian_rebar_dmesg_and_lspci.txt Attachment:
Jiqian_rebar_xl_dmesg.txt
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |