Skip to contentSkip to conversation

virtio_net: ethtool tx napi configuration

PATCH Applied Jason Wang 2 participants 5 messages Oct 9, 2018 – Oct 11, 2018

Subsystems (4)
lore
Share & tools
lore

Jason Wang

author
#0 lore raw

PATCH v3 1/1 virtio_net: ethtool tx napi configuration

Implement ethtool .set_coalesce (-C) and .get_coalesce (-c) handlers. Interrupt moderation is currently not supported, so these accept and display the default settings of 0 usec and 1 frame.

Toggle tx napi through setting tx-frames. So as to not interfere with possible future interrupt moderation, value 1 means tx napi while value 0 means not.

Only allow the switching when device is down for simplicity.

---
Changes from V2:
- only allow the switching when device is done
- remove unnecessary global variable and initialization
Changes from V1:
- try to synchronize with datapath to allow changing mode when interface is up.
- use tx-frames 0 as to disable tx napi while tx-frames 1 to enable tx napi

---
 drivers/net/virtio_net.c | 50 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)
drivers/net/virtio_net.c +50 -0
index 765920905226..751f385f4e0a 100644
@@ -2181,6 +2181,54 @@ static int virtnet_get_link_ksettings(struct net_device *dev,
 	return 0;
 }
 
+static int virtnet_set_coalesce(struct net_device *dev,
+				struct ethtool_coalesce *ec)
+{
+	struct ethtool_coalesce ec_default = {
+		.cmd = ETHTOOL_SCOALESCE,
+		.rx_max_coalesced_frames = 1,
+	};
+	struct virtnet_info *vi = netdev_priv(dev);
+	int i, napi_weight;
+	bool running = netif_running(dev);
+
+	if (ec->tx_max_coalesced_frames > 1)
+		return -EINVAL;
+
+	ec_default.tx_max_coalesced_frames = ec->tx_max_coalesced_frames;
+	napi_weight = ec->tx_max_coalesced_frames ? NAPI_POLL_WEIGHT : 0;
+
+	/* disallow changes to fields not explicitly tested above */
+	if (memcmp(ec, &ec_default, sizeof(ec_default)))
+		return -EINVAL;
+
+	if (napi_weight ^ vi->sq[0].napi.weight) {
+		if (dev->flags & IFF_UP)
+			return -EBUSY;
+		for (i = 0; i < vi->max_queue_pairs; i++)
+			vi->sq[i].napi.weight = napi_weight;
+	}
+
+	return 0;
+}
+
+static int virtnet_get_coalesce(struct net_device *dev,
+				struct ethtool_coalesce *ec)
+{
+	struct ethtool_coalesce ec_default = {
+		.cmd = ETHTOOL_GCOALESCE,
+		.rx_max_coalesced_frames = 1,
+	};
+	struct virtnet_info *vi = netdev_priv(dev);
+
+	memcpy(ec, &ec_default, sizeof(ec_default));
+
+	if (vi->sq[0].napi.weight)
+		ec->tx_max_coalesced_frames = 1;
+
+	return 0;
+}
+
 static void virtnet_init_settings(struct net_device *dev)
 {
 	struct virtnet_info *vi = netdev_priv(dev);
@@ -2219,6 +2267,8 @@ static const struct ethtool_ops virtnet_ethtool_ops = {
 	.get_ts_info = ethtool_op_get_ts_info,
 	.get_link_ksettings = virtnet_get_link_ksettings,
 	.set_link_ksettings = virtnet_set_link_ksettings,
+	.set_coalesce = virtnet_set_coalesce,
+	.get_coalesce = virtnet_get_coalesce,
 };
 
 static void virtnet_freeze_down(struct virtio_device *vdev)
Signature · 1 line
2.17.1
maintainer Applied
#1 lore raw

From: Jason Wang <[email protected]>
Date: Tue, 9 Oct 2018 10:06:26 +0800

Quoted 14 lines

Implement ethtool .set_coalesce (-C) and .get_coalesce (-c) handlers. Interrupt moderation is currently not supported, so these accept and display the default settings of 0 usec and 1 frame.

Toggle tx napi through setting tx-frames. So as to not interfere with possible future interrupt moderation, value 1 means tx napi while value 0 means not.

Only allow the switching when device is down for simplicity.

Quoted 8 lines

---
Changes from V2:
- only allow the switching when device is done
- remove unnecessary global variable and initialization
Changes from V1:
- try to synchronize with datapath to allow changing mode when interface is up.
- use tx-frames 0 as to disable tx napi while tx-frames 1 to enable tx napi

Applied, with...

drivers/net/virtio_net.c static int virtnet_get_link_ksettings(struct net_device *dev, · line 2193

Quoted 1 line
drivers/net/virtio_net.c +1 -0
+	bool running = netif_running(dev);

this unused variable removed.

author
#2 lore raw
Quoted 25 lines · David Miller

From: Jason Wang <[email protected]>
Date: Tue, 9 Oct 2018 10:06:26 +0800

Quoted 14 lines

Implement ethtool .set_coalesce (-C) and .get_coalesce (-c) handlers. Interrupt moderation is currently not supported, so these accept and display the default settings of 0 usec and 1 frame.

Toggle tx napi through setting tx-frames. So as to not interfere with possible future interrupt moderation, value 1 means tx napi while value 0 means not.

Only allow the switching when device is down for simplicity.

Quoted 8 lines

---
Changes from V2:
- only allow the switching when device is done
- remove unnecessary global variable and initialization
Changes from V1:
- try to synchronize with datapath to allow changing mode when interface is up.
- use tx-frames 0 as to disable tx napi while tx-frames 1 to enable tx napi

Quoted 4 lines

Applied, with...

drivers/net/virtio_net.c static int virtnet_get_link_ksettings(struct net_device *dev, · line 2193

Quoted 1 line
drivers/net/virtio_net.c +1 -0
+	bool running = netif_running(dev);

this unused variable removed.

My bad, thanks for the fixup.
_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

author
#3 lore raw
In reply to David Miller
Quoted 25 lines · David Miller

From: Jason Wang <[email protected]>
Date: Tue, 9 Oct 2018 10:06:26 +0800

Quoted 14 lines

Implement ethtool .set_coalesce (-C) and .get_coalesce (-c) handlers. Interrupt moderation is currently not supported, so these accept and display the default settings of 0 usec and 1 frame.

Toggle tx napi through setting tx-frames. So as to not interfere with possible future interrupt moderation, value 1 means tx napi while value 0 means not.

Only allow the switching when device is down for simplicity.

Quoted 8 lines

---
Changes from V2:
- only allow the switching when device is done
- remove unnecessary global variable and initialization
Changes from V1:
- try to synchronize with datapath to allow changing mode when interface is up.
- use tx-frames 0 as to disable tx napi while tx-frames 1 to enable tx napi

Quoted 4 lines

Applied, with...

drivers/net/virtio_net.c static int virtnet_get_link_ksettings(struct net_device *dev, · line 2193

Quoted 1 line
drivers/net/virtio_net.c +1 -0
+	bool running = netif_running(dev);

this unused variable removed.

My bad, thanks for the fixup.

maintainer Applied
#4 lore raw
In reply to Jason Wang

From: Jason Wang <[email protected]>
Date: Tue, 9 Oct 2018 10:06:26 +0800

Quoted 14 lines

Implement ethtool .set_coalesce (-C) and .get_coalesce (-c) handlers. Interrupt moderation is currently not supported, so these accept and display the default settings of 0 usec and 1 frame.

Toggle tx napi through setting tx-frames. So as to not interfere with possible future interrupt moderation, value 1 means tx napi while value 0 means not.

Only allow the switching when device is down for simplicity.

Quoted 8 lines

---
Changes from V2:
- only allow the switching when device is done
- remove unnecessary global variable and initialization
Changes from V1:
- try to synchronize with datapath to allow changing mode when interface is up.
- use tx-frames 0 as to disable tx napi while tx-frames 1 to enable tx napi

Applied, with...

drivers/net/virtio_net.c static int virtnet_get_link_ksettings(struct net_device *dev, · line 2193

Quoted 1 line
drivers/net/virtio_net.c +1 -0
+	bool running = netif_running(dev);

this unused variable removed.