net: wwan: iosm: Remove unnecessary if_mutex lock
authorZhaoping Shu <zhaoping.shu@mediatek.com>
Thu, 3 Nov 2022 11:08:49 +0000 (19:08 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Nov 2022 09:38:04 +0000 (09:38 +0000)
These WWAN network interface operations (create/delete/open/close)
are already protected by RTNL lock, i.e., wwan_ops.newlink(),
wwan_ops.dellink(), net_device_ops.ndo_open() and
net_device.ndo_stop() are called with RTNL lock held.
Therefore, this patch removes the unnecessary if_mutex.

Signed-off-by: Zhaoping Shu <zhaoping.shu@mediatek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/wwan/iosm/iosm_ipc_wwan.c

index 0108d8d..4c9022a 100644 (file)
@@ -40,13 +40,11 @@ struct iosm_netdev_priv {
  * @ipc_imem:          Pointer to imem data-struct
  * @sub_netlist:       List of active netdevs
  * @dev:               Pointer device structure
- * @if_mutex:          Mutex used for add and remove interface id
  */
 struct iosm_wwan {
        struct iosm_imem *ipc_imem;
        struct iosm_netdev_priv __rcu *sub_netlist[IP_MUX_SESSION_END + 1];
        struct device *dev;
-       struct mutex if_mutex; /* Mutex used for add and remove interface id */
 };
 
 /* Bring-up the wwan net link */
@@ -55,14 +53,11 @@ static int ipc_wwan_link_open(struct net_device *netdev)
        struct iosm_netdev_priv *priv = wwan_netdev_drvpriv(netdev);
        struct iosm_wwan *ipc_wwan = priv->ipc_wwan;
        int if_id = priv->if_id;
-       int ret;
 
        if (if_id < IP_MUX_SESSION_START ||
            if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist))
                return -EINVAL;
 
-       mutex_lock(&ipc_wwan->if_mutex);
-
        /* get channel id */
        priv->ch_id = ipc_imem_sys_wwan_open(ipc_wwan->ipc_imem, if_id);
 
@@ -70,8 +65,7 @@ static int ipc_wwan_link_open(struct net_device *netdev)
                dev_err(ipc_wwan->dev,
                        "cannot connect wwan0 & id %d to the IPC mem layer",
                        if_id);
-               ret = -ENODEV;
-               goto out;
+               return -ENODEV;
        }
 
        /* enable tx path, DL data may follow */
@@ -80,10 +74,7 @@ static int ipc_wwan_link_open(struct net_device *netdev)
        dev_dbg(ipc_wwan->dev, "Channel id %d allocated to if_id %d",
                priv->ch_id, priv->if_id);
 
-       ret = 0;
-out:
-       mutex_unlock(&ipc_wwan->if_mutex);
-       return ret;
+       return 0;
 }
 
 /* Bring-down the wwan net link */
@@ -93,11 +84,9 @@ static int ipc_wwan_link_stop(struct net_device *netdev)
 
        netif_stop_queue(netdev);
 
-       mutex_lock(&priv->ipc_wwan->if_mutex);
        ipc_imem_sys_wwan_close(priv->ipc_wwan->ipc_imem, priv->if_id,
                                priv->ch_id);
        priv->ch_id = -1;
-       mutex_unlock(&priv->ipc_wwan->if_mutex);
 
        return 0;
 }
@@ -190,26 +179,17 @@ static int ipc_wwan_newlink(void *ctxt, struct net_device *dev,
        priv->netdev = dev;
        priv->ipc_wwan = ipc_wwan;
 
-       mutex_lock(&ipc_wwan->if_mutex);
-       if (rcu_access_pointer(ipc_wwan->sub_netlist[if_id])) {
-               err = -EBUSY;
-               goto out_unlock;
-       }
+       if (rcu_access_pointer(ipc_wwan->sub_netlist[if_id]))
+               return -EBUSY;
 
        err = register_netdevice(dev);
        if (err)
-               goto out_unlock;
+               return err;
 
        rcu_assign_pointer(ipc_wwan->sub_netlist[if_id], priv);
-       mutex_unlock(&ipc_wwan->if_mutex);
-
        netif_device_attach(dev);
 
        return 0;
-
-out_unlock:
-       mutex_unlock(&ipc_wwan->if_mutex);
-       return err;
 }
 
 static void ipc_wwan_dellink(void *ctxt, struct net_device *dev,
@@ -223,17 +203,12 @@ static void ipc_wwan_dellink(void *ctxt, struct net_device *dev,
                    if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist)))
                return;
 
-       mutex_lock(&ipc_wwan->if_mutex);
-
        if (WARN_ON(rcu_access_pointer(ipc_wwan->sub_netlist[if_id]) != priv))
-               goto unlock;
+               return;
 
        RCU_INIT_POINTER(ipc_wwan->sub_netlist[if_id], NULL);
        /* unregistering includes synchronize_net() */
        unregister_netdevice_queue(dev, head);
-
-unlock:
-       mutex_unlock(&ipc_wwan->if_mutex);
 }
 
 static const struct wwan_ops iosm_wwan_ops = {
@@ -324,12 +299,9 @@ struct iosm_wwan *ipc_wwan_init(struct iosm_imem *ipc_imem, struct device *dev)
        ipc_wwan->dev = dev;
        ipc_wwan->ipc_imem = ipc_imem;
 
-       mutex_init(&ipc_wwan->if_mutex);
-
        /* WWAN core will create a netdev for the default IP MUX channel */
        if (wwan_register_ops(ipc_wwan->dev, &iosm_wwan_ops, ipc_wwan,
                              IP_MUX_SESSION_DEFAULT)) {
-               mutex_destroy(&ipc_wwan->if_mutex);
                kfree(ipc_wwan);
                return NULL;
        }
@@ -342,7 +314,5 @@ void ipc_wwan_deinit(struct iosm_wwan *ipc_wwan)
        /* This call will remove all child netdev(s) */
        wwan_unregister_ops(ipc_wwan->dev);
 
-       mutex_destroy(&ipc_wwan->if_mutex);
-
        kfree(ipc_wwan);
 }