]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gve: Fix use of netif_carrier_ok()
authorPraveen Kaligineedi <pkaligineedi@google.com>
Thu, 1 Aug 2024 20:56:19 +0000 (13:56 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Aug 2024 13:34:02 +0000 (15:34 +0200)
[ Upstream commit fba917b169bea5f8f2ee300e19d5f7a6341a5251 ]

GVE driver wrongly relies on netif_carrier_ok() to check the
interface administrative state when resources are being
allocated/deallocated for queue(s). netif_carrier_ok() needs
to be replaced with netif_running() for all such cases.

Administrative state is the result of "ip link set dev <dev>
up/down". It reflects whether the administrator wants to use
the device for traffic and the corresponding resources have
been allocated.

Fixes: 5f08cd3d6423 ("gve: Alloc before freeing when adjusting queues")
Signed-off-by: Praveen Kaligineedi <pkaligineedi@google.com>
Reviewed-by: Shailend Chand <shailend@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20240801205619.987396-1-pkaligineedi@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/google/gve/gve_ethtool.c
drivers/net/ethernet/google/gve/gve_main.c

index fe1741d482b4a0a9d4cb264319797f09f3ebd39c..cf816ede05f69067f5e2c82859d5d2cb57b60bc2 100644 (file)
@@ -492,7 +492,7 @@ static int gve_set_channels(struct net_device *netdev,
                return -EINVAL;
        }
 
-       if (!netif_carrier_ok(netdev)) {
+       if (!netif_running(netdev)) {
                priv->tx_cfg.num_queues = new_tx;
                priv->rx_cfg.num_queues = new_rx;
                return 0;
index cabf7d4bcecb8cd44cfa24acd6c9fa3fc40c9be1..8b14efd14a505506d352a8fd9dc20be82b5ad0c1 100644 (file)
@@ -1511,7 +1511,7 @@ static int gve_set_xdp(struct gve_priv *priv, struct bpf_prog *prog,
        u32 status;
 
        old_prog = READ_ONCE(priv->xdp_prog);
-       if (!netif_carrier_ok(priv->dev)) {
+       if (!netif_running(priv->dev)) {
                WRITE_ONCE(priv->xdp_prog, prog);
                if (old_prog)
                        bpf_prog_put(old_prog);
@@ -1784,7 +1784,7 @@ int gve_adjust_queues(struct gve_priv *priv,
        rx_alloc_cfg.qcfg = &new_rx_config;
        tx_alloc_cfg.num_rings = new_tx_config.num_queues;
 
-       if (netif_carrier_ok(priv->dev)) {
+       if (netif_running(priv->dev)) {
                err = gve_adjust_config(priv, &tx_alloc_cfg, &rx_alloc_cfg);
                return err;
        }
@@ -2001,7 +2001,7 @@ static int gve_set_features(struct net_device *netdev,
 
        if ((netdev->features & NETIF_F_LRO) != (features & NETIF_F_LRO)) {
                netdev->features ^= NETIF_F_LRO;
-               if (netif_carrier_ok(netdev)) {
+               if (netif_running(netdev)) {
                        err = gve_adjust_config(priv, &tx_alloc_cfg, &rx_alloc_cfg);
                        if (err) {
                                /* Revert the change on error. */
@@ -2290,7 +2290,7 @@ err:
 
 int gve_reset(struct gve_priv *priv, bool attempt_teardown)
 {
-       bool was_up = netif_carrier_ok(priv->dev);
+       bool was_up = netif_running(priv->dev);
        int err;
 
        dev_info(&priv->pdev->dev, "Performing reset\n");
@@ -2631,7 +2631,7 @@ static void gve_shutdown(struct pci_dev *pdev)
 {
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct gve_priv *priv = netdev_priv(netdev);
-       bool was_up = netif_carrier_ok(priv->dev);
+       bool was_up = netif_running(priv->dev);
 
        rtnl_lock();
        if (was_up && gve_close(priv->dev)) {
@@ -2649,7 +2649,7 @@ static int gve_suspend(struct pci_dev *pdev, pm_message_t state)
 {
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct gve_priv *priv = netdev_priv(netdev);
-       bool was_up = netif_carrier_ok(priv->dev);
+       bool was_up = netif_running(priv->dev);
 
        priv->suspend_cnt++;
        rtnl_lock();