* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-07-28 17:23 ` [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming Koichiro Den
@ 2026-07-28 17:38 ` sashiko-bot
2026-07-28 19:18 ` Frank Li
` (2 subsequent siblings)
3 siblings, 0 replies; 20+ messages in thread
From: sashiko-bot @ 2026-07-28 17:38 UTC (permalink / raw)
To: Koichiro Den; +Cc: ntb, linux-pci
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
Pre-existing issues:
- [High] An off-by-one loop initialization error in `epf_ntb_init_epc_bar()` leaves memory window BARs beyond the first one unassigned (`NO_BAR` or `-1`). This results in negative array indexing and out-of-bounds memory accesses when `epf_ntb_mw_bar_init()` and `vntb_epf_mw_set_trans()` index into `ntb->epf->bar[barno]`.
- [High] Missing NULL checks for `epc_features` returned by `pci_epc_get_features()`, leading to a kernel panic if the underlying EPC driver does not implement the `.get_features` callback.
- [High] The virtual PCI driver `vntb_pci_driver` lacks a `.remove` callback, resulting in resource leaks of the virtual PCI bus and Use-After-Free of the NTB device structures upon module unload or EPF unbind.
--
--- Patch [1]: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming ---
commit fc9ce298c179bf87e88da3f2964f2fbbd870806a
Author: Koichiro Den <den@valinux.co.jp>
PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
This commit updates vntb_epf_mw_set_trans() to pass the endpoint function's
own func_no and vfunc_no instead of hardcoded zeros when programming the
memory-window BAR. This ensures the BAR is correctly configured when the
virtual NTB endpoint function is bound to a function other than PF0.
> diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> index c3caec927d748..fba65abfb6b21 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> epf_bar->barno = barno;
> epf_bar->size = size;
[Severity: High]
This isn't a bug introduced by this patch, but is it possible for barno to
be -1 here, leading to an out-of-bounds write?
Looking at epf_ntb_init_epc_bar(), the loop iterating over optional memory
window BARs incorrectly starts from BAR_MW1 instead of BAR_MW2:
drivers/pci/endpoint/functions/pci-epf-vntb.c:epf_ntb_init_epc_bar() {
...
for (bar = BAR_MW1, i = 1; i < num_mws; bar++, i++) {
...
}
If a user configures num_mws > 1, this leaves BAR_MW2 unassigned (-1). Later,
when vntb_epf_mw_set_trans() is called for idx = 1, barno is evaluated as -1.
Will epf_bar = &ntb->epf->bar[barno] then access out of bounds and corrupt
memory?
> - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> + ntb->epf->vfunc_no, epf_bar);
> if (ret) {
> dev_err(dev, "failure set mw trans\n");
> return ret;
Also, while reviewing this file, I noticed a few other pre-existing issues:
[Severity: High]
This is a pre-existing issue, but how is the case where epc_features returns
NULL handled?
drivers/pci/endpoint/functions/pci-epf-vntb.c:epf_ntb_configure_interrupt() {
...
epc_features = pci_epc_get_features(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no);
if (!(epc_features->msix_capable || epc_features->msi_capable)) {
...
}
If the underlying EPC driver lacks the .get_features callback,
pci_epc_get_features() returns NULL, which would cause a NULL pointer
dereference here. A similar dereference happens in
epf_ntb_config_spad_bar_alloc().
[Severity: High]
This is a pre-existing issue, but does vntb_pci_driver intentionally omit a
.remove callback?
drivers/pci/endpoint/functions/pci-epf-vntb.c:
static struct pci_driver vntb_pci_driver = {
.name = "pci-vntb",
.id_table = pci_vntb_table,
.probe = pci_vntb_probe,
};
When epf_ntb_unbind() unregisters this driver:
drivers/pci/endpoint/functions/pci-epf-vntb.c:epf_ntb_unbind() {
...
pci_unregister_driver(&vntb_pci_driver);
}
Since there is no .remove callback, ntb_unregister_device() is never called to
clean up the virtual PCI bus and its associated devices. Could this lead to a
resource leak and dangling sysdata pointers upon module unload or EPF unbind?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260728172306.2751813-1-den@valinux.co.jp?part=1
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-07-28 17:23 ` [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming Koichiro Den
2026-07-28 17:38 ` sashiko-bot
@ 2026-07-28 19:18 ` Frank Li
2026-09-08 16:53 ` Bjorn Helgaas
2026-09-08 21:08 ` Bjorn Helgaas
3 siblings, 0 replies; 20+ messages in thread
From: Frank Li @ 2026-07-28 19:18 UTC (permalink / raw)
To: Koichiro Den
Cc: Manivannan Sadhasivam, Frank Li, Niklas Cassel,
Krzysztof Wilczyński, Kishon Vijay Abraham I, Bjorn Helgaas,
Jon Mason, Dave Jiang, Allen Hubbe, linux-pci, ntb, linux-kernel
On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> vntb_epf_mw_set_trans() programs the memory-window BAR through
> pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> lands on the wrong function whenever the vNTB EPF is bound to anything
> but PF0. The other BAR programming sites in the vNTB driver already pass
> the EPF's own numbers.
>
> Pass the EPF's own func_no/vfunc_no here as well.
>
> Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
> Signed-off-by: Koichiro Den <den@valinux.co.jp>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/pci/endpoint/functions/pci-epf-vntb.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> index c3caec927d74..fba65abfb6b2 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> epf_bar->barno = barno;
> epf_bar->size = size;
>
> - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> + ntb->epf->vfunc_no, epf_bar);
> if (ret) {
> dev_err(dev, "failure set mw trans\n");
> return ret;
> --
> 2.51.0
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-07-28 17:23 ` [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming Koichiro Den
2026-07-28 17:38 ` sashiko-bot
2026-07-28 19:18 ` Frank Li
@ 2026-09-08 16:53 ` Bjorn Helgaas
2026-09-09 2:01 ` Koichiro Den
2026-09-08 21:08 ` Bjorn Helgaas
3 siblings, 1 reply; 20+ messages in thread
From: Bjorn Helgaas @ 2026-09-08 16:53 UTC (permalink / raw)
To: Koichiro Den
Cc: Manivannan Sadhasivam, Frank Li, Niklas Cassel,
Krzysztof Wilczyński, Kishon Vijay Abraham I, Bjorn Helgaas,
Jon Mason, Dave Jiang, Allen Hubbe, linux-pci, ntb, linux-kernel
On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> vntb_epf_mw_set_trans() programs the memory-window BAR through
> pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> lands on the wrong function whenever the vNTB EPF is bound to anything
> but PF0. The other BAR programming sites in the vNTB driver already pass
> the EPF's own numbers.
>
> Pass the EPF's own func_no/vfunc_no here as well.
We're referring to these as "PF" and "VF" in the subject and "physical
endpoint function" and "virtual endpoint function" in the
pci_epc_set_bar() kernel-doc, but I don't think these have anything to
do with the SR-IOV PF and VF concepts, do they?
I don't have a better naming suggestion, but this is slightly
confusing.
> Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
> Signed-off-by: Koichiro Den <den@valinux.co.jp>
> ---
> drivers/pci/endpoint/functions/pci-epf-vntb.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> index c3caec927d74..fba65abfb6b2 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> epf_bar->barno = barno;
> epf_bar->size = size;
>
> - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> + ntb->epf->vfunc_no, epf_bar);
> if (ret) {
> dev_err(dev, "failure set mw trans\n");
> return ret;
> --
> 2.51.0
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-09-08 16:53 ` Bjorn Helgaas
@ 2026-09-09 2:01 ` Koichiro Den
2026-09-09 2:23 ` Bjorn Helgaas
0 siblings, 1 reply; 20+ messages in thread
From: Koichiro Den @ 2026-09-09 2:01 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Manivannan Sadhasivam, Frank Li, Niklas Cassel,
Krzysztof Wilczyński, Kishon Vijay Abraham I, Bjorn Helgaas,
Jon Mason, Dave Jiang, Allen Hubbe, linux-pci, ntb, linux-kernel
On Tue, Sep 08, 2026 at 11:53:15AM -0500, Bjorn Helgaas wrote:
> On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> > vntb_epf_mw_set_trans() programs the memory-window BAR through
> > pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> > lands on the wrong function whenever the vNTB EPF is bound to anything
> > but PF0. The other BAR programming sites in the vNTB driver already pass
> > the EPF's own numbers.
> >
> > Pass the EPF's own func_no/vfunc_no here as well.
>
> We're referring to these as "PF" and "VF" in the subject and "physical
> endpoint function" and "virtual endpoint function" in the
> pci_epc_set_bar() kernel-doc, but I don't think these have anything to
> do with the SR-IOV PF and VF concepts, do they?
Not in the specific case that motivated this series. But AFAICT, the EPC API
uses the same (func_no, vfunc_no) pair to cover both ordinary functions and
SR-IOV PFs/VFs scenarios. With vfunc_no == 0, func_no can identify either an
ordinary function or an SR-IOV PF. A non-zero vfunc_no identifies a VF
associated with the PF selected by func_no.
>
> I don't have a better naming suggestion, but this is slightly
> confusing.
Perhaps a better subject might be:
PCI: endpoint: pci-epf-vntb: Pass (func_no, vfunc_no) when programming BARs
Best regards,
Koichiro
>
> > Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
> > Signed-off-by: Koichiro Den <den@valinux.co.jp>
> > ---
> > drivers/pci/endpoint/functions/pci-epf-vntb.c | 3 ++-
> > 1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > index c3caec927d74..fba65abfb6b2 100644
> > --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> > epf_bar->barno = barno;
> > epf_bar->size = size;
> >
> > - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> > + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> > + ntb->epf->vfunc_no, epf_bar);
> > if (ret) {
> > dev_err(dev, "failure set mw trans\n");
> > return ret;
> > --
> > 2.51.0
> >
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-09-09 2:01 ` Koichiro Den
@ 2026-09-09 2:23 ` Bjorn Helgaas
2026-09-09 4:53 ` Koichiro Den
0 siblings, 1 reply; 20+ messages in thread
From: Bjorn Helgaas @ 2026-09-09 2:23 UTC (permalink / raw)
To: Koichiro Den
Cc: Manivannan Sadhasivam, Frank Li, Niklas Cassel,
Krzysztof Wilczyński, Kishon Vijay Abraham I, Bjorn Helgaas,
Jon Mason, Dave Jiang, Allen Hubbe, linux-pci, ntb, linux-kernel
On Wed, Sep 09, 2026 at 11:01:48AM +0900, Koichiro Den wrote:
> On Tue, Sep 08, 2026 at 11:53:15AM -0500, Bjorn Helgaas wrote:
> > On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> > > vntb_epf_mw_set_trans() programs the memory-window BAR through
> > > pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> > > lands on the wrong function whenever the vNTB EPF is bound to anything
> > > but PF0. The other BAR programming sites in the vNTB driver already pass
> > > the EPF's own numbers.
> > >
> > > Pass the EPF's own func_no/vfunc_no here as well.
> >
> > We're referring to these as "PF" and "VF" in the subject and "physical
> > endpoint function" and "virtual endpoint function" in the
> > pci_epc_set_bar() kernel-doc, but I don't think these have anything to
> > do with the SR-IOV PF and VF concepts, do they?
>
> Not in the specific case that motivated this series. But AFAICT, the EPC API
> uses the same (func_no, vfunc_no) pair to cover both ordinary functions and
> SR-IOV PFs/VFs scenarios. With vfunc_no == 0, func_no can identify either an
> ordinary function or an SR-IOV PF. A non-zero vfunc_no identifies a VF
> associated with the PF selected by func_no.
Now I'm even more confused :)
Are you saying that a non-zero vfunc_no always identifies an SR-IOV
VF? And there's some dependency on that? I don't any mention of
"iov" in drivers/pci/endpoint/.
> > I don't have a better naming suggestion, but this is slightly
> > confusing.
>
> Perhaps a better subject might be:
>
> PCI: endpoint: pci-epf-vntb: Pass (func_no, vfunc_no) when programming BARs
>
> Best regards,
> Koichiro
>
> >
> > > Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
> > > Signed-off-by: Koichiro Den <den@valinux.co.jp>
> > > ---
> > > drivers/pci/endpoint/functions/pci-epf-vntb.c | 3 ++-
> > > 1 file changed, 2 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > index c3caec927d74..fba65abfb6b2 100644
> > > --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> > > epf_bar->barno = barno;
> > > epf_bar->size = size;
> > >
> > > - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> > > + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> > > + ntb->epf->vfunc_no, epf_bar);
> > > if (ret) {
> > > dev_err(dev, "failure set mw trans\n");
> > > return ret;
> > > --
> > > 2.51.0
> > >
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-09-09 2:23 ` Bjorn Helgaas
@ 2026-09-09 4:53 ` Koichiro Den
2026-09-09 16:09 ` Bjorn Helgaas
0 siblings, 1 reply; 20+ messages in thread
From: Koichiro Den @ 2026-09-09 4:53 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Manivannan Sadhasivam, Frank Li, Niklas Cassel,
Krzysztof Wilczyński, Kishon Vijay Abraham I, Bjorn Helgaas,
Jon Mason, Dave Jiang, Allen Hubbe, linux-pci, ntb, linux-kernel
On Tue, Sep 08, 2026 at 09:23:11PM -0500, Bjorn Helgaas wrote:
> On Wed, Sep 09, 2026 at 11:01:48AM +0900, Koichiro Den wrote:
> > On Tue, Sep 08, 2026 at 11:53:15AM -0500, Bjorn Helgaas wrote:
> > > On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> > > > vntb_epf_mw_set_trans() programs the memory-window BAR through
> > > > pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> > > > lands on the wrong function whenever the vNTB EPF is bound to anything
> > > > but PF0. The other BAR programming sites in the vNTB driver already pass
> > > > the EPF's own numbers.
> > > >
> > > > Pass the EPF's own func_no/vfunc_no here as well.
> > >
> > > We're referring to these as "PF" and "VF" in the subject and "physical
> > > endpoint function" and "virtual endpoint function" in the
> > > pci_epc_set_bar() kernel-doc, but I don't think these have anything to
> > > do with the SR-IOV PF and VF concepts, do they?
> >
> > Not in the specific case that motivated this series. But AFAICT, the EPC API
> > uses the same (func_no, vfunc_no) pair to cover both ordinary functions and
> > SR-IOV PFs/VFs scenarios. With vfunc_no == 0, func_no can identify either an
> > ordinary function or an SR-IOV PF. A non-zero vfunc_no identifies a VF
> > associated with the PF selected by func_no.
>
> Now I'm even more confused :)
>
> Are you saying that a non-zero vfunc_no always identifies an SR-IOV
> VF? And there's some dependency on that? I don't any mention of
> "iov" in drivers/pci/endpoint/.
Yes, that is my understanding of the current in-tree implementation. You're
right that drivers/pci/endpoint/ itself contains no explicit reference to
SR-IOV. E.g. pci_epf_add_vepf() just calls it a "virtual EP function".
So my saying was kind of assumptive, but I still think the same because:
- The support was introduced for SR-IOV:
https://lore.kernel.org/r/20210819123343.1951-1-kishon@ti.com/
- The core rejects a non-zero vfunc_no unless the EPC provides max_vfs, and
Cadence is the only in-tree EPC driver I found that does so. For example,
cdns_pcie_ep_set_bar() calls cdns_pcie_get_fn_from_vfn(), which uses the
SR-IOV First VF Offset and VF Stride for a non-zero vfn.
Best regards,
Koichiro
>
> > > I don't have a better naming suggestion, but this is slightly
> > > confusing.
> >
> > Perhaps a better subject might be:
> >
> > PCI: endpoint: pci-epf-vntb: Pass (func_no, vfunc_no) when programming BARs
> >
> > Best regards,
> > Koichiro
> >
> > >
> > > > Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
> > > > Signed-off-by: Koichiro Den <den@valinux.co.jp>
> > > > ---
> > > > drivers/pci/endpoint/functions/pci-epf-vntb.c | 3 ++-
> > > > 1 file changed, 2 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > index c3caec927d74..fba65abfb6b2 100644
> > > > --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> > > > epf_bar->barno = barno;
> > > > epf_bar->size = size;
> > > >
> > > > - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> > > > + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> > > > + ntb->epf->vfunc_no, epf_bar);
> > > > if (ret) {
> > > > dev_err(dev, "failure set mw trans\n");
> > > > return ret;
> > > > --
> > > > 2.51.0
> > > >
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-09-09 4:53 ` Koichiro Den
@ 2026-09-09 16:09 ` Bjorn Helgaas
2026-09-10 4:56 ` Koichiro Den
0 siblings, 1 reply; 20+ messages in thread
From: Bjorn Helgaas @ 2026-09-09 16:09 UTC (permalink / raw)
To: Koichiro Den
Cc: Manivannan Sadhasivam, Frank Li, Niklas Cassel,
Krzysztof Wilczyński, Kishon Vijay Abraham I, Bjorn Helgaas,
Jon Mason, Dave Jiang, Allen Hubbe, linux-pci, ntb, linux-kernel
On Wed, Sep 09, 2026 at 01:53:53PM +0900, Koichiro Den wrote:
> On Tue, Sep 08, 2026 at 09:23:11PM -0500, Bjorn Helgaas wrote:
> > On Wed, Sep 09, 2026 at 11:01:48AM +0900, Koichiro Den wrote:
> > > On Tue, Sep 08, 2026 at 11:53:15AM -0500, Bjorn Helgaas wrote:
> > > > On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> > > > > vntb_epf_mw_set_trans() programs the memory-window BAR through
> > > > > pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> > > > > lands on the wrong function whenever the vNTB EPF is bound to anything
> > > > > but PF0. The other BAR programming sites in the vNTB driver already pass
> > > > > the EPF's own numbers.
> > > > >
> > > > > Pass the EPF's own func_no/vfunc_no here as well.
> > > >
> > > > We're referring to these as "PF" and "VF" in the subject and "physical
> > > > endpoint function" and "virtual endpoint function" in the
> > > > pci_epc_set_bar() kernel-doc, but I don't think these have anything to
> > > > do with the SR-IOV PF and VF concepts, do they?
> > >
> > > Not in the specific case that motivated this series. But AFAICT, the EPC API
> > > uses the same (func_no, vfunc_no) pair to cover both ordinary functions and
> > > SR-IOV PFs/VFs scenarios. With vfunc_no == 0, func_no can identify either an
> > > ordinary function or an SR-IOV PF. A non-zero vfunc_no identifies a VF
> > > associated with the PF selected by func_no.
> >
> > Now I'm even more confused :)
> >
> > Are you saying that a non-zero vfunc_no always identifies an SR-IOV
> > VF? And there's some dependency on that? I don't any mention of
> > "iov" in drivers/pci/endpoint/.
>
> Yes, that is my understanding of the current in-tree implementation. You're
> right that drivers/pci/endpoint/ itself contains no explicit reference to
> SR-IOV. E.g. pci_epf_add_vepf() just calls it a "virtual EP function".
> So my saying was kind of assumptive, but I still think the same because:
>
> - The support was introduced for SR-IOV:
> https://lore.kernel.org/r/20210819123343.1951-1-kishon@ti.com/
>
> - The core rejects a non-zero vfunc_no unless the EPC provides max_vfs, and
> Cadence is the only in-tree EPC driver I found that does so. For example,
> cdns_pcie_ep_set_bar() calls cdns_pcie_get_fn_from_vfn(), which uses the
> SR-IOV First VF Offset and VF Stride for a non-zero vfn.
Thanks, that's helpful. I still have to work hard to change my point
of view from host-side drivers to endpoint drivers operating on the
other end of the link. The fact that there are several interfaces
that need (func_no, vfunc_no) suggests that callers really do need to
understand what's going on, and maybe we should try to connect the
kernel-doc and abbreviations more closely with PCIe spec terms.
E.g., if "physical EP function" and "virtual EP function" refer to
SR-IOV PF and VF, maybe we should word them as "endpoint PF" or
"endpoint VF" (or "EP PF", "EP VF" for short). If
"pci_epf_add_vepf()" adds an SR-IOV VF, maybe "pci_epf_add_vf()" would
be descriptive enough. We already know we're on the endpoint because
of "epf", so we probably don't need another hint in "vepf", which
includes a "pf" that doesn't mean SR-IOV PF.
> > > > I don't have a better naming suggestion, but this is slightly
> > > > confusing.
> > >
> > > Perhaps a better subject might be:
> > >
> > > PCI: endpoint: pci-epf-vntb: Pass (func_no, vfunc_no) when programming BARs
> > >
> > > Best regards,
> > > Koichiro
> > >
> > > >
> > > > > Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
> > > > > Signed-off-by: Koichiro Den <den@valinux.co.jp>
> > > > > ---
> > > > > drivers/pci/endpoint/functions/pci-epf-vntb.c | 3 ++-
> > > > > 1 file changed, 2 insertions(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > > index c3caec927d74..fba65abfb6b2 100644
> > > > > --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > > +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > > @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> > > > > epf_bar->barno = barno;
> > > > > epf_bar->size = size;
> > > > >
> > > > > - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> > > > > + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> > > > > + ntb->epf->vfunc_no, epf_bar);
> > > > > if (ret) {
> > > > > dev_err(dev, "failure set mw trans\n");
> > > > > return ret;
> > > > > --
> > > > > 2.51.0
> > > > >
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-09-09 16:09 ` Bjorn Helgaas
@ 2026-09-10 4:56 ` Koichiro Den
2026-09-10 6:08 ` Manivannan Sadhasivam
0 siblings, 1 reply; 20+ messages in thread
From: Koichiro Den @ 2026-09-10 4:56 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Manivannan Sadhasivam, Frank Li, Niklas Cassel,
Krzysztof Wilczyński, Kishon Vijay Abraham I, Bjorn Helgaas,
Jon Mason, Dave Jiang, Allen Hubbe, linux-pci, ntb, linux-kernel
On Wed, Sep 09, 2026 at 11:09:49AM -0500, Bjorn Helgaas wrote:
> On Wed, Sep 09, 2026 at 01:53:53PM +0900, Koichiro Den wrote:
> > On Tue, Sep 08, 2026 at 09:23:11PM -0500, Bjorn Helgaas wrote:
> > > On Wed, Sep 09, 2026 at 11:01:48AM +0900, Koichiro Den wrote:
> > > > On Tue, Sep 08, 2026 at 11:53:15AM -0500, Bjorn Helgaas wrote:
> > > > > On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> > > > > > vntb_epf_mw_set_trans() programs the memory-window BAR through
> > > > > > pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> > > > > > lands on the wrong function whenever the vNTB EPF is bound to anything
> > > > > > but PF0. The other BAR programming sites in the vNTB driver already pass
> > > > > > the EPF's own numbers.
> > > > > >
> > > > > > Pass the EPF's own func_no/vfunc_no here as well.
> > > > >
> > > > > We're referring to these as "PF" and "VF" in the subject and "physical
> > > > > endpoint function" and "virtual endpoint function" in the
> > > > > pci_epc_set_bar() kernel-doc, but I don't think these have anything to
> > > > > do with the SR-IOV PF and VF concepts, do they?
> > > >
> > > > Not in the specific case that motivated this series. But AFAICT, the EPC API
> > > > uses the same (func_no, vfunc_no) pair to cover both ordinary functions and
> > > > SR-IOV PFs/VFs scenarios. With vfunc_no == 0, func_no can identify either an
> > > > ordinary function or an SR-IOV PF. A non-zero vfunc_no identifies a VF
> > > > associated with the PF selected by func_no.
> > >
> > > Now I'm even more confused :)
> > >
> > > Are you saying that a non-zero vfunc_no always identifies an SR-IOV
> > > VF? And there's some dependency on that? I don't any mention of
> > > "iov" in drivers/pci/endpoint/.
> >
> > Yes, that is my understanding of the current in-tree implementation. You're
> > right that drivers/pci/endpoint/ itself contains no explicit reference to
> > SR-IOV. E.g. pci_epf_add_vepf() just calls it a "virtual EP function".
> > So my saying was kind of assumptive, but I still think the same because:
> >
> > - The support was introduced for SR-IOV:
> > https://lore.kernel.org/r/20210819123343.1951-1-kishon@ti.com/
> >
> > - The core rejects a non-zero vfunc_no unless the EPC provides max_vfs, and
> > Cadence is the only in-tree EPC driver I found that does so. For example,
> > cdns_pcie_ep_set_bar() calls cdns_pcie_get_fn_from_vfn(), which uses the
> > SR-IOV First VF Offset and VF Stride for a non-zero vfn.
>
> Thanks, that's helpful. I still have to work hard to change my point
> of view from host-side drivers to endpoint drivers operating on the
> other end of the link. The fact that there are several interfaces
> that need (func_no, vfunc_no) suggests that callers really do need to
> understand what's going on, and maybe we should try to connect the
> kernel-doc and abbreviations more closely with PCIe spec terms.
>
> E.g., if "physical EP function" and "virtual EP function" refer to
> SR-IOV PF and VF, maybe we should word them as "endpoint PF" or
> "endpoint VF" (or "EP PF", "EP VF" for short). If
I personally agree. That sounds reasonable and would help clarify things.
> "pci_epf_add_vepf()" adds an SR-IOV VF, maybe "pci_epf_add_vf()" would
> be descriptive enough. We already know we're on the endpoint because
> of "epf", so we probably don't need another hint in "vepf", which
> includes a "pf" that doesn't mean SR-IOV PF.
True. But I'd also like to hear what the PCI EP maintainers think about this.
Best regards,
Koichiro
>
> > > > > I don't have a better naming suggestion, but this is slightly
> > > > > confusing.
> > > >
> > > > Perhaps a better subject might be:
> > > >
> > > > PCI: endpoint: pci-epf-vntb: Pass (func_no, vfunc_no) when programming BARs
> > > >
> > > > Best regards,
> > > > Koichiro
> > > >
> > > > >
> > > > > > Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
> > > > > > Signed-off-by: Koichiro Den <den@valinux.co.jp>
> > > > > > ---
> > > > > > drivers/pci/endpoint/functions/pci-epf-vntb.c | 3 ++-
> > > > > > 1 file changed, 2 insertions(+), 1 deletion(-)
> > > > > >
> > > > > > diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > > > index c3caec927d74..fba65abfb6b2 100644
> > > > > > --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > > > +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> > > > > > @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> > > > > > epf_bar->barno = barno;
> > > > > > epf_bar->size = size;
> > > > > >
> > > > > > - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> > > > > > + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> > > > > > + ntb->epf->vfunc_no, epf_bar);
> > > > > > if (ret) {
> > > > > > dev_err(dev, "failure set mw trans\n");
> > > > > > return ret;
> > > > > > --
> > > > > > 2.51.0
> > > > > >
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-09-10 4:56 ` Koichiro Den
@ 2026-09-10 6:08 ` Manivannan Sadhasivam
2026-09-10 8:26 ` Koichiro Den
0 siblings, 1 reply; 20+ messages in thread
From: Manivannan Sadhasivam @ 2026-09-10 6:08 UTC (permalink / raw)
To: Koichiro Den
Cc: Bjorn Helgaas, Frank Li, Niklas Cassel, Krzysztof Wilczyński,
Kishon Vijay Abraham I, Bjorn Helgaas, Jon Mason, Dave Jiang,
Allen Hubbe, linux-pci, ntb, linux-kernel
On Thu, Sep 10, 2026 at 01:56:53PM +0900, Koichiro Den wrote:
> On Wed, Sep 09, 2026 at 11:09:49AM -0500, Bjorn Helgaas wrote:
> > On Wed, Sep 09, 2026 at 01:53:53PM +0900, Koichiro Den wrote:
> > > On Tue, Sep 08, 2026 at 09:23:11PM -0500, Bjorn Helgaas wrote:
> > > > On Wed, Sep 09, 2026 at 11:01:48AM +0900, Koichiro Den wrote:
> > > > > On Tue, Sep 08, 2026 at 11:53:15AM -0500, Bjorn Helgaas wrote:
> > > > > > On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> > > > > > > vntb_epf_mw_set_trans() programs the memory-window BAR through
> > > > > > > pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> > > > > > > lands on the wrong function whenever the vNTB EPF is bound to anything
> > > > > > > but PF0. The other BAR programming sites in the vNTB driver already pass
> > > > > > > the EPF's own numbers.
> > > > > > >
> > > > > > > Pass the EPF's own func_no/vfunc_no here as well.
> > > > > >
> > > > > > We're referring to these as "PF" and "VF" in the subject and "physical
> > > > > > endpoint function" and "virtual endpoint function" in the
> > > > > > pci_epc_set_bar() kernel-doc, but I don't think these have anything to
> > > > > > do with the SR-IOV PF and VF concepts, do they?
> > > > >
> > > > > Not in the specific case that motivated this series. But AFAICT, the EPC API
> > > > > uses the same (func_no, vfunc_no) pair to cover both ordinary functions and
> > > > > SR-IOV PFs/VFs scenarios. With vfunc_no == 0, func_no can identify either an
> > > > > ordinary function or an SR-IOV PF. A non-zero vfunc_no identifies a VF
> > > > > associated with the PF selected by func_no.
> > > >
> > > > Now I'm even more confused :)
> > > >
> > > > Are you saying that a non-zero vfunc_no always identifies an SR-IOV
> > > > VF? And there's some dependency on that? I don't any mention of
> > > > "iov" in drivers/pci/endpoint/.
> > >
> > > Yes, that is my understanding of the current in-tree implementation. You're
> > > right that drivers/pci/endpoint/ itself contains no explicit reference to
> > > SR-IOV. E.g. pci_epf_add_vepf() just calls it a "virtual EP function".
> > > So my saying was kind of assumptive, but I still think the same because:
> > >
> > > - The support was introduced for SR-IOV:
> > > https://lore.kernel.org/r/20210819123343.1951-1-kishon@ti.com/
> > >
> > > - The core rejects a non-zero vfunc_no unless the EPC provides max_vfs, and
> > > Cadence is the only in-tree EPC driver I found that does so. For example,
> > > cdns_pcie_ep_set_bar() calls cdns_pcie_get_fn_from_vfn(), which uses the
> > > SR-IOV First VF Offset and VF Stride for a non-zero vfn.
> >
Your understanding is correct.
> > Thanks, that's helpful. I still have to work hard to change my point
> > of view from host-side drivers to endpoint drivers operating on the
> > other end of the link. The fact that there are several interfaces
> > that need (func_no, vfunc_no) suggests that callers really do need to
> > understand what's going on, and maybe we should try to connect the
> > kernel-doc and abbreviations more closely with PCIe spec terms.
> >
> > E.g., if "physical EP function" and "virtual EP function" refer to
> > SR-IOV PF and VF, maybe we should word them as "endpoint PF" or
> > "endpoint VF" (or "EP PF", "EP VF" for short). If
>
> I personally agree. That sounds reasonable and would help clarify things.
>
> > "pci_epf_add_vepf()" adds an SR-IOV VF, maybe "pci_epf_add_vf()" would
> > be descriptive enough. We already know we're on the endpoint because
> > of "epf", so we probably don't need another hint in "vepf", which
> > includes a "pf" that doesn't mean SR-IOV PF.
>
> True. But I'd also like to hear what the PCI EP maintainers think about this.
>
Fine with me.
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-09-10 6:08 ` Manivannan Sadhasivam
@ 2026-09-10 8:26 ` Koichiro Den
0 siblings, 0 replies; 20+ messages in thread
From: Koichiro Den @ 2026-09-10 8:26 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: Bjorn Helgaas, Frank Li, Niklas Cassel, Krzysztof Wilczyński,
Kishon Vijay Abraham I, Bjorn Helgaas, Jon Mason, Dave Jiang,
Allen Hubbe, linux-pci, ntb, linux-kernel
On Thu, Sep 10, 2026 at 08:08:10AM +0200, Manivannan Sadhasivam wrote:
> On Thu, Sep 10, 2026 at 01:56:53PM +0900, Koichiro Den wrote:
> > On Wed, Sep 09, 2026 at 11:09:49AM -0500, Bjorn Helgaas wrote:
> > > On Wed, Sep 09, 2026 at 01:53:53PM +0900, Koichiro Den wrote:
> > > > On Tue, Sep 08, 2026 at 09:23:11PM -0500, Bjorn Helgaas wrote:
> > > > > On Wed, Sep 09, 2026 at 11:01:48AM +0900, Koichiro Den wrote:
> > > > > > On Tue, Sep 08, 2026 at 11:53:15AM -0500, Bjorn Helgaas wrote:
> > > > > > > On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> > > > > > > > vntb_epf_mw_set_trans() programs the memory-window BAR through
> > > > > > > > pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> > > > > > > > lands on the wrong function whenever the vNTB EPF is bound to anything
> > > > > > > > but PF0. The other BAR programming sites in the vNTB driver already pass
> > > > > > > > the EPF's own numbers.
> > > > > > > >
> > > > > > > > Pass the EPF's own func_no/vfunc_no here as well.
> > > > > > >
> > > > > > > We're referring to these as "PF" and "VF" in the subject and "physical
> > > > > > > endpoint function" and "virtual endpoint function" in the
> > > > > > > pci_epc_set_bar() kernel-doc, but I don't think these have anything to
> > > > > > > do with the SR-IOV PF and VF concepts, do they?
> > > > > >
> > > > > > Not in the specific case that motivated this series. But AFAICT, the EPC API
> > > > > > uses the same (func_no, vfunc_no) pair to cover both ordinary functions and
> > > > > > SR-IOV PFs/VFs scenarios. With vfunc_no == 0, func_no can identify either an
> > > > > > ordinary function or an SR-IOV PF. A non-zero vfunc_no identifies a VF
> > > > > > associated with the PF selected by func_no.
> > > > >
> > > > > Now I'm even more confused :)
> > > > >
> > > > > Are you saying that a non-zero vfunc_no always identifies an SR-IOV
> > > > > VF? And there's some dependency on that? I don't any mention of
> > > > > "iov" in drivers/pci/endpoint/.
> > > >
> > > > Yes, that is my understanding of the current in-tree implementation. You're
> > > > right that drivers/pci/endpoint/ itself contains no explicit reference to
> > > > SR-IOV. E.g. pci_epf_add_vepf() just calls it a "virtual EP function".
> > > > So my saying was kind of assumptive, but I still think the same because:
> > > >
> > > > - The support was introduced for SR-IOV:
> > > > https://lore.kernel.org/r/20210819123343.1951-1-kishon@ti.com/
> > > >
> > > > - The core rejects a non-zero vfunc_no unless the EPC provides max_vfs, and
> > > > Cadence is the only in-tree EPC driver I found that does so. For example,
> > > > cdns_pcie_ep_set_bar() calls cdns_pcie_get_fn_from_vfn(), which uses the
> > > > SR-IOV First VF Offset and VF Stride for a non-zero vfn.
> > >
>
> Your understanding is correct.
>
> > > Thanks, that's helpful. I still have to work hard to change my point
> > > of view from host-side drivers to endpoint drivers operating on the
> > > other end of the link. The fact that there are several interfaces
> > > that need (func_no, vfunc_no) suggests that callers really do need to
> > > understand what's going on, and maybe we should try to connect the
> > > kernel-doc and abbreviations more closely with PCIe spec terms.
> > >
> > > E.g., if "physical EP function" and "virtual EP function" refer to
> > > SR-IOV PF and VF, maybe we should word them as "endpoint PF" or
> > > "endpoint VF" (or "EP PF", "EP VF" for short). If
> >
> > I personally agree. That sounds reasonable and would help clarify things.
> >
> > > "pci_epf_add_vepf()" adds an SR-IOV VF, maybe "pci_epf_add_vf()" would
> > > be descriptive enough. We already know we're on the endpoint because
> > > of "epf", so we probably don't need another hint in "vepf", which
> > > includes a "pf" that doesn't mean SR-IOV PF.
> >
> > True. But I'd also like to hear what the PCI EP maintainers think about this.
> >
>
> Fine with me.
All right, thanks for the comment. Sounds like a small refactoring task then.
I'll try to pick it up when I have got some spare cycles, unless someone gets to
it first.
Best regards,
Koichiro
>
> - Mani
>
> --
> மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming
2026-07-28 17:23 ` [PATCH 1/3] PCI: endpoint: pci-epf-vntb: Pass PF/VF number when BAR programming Koichiro Den
` (2 preceding siblings ...)
2026-09-08 16:53 ` Bjorn Helgaas
@ 2026-09-08 21:08 ` Bjorn Helgaas
3 siblings, 0 replies; 20+ messages in thread
From: Bjorn Helgaas @ 2026-09-08 21:08 UTC (permalink / raw)
To: Koichiro Den
Cc: Manivannan Sadhasivam, Frank Li, Niklas Cassel,
Krzysztof Wilczyński, Kishon Vijay Abraham I, Bjorn Helgaas,
Jon Mason, Dave Jiang, Allen Hubbe, linux-pci, ntb, linux-kernel
On Wed, Jul 29, 2026 at 02:23:04AM +0900, Koichiro Den wrote:
> vntb_epf_mw_set_trans() programs the memory-window BAR through
> pci_epc_set_bar() with hardcoded function numbers (0, 0), so the BAR
> lands on the wrong function whenever the vNTB EPF is bound to anything
> but PF0. The other BAR programming sites in the vNTB driver already pass
> the EPF's own numbers.
>
> Pass the EPF's own func_no/vfunc_no here as well.
>
> Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
> Signed-off-by: Koichiro Den <den@valinux.co.jp>
> ---
> drivers/pci/endpoint/functions/pci-epf-vntb.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> index c3caec927d74..fba65abfb6b2 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
> @@ -1427,7 +1427,8 @@ static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
> epf_bar->barno = barno;
> epf_bar->size = size;
>
> - ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
> + ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no,
> + ntb->epf->vfunc_no, epf_bar);
Thanks for this fix!
If anybody is bored, I think this file could be somewhat improved by
adding local "epf = ntb->epf" variables to reduce the repetition of
"ntb->epf", as epf_ntb_config_spad_bar_alloc() does.
Even then there's a lot of repetition, but I think much of it is there
to make room for the PRIMARY_INTERFACE/SECONDARY_INTERFACE stuff for
NTBs.
> if (ret) {
> dev_err(dev, "failure set mw trans\n");
> return ret;
> --
> 2.51.0
>
^ permalink raw reply [flat|nested] 20+ messages in thread