mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
net/liquidio: drop cached VF pci_dev LUT
The PF SR-IOV enable path caches VF pci_dev pointers in dpiring_to_vfpcidev_lut[] by iterating with pci_get_device(). Those entries do not own a reference, because the iterator drops the previous device reference on each step. The cached pointer is then dereferenced later when handling OCTEON_VF_FLR_REQUEST. Replace the cached VF mapping with runtime lookup on the mailbox DPI ring: derive the VF index from q_no, resolve the VF via exported PCI IOV helpers, validate it with the PF pointer and VF ID, then issue pcie_flr() and drop the reference with pci_dev_put(). Remove the unused VF lookup table initialization and cleanup. Fixes:ca6139ffc6("liquidio CN23XX: sysfs VF config support") Fixes:8c978d0592("liquidio CN23XX: Mailbox support") Signed-off-by: Yuho Choi <dbgh9129@gmail.com> Link: https://patch.msgid.link/20260701040847.1897845-1-dbgh9129@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
d9d6d67f4c
commit
5c0e3ba4f5
|
|
@ -3779,9 +3779,7 @@ static int setup_nic_devices(struct octeon_device *octeon_dev)
|
|||
static int octeon_enable_sriov(struct octeon_device *oct)
|
||||
{
|
||||
unsigned int num_vfs_alloced = oct->sriov_info.num_vfs_alloced;
|
||||
struct pci_dev *vfdev;
|
||||
int err;
|
||||
u32 u;
|
||||
|
||||
if (OCTEON_CN23XX_PF(oct) && num_vfs_alloced) {
|
||||
err = pci_enable_sriov(oct->pci_dev,
|
||||
|
|
@ -3794,23 +3792,6 @@ static int octeon_enable_sriov(struct octeon_device *oct)
|
|||
return err;
|
||||
}
|
||||
oct->sriov_info.sriov_enabled = 1;
|
||||
|
||||
/* init lookup table that maps DPI ring number to VF pci_dev
|
||||
* struct pointer
|
||||
*/
|
||||
u = 0;
|
||||
vfdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
|
||||
OCTEON_CN23XX_VF_VID, NULL);
|
||||
while (vfdev) {
|
||||
if (vfdev->is_virtfn &&
|
||||
(vfdev->physfn == oct->pci_dev)) {
|
||||
oct->sriov_info.dpiring_to_vfpcidev_lut[u] =
|
||||
vfdev;
|
||||
u += oct->sriov_info.rings_per_vf;
|
||||
}
|
||||
vfdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
|
||||
OCTEON_CN23XX_VF_VID, vfdev);
|
||||
}
|
||||
}
|
||||
|
||||
return num_vfs_alloced;
|
||||
|
|
@ -3818,8 +3799,6 @@ static int octeon_enable_sriov(struct octeon_device *oct)
|
|||
|
||||
static int lio_pci_sriov_disable(struct octeon_device *oct)
|
||||
{
|
||||
int u;
|
||||
|
||||
if (pci_vfs_assigned(oct->pci_dev)) {
|
||||
dev_err(&oct->pci_dev->dev, "VFs are still assigned to VMs.\n");
|
||||
return -EPERM;
|
||||
|
|
@ -3827,12 +3806,6 @@ static int lio_pci_sriov_disable(struct octeon_device *oct)
|
|||
|
||||
pci_disable_sriov(oct->pci_dev);
|
||||
|
||||
u = 0;
|
||||
while (u < MAX_POSSIBLE_VFS) {
|
||||
oct->sriov_info.dpiring_to_vfpcidev_lut[u] = NULL;
|
||||
u += oct->sriov_info.rings_per_vf;
|
||||
}
|
||||
|
||||
oct->sriov_info.num_vfs_alloced = 0;
|
||||
dev_info(&oct->pci_dev->dev, "oct->pf_num:%d disabled VFs\n",
|
||||
oct->pf_num);
|
||||
|
|
|
|||
|
|
@ -390,9 +390,6 @@ struct octeon_sriov_info {
|
|||
|
||||
struct lio_trusted_vf trusted_vf;
|
||||
|
||||
/*lookup table that maps DPI ring number to VF pci_dev struct pointer*/
|
||||
struct pci_dev *dpiring_to_vfpcidev_lut[MAX_POSSIBLE_VFS];
|
||||
|
||||
u64 vf_macaddr[MAX_POSSIBLE_VFS];
|
||||
|
||||
u16 vf_vlantci[MAX_POSSIBLE_VFS];
|
||||
|
|
|
|||
|
|
@ -26,6 +26,31 @@
|
|||
#include "octeon_mailbox.h"
|
||||
#include "cn23xx_pf_device.h"
|
||||
|
||||
static struct pci_dev *lio_vf_pci_dev_by_qno(struct octeon_device *oct, u32 q_no)
|
||||
{
|
||||
struct pci_dev *vfdev = NULL;
|
||||
int vfidx;
|
||||
|
||||
if (!oct->sriov_info.rings_per_vf)
|
||||
return NULL;
|
||||
|
||||
if (q_no % oct->sriov_info.rings_per_vf)
|
||||
return NULL;
|
||||
|
||||
vfidx = q_no / oct->sriov_info.rings_per_vf;
|
||||
if (vfidx >= oct->sriov_info.num_vfs_alloced)
|
||||
return NULL;
|
||||
|
||||
while ((vfdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
|
||||
OCTEON_CN23XX_VF_VID, vfdev))) {
|
||||
if (pci_physfn(vfdev) && pci_physfn(vfdev) == oct->pci_dev &&
|
||||
pci_iov_vf_id(vfdev) == vfidx)
|
||||
return vfdev;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* octeon_mbox_read:
|
||||
* @mbox: Pointer mailbox
|
||||
|
|
@ -237,6 +262,7 @@ static int octeon_mbox_process_cmd(struct octeon_mbox *mbox,
|
|||
struct octeon_mbox_cmd *mbox_cmd)
|
||||
{
|
||||
struct octeon_device *oct = mbox->oct_dev;
|
||||
struct pci_dev *vfdev;
|
||||
|
||||
switch (mbox_cmd->msg.s.cmd) {
|
||||
case OCTEON_VF_ACTIVE:
|
||||
|
|
@ -260,7 +286,12 @@ static int octeon_mbox_process_cmd(struct octeon_mbox *mbox,
|
|||
dev_info(&oct->pci_dev->dev,
|
||||
"got a request for FLR from VF that owns DPI ring %u\n",
|
||||
mbox->q_no);
|
||||
pcie_flr(oct->sriov_info.dpiring_to_vfpcidev_lut[mbox->q_no]);
|
||||
vfdev = lio_vf_pci_dev_by_qno(oct, mbox->q_no);
|
||||
if (!vfdev)
|
||||
break;
|
||||
|
||||
pcie_flr(vfdev);
|
||||
pci_dev_put(vfdev);
|
||||
break;
|
||||
|
||||
case OCTEON_PF_CHANGED_VF_MACADDR:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user