[Intel-wired-lan] [next PATCH 3/5] fm10k: Cleanup exception handling for changing queues
Allan, Bruce W
bruce.w.allan at intel.com
Thu Oct 29 19:12:25 UTC 2015
> -----Original Message-----
> From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On
> Behalf Of Alexander Duyck
> Sent: Tuesday, October 27, 2015 4:59 PM
> To: intel-wired-lan at lists.osuosl.org
> Subject: [Intel-wired-lan] [next PATCH 3/5] fm10k: Cleanup exception
> handling for changing queues
>
> This patch is meant to cleanup the exception handling for the paths where
> we reset the interrupts and then reconfigure them. In all of these paths
> we had very different levels of exception handling. I have updated the
> driver so that all of the paths should result in a similar state if we
> fail.
>
> Specifically the driver will now unload the mailbox interrupt, free the
> queue vectors and MSI-X, and then detach the interface.
>
> In addition for any of the PCIe related resets I have added a check with
> the hw_ready function to just make sure the registers are in a readable
> state prior to reopening the interface.
>
> Signed-off-by: Alexander Duyck <aduyck at mirantis.com>
> ---
> drivers/net/ethernet/intel/fm10k/fm10k_netdev.c | 17 +++++--
> drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 55
> ++++++++++++++++++-----
> 2 files changed, 55 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
> b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
> index 38fe2d8c8388..4855686d2b4e 100644
> --- a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
> +++ b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
> @@ -1176,19 +1176,28 @@ int fm10k_setup_tc(struct net_device *dev, u8
> tc)
>
> err = fm10k_init_queueing_scheme(interface);
> if (err)
> - return err;
> + goto err_queueing_scheme;
>
> err = fm10k_mbx_request_irq(interface);
> if (err)
> - return err;
> + goto err_mbx_irq;
>
> - if (netif_running(dev))
> - fm10k_open(dev);
> + err = netif_running(dev) ? fm10k_open(dev) : 0;
> + if (err)
> + goto err_open;
>
> /* flag to indicate SWPRI has yet to be updated */
> interface->flags |= FM10K_FLAG_SWPRI_CONFIG;
>
> return 0;
> +err_open:
> + fm10k_mbx_free_irq(interface);
> +err_mbx_irq:
> + fm10k_clear_queueing_scheme(interface);
> +err_queueing_scheme:
> + netif_device_detach(dev);
> +
> + return err;
> }
>
> static int fm10k_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
> diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
> b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
> index 15327d274d72..7b33cddfc6be 100644
> --- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
> +++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
> @@ -185,7 +185,13 @@ static void fm10k_reinit(struct fm10k_intfc
> *interface)
> }
>
> /* reassociate interrupts */
> - fm10k_mbx_request_irq(interface);
> + err = fm10k_mbx_request_irq(interface);
> + if (err)
> + goto err_mbx_irq;
> +
> + err = fm10k_hw_ready(interface);
> + if (err)
> + goto err_open;
>
> /* update hardware address for VFs if perm_addr has changed */
> if (hw->mac.type == fm10k_mac_vf) {
> @@ -205,14 +211,23 @@ static void fm10k_reinit(struct fm10k_intfc
> *interface)
> /* reset clock */
> fm10k_ts_reset(interface);
>
> - if (netif_running(netdev))
> - fm10k_open(netdev);
> -
> + err = netif_running(netdev) ? fm10k_open(netdev) : 0;
> + if (err)
> + goto err_open;
> +
Jeff, the above blank-line separator line in Alex' original submission looks fine here but
in your next-queue tree dev-queue branch there is additional whitespace (2 tabs).
How did that happen?
> fm10k_iov_resume(interface->pdev);
>
> + rtnl_unlock();
> +
> + clear_bit(__FM10K_RESETTING, &interface->state);
> +
> + return;
> +err_open:
> + fm10k_mbx_free_irq(interface);
> +err_mbx_irq:
> + fm10k_clear_queueing_scheme(interface);
> reinit_err:
> - if (err)
> - netif_device_detach(netdev);
> + netif_device_detach(netdev);
>
> rtnl_unlock();
>
> @@ -2130,16 +2145,22 @@ static int fm10k_resume(struct pci_dev *pdev)
> rtnl_lock();
>
> err = fm10k_init_queueing_scheme(interface);
> - if (!err) {
> - fm10k_mbx_request_irq(interface);
> - if (netif_running(netdev))
> - err = fm10k_open(netdev);
> - }
> + if (err)
> + goto err_queueing_scheme;
>
> - rtnl_unlock();
> + err = fm10k_mbx_request_irq(interface);
> + if (err)
> + goto err_mbx_irq;
>
> + err = fm10k_hw_ready(interface);
> if (err)
> - return err;
> + goto err_open;
> +
> + err = netif_running(netdev) ? fm10k_open(netdev) : 0;
> + if (err)
> + goto err_open;
> +
Ditto here
> + rtnl_unlock();
>
> /* assume host is not ready, to prevent race with watchdog in case
> we
> * actually don't have connection to the switch
> @@ -2157,6 +2178,14 @@ static int fm10k_resume(struct pci_dev *pdev)
> netif_device_attach(netdev);
>
> return 0;
> +err_open:
> + fm10k_mbx_free_irq(interface);
> +err_mbx_irq:
> + fm10k_clear_queueing_scheme(interface);
> +err_queueing_scheme:
> + rtnl_unlock();
> +
> + return err;
> }
>
> /**
>
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan at lists.osuosl.org
> http://lists.osuosl.org/mailman/listinfo/intel-wired-lan
More information about the Intel-wired-lan
mailing list