naccyde / rpms / iproute

Forked from rpms/iproute 8 months ago
Clone

Blame SOURCES/0015-vdpa-Allow-for-printing-negotiated-features-of-a-dev.patch

b6425b
From 5a42cc6a5ec79fd0f93904f19b8954c772d931eb Mon Sep 17 00:00:00 2001
b6425b
Message-Id: <5a42cc6a5ec79fd0f93904f19b8954c772d931eb.1647984433.git.aclaudi@redhat.com>
b6425b
In-Reply-To: <cef782ca658d695c5ca2d174ba1f89cba6bd84e5.1647984433.git.aclaudi@redhat.com>
b6425b
References: <cef782ca658d695c5ca2d174ba1f89cba6bd84e5.1647984433.git.aclaudi@redhat.com>
b6425b
From: Andrea Claudi <aclaudi@redhat.com>
b6425b
Date: Mon, 21 Mar 2022 16:35:16 +0100
b6425b
Subject: [PATCH] vdpa: Allow for printing negotiated features of a device
b6425b
b6425b
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2059427
b6425b
Upstream Status: iproute2-next.git commit bd91c764
b6425b
b6425b
commit bd91c764718997adaa1d86eee5c585e67ca85356
b6425b
Author: Eli Cohen <elic@nvidia.com>
b6425b
Date:   Sun Mar 13 19:12:17 2022 +0200
b6425b
b6425b
    vdpa: Allow for printing negotiated features of a device
b6425b
b6425b
    When reading the configuration of a vdpa device, check if the
b6425b
    VDPA_ATTR_DEV_NEGOTIATED_FEATURES is available. If it is, parse the
b6425b
    feature bits and print a string representation of each of the feature
b6425b
    bits.
b6425b
b6425b
    We keep the strings in two different arrays. One for net device related
b6425b
    devices and one for generic feature bits.
b6425b
b6425b
    In this patch we parse only net device specific features. Support for
b6425b
    other devices can be added later. If the device queried is not a net
b6425b
    device, we print its bit number only.
b6425b
b6425b
    Examples:
b6425b
    1. Standard presentation
b6425b
    $ vdpa dev config show vdpa-a
b6425b
    vdpa-a: mac 00:00:00:00:88:88 link up link_announce false max_vq_pairs 2 mtu 9000
b6425b
      negotiated_features CSUM GUEST_CSUM MTU MAC HOST_TSO4 HOST_TSO6 STATUS \
b6425b
    CTRL_VQ MQ CTRL_MAC_ADDR VERSION_1 ACCESS_PLATFORM
b6425b
b6425b
    2. json output
b6425b
    $ vdpa -j dev config show vdpa-a
b6425b
    {"config":{"vdpa-a":{"mac":"00:00:00:00:88:88","link":"up","link_announce":false,\
b6425b
    "max_vq_pairs":2,"mtu":9000,"negotiated_features":["CSUM","GUEST_CSUM",\
b6425b
    "MTU","MAC","HOST_TSO4","HOST_TSO6","STATUS","CTRL_VQ","MQ","CTRL_MAC_ADDR",\
b6425b
    "VERSION_1","ACCESS_PLATFORM"]}}}
b6425b
b6425b
    3. Pretty json
b6425b
    $ vdpa -jp dev config show vdpa-a
b6425b
    {
b6425b
        "config": {
b6425b
            "vdpa-a": {
b6425b
                "mac": "00:00:00:00:88:88",
b6425b
                "link ": "up",
b6425b
                "link_announce ": false,
b6425b
                "max_vq_pairs": 2,
b6425b
                "mtu": 9000,
b6425b
                "negotiated_features": [
b6425b
    "CSUM","GUEST_CSUM","MTU","MAC","HOST_TSO4","HOST_TSO6","STATUS","CTRL_VQ",\
b6425b
    "MQ","CTRL_MAC_ADDR","VERSION_1","ACCESS_PLATFORM" ]
b6425b
            }
b6425b
        }
b6425b
    }
b6425b
b6425b
    Reviewed-by: Si-Wei Liu<si-wei.liu@oracle.com>
b6425b
    Acked-by: Jason Wang <jasowang@redhat.com>
b6425b
    Signed-off-by: Eli Cohen <elic@nvidia.com>
b6425b
    Signed-off-by: David Ahern <dsahern@kernel.org>
b6425b
---
b6425b
 vdpa/vdpa.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++-
b6425b
 1 file changed, 103 insertions(+), 2 deletions(-)
b6425b
b6425b
diff --git a/vdpa/vdpa.c b/vdpa/vdpa.c
b6425b
index 4ccb5648..40078b1c 100644
b6425b
--- a/vdpa/vdpa.c
b6425b
+++ b/vdpa/vdpa.c
b6425b
@@ -10,6 +10,8 @@
b6425b
 #include <linux/virtio_net.h>
b6425b
 #include <linux/netlink.h>
b6425b
 #include <libmnl/libmnl.h>
b6425b
+#include <linux/virtio_ring.h>
b6425b
+#include <linux/virtio_config.h>
b6425b
 #include "mnl_utils.h"
b6425b
 #include <rt_names.h>
b6425b
 
b6425b
@@ -78,6 +80,7 @@ static const enum mnl_attr_data_type vdpa_policy[VDPA_ATTR_MAX + 1] = {
b6425b
 	[VDPA_ATTR_DEV_VENDOR_ID] = MNL_TYPE_U32,
b6425b
 	[VDPA_ATTR_DEV_MAX_VQS] = MNL_TYPE_U32,
b6425b
 	[VDPA_ATTR_DEV_MAX_VQ_SIZE] = MNL_TYPE_U16,
b6425b
+	[VDPA_ATTR_DEV_NEGOTIATED_FEATURES] = MNL_TYPE_U64,
b6425b
 };
b6425b
 
b6425b
 static int attr_cb(const struct nlattr *attr, void *data)
b6425b
@@ -385,6 +388,94 @@ static const char *parse_class(int num)
b6425b
 	return class ? class : "< unknown class >";
b6425b
 }
b6425b
 
b6425b
+static const char * const net_feature_strs[64] = {
b6425b
+	[VIRTIO_NET_F_CSUM] = "CSUM",
b6425b
+	[VIRTIO_NET_F_GUEST_CSUM] = "GUEST_CSUM",
b6425b
+	[VIRTIO_NET_F_CTRL_GUEST_OFFLOADS] = "CTRL_GUEST_OFFLOADS",
b6425b
+	[VIRTIO_NET_F_MTU] = "MTU",
b6425b
+	[VIRTIO_NET_F_MAC] = "MAC",
b6425b
+	[VIRTIO_NET_F_GUEST_TSO4] = "GUEST_TSO4",
b6425b
+	[VIRTIO_NET_F_GUEST_TSO6] = "GUEST_TSO6",
b6425b
+	[VIRTIO_NET_F_GUEST_ECN] = "GUEST_ECN",
b6425b
+	[VIRTIO_NET_F_GUEST_UFO] = "GUEST_UFO",
b6425b
+	[VIRTIO_NET_F_HOST_TSO4] = "HOST_TSO4",
b6425b
+	[VIRTIO_NET_F_HOST_TSO6] = "HOST_TSO6",
b6425b
+	[VIRTIO_NET_F_HOST_ECN] = "HOST_ECN",
b6425b
+	[VIRTIO_NET_F_HOST_UFO] = "HOST_UFO",
b6425b
+	[VIRTIO_NET_F_MRG_RXBUF] = "MRG_RXBUF",
b6425b
+	[VIRTIO_NET_F_STATUS] = "STATUS",
b6425b
+	[VIRTIO_NET_F_CTRL_VQ] = "CTRL_VQ",
b6425b
+	[VIRTIO_NET_F_CTRL_RX] = "CTRL_RX",
b6425b
+	[VIRTIO_NET_F_CTRL_VLAN] = "CTRL_VLAN",
b6425b
+	[VIRTIO_NET_F_CTRL_RX_EXTRA] = "CTRL_RX_EXTRA",
b6425b
+	[VIRTIO_NET_F_GUEST_ANNOUNCE] = "GUEST_ANNOUNCE",
b6425b
+	[VIRTIO_NET_F_MQ] = "MQ",
b6425b
+	[VIRTIO_F_NOTIFY_ON_EMPTY] = "NOTIFY_ON_EMPTY",
b6425b
+	[VIRTIO_NET_F_CTRL_MAC_ADDR] = "CTRL_MAC_ADDR",
b6425b
+	[VIRTIO_F_ANY_LAYOUT] = "ANY_LAYOUT",
b6425b
+	[VIRTIO_NET_F_RSC_EXT] = "RSC_EXT",
b6425b
+	[VIRTIO_NET_F_HASH_REPORT] = "HASH_REPORT",
b6425b
+	[VIRTIO_NET_F_RSS] = "RSS",
b6425b
+	[VIRTIO_NET_F_STANDBY] = "STANDBY",
b6425b
+	[VIRTIO_NET_F_SPEED_DUPLEX] = "SPEED_DUPLEX",
b6425b
+};
b6425b
+
b6425b
+#define VIRTIO_F_IN_ORDER 35
b6425b
+#define VIRTIO_F_NOTIFICATION_DATA 38
b6425b
+#define VDPA_EXT_FEATURES_SZ (VIRTIO_TRANSPORT_F_END - \
b6425b
+			      VIRTIO_TRANSPORT_F_START + 1)
b6425b
+
b6425b
+static const char * const ext_feature_strs[VDPA_EXT_FEATURES_SZ] = {
b6425b
+	[VIRTIO_RING_F_INDIRECT_DESC - VIRTIO_TRANSPORT_F_START] = "RING_INDIRECT_DESC",
b6425b
+	[VIRTIO_RING_F_EVENT_IDX - VIRTIO_TRANSPORT_F_START] = "RING_EVENT_IDX",
b6425b
+	[VIRTIO_F_VERSION_1 - VIRTIO_TRANSPORT_F_START] = "VERSION_1",
b6425b
+	[VIRTIO_F_ACCESS_PLATFORM - VIRTIO_TRANSPORT_F_START] = "ACCESS_PLATFORM",
b6425b
+	[VIRTIO_F_RING_PACKED - VIRTIO_TRANSPORT_F_START] = "RING_PACKED",
b6425b
+	[VIRTIO_F_IN_ORDER - VIRTIO_TRANSPORT_F_START] = "IN_ORDER",
b6425b
+	[VIRTIO_F_ORDER_PLATFORM - VIRTIO_TRANSPORT_F_START] = "ORDER_PLATFORM",
b6425b
+	[VIRTIO_F_SR_IOV - VIRTIO_TRANSPORT_F_START] = "SR_IOV",
b6425b
+	[VIRTIO_F_NOTIFICATION_DATA - VIRTIO_TRANSPORT_F_START] = "NOTIFICATION_DATA",
b6425b
+};
b6425b
+
b6425b
+static const char * const *dev_to_feature_str[] = {
b6425b
+	[VIRTIO_ID_NET] = net_feature_strs,
b6425b
+};
b6425b
+
b6425b
+#define NUM_FEATURE_BITS 64
b6425b
+
b6425b
+static void print_features(struct vdpa *vdpa, uint64_t features, bool mgmtdevf,
b6425b
+			   uint16_t dev_id)
b6425b
+{
b6425b
+	const char * const *feature_strs = NULL;
b6425b
+	const char *s;
b6425b
+	int i;
b6425b
+
b6425b
+	if (dev_id < ARRAY_SIZE(dev_to_feature_str))
b6425b
+		feature_strs = dev_to_feature_str[dev_id];
b6425b
+
b6425b
+	if (mgmtdevf)
b6425b
+		pr_out_array_start(vdpa, "dev_features");
b6425b
+	else
b6425b
+		pr_out_array_start(vdpa, "negotiated_features");
b6425b
+
b6425b
+	for (i = 0; i < NUM_FEATURE_BITS; i++) {
b6425b
+		if (!(features & (1ULL << i)))
b6425b
+			continue;
b6425b
+
b6425b
+		if (i < VIRTIO_TRANSPORT_F_START || i > VIRTIO_TRANSPORT_F_END)
b6425b
+			s = feature_strs ? feature_strs[i] : NULL;
b6425b
+		else
b6425b
+			s = ext_feature_strs[i - VIRTIO_TRANSPORT_F_START];
b6425b
+
b6425b
+		if (!s)
b6425b
+			print_uint(PRINT_ANY, NULL, " bit_%d", i);
b6425b
+		else
b6425b
+			print_string(PRINT_ANY, NULL, " %s", s);
b6425b
+	}
b6425b
+
b6425b
+	pr_out_array_end(vdpa);
b6425b
+}
b6425b
+
b6425b
 static void pr_out_mgmtdev_show(struct vdpa *vdpa, const struct nlmsghdr *nlh,
b6425b
 				struct nlattr **tb)
b6425b
 {
b6425b
@@ -579,9 +670,10 @@ static int cmd_dev_del(struct vdpa *vdpa,  int argc, char **argv)
b6425b
 	return mnlu_gen_socket_sndrcv(&vdpa->nlg, nlh, NULL, NULL);
b6425b
 }
b6425b
 
b6425b
-static void pr_out_dev_net_config(struct nlattr **tb)
b6425b
+static void pr_out_dev_net_config(struct vdpa *vdpa, struct nlattr **tb)
b6425b
 {
b6425b
 	SPRINT_BUF(macaddr);
b6425b
+	uint64_t val_u64;
b6425b
 	uint16_t val_u16;
b6425b
 
b6425b
 	if (tb[VDPA_ATTR_DEV_NET_CFG_MACADDR]) {
b6425b
@@ -610,6 +702,15 @@ static void pr_out_dev_net_config(struct nlattr **tb)
b6425b
 		val_u16 = mnl_attr_get_u16(tb[VDPA_ATTR_DEV_NET_CFG_MTU]);
b6425b
 		print_uint(PRINT_ANY, "mtu", "mtu %d ", val_u16);
b6425b
 	}
b6425b
+	if (tb[VDPA_ATTR_DEV_NEGOTIATED_FEATURES]) {
b6425b
+		uint16_t dev_id = 0;
b6425b
+
b6425b
+		if (tb[VDPA_ATTR_DEV_ID])
b6425b
+			dev_id = mnl_attr_get_u32(tb[VDPA_ATTR_DEV_ID]);
b6425b
+
b6425b
+		val_u64 = mnl_attr_get_u64(tb[VDPA_ATTR_DEV_NEGOTIATED_FEATURES]);
b6425b
+		print_features(vdpa, val_u64, false, dev_id);
b6425b
+	}
b6425b
 }
b6425b
 
b6425b
 static void pr_out_dev_config(struct vdpa *vdpa, struct nlattr **tb)
b6425b
@@ -619,7 +720,7 @@ static void pr_out_dev_config(struct vdpa *vdpa, struct nlattr **tb)
b6425b
 	pr_out_vdev_handle_start(vdpa, tb);
b6425b
 	switch (device_id) {
b6425b
 	case VIRTIO_ID_NET:
b6425b
-		pr_out_dev_net_config(tb);
b6425b
+		pr_out_dev_net_config(vdpa, tb);
b6425b
 		break;
b6425b
 	default:
b6425b
 		break;
b6425b
-- 
b6425b
2.35.1
b6425b