linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Add Multiple TX/RX Queues Support for WWAN Network Device
@ 2021-12-08  4:04 xiayu.zhang
  2021-12-09  1:53 ` Jakub Kicinski
  2021-12-09 23:11 ` Sergey Ryazanov
  0 siblings, 2 replies; 11+ messages in thread
From: xiayu.zhang @ 2021-12-08  4:04 UTC (permalink / raw)
  To: loic.poulain, ryazanov.s.a, davem, kuba
  Cc: johannes, netdev, linux-kernel, xiayu.zhang, haijun.liu,
	zhaoping.shu, hw.he, srv_heupstream, Xiayu Zhang

From: Xiayu Zhang <Xiayu.Zhang@mediatek.com>

This patch adds 2 callback functions get_num_tx_queues() and
get_num_rx_queues() to let WWAN network device driver customize its own
TX and RX queue numbers. It gives WWAN driver a chance to implement its
own software strategies, such as TX Qos.

Currently, if WWAN device driver creates default bearer interface when
calling wwan_register_ops(), there will be only 1 TX queue and 1 RX queue
for the WWAN network device. In this case, driver is not able to enlarge
the queue numbers by calling netif_set_real_num_tx_queues() or
netif_set_real_num_rx_queues() to take advantage of the network device's
capability of supporting multiple TX/RX queues.

As for additional interfaces of secondary bearers, if userspace service
doesn't specify the num_tx_queues or num_rx_queues in netlink message or
iproute2 command, there also will be only 1 TX queue and 1 RX queue for
each additional interface. If userspace service specifies the num_tx_queues
and num_rx_queues, however, these numbers could be not able to match the
capabilities of network device.

Besides, userspace service is hard to learn every WWAN network device's
TX/RX queue numbers.

In order to let WWAN driver determine the queue numbers, this patch adds
below callback functions in wwan_ops:
    struct wwan_ops {
        unsigned int priv_size;
        ...
        unsigned int (*get_num_tx_queues)(unsigned int hint_num);
        unsigned int (*get_num_rx_queues)(unsigned int hint_num);
    };

WWAN subsystem uses the input parameters num_tx_queues and num_rx_queues of
wwan_rtnl_alloc() as hint values, and passes the 2 values to the two
callback functions. WWAN device driver should determine the actual numbers
of network device's TX and RX queues according to the hint value and
device's capabilities.

Signed-off-by: Xiayu Zhang <Xiayu.Zhang@mediatek.com>
---
 drivers/net/wwan/wwan_core.c | 25 ++++++++++++++++++++++++-
 include/linux/wwan.h         |  6 ++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c
index d293ab688044..00095c6987be 100644
--- a/drivers/net/wwan/wwan_core.c
+++ b/drivers/net/wwan/wwan_core.c
@@ -823,6 +823,7 @@ static struct net_device *wwan_rtnl_alloc(struct nlattr *tb[],
 	struct wwan_device *wwandev = wwan_dev_get_by_name(devname);
 	struct net_device *dev;
 	unsigned int priv_size;
+	unsigned int num_txqs, num_rxqs;
 
 	if (IS_ERR(wwandev))
 		return ERR_CAST(wwandev);
@@ -833,9 +834,31 @@ static struct net_device *wwan_rtnl_alloc(struct nlattr *tb[],
 		goto out;
 	}
 
+	/* let wwan device driver determine TX queue number if it wants */
+	if (wwandev->ops->get_num_tx_queues) {
+		num_txqs = wwandev->ops->get_num_tx_queues(num_tx_queues);
+		if (num_txqs < 1 || num_txqs > 4096) {
+			dev = ERR_PTR(-EINVAL);
+			goto out;
+		}
+	} else {
+		num_txqs = num_tx_queues;
+	}
+
+	/* let wwan device driver determine RX queue number if it wants */
+	if (wwandev->ops->get_num_rx_queues) {
+		num_rxqs = wwandev->ops->get_num_rx_queues(num_rx_queues);
+		if (num_rxqs < 1 || num_rxqs > 4096) {
+			dev = ERR_PTR(-EINVAL);
+			goto out;
+		}
+	} else {
+		num_rxqs = num_rx_queues;
+	}
+
 	priv_size = sizeof(struct wwan_netdev_priv) + wwandev->ops->priv_size;
 	dev = alloc_netdev_mqs(priv_size, ifname, name_assign_type,
-			       wwandev->ops->setup, num_tx_queues, num_rx_queues);
+			       wwandev->ops->setup, num_txqs, num_rxqs);
 
 	if (dev) {
 		SET_NETDEV_DEV(dev, &wwandev->dev);
diff --git a/include/linux/wwan.h b/include/linux/wwan.h
index 9fac819f92e3..69c0af7ab6af 100644
--- a/include/linux/wwan.h
+++ b/include/linux/wwan.h
@@ -156,6 +156,10 @@ static inline void *wwan_netdev_drvpriv(struct net_device *dev)
  * @setup: set up a new netdev
  * @newlink: register the new netdev
  * @dellink: remove the given netdev
+ * @get_num_tx_queues: determine number of transmit queues
+ *                     to create when creating a new device.
+ * @get_num_rx_queues: determine number of receive queues
+ *                     to create when creating a new device.
  */
 struct wwan_ops {
 	unsigned int priv_size;
@@ -164,6 +168,8 @@ struct wwan_ops {
 		       u32 if_id, struct netlink_ext_ack *extack);
 	void (*dellink)(void *ctxt, struct net_device *dev,
 			struct list_head *head);
+	unsigned int (*get_num_tx_queues)(unsigned int hint_num);
+	unsigned int (*get_num_rx_queues)(unsigned int hint_num);
 };
 
 int wwan_register_ops(struct device *parent, const struct wwan_ops *ops,
-- 
2.17.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2021-12-17  8:06 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-08  4:04 [PATCH] Add Multiple TX/RX Queues Support for WWAN Network Device xiayu.zhang
2021-12-09  1:53 ` Jakub Kicinski
2021-12-09 23:11 ` Sergey Ryazanov
2021-12-13  6:06   ` Xiayu Zhang
2021-12-15  0:23     ` Sergey Ryazanov
2021-12-15  8:44       ` Xiayu Zhang
2021-12-15  9:29         ` Loic Poulain
2021-12-15 14:16         ` Sergey Ryazanov
2021-12-16 12:13           ` Xiayu Zhang
2021-12-16 12:39             ` Sergey Ryazanov
2021-12-17  8:05               ` Xiayu Zhang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).