Commit f9027f88 authored by Zhaoping Shu's avatar Zhaoping Shu Committed by David S. Miller

net: wwan: iosm: Remove unnecessary if_mutex lock

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: default avatarZhaoping Shu <zhaoping.shu@mediatek.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 668205b9
...@@ -40,13 +40,11 @@ struct iosm_netdev_priv { ...@@ -40,13 +40,11 @@ struct iosm_netdev_priv {
* @ipc_imem: Pointer to imem data-struct * @ipc_imem: Pointer to imem data-struct
* @sub_netlist: List of active netdevs * @sub_netlist: List of active netdevs
* @dev: Pointer device structure * @dev: Pointer device structure
* @if_mutex: Mutex used for add and remove interface id
*/ */
struct iosm_wwan { struct iosm_wwan {
struct iosm_imem *ipc_imem; struct iosm_imem *ipc_imem;
struct iosm_netdev_priv __rcu *sub_netlist[IP_MUX_SESSION_END + 1]; struct iosm_netdev_priv __rcu *sub_netlist[IP_MUX_SESSION_END + 1];
struct device *dev; struct device *dev;
struct mutex if_mutex; /* Mutex used for add and remove interface id */
}; };
/* Bring-up the wwan net link */ /* Bring-up the wwan net link */
...@@ -55,14 +53,11 @@ static int ipc_wwan_link_open(struct net_device *netdev) ...@@ -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_netdev_priv *priv = wwan_netdev_drvpriv(netdev);
struct iosm_wwan *ipc_wwan = priv->ipc_wwan; struct iosm_wwan *ipc_wwan = priv->ipc_wwan;
int if_id = priv->if_id; int if_id = priv->if_id;
int ret;
if (if_id < IP_MUX_SESSION_START || if (if_id < IP_MUX_SESSION_START ||
if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist)) if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist))
return -EINVAL; return -EINVAL;
mutex_lock(&ipc_wwan->if_mutex);
/* get channel id */ /* get channel id */
priv->ch_id = ipc_imem_sys_wwan_open(ipc_wwan->ipc_imem, if_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) ...@@ -70,8 +65,7 @@ static int ipc_wwan_link_open(struct net_device *netdev)
dev_err(ipc_wwan->dev, dev_err(ipc_wwan->dev,
"cannot connect wwan0 & id %d to the IPC mem layer", "cannot connect wwan0 & id %d to the IPC mem layer",
if_id); if_id);
ret = -ENODEV; return -ENODEV;
goto out;
} }
/* enable tx path, DL data may follow */ /* enable tx path, DL data may follow */
...@@ -80,10 +74,7 @@ static int ipc_wwan_link_open(struct net_device *netdev) ...@@ -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", dev_dbg(ipc_wwan->dev, "Channel id %d allocated to if_id %d",
priv->ch_id, priv->if_id); priv->ch_id, priv->if_id);
ret = 0; return 0;
out:
mutex_unlock(&ipc_wwan->if_mutex);
return ret;
} }
/* Bring-down the wwan net link */ /* Bring-down the wwan net link */
...@@ -93,11 +84,9 @@ static int ipc_wwan_link_stop(struct net_device *netdev) ...@@ -93,11 +84,9 @@ static int ipc_wwan_link_stop(struct net_device *netdev)
netif_stop_queue(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, ipc_imem_sys_wwan_close(priv->ipc_wwan->ipc_imem, priv->if_id,
priv->ch_id); priv->ch_id);
priv->ch_id = -1; priv->ch_id = -1;
mutex_unlock(&priv->ipc_wwan->if_mutex);
return 0; return 0;
} }
...@@ -190,26 +179,17 @@ static int ipc_wwan_newlink(void *ctxt, struct net_device *dev, ...@@ -190,26 +179,17 @@ static int ipc_wwan_newlink(void *ctxt, struct net_device *dev,
priv->netdev = dev; priv->netdev = dev;
priv->ipc_wwan = ipc_wwan; priv->ipc_wwan = ipc_wwan;
mutex_lock(&ipc_wwan->if_mutex); if (rcu_access_pointer(ipc_wwan->sub_netlist[if_id]))
if (rcu_access_pointer(ipc_wwan->sub_netlist[if_id])) { return -EBUSY;
err = -EBUSY;
goto out_unlock;
}
err = register_netdevice(dev); err = register_netdevice(dev);
if (err) if (err)
goto out_unlock; return err;
rcu_assign_pointer(ipc_wwan->sub_netlist[if_id], priv); rcu_assign_pointer(ipc_wwan->sub_netlist[if_id], priv);
mutex_unlock(&ipc_wwan->if_mutex);
netif_device_attach(dev); netif_device_attach(dev);
return 0; return 0;
out_unlock:
mutex_unlock(&ipc_wwan->if_mutex);
return err;
} }
static void ipc_wwan_dellink(void *ctxt, struct net_device *dev, 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, ...@@ -223,17 +203,12 @@ static void ipc_wwan_dellink(void *ctxt, struct net_device *dev,
if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist))) if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist)))
return; return;
mutex_lock(&ipc_wwan->if_mutex);
if (WARN_ON(rcu_access_pointer(ipc_wwan->sub_netlist[if_id]) != priv)) 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); RCU_INIT_POINTER(ipc_wwan->sub_netlist[if_id], NULL);
/* unregistering includes synchronize_net() */ /* unregistering includes synchronize_net() */
unregister_netdevice_queue(dev, head); unregister_netdevice_queue(dev, head);
unlock:
mutex_unlock(&ipc_wwan->if_mutex);
} }
static const struct wwan_ops iosm_wwan_ops = { 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) ...@@ -324,12 +299,9 @@ struct iosm_wwan *ipc_wwan_init(struct iosm_imem *ipc_imem, struct device *dev)
ipc_wwan->dev = dev; ipc_wwan->dev = dev;
ipc_wwan->ipc_imem = ipc_imem; ipc_wwan->ipc_imem = ipc_imem;
mutex_init(&ipc_wwan->if_mutex);
/* WWAN core will create a netdev for the default IP MUX channel */ /* WWAN core will create a netdev for the default IP MUX channel */
if (wwan_register_ops(ipc_wwan->dev, &iosm_wwan_ops, ipc_wwan, if (wwan_register_ops(ipc_wwan->dev, &iosm_wwan_ops, ipc_wwan,
IP_MUX_SESSION_DEFAULT)) { IP_MUX_SESSION_DEFAULT)) {
mutex_destroy(&ipc_wwan->if_mutex);
kfree(ipc_wwan); kfree(ipc_wwan);
return NULL; return NULL;
} }
...@@ -342,7 +314,5 @@ void ipc_wwan_deinit(struct iosm_wwan *ipc_wwan) ...@@ -342,7 +314,5 @@ void ipc_wwan_deinit(struct iosm_wwan *ipc_wwan)
/* This call will remove all child netdev(s) */ /* This call will remove all child netdev(s) */
wwan_unregister_ops(ipc_wwan->dev); wwan_unregister_ops(ipc_wwan->dev);
mutex_destroy(&ipc_wwan->if_mutex);
kfree(ipc_wwan); kfree(ipc_wwan);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment