Re: [PATCH 00/11] PCI/NTB: endpoint: packed vNTB memory windows
Randy Dunlap <[email protected]> Mon, 3 Aug 2026 16:00:45 -0700
| Newsgroups | dev.linux.lists.ntb,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci |
|---|---|
| Message-ID | <[email protected]> |
On 8/3/26 11:04 AM, Koichiro Den wrote: > Hi, > > vNTB currently spends one BAR per MW. BAR count therefore limits the > number of MWs, even when one BAR has room for several. A large BAR, > especially a Resizable BAR, can instead be split into logical MWs and > leave more BARs for config and doorbells. > > This series adds packed_mws, which exposes up to 16 equal-sized logical > MWs in one BAR. ntb_transport uses the new group operations to configure > them atomically. > > The immediate use case is increasing the number of ntb_transport queues. > The resulting performance gain is shown in the Testing section. > > Based on the latest pci/endpoint. > > > Why not BAR subrange mappings? > ============================== > > An earlier proposal used mwN_offset and BAR subrange mappings to place > independently backed MWs in one BAR: > > https://lore.kernel.org/r/[email protected]/ > > BAR subrange mapping is currently implemented only by DWC, and that > design still needs one hardware mapping per MW in each direction. This > series instead requires one contiguous backing range and maps the whole > group once in each direction. The initial implementation intentionally > trades arbitrary MW placement for a constant mapping count as the MW > count grows. More flexible layouts can be added when a concrete use > case requires them. > Hi, To be clear, this is totally outside of the scope of any PCI or NTB standards or specs? or did I overlook that part of the discussion? Thanks. > > Testing > ======= > > The packed data path was tested with ntb_transport and ntb_netdev. An > `iperf3 -ub0 -l 65482 -P 2` UDP saturation run produced the following > results when only one Resizable BAR was available for MWs: > > Configuration Receiver throughput > ---------------------------------------------- ------------------- > num_mws=1, packed_mws unset (default 0) 607 Mbits/sec > num_mws=2, packed_mws=2, combined channels=2 1.19 Gbits/sec > > Meanwhile, I realized that the in-tree ntb_test.sh does not fully pass > with the pci-epf-vntb/ntb_hw_epf setup on the base tree. I had to apply > a separate collection of local PCI endpoint and NTB fixes before this > setup could be used for regression testing. These fixes address > pre-existing issues and are not prerequisites of the packed MW > implementation. > > With packed_mws unset and ntb_msi_tests disabled, ntb_test.sh reported > the same pass/unsupported results before and after this series. One run > follows: > > $ sudo ./ntb_test.sh -r ${EP} -m 1048576 -p 28 0000:01:00.0 0001:10:00.0 > Starting ntb_tool tests... > Running port tests on: 0000:01:00.0 / 0001:10:00.0 > Local port 0 with index 0 on remote host > Peer port 0 with index 0 on local host > Passed > Running link tests on: 0000:01:00.0 / 0001:10:00.0 > Passed > Running link tests on: 0001:10:00.0 / 0000:01:00.0 > Passed > Running db tests on: 0000:01:00.0 / 0001:10:00.0 > Passed > Running db tests on: 0001:10:00.0 / 0000:01:00.0 > Passed > Running spad tests on: 0000:01:00.0 / 0001:10:00.0 > Passed > Running spad tests on: 0001:10:00.0 / 0000:01:00.0 > Passed > Running msg tests on: 0000:01:00.0 / 0001:10:00.0 > Unsupported > Running msg tests on: 0001:10:00.0 / 0000:01:00.0 > Unsupported > Running mw0 tests on: 0000:01:00.0 / 0001:10:00.0 > Passed > Running mw0 tests on: 0001:10:00.0 / 0000:01:00.0 > Passed > > Starting ntb_pingpong tests... > Running ping pong tests on: 0000:01:00.0 / 0001:10:00.0 > Passed > > Starting ntb_perf tests... > Running local perf test without DMA > Peer 0 test statistics: > 0: copied 268435456 bytes in 137063 usecs, 1958 MBytes/s > Passed > Running remote perf test without DMA > Peer 0 test statistics: > 0: copied 268435456 bytes in 139188 usecs, 1928 MBytes/s > Passed > > For comparison, the before-series run reported 1997 MBytes/s locally > and 1950 MBytes/s remotely. No obvious regression was seen in this > single-run comparison. > > > Control layout compatibility > ============================ > > The endpoint selects the control layout. Non-packed pci-epf-vntb keeps > the version 0 layout. packed_mws selects version 1. "Old" and "new" > below mean ntb_hw_epf without and with this series. > > EP configuration Old ntb_hw_epf New ntb_hw_epf > ---------------- ------------------------ ------------------------ > non-packed (v0) Supported Supported > packed (v1) Not supported [1] Supported > > [1] The old driver accepts two or four MWs but looks for a separate BAR > for each MW. It rejects larger MW counts at probe. > > > Packed MW compatibility with in-tree NTB clients > ================================================ > > The in-tree clients handle a packed MW group as follows: > > Client Behavior > -------------- ------------------------------------------------------ > ntb_transport Uses group operations. Without a singleton MW, MSI > mode falls back to doorbells. > ntb_perf Rejects a non-singleton MW group at probe. > ntb_tool Loads normally. Per-MW inbound translation setup > returns -EOPNOTSUPP for a non-singleton group. > Doorbell and scratchpad access is unaffected. > ntb_msi_test Fails probe unless the MW reserved for MSI is a > singleton. > ntb_pingpong Does not use MWs and is unaffected. > > Further client support can be added separately when needed. A final > singleton MW on another BAR can also be added later if MSI mode is needed > with packed MWs. > > > Notes > ===== > > * About pci-epf-ntb: > > pci-epf-ntb remains on the legacy version 0 layout; this series does > not add version 1 layout support to it. A pci-epf-ntb bridge should > therefore keep its existing behavior even when its nodes run a mix of > old and new kernels. I do not have hardware for the pci-epf-ntb bridge > topology. > > * About existing inbound MW clear behavior: > > pci-epf-vntb already leaves the inbound BAR mapping in place when an > MW translation is cleared. This series keeps that behavior for packed > MWs. This limitation is independent of packing. > > pci_epc_clear_bar() is not suitable here because it can clear the BAR > address assigned by the host. An EPF can instead restore a persistent > fallback mapping with pci_epc_set_bar(), as pci-epf-test does: > > https://lore.kernel.org/r/[email protected]/ > > pci-epf-vntb has no such fallback mapping today. Adding one, or an EPC > operation to unmap only the inbound translation, should be separate > work. > > Best regards, > Koichiro > > > Koichiro Den (11): > NTB: Add atomic MW translation group operations > NTB: epf: Parse a versioned packed MW layout > PCI: endpoint: pci-epf-vntb: Add packed MW layout handling > PCI: endpoint: pci-epf-vntb: Implement MW group translation callbacks > PCI: endpoint: pci-epf-vntb: Allocate packed outbound MW space > PCI: endpoint: pci-epf-vntb: Add outbound MW group commands > NTB: epf: Implement MW group translation callbacks > NTB: perf: Reject grouped memory windows > NTB/msi: Require a singleton memory window > NTB: ntb_transport: Use atomic MW translation groups > PCI: endpoint: pci-epf-vntb: Expose packed MWs through configfs > > Documentation/PCI/endpoint/pci-vntb-howto.rst | 16 +- > drivers/ntb/hw/epf/ntb_hw_epf.c | 143 +++++- > drivers/ntb/msi.c | 19 +- > drivers/ntb/ntb_transport.c | 127 +++++- > drivers/ntb/test/ntb_perf.c | 16 +- > drivers/pci/endpoint/functions/pci-epf-vntb.c | 423 ++++++++++++++++-- > include/linux/ntb.h | 133 +++++- > 7 files changed, 801 insertions(+), 76 deletions(-) > -- ~Randy