| From b3d50c4e51c200a60d0873eb03ba9d7d105c96bd Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Jun 2021 17:32:36 +0200 |
| Subject: sfc: error code if SRIOV cannot be disabled |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Íñigo Huguet <ihuguet@redhat.com> |
| |
| [ Upstream commit 1ebe4feb8b442884f5a28d2437040096723dd1ea ] |
| |
| If SRIOV cannot be disabled during device removal or module unloading, |
| return error code so it can be logged properly in the calling function. |
| |
| Note that this can only happen if any VF is currently attached to a |
| guest using Xen, but not with vfio/KVM. Despite that in that case the |
| VFs won't work properly with PF removed and/or the module unloaded, I |
| have let it as is because I don't know what side effects may have |
| changing it, and also it seems to be the same that other drivers are |
| doing in this situation. |
| |
| In the case of being called during SRIOV reconfiguration, the behavior |
| hasn't changed because the function is called with force=false. |
| |
| Signed-off-by: Íñigo Huguet <ihuguet@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/sfc/ef10_sriov.c | 15 +++++++++++---- |
| 1 file changed, 11 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/sfc/ef10_sriov.c b/drivers/net/ethernet/sfc/ef10_sriov.c |
| index a5d28b0f75ba..84041cd587d7 100644 |
| --- a/drivers/net/ethernet/sfc/ef10_sriov.c |
| +++ b/drivers/net/ethernet/sfc/ef10_sriov.c |
| @@ -402,12 +402,17 @@ fail1: |
| return rc; |
| } |
| |
| +/* Disable SRIOV and remove VFs |
| + * If some VFs are attached to a guest (using Xen, only) nothing is |
| + * done if force=false, and vports are freed if force=true (for the non |
| + * attachedc ones, only) but SRIOV is not disabled and VFs are not |
| + * removed in either case. |
| + */ |
| static int efx_ef10_pci_sriov_disable(struct efx_nic *efx, bool force) |
| { |
| struct pci_dev *dev = efx->pci_dev; |
| - unsigned int vfs_assigned = 0; |
| - |
| - vfs_assigned = pci_vfs_assigned(dev); |
| + unsigned int vfs_assigned = pci_vfs_assigned(dev); |
| + int rc = 0; |
| |
| if (vfs_assigned && !force) { |
| netif_info(efx, drv, efx->net_dev, "VFs are assigned to guests; " |
| @@ -417,10 +422,12 @@ static int efx_ef10_pci_sriov_disable(struct efx_nic *efx, bool force) |
| |
| if (!vfs_assigned) |
| pci_disable_sriov(dev); |
| + else |
| + rc = -EBUSY; |
| |
| efx_ef10_sriov_free_vf_vswitching(efx); |
| efx->vf_count = 0; |
| - return 0; |
| + return rc; |
| } |
| |
| int efx_ef10_sriov_configure(struct efx_nic *efx, int num_vfs) |
| -- |
| 2.30.2 |
| |