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

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
Loading
Loading
Loading
Loading
+6 −36
Original line number Diff line number Diff line
@@ -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);
}