All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu
@ 2021-10-25 12:53 Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 1/8] vdpa: Introduce and use vdpa device get, set config helpers Parav Pandit via Virtualization
                   ` (7 more replies)
  0 siblings, 8 replies; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

Currently user cannot view the vdpa device config space. Also user
cannot set the mac address and mtu of the vdpa device.
This patchset enables users to set the mac address and mtu of the vdpa
device once the device is created.
If a vendor driver supports such configuration user can set it otherwise
user gets unsupported error.

vdpa mac address and mtu are device configuration layout fields.
To keep interface generic enough for multiple types of vdpa devices, mac
address and mtu setting is implemented as configuration layout fields.

An example of query & set of config layout fields for vdpa_sim_net
driver:

Configuration layout fields are set when a vdpa device is created.

$ vdpa mgmtdev show
vdpasim_net:
  supported_classes net
pci/0000:08:00.2:
  supported_classes net

Add the device with MAC and MTU:
$ vdpa dev add name bar mgmtdev vdpasim_net mac 00:11:22:33:44:66 mtu 1500

In above command only mac address or only mtu can also be set.

View the config after setting:
$ vdpa dev config show
bar: mac 00:11:22:33:44:66 link up link_announce false mtu 1500

Patch summary:
Patch-1 introduced and use helpers for get/set config area
Patch-2 implement query device config layout
Patch-3 use kernel coding style for structure comment
Patch-4 enanble user to set mac and mtu in config space
Patch-5 vdpa_sim_net implements get and set of config layout
Patch-6 mlx vdpa driver fix to avoid clearing VIRTIO_NET_F_MAC during
        reset callback
Patch-7 mlx5 vdpa driver supports user provided mac config
Patch-8 mlx5 vdpa driver uses user provided mac during rx flow steering

changelog:
v4->v5:
 - use vdpa_set_config() API in virtio_vdpa driver
 - make vdpa_set_config() buffer argument const
 - added comment for checking process capability
 - updated commit log example for add command
v3->v4:
 - enable setting mac and mtu of the vdpa device using creation time
 - introduced a patch to fix mlx5 driver to avoid clearing
   VIRTIO_NET_F_MAC
 - introduced a patch to use kernel coding style for structure comment
 - removed config attributes not used by sim and mlx5 net drivers
v2->v3:
 - dropped patches which are merged
 - simplified code to handle non transitional devices
v1->v2:
 - new patches to fix kdoc comment to add new kdoc section
 - new patch to have synchronized access to features and config space
 - read whole net config layout instead of individual fields
 - added error extack for unmanaged vdpa device
 - fixed several endianness issues
 - introduced vdpa device ops for get config which is synchronized
   with other get/set features ops and config ops
 - fixed mtu range checking for max
 - using NLA_POLICY_ETH_ADDR
 - set config moved to device ops instead of mgmtdev ops
 - merged build and set to single routine
 - ensuring that user has NET_ADMIN capability for configuring network
   attributes
 - using updated interface and callbacks for get/set config
 - following new api for config get/set for mgmt tool in mlx5 vdpa
   driver
 - fixes for accessing right SF dma device and bar address
 - fix for mtu calculation
 - fix for bit access in features
 - fix for index restore with suspend/resume operation

Eli Cohen (2):
  vdpa/mlx5: Support configuration of MAC
  vdpa/mlx5: Forward only packets with allowed MAC address

Parav Pandit (6):
  vdpa: Introduce and use vdpa device get, set config helpers
  vdpa: Introduce query of device config layout
  vdpa: Use kernel coding style for structure comments
  vdpa: Enable user to set mac and mtu of vdpa device
  vdpa_sim_net: Enable user to set mac address and mtu
  vdpa/mlx5: Fix clearing of VIRTIO_NET_F_MAC feature bit

 drivers/vdpa/ifcvf/ifcvf_main.c      |   3 +-
 drivers/vdpa/mlx5/net/mlx5_vnet.c    |  97 ++++++++---
 drivers/vdpa/vdpa.c                  | 248 ++++++++++++++++++++++++++-
 drivers/vdpa/vdpa_sim/vdpa_sim_blk.c |   3 +-
 drivers/vdpa/vdpa_sim/vdpa_sim_net.c |  38 ++--
 drivers/vdpa/vdpa_user/vduse_dev.c   |   3 +-
 drivers/vhost/vdpa.c                 |   3 +-
 drivers/virtio/virtio_vdpa.c         |   3 +-
 include/linux/vdpa.h                 |  47 +++--
 include/uapi/linux/vdpa.h            |   6 +
 10 files changed, 382 insertions(+), 69 deletions(-)

-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* [PATCH linux-next v5 1/8] vdpa: Introduce and use vdpa device get, set config helpers
  2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
@ 2021-10-25 12:53 ` Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 2/8] vdpa: Introduce query of device config layout Parav Pandit via Virtualization
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

Subsequent patches enable get and set configuration either
via management device or via vdpa device' config ops.

This requires synchronization between multiple callers to get and set
config callbacks. Features setting also influence the layout of the
configuration fields endianness.

To avoid exposing synchronization primitives to callers, introduce
helper for setting the configuration and use it.

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Eli Cohen <elic@nvidia.com>
Acked-by: Jason Wang <jasowang@redhat.com>
---
changelog:
v4->v5:
 - use vdpa_set_config() API in virtio_vdpa driver
---
 drivers/vdpa/vdpa.c          | 36 ++++++++++++++++++++++++++++++++++++
 drivers/vhost/vdpa.c         |  3 +--
 drivers/virtio/virtio_vdpa.c |  3 +--
 include/linux/vdpa.h         | 19 ++++---------------
 4 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c
index 4aeb1458b924..d42697699366 100644
--- a/drivers/vdpa/vdpa.c
+++ b/drivers/vdpa/vdpa.c
@@ -297,6 +297,42 @@ void vdpa_mgmtdev_unregister(struct vdpa_mgmt_dev *mdev)
 }
 EXPORT_SYMBOL_GPL(vdpa_mgmtdev_unregister);
 
+/**
+ * vdpa_get_config - Get one or more device configuration fields.
+ * @vdev: vdpa device to operate on
+ * @offset: starting byte offset of the field
+ * @buf: buffer pointer to read to
+ * @len: length of the configuration fields in bytes
+ */
+void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
+		     void *buf, unsigned int len)
+{
+	const struct vdpa_config_ops *ops = vdev->config;
+
+	/*
+	 * Config accesses aren't supposed to trigger before features are set.
+	 * If it does happen we assume a legacy guest.
+	 */
+	if (!vdev->features_valid)
+		vdpa_set_features(vdev, 0);
+	ops->get_config(vdev, offset, buf, len);
+}
+EXPORT_SYMBOL_GPL(vdpa_get_config);
+
+/**
+ * vdpa_set_config - Set one or more device configuration fields.
+ * @vdev: vdpa device to operate on
+ * @offset: starting byte offset of the field
+ * @buf: buffer pointer to read from
+ * @length: length of the configuration fields in bytes
+ */
+void vdpa_set_config(struct vdpa_device *vdev, unsigned int offset,
+		     const void *buf, unsigned int length)
+{
+	vdev->config->set_config(vdev, offset, buf, length);
+}
+EXPORT_SYMBOL_GPL(vdpa_set_config);
+
 static bool mgmtdev_handle_match(const struct vdpa_mgmt_dev *mdev,
 				 const char *busname, const char *devname)
 {
diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c
index 39039e046117..01c59ce7e250 100644
--- a/drivers/vhost/vdpa.c
+++ b/drivers/vhost/vdpa.c
@@ -237,7 +237,6 @@ static long vhost_vdpa_set_config(struct vhost_vdpa *v,
 				  struct vhost_vdpa_config __user *c)
 {
 	struct vdpa_device *vdpa = v->vdpa;
-	const struct vdpa_config_ops *ops = vdpa->config;
 	struct vhost_vdpa_config config;
 	unsigned long size = offsetof(struct vhost_vdpa_config, buf);
 	u8 *buf;
@@ -251,7 +250,7 @@ static long vhost_vdpa_set_config(struct vhost_vdpa *v,
 	if (IS_ERR(buf))
 		return PTR_ERR(buf);
 
-	ops->set_config(vdpa, config.off, buf, config.len);
+	vdpa_set_config(vdpa, config.off, buf, config.len);
 
 	kvfree(buf);
 	return 0;
diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
index e42ace29daa1..4bb148d4b4e8 100644
--- a/drivers/virtio/virtio_vdpa.c
+++ b/drivers/virtio/virtio_vdpa.c
@@ -65,9 +65,8 @@ static void virtio_vdpa_set(struct virtio_device *vdev, unsigned offset,
 			    const void *buf, unsigned len)
 {
 	struct vdpa_device *vdpa = vd_get_vdpa(vdev);
-	const struct vdpa_config_ops *ops = vdpa->config;
 
-	ops->set_config(vdpa, offset, buf, len);
+	vdpa_set_config(vdpa, offset, buf, len);
 }
 
 static u32 virtio_vdpa_generation(struct virtio_device *vdev)
diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
index 30864848950b..267236aab34c 100644
--- a/include/linux/vdpa.h
+++ b/include/linux/vdpa.h
@@ -386,21 +386,10 @@ static inline int vdpa_set_features(struct vdpa_device *vdev, u64 features)
 	return ops->set_features(vdev, features);
 }
 
-static inline void vdpa_get_config(struct vdpa_device *vdev,
-				   unsigned int offset, void *buf,
-				   unsigned int len)
-{
-	const struct vdpa_config_ops *ops = vdev->config;
-
-	/*
-	 * Config accesses aren't supposed to trigger before features are set.
-	 * If it does happen we assume a legacy guest.
-	 */
-	if (!vdev->features_valid)
-		vdpa_set_features(vdev, 0);
-	ops->get_config(vdev, offset, buf, len);
-}
-
+void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
+		     void *buf, unsigned int len);
+void vdpa_set_config(struct vdpa_device *dev, unsigned int offset,
+		     const void *buf, unsigned int length);
 /**
  * struct vdpa_mgmtdev_ops - vdpa device ops
  * @dev_add: Add a vdpa device using alloc and register
-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* [PATCH linux-next v5 2/8] vdpa: Introduce query of device config layout
  2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 1/8] vdpa: Introduce and use vdpa device get, set config helpers Parav Pandit via Virtualization
@ 2021-10-25 12:53 ` Parav Pandit via Virtualization
  2021-10-26  2:47   ` Jason Wang
  2021-10-25 12:53 ` [PATCH linux-next v5 3/8] vdpa: Use kernel coding style for structure comments Parav Pandit via Virtualization
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

Introduce a command to query a device config layout.

An example query of network vdpa device:

$ vdpa dev add name bar mgmtdev vdpasim_net

$ vdpa dev config show
bar: mac 00:35:09:19:48:05 link up link_announce false mtu 1500

$ vdpa dev config show -jp
{
    "config": {
        "bar": {
            "mac": "00:35:09:19:48:05",
            "link ": "up",
            "link_announce ": false,
            "mtu": 1500,
        }
    }
}

Signed-off-by: Parav Pandit <parav@nvidia.com>
Signed-off-by: Eli Cohen <elic@nvidia.com>
---
changelog:
v3->v4:
 - removed config space fields reporting which are not used by mlx5
   and sim drivers
---
 drivers/vdpa/vdpa.c       | 176 ++++++++++++++++++++++++++++++++++++++
 include/linux/vdpa.h      |   2 +
 include/uapi/linux/vdpa.h |   6 ++
 3 files changed, 184 insertions(+)

diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c
index d42697699366..973c56fb60b9 100644
--- a/drivers/vdpa/vdpa.c
+++ b/drivers/vdpa/vdpa.c
@@ -14,6 +14,8 @@
 #include <uapi/linux/vdpa.h>
 #include <net/genetlink.h>
 #include <linux/mod_devicetable.h>
+#include <linux/virtio_net.h>
+#include <linux/virtio_ids.h>
 
 static LIST_HEAD(mdev_head);
 /* A global mutex that protects vdpa management device and device level operations. */
@@ -66,6 +68,7 @@ static void vdpa_release_dev(struct device *d)
 		ops->free(vdev);
 
 	ida_simple_remove(&vdpa_index_ida, vdev->index);
+	mutex_destroy(&vdev->cf_mutex);
 	kfree(vdev);
 }
 
@@ -127,6 +130,7 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
 	if (err)
 		goto err_name;
 
+	mutex_init(&vdev->cf_mutex);
 	device_initialize(&vdev->dev);
 
 	return vdev;
@@ -309,6 +313,7 @@ void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
 {
 	const struct vdpa_config_ops *ops = vdev->config;
 
+	mutex_lock(&vdev->cf_mutex);
 	/*
 	 * Config accesses aren't supposed to trigger before features are set.
 	 * If it does happen we assume a legacy guest.
@@ -316,6 +321,7 @@ void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
 	if (!vdev->features_valid)
 		vdpa_set_features(vdev, 0);
 	ops->get_config(vdev, offset, buf, len);
+	mutex_unlock(&vdev->cf_mutex);
 }
 EXPORT_SYMBOL_GPL(vdpa_get_config);
 
@@ -329,7 +335,9 @@ EXPORT_SYMBOL_GPL(vdpa_get_config);
 void vdpa_set_config(struct vdpa_device *vdev, unsigned int offset,
 		     const void *buf, unsigned int length)
 {
+	mutex_lock(&vdev->cf_mutex);
 	vdev->config->set_config(vdev, offset, buf, length);
+	mutex_unlock(&vdev->cf_mutex);
 }
 EXPORT_SYMBOL_GPL(vdpa_set_config);
 
@@ -661,6 +669,168 @@ static int vdpa_nl_cmd_dev_get_dumpit(struct sk_buff *msg, struct netlink_callba
 	return msg->len;
 }
 
+static int vdpa_dev_net_mq_config_fill(struct vdpa_device *vdev,
+				       struct sk_buff *msg, u64 features,
+				       const struct virtio_net_config *config)
+{
+	u16 val_u16;
+
+	if ((features & (1ULL << VIRTIO_NET_F_MQ)) == 0)
+		return 0;
+
+	val_u16 = le16_to_cpu(config->max_virtqueue_pairs);
+	return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MAX_VQP, val_u16);
+}
+
+static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *msg)
+{
+	struct virtio_net_config config = {};
+	u64 features;
+	u16 val_u16;
+
+	vdpa_get_config(vdev, 0, &config, sizeof(config));
+
+	if (nla_put(msg, VDPA_ATTR_DEV_NET_CFG_MACADDR, sizeof(config.mac),
+		    config.mac))
+		return -EMSGSIZE;
+
+	val_u16 = le16_to_cpu(config.status);
+	if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_STATUS, val_u16))
+		return -EMSGSIZE;
+
+	val_u16 = le16_to_cpu(config.mtu);
+	if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MTU, val_u16))
+		return -EMSGSIZE;
+
+	features = vdev->config->get_features(vdev);
+
+	return vdpa_dev_net_mq_config_fill(vdev, msg, features, &config);
+}
+
+static int
+vdpa_dev_config_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid, u32 seq,
+		     int flags, struct netlink_ext_ack *extack)
+{
+	u32 device_id;
+	void *hdr;
+	int err;
+
+	hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags,
+			  VDPA_CMD_DEV_CONFIG_GET);
+	if (!hdr)
+		return -EMSGSIZE;
+
+	if (nla_put_string(msg, VDPA_ATTR_DEV_NAME, dev_name(&vdev->dev))) {
+		err = -EMSGSIZE;
+		goto msg_err;
+	}
+
+	device_id = vdev->config->get_device_id(vdev);
+	if (nla_put_u32(msg, VDPA_ATTR_DEV_ID, device_id)) {
+		err = -EMSGSIZE;
+		goto msg_err;
+	}
+
+	switch (device_id) {
+	case VIRTIO_ID_NET:
+		err = vdpa_dev_net_config_fill(vdev, msg);
+		break;
+	default:
+		err = -EOPNOTSUPP;
+		break;
+	}
+	if (err)
+		goto msg_err;
+
+	genlmsg_end(msg, hdr);
+	return 0;
+
+msg_err:
+	genlmsg_cancel(msg, hdr);
+	return err;
+}
+
+static int vdpa_nl_cmd_dev_config_get_doit(struct sk_buff *skb, struct genl_info *info)
+{
+	struct vdpa_device *vdev;
+	struct sk_buff *msg;
+	const char *devname;
+	struct device *dev;
+	int err;
+
+	if (!info->attrs[VDPA_ATTR_DEV_NAME])
+		return -EINVAL;
+	devname = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
+	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+	if (!msg)
+		return -ENOMEM;
+
+	mutex_lock(&vdpa_dev_mutex);
+	dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
+	if (!dev) {
+		NL_SET_ERR_MSG_MOD(info->extack, "device not found");
+		err = -ENODEV;
+		goto dev_err;
+	}
+	vdev = container_of(dev, struct vdpa_device, dev);
+	if (!vdev->mdev) {
+		NL_SET_ERR_MSG_MOD(info->extack, "unmanaged vdpa device");
+		err = -EINVAL;
+		goto mdev_err;
+	}
+	err = vdpa_dev_config_fill(vdev, msg, info->snd_portid, info->snd_seq,
+				   0, info->extack);
+	if (!err)
+		err = genlmsg_reply(msg, info);
+
+mdev_err:
+	put_device(dev);
+dev_err:
+	mutex_unlock(&vdpa_dev_mutex);
+	if (err)
+		nlmsg_free(msg);
+	return err;
+}
+
+static int vdpa_dev_config_dump(struct device *dev, void *data)
+{
+	struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
+	struct vdpa_dev_dump_info *info = data;
+	int err;
+
+	if (!vdev->mdev)
+		return 0;
+	if (info->idx < info->start_idx) {
+		info->idx++;
+		return 0;
+	}
+	err = vdpa_dev_config_fill(vdev, info->msg, NETLINK_CB(info->cb->skb).portid,
+				   info->cb->nlh->nlmsg_seq, NLM_F_MULTI,
+				   info->cb->extack);
+	if (err)
+		return err;
+
+	info->idx++;
+	return 0;
+}
+
+static int
+vdpa_nl_cmd_dev_config_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
+{
+	struct vdpa_dev_dump_info info;
+
+	info.msg = msg;
+	info.cb = cb;
+	info.start_idx = cb->args[0];
+	info.idx = 0;
+
+	mutex_lock(&vdpa_dev_mutex);
+	bus_for_each_dev(&vdpa_bus, NULL, &info, vdpa_dev_config_dump);
+	mutex_unlock(&vdpa_dev_mutex);
+	cb->args[0] = info.idx;
+	return msg->len;
+}
+
 static const struct nla_policy vdpa_nl_policy[VDPA_ATTR_MAX + 1] = {
 	[VDPA_ATTR_MGMTDEV_BUS_NAME] = { .type = NLA_NUL_STRING },
 	[VDPA_ATTR_MGMTDEV_DEV_NAME] = { .type = NLA_STRING },
@@ -692,6 +862,12 @@ static const struct genl_ops vdpa_nl_ops[] = {
 		.doit = vdpa_nl_cmd_dev_get_doit,
 		.dumpit = vdpa_nl_cmd_dev_get_dumpit,
 	},
+	{
+		.cmd = VDPA_CMD_DEV_CONFIG_GET,
+		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
+		.doit = vdpa_nl_cmd_dev_config_get_doit,
+		.dumpit = vdpa_nl_cmd_dev_config_get_dumpit,
+	},
 };
 
 static struct genl_family vdpa_nl_family __ro_after_init = {
diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
index 267236aab34c..5cc5e501397f 100644
--- a/include/linux/vdpa.h
+++ b/include/linux/vdpa.h
@@ -63,6 +63,7 @@ struct vdpa_mgmt_dev;
  * @dev: underlying device
  * @dma_dev: the actual device that is performing DMA
  * @config: the configuration ops for this device.
+ * @cf_mutex: Protects get and set access to configuration layout.
  * @index: device index
  * @features_valid: were features initialized? for legacy guests
  * @use_va: indicate whether virtual address must be used by this device
@@ -74,6 +75,7 @@ struct vdpa_device {
 	struct device dev;
 	struct device *dma_dev;
 	const struct vdpa_config_ops *config;
+	struct mutex cf_mutex; /* Protects get/set config */
 	unsigned int index;
 	bool features_valid;
 	bool use_va;
diff --git a/include/uapi/linux/vdpa.h b/include/uapi/linux/vdpa.h
index e3b87879514c..a252f06f9dfd 100644
--- a/include/uapi/linux/vdpa.h
+++ b/include/uapi/linux/vdpa.h
@@ -17,6 +17,7 @@ enum vdpa_command {
 	VDPA_CMD_DEV_NEW,
 	VDPA_CMD_DEV_DEL,
 	VDPA_CMD_DEV_GET,		/* can dump */
+	VDPA_CMD_DEV_CONFIG_GET,	/* can dump */
 };
 
 enum vdpa_attr {
@@ -34,6 +35,11 @@ enum vdpa_attr {
 	VDPA_ATTR_DEV_MAX_VQ_SIZE,		/* u16 */
 	VDPA_ATTR_DEV_MIN_VQ_SIZE,		/* u16 */
 
+	VDPA_ATTR_DEV_NET_CFG_MACADDR,		/* binary */
+	VDPA_ATTR_DEV_NET_STATUS,		/* u8 */
+	VDPA_ATTR_DEV_NET_CFG_MAX_VQP,		/* u16 */
+	VDPA_ATTR_DEV_NET_CFG_MTU,		/* u16 */
+
 	/* new attributes must be added above here */
 	VDPA_ATTR_MAX,
 };
-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* [PATCH linux-next v5 3/8] vdpa: Use kernel coding style for structure comments
  2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 1/8] vdpa: Introduce and use vdpa device get, set config helpers Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 2/8] vdpa: Introduce query of device config layout Parav Pandit via Virtualization
@ 2021-10-25 12:53 ` Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 4/8] vdpa: Enable user to set mac and mtu of vdpa device Parav Pandit via Virtualization
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

As subsequent patch adds new structure field with comment, move the
structure comment to follow kernel coding style.

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Eli Cohen <elic@nvidia.com>
Acked-by: Jason Wang <jasowang@redhat.com>
---
 include/linux/vdpa.h | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
index 5cc5e501397f..fafb7202482c 100644
--- a/include/linux/vdpa.h
+++ b/include/linux/vdpa.h
@@ -411,10 +411,17 @@ struct vdpa_mgmtdev_ops {
 	void (*dev_del)(struct vdpa_mgmt_dev *mdev, struct vdpa_device *dev);
 };
 
+/**
+ * struct vdpa_mgmt_dev - vdpa management device
+ * @device: Management parent device
+ * @ops: operations supported by management device
+ * @id_table: Pointer to device id table of supported ids
+ * @list: list entry
+ */
 struct vdpa_mgmt_dev {
 	struct device *device;
 	const struct vdpa_mgmtdev_ops *ops;
-	const struct virtio_device_id *id_table; /* supported ids */
+	const struct virtio_device_id *id_table;
 	struct list_head list;
 };
 
-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* [PATCH linux-next v5 4/8] vdpa: Enable user to set mac and mtu of vdpa device
  2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
                   ` (2 preceding siblings ...)
  2021-10-25 12:53 ` [PATCH linux-next v5 3/8] vdpa: Use kernel coding style for structure comments Parav Pandit via Virtualization
@ 2021-10-25 12:53 ` Parav Pandit via Virtualization
  2021-10-26  2:47   ` Jason Wang
  2021-10-25 12:53 ` [PATCH linux-next v5 5/8] vdpa_sim_net: Enable user to set mac address and mtu Parav Pandit via Virtualization
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

$ vdpa dev add name bar mgmtdev vdpasim_net mac 00:11:22:33:44:55 mtu 9000

$ vdpa dev config show
bar: mac 00:11:22:33:44:55 link up link_announce false mtu 9000

$ vdpa dev config show -jp
{
    "config": {
        "bar": {
            "mac": "00:11:22:33:44:55",
            "link ": "up",
            "link_announce ": false,
            "mtu": 9000,
        }
    }
}

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Eli Cohen <elic@nvidia.com>
---
changelog:
v4->v5:
 - added comment for checking device capabilities
v3->v4:
 - provide config attributes during device addition time
---
 drivers/vdpa/ifcvf/ifcvf_main.c      |  3 ++-
 drivers/vdpa/mlx5/net/mlx5_vnet.c    |  3 ++-
 drivers/vdpa/vdpa.c                  | 38 ++++++++++++++++++++++++++--
 drivers/vdpa/vdpa_sim/vdpa_sim_blk.c |  3 ++-
 drivers/vdpa/vdpa_sim/vdpa_sim_net.c |  3 ++-
 drivers/vdpa/vdpa_user/vduse_dev.c   |  3 ++-
 include/linux/vdpa.h                 | 17 ++++++++++++-
 7 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
index dcd648e1f7e7..6dc75ca70b37 100644
--- a/drivers/vdpa/ifcvf/ifcvf_main.c
+++ b/drivers/vdpa/ifcvf/ifcvf_main.c
@@ -499,7 +499,8 @@ static u32 get_dev_type(struct pci_dev *pdev)
 	return dev_type;
 }
 
-static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
+static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
+			      const struct vdpa_dev_set_config *config)
 {
 	struct ifcvf_vdpa_mgmt_dev *ifcvf_mgmt_dev;
 	struct ifcvf_adapter *adapter;
diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
index b5bd1a553256..6bbdc0ece707 100644
--- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
+++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
@@ -2482,7 +2482,8 @@ static int event_handler(struct notifier_block *nb, unsigned long event, void *p
 	return ret;
 }
 
-static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name)
+static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
+			     const struct vdpa_dev_set_config *add_config)
 {
 	struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
 	struct virtio_net_config *config;
diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c
index 973c56fb60b9..a1168a7fa8b8 100644
--- a/drivers/vdpa/vdpa.c
+++ b/drivers/vdpa/vdpa.c
@@ -14,7 +14,6 @@
 #include <uapi/linux/vdpa.h>
 #include <net/genetlink.h>
 #include <linux/mod_devicetable.h>
-#include <linux/virtio_net.h>
 #include <linux/virtio_ids.h>
 
 static LIST_HEAD(mdev_head);
@@ -480,9 +479,15 @@ vdpa_nl_cmd_mgmtdev_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
 	return msg->len;
 }
 
+#define VDPA_DEV_NET_ATTRS_MASK ((1 << VDPA_ATTR_DEV_NET_CFG_MACADDR) | \
+				 (1 << VDPA_ATTR_DEV_NET_CFG_MTU))
+
 static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *info)
 {
+	struct vdpa_dev_set_config config = {};
+	struct nlattr **nl_attrs = info->attrs;
 	struct vdpa_mgmt_dev *mdev;
+	const u8 *macaddr;
 	const char *name;
 	int err = 0;
 
@@ -491,6 +496,26 @@ static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *i
 
 	name = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
 
+	if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]) {
+		macaddr = nla_data(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]);
+		memcpy(config.net.mac, macaddr, sizeof(config.net.mac));
+		config.mask |= (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR);
+	}
+	if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]) {
+		config.net.mtu =
+			nla_get_u16(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]);
+		config.mask |= (1 << VDPA_ATTR_DEV_NET_CFG_MTU);
+	}
+
+	/* Skip checking capability if user didn't prefer to configure any
+	 * device networking attributes. It is likely that user might have used
+	 * a device specific method to configure such attributes or using device
+	 * default attributes.
+	 */
+	if ((config.mask & VDPA_DEV_NET_ATTRS_MASK) &&
+	    !netlink_capable(skb, CAP_NET_ADMIN))
+		return -EPERM;
+
 	mutex_lock(&vdpa_dev_mutex);
 	mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
 	if (IS_ERR(mdev)) {
@@ -498,8 +523,14 @@ static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *i
 		err = PTR_ERR(mdev);
 		goto err;
 	}
+	if ((config.mask & mdev->config_attr_mask) != config.mask) {
+		NL_SET_ERR_MSG_MOD(info->extack,
+				   "All provided attributes are not supported");
+		err = -EOPNOTSUPP;
+		goto err;
+	}
 
-	err = mdev->ops->dev_add(mdev, name);
+	err = mdev->ops->dev_add(mdev, name, &config);
 err:
 	mutex_unlock(&vdpa_dev_mutex);
 	return err;
@@ -835,6 +866,9 @@ static const struct nla_policy vdpa_nl_policy[VDPA_ATTR_MAX + 1] = {
 	[VDPA_ATTR_MGMTDEV_BUS_NAME] = { .type = NLA_NUL_STRING },
 	[VDPA_ATTR_MGMTDEV_DEV_NAME] = { .type = NLA_STRING },
 	[VDPA_ATTR_DEV_NAME] = { .type = NLA_STRING },
+	[VDPA_ATTR_DEV_NET_CFG_MACADDR] = NLA_POLICY_ETH_ADDR,
+	/* virtio spec 1.1 section 5.1.4.1 for valid MTU range */
+	[VDPA_ATTR_DEV_NET_CFG_MTU] = NLA_POLICY_MIN(NLA_U16, 68),
 };
 
 static const struct genl_ops vdpa_nl_ops[] = {
diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
index a790903f243e..42d401d43911 100644
--- a/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
+++ b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
@@ -248,7 +248,8 @@ static struct device vdpasim_blk_mgmtdev = {
 	.release = vdpasim_blk_mgmtdev_release,
 };
 
-static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
+static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
+			       const struct vdpa_dev_set_config *config)
 {
 	struct vdpasim_dev_attr dev_attr = {};
 	struct vdpasim *simdev;
diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
index a1ab6163f7d1..d681e423e64f 100644
--- a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
+++ b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
@@ -126,7 +126,8 @@ static struct device vdpasim_net_mgmtdev = {
 	.release = vdpasim_net_mgmtdev_release,
 };
 
-static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
+static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
+			       const struct vdpa_dev_set_config *config)
 {
 	struct vdpasim_dev_attr dev_attr = {};
 	struct vdpasim *simdev;
diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c
index 841667a896dd..c9204c62f339 100644
--- a/drivers/vdpa/vdpa_user/vduse_dev.c
+++ b/drivers/vdpa/vdpa_user/vduse_dev.c
@@ -1503,7 +1503,8 @@ static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
 	return 0;
 }
 
-static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
+static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
+			const struct vdpa_dev_set_config *config)
 {
 	struct vduse_dev *dev;
 	int ret;
diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
index fafb7202482c..bf9ddf743e2f 100644
--- a/include/linux/vdpa.h
+++ b/include/linux/vdpa.h
@@ -6,6 +6,8 @@
 #include <linux/device.h>
 #include <linux/interrupt.h>
 #include <linux/vhost_iotlb.h>
+#include <linux/virtio_net.h>
+#include <linux/if_ether.h>
 
 /**
  * struct vdpa_calllback - vDPA callback definition.
@@ -93,6 +95,14 @@ struct vdpa_iova_range {
 	u64 last;
 };
 
+struct vdpa_dev_set_config {
+	struct {
+		u8 mac[ETH_ALEN];
+		u16 mtu;
+	} net;
+	u64 mask;
+};
+
 /**
  * Corresponding file area for device memory mapping
  * @file: vma->vm_file for the mapping
@@ -397,6 +407,7 @@ void vdpa_set_config(struct vdpa_device *dev, unsigned int offset,
  * @dev_add: Add a vdpa device using alloc and register
  *	     @mdev: parent device to use for device addition
  *	     @name: name of the new vdpa device
+ *	     @config: config attributes to apply to the device under creation
  *	     Driver need to add a new device using _vdpa_register_device()
  *	     after fully initializing the vdpa device. Driver must return 0
  *	     on success or appropriate error code.
@@ -407,7 +418,8 @@ void vdpa_set_config(struct vdpa_device *dev, unsigned int offset,
  *	     _vdpa_unregister_device().
  */
 struct vdpa_mgmtdev_ops {
-	int (*dev_add)(struct vdpa_mgmt_dev *mdev, const char *name);
+	int (*dev_add)(struct vdpa_mgmt_dev *mdev, const char *name,
+		       const struct vdpa_dev_set_config *config);
 	void (*dev_del)(struct vdpa_mgmt_dev *mdev, struct vdpa_device *dev);
 };
 
@@ -416,12 +428,15 @@ struct vdpa_mgmtdev_ops {
  * @device: Management parent device
  * @ops: operations supported by management device
  * @id_table: Pointer to device id table of supported ids
+ * @config_attr_mask: bit mask of attributes of type enum vdpa_attr that
+ *		      management devie support during dev_add callback
  * @list: list entry
  */
 struct vdpa_mgmt_dev {
 	struct device *device;
 	const struct vdpa_mgmtdev_ops *ops;
 	const struct virtio_device_id *id_table;
+	u64 config_attr_mask;
 	struct list_head list;
 };
 
-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* [PATCH linux-next v5 5/8] vdpa_sim_net: Enable user to set mac address and mtu
  2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
                   ` (3 preceding siblings ...)
  2021-10-25 12:53 ` [PATCH linux-next v5 4/8] vdpa: Enable user to set mac and mtu of vdpa device Parav Pandit via Virtualization
@ 2021-10-25 12:53 ` Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 6/8] vdpa/mlx5: Fix clearing of VIRTIO_NET_F_MAC feature bit Parav Pandit via Virtualization
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

Enable user to set the mac address and mtu so that each vdpa device
can have its own user specified mac address and mtu.

Now that user is enabled to set the mac address, remove the module
parameter for same.

And example of setting mac addr and mtu and view the configuration:
$ vdpa mgmtdev show
vdpasim_net:
  supported_classes net

$ vdpa dev add name bar mgmtdev vdpasim_net mac 00:11:22:33:44:55 mtu 9000

$ vdpa dev config show
bar: mac 00:11:22:33:44:55 link up link_announce false mtu 9000

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Eli Cohen <elic@nvidia.com>
---
changelog:
v4->v5:
 - updated commit log example for add command
---
 drivers/vdpa/vdpa_sim/vdpa_sim_net.c | 35 +++++++++++++++-------------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
index d681e423e64f..76dd24abc791 100644
--- a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
+++ b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
@@ -16,6 +16,7 @@
 #include <linux/vringh.h>
 #include <linux/vdpa.h>
 #include <uapi/linux/virtio_net.h>
+#include <uapi/linux/vdpa.h>
 
 #include "vdpa_sim.h"
 
@@ -29,12 +30,6 @@
 
 #define VDPASIM_NET_VQ_NUM	2
 
-static char *macaddr;
-module_param(macaddr, charp, 0);
-MODULE_PARM_DESC(macaddr, "Ethernet MAC address");
-
-static u8 macaddr_buf[ETH_ALEN];
-
 static void vdpasim_net_work(struct work_struct *work)
 {
 	struct vdpasim *vdpasim = container_of(work, struct vdpasim, work);
@@ -112,9 +107,21 @@ static void vdpasim_net_get_config(struct vdpasim *vdpasim, void *config)
 {
 	struct virtio_net_config *net_config = config;
 
-	net_config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
 	net_config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);
-	memcpy(net_config->mac, macaddr_buf, ETH_ALEN);
+}
+
+static void vdpasim_net_setup_config(struct vdpasim *vdpasim,
+				     const struct vdpa_dev_set_config *config)
+{
+	struct virtio_net_config *vio_config = vdpasim->config;
+
+	if (config->mask & (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR))
+		memcpy(vio_config->mac, config->net.mac, ETH_ALEN);
+	if (config->mask & (1 << VDPA_ATTR_DEV_NET_CFG_MTU))
+		vio_config->mtu = cpu_to_vdpasim16(vdpasim, config->net.mtu);
+	else
+		/* Setup default MTU to be 1500 */
+		vio_config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
 }
 
 static void vdpasim_net_mgmtdev_release(struct device *dev)
@@ -147,6 +154,8 @@ static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
 	if (IS_ERR(simdev))
 		return PTR_ERR(simdev);
 
+	vdpasim_net_setup_config(simdev, config);
+
 	ret = _vdpa_register_device(&simdev->vdpa, VDPASIM_NET_VQ_NUM);
 	if (ret)
 		goto reg_err;
@@ -180,20 +189,14 @@ static struct vdpa_mgmt_dev mgmt_dev = {
 	.device = &vdpasim_net_mgmtdev,
 	.id_table = id_table,
 	.ops = &vdpasim_net_mgmtdev_ops,
+	.config_attr_mask = (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR |
+			     1 << VDPA_ATTR_DEV_NET_CFG_MTU),
 };
 
 static int __init vdpasim_net_init(void)
 {
 	int ret;
 
-	if (macaddr) {
-		mac_pton(macaddr, macaddr_buf);
-		if (!is_valid_ether_addr(macaddr_buf))
-			return -EADDRNOTAVAIL;
-	} else {
-		eth_random_addr(macaddr_buf);
-	}
-
 	ret = device_register(&vdpasim_net_mgmtdev);
 	if (ret)
 		return ret;
-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* [PATCH linux-next v5 6/8] vdpa/mlx5: Fix clearing of VIRTIO_NET_F_MAC feature bit
  2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
                   ` (4 preceding siblings ...)
  2021-10-25 12:53 ` [PATCH linux-next v5 5/8] vdpa_sim_net: Enable user to set mac address and mtu Parav Pandit via Virtualization
@ 2021-10-25 12:53 ` Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC Parav Pandit via Virtualization
  2021-10-25 12:53 ` [PATCH linux-next v5 8/8] vdpa/mlx5: Forward only packets with allowed MAC address Parav Pandit via Virtualization
  7 siblings, 0 replies; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

Cited patch in the fixes tag clears the features bit during reset.
mlx5 vdpa device feature bits are static decided by device capabilities.

Clearing features bit cleared the VIRTIO_NET_F_MAC. Due to this MAC address
provided by the device is not honored.

Fix it by not clearing the static feature bits during reset.

Fixes: 0686082dbf7a ("vdpa: Add reset callback in vdpa_config_ops")
Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Eli Cohen <elic@nvidia.com>
---
 drivers/vdpa/mlx5/net/mlx5_vnet.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
index 6bbdc0ece707..8d1539728a59 100644
--- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
+++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
@@ -2194,7 +2194,6 @@ static int mlx5_vdpa_reset(struct vdpa_device *vdev)
 	clear_vqs_ready(ndev);
 	mlx5_vdpa_destroy_mr(&ndev->mvdev);
 	ndev->mvdev.status = 0;
-	ndev->mvdev.mlx_features = 0;
 	memset(ndev->event_cbs, 0, sizeof(ndev->event_cbs));
 	ndev->mvdev.actual_features = 0;
 	++mvdev->generation;
-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC
  2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
                   ` (5 preceding siblings ...)
  2021-10-25 12:53 ` [PATCH linux-next v5 6/8] vdpa/mlx5: Fix clearing of VIRTIO_NET_F_MAC feature bit Parav Pandit via Virtualization
@ 2021-10-25 12:53 ` Parav Pandit via Virtualization
  2021-10-25 18:35   ` Parav Pandit via Virtualization
  2021-10-26  4:58   ` leohou1402
  2021-10-25 12:53 ` [PATCH linux-next v5 8/8] vdpa/mlx5: Forward only packets with allowed MAC address Parav Pandit via Virtualization
  7 siblings, 2 replies; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

From: Eli Cohen <elic@nvidia.com>

Add code to accept MAC configuration through vdpa tool. The MAC is
written into the config struct and later can be retrieved through
get_config().

Examples:
1. Configure MAC while adding a device:
$ vdpa dev add mgmtdev pci/0000:06:00.2 name vdpa0 mac 00:11:22:33:44:55

2. Show configured params:
$ vdpa dev config show
vdpa0: mac 00:11:22:33:44:55 link down link_announce false max_vq_pairs 8 mtu 1500

Signed-off-by: Eli Cohen <elic@nvidia.com>
Reviewed-by: Parav Pandit <parav@nvidia.com>
Acked-by: Jason Wang <jasowang@redhat.com>
---
 drivers/vdpa/mlx5/net/mlx5_vnet.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
index 8d1539728a59..860d80efa5d1 100644
--- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
+++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
@@ -6,6 +6,7 @@
 #include <linux/vringh.h>
 #include <uapi/linux/virtio_net.h>
 #include <uapi/linux/virtio_ids.h>
+#include <uapi/linux/vdpa.h>
 #include <linux/virtio_config.h>
 #include <linux/auxiliary_bus.h>
 #include <linux/mlx5/cq.h>
@@ -2523,18 +2524,19 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
 	if (err)
 		goto err_mtu;
 
-	ndev->config.mtu = cpu_to_mlx5vdpa16(mvdev, mtu);
-	ndev->config.status |= cpu_to_mlx5vdpa16(mvdev, VIRTIO_NET_S_LINK_UP);
-
-	err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config->mac);
-	if (err)
-		goto err_mtu;
-
 	if (get_link_state(mvdev))
 		ndev->config.status |= cpu_to_mlx5vdpa16(mvdev, VIRTIO_NET_S_LINK_UP);
 	else
 		ndev->config.status &= cpu_to_mlx5vdpa16(mvdev, ~VIRTIO_NET_S_LINK_UP);
 
+	if (add_config->mask & (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR)) {
+		memcpy(ndev->config.mac, add_config->net.mac, ETH_ALEN);
+	} else {
+		err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config->mac);
+		if (err)
+			goto err_mtu;
+	}
+
 	if (!is_zero_ether_addr(config->mac)) {
 		pfmdev = pci_get_drvdata(pci_physfn(mdev->pdev));
 		err = mlx5_mpfs_add_mac(pfmdev, config->mac);
@@ -2632,6 +2634,7 @@ static int mlx5v_probe(struct auxiliary_device *adev,
 	mgtdev->mgtdev.ops = &mdev_ops;
 	mgtdev->mgtdev.device = mdev->device;
 	mgtdev->mgtdev.id_table = id_table;
+	mgtdev->mgtdev.config_attr_mask = (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR);
 	mgtdev->madev = madev;
 
 	err = vdpa_mgmtdev_register(&mgtdev->mgtdev);
-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* [PATCH linux-next v5 8/8] vdpa/mlx5: Forward only packets with allowed MAC address
  2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
                   ` (6 preceding siblings ...)
  2021-10-25 12:53 ` [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC Parav Pandit via Virtualization
@ 2021-10-25 12:53 ` Parav Pandit via Virtualization
  7 siblings, 0 replies; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 12:53 UTC (permalink / raw)
  To: virtualization; +Cc: elic, mst

From: Eli Cohen <elic@nvidia.com>

Add rules to forward packets to the net device's TIR only if the
destination MAC is equal to the configured MAC. This is required to
prevent the netdevice from receiving traffic not destined to its
configured MAC.

Signed-off-by: Eli Cohen <elic@nvidia.com>
Reviewed-by: Parav Pandit <parav@nvidia.com>
---
 drivers/vdpa/mlx5/net/mlx5_vnet.c | 76 +++++++++++++++++++++++--------
 1 file changed, 58 insertions(+), 18 deletions(-)

diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
index 860d80efa5d1..fb06c69c79db 100644
--- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
+++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
@@ -158,7 +158,8 @@ struct mlx5_vdpa_net {
 	struct mutex reslock;
 	struct mlx5_flow_table *rxft;
 	struct mlx5_fc *rx_counter;
-	struct mlx5_flow_handle *rx_rule;
+	struct mlx5_flow_handle *rx_rule_ucast;
+	struct mlx5_flow_handle *rx_rule_mcast;
 	bool setup;
 	u32 cur_num_vqs;
 	struct notifier_block nb;
@@ -1383,21 +1384,33 @@ static int add_fwd_to_tir(struct mlx5_vdpa_net *ndev)
 	struct mlx5_flow_table_attr ft_attr = {};
 	struct mlx5_flow_act flow_act = {};
 	struct mlx5_flow_namespace *ns;
+	struct mlx5_flow_spec *spec;
+	void *headers_c;
+	void *headers_v;
+	u8 *dmac_c;
+	u8 *dmac_v;
 	int err;
 
-	/* for now, one entry, match all, forward to tir */
-	ft_attr.max_fte = 1;
-	ft_attr.autogroup.max_num_groups = 1;
+	spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
+	if (!spec)
+		return -ENOMEM;
+
+	spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
+	ft_attr.max_fte = 2;
+	ft_attr.autogroup.max_num_groups = 2;
 
 	ns = mlx5_get_flow_namespace(ndev->mvdev.mdev, MLX5_FLOW_NAMESPACE_BYPASS);
 	if (!ns) {
-		mlx5_vdpa_warn(&ndev->mvdev, "get flow namespace\n");
-		return -EOPNOTSUPP;
+		mlx5_vdpa_warn(&ndev->mvdev, "failed to get flow namespace\n");
+		err = -EOPNOTSUPP;
+		goto err_ns;
 	}
 
 	ndev->rxft = mlx5_create_auto_grouped_flow_table(ns, &ft_attr);
-	if (IS_ERR(ndev->rxft))
-		return PTR_ERR(ndev->rxft);
+	if (IS_ERR(ndev->rxft)) {
+		err = PTR_ERR(ndev->rxft);
+		goto err_ns;
+	}
 
 	ndev->rx_counter = mlx5_fc_create(ndev->mvdev.mdev, false);
 	if (IS_ERR(ndev->rx_counter)) {
@@ -1405,37 +1418,64 @@ static int add_fwd_to_tir(struct mlx5_vdpa_net *ndev)
 		goto err_fc;
 	}
 
+	headers_c = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, outer_headers);
+	dmac_c = MLX5_ADDR_OF(fte_match_param, headers_c, outer_headers.dmac_47_16);
+	memset(dmac_c, 0xff, ETH_ALEN);
+	headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, outer_headers);
+	dmac_v = MLX5_ADDR_OF(fte_match_param, headers_v, outer_headers.dmac_47_16);
+	ether_addr_copy(dmac_v, ndev->config.mac);
+
 	flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_COUNT;
 	dest[0].type = MLX5_FLOW_DESTINATION_TYPE_TIR;
 	dest[0].tir_num = ndev->res.tirn;
 	dest[1].type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
 	dest[1].counter_id = mlx5_fc_id(ndev->rx_counter);
-	ndev->rx_rule = mlx5_add_flow_rules(ndev->rxft, NULL, &flow_act, dest, 2);
-	if (IS_ERR(ndev->rx_rule)) {
-		err = PTR_ERR(ndev->rx_rule);
-		ndev->rx_rule = NULL;
-		goto err_rule;
+	ndev->rx_rule_ucast = mlx5_add_flow_rules(ndev->rxft, spec, &flow_act, dest, 2);
+
+	if (IS_ERR(ndev->rx_rule_ucast)) {
+		err = PTR_ERR(ndev->rx_rule_ucast);
+		ndev->rx_rule_ucast = NULL;
+		goto err_rule_ucast;
+	}
+
+	memset(dmac_c, 0, ETH_ALEN);
+	memset(dmac_v, 0, ETH_ALEN);
+	dmac_c[0] = 1;
+	dmac_v[0] = 1;
+	flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
+	ndev->rx_rule_mcast = mlx5_add_flow_rules(ndev->rxft, spec, &flow_act, dest, 1);
+	if (IS_ERR(ndev->rx_rule_mcast)) {
+		err = PTR_ERR(ndev->rx_rule_mcast);
+		ndev->rx_rule_mcast = NULL;
+		goto err_rule_mcast;
 	}
 
+	kvfree(spec);
 	return 0;
 
-err_rule:
+err_rule_mcast:
+	mlx5_del_flow_rules(ndev->rx_rule_ucast);
+	ndev->rx_rule_ucast = NULL;
+err_rule_ucast:
 	mlx5_fc_destroy(ndev->mvdev.mdev, ndev->rx_counter);
 err_fc:
 	mlx5_destroy_flow_table(ndev->rxft);
+err_ns:
+	kvfree(spec);
 	return err;
 }
 
 static void remove_fwd_to_tir(struct mlx5_vdpa_net *ndev)
 {
-	if (!ndev->rx_rule)
+	if (!ndev->rx_rule_ucast)
 		return;
 
-	mlx5_del_flow_rules(ndev->rx_rule);
+	mlx5_del_flow_rules(ndev->rx_rule_mcast);
+	ndev->rx_rule_mcast = NULL;
+	mlx5_del_flow_rules(ndev->rx_rule_ucast);
+	ndev->rx_rule_ucast = NULL;
 	mlx5_fc_destroy(ndev->mvdev.mdev, ndev->rx_counter);
 	mlx5_destroy_flow_table(ndev->rxft);
-
-	ndev->rx_rule = NULL;
 }
 
 static virtio_net_ctrl_ack handle_ctrl_mac(struct mlx5_vdpa_dev *mvdev, u8 cmd)
-- 
2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* RE: [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC
  2021-10-25 12:53 ` [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC Parav Pandit via Virtualization
@ 2021-10-25 18:35   ` Parav Pandit via Virtualization
  2021-10-25 21:14     ` Michael S. Tsirkin
  2021-10-26  4:58   ` leohou1402
  1 sibling, 1 reply; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-25 18:35 UTC (permalink / raw)
  To: virtualization; +Cc: Eli Cohen, mst


> From: Parav Pandit <parav@nvidia.com>
> Sent: Monday, October 25, 2021 6:23 PM
> 
> From: Eli Cohen <elic@nvidia.com>
> 
> Add code to accept MAC configuration through vdpa tool. The MAC is written
> into the config struct and later can be retrieved through get_config().
> 
> Examples:
> 1. Configure MAC while adding a device:
> $ vdpa dev add mgmtdev pci/0000:06:00.2 name vdpa0 mac 00:11:22:33:44:55
> 
> 2. Show configured params:
> $ vdpa dev config show
> vdpa0: mac 00:11:22:33:44:55 link down link_announce false max_vq_pairs 8
> mtu 1500
> 
> Signed-off-by: Eli Cohen <elic@nvidia.com>
> Reviewed-by: Parav Pandit <parav@nvidia.com>
> Acked-by: Jason Wang <jasowang@redhat.com>
> ---
>  drivers/vdpa/mlx5/net/mlx5_vnet.c | 17 ++++++++++-------
>  1 file changed, 10 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> index 8d1539728a59..860d80efa5d1 100644
> --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> @@ -6,6 +6,7 @@
>  #include <linux/vringh.h>
>  #include <uapi/linux/virtio_net.h>
>  #include <uapi/linux/virtio_ids.h>
> +#include <uapi/linux/vdpa.h>
>  #include <linux/virtio_config.h>
>  #include <linux/auxiliary_bus.h>
>  #include <linux/mlx5/cq.h>
> @@ -2523,18 +2524,19 @@ static int mlx5_vdpa_dev_add(struct
> vdpa_mgmt_dev *v_mdev, const char *name,
>  	if (err)
>  		goto err_mtu;
> 
> -	ndev->config.mtu = cpu_to_mlx5vdpa16(mvdev, mtu);
I messed up above line in the rebase conflict.
Let me resend the series.

> -	ndev->config.status |= cpu_to_mlx5vdpa16(mvdev,
> VIRTIO_NET_S_LINK_UP);
> -
> -	err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config->mac);
> -	if (err)
> -		goto err_mtu;
> -
>  	if (get_link_state(mvdev))
>  		ndev->config.status |= cpu_to_mlx5vdpa16(mvdev,
> VIRTIO_NET_S_LINK_UP);
>  	else
>  		ndev->config.status &= cpu_to_mlx5vdpa16(mvdev,
> ~VIRTIO_NET_S_LINK_UP);
> 
> +	if (add_config->mask & (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR))
> {
> +		memcpy(ndev->config.mac, add_config->net.mac, ETH_ALEN);
> +	} else {
> +		err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config-
> >mac);
> +		if (err)
> +			goto err_mtu;
> +	}
> +
>  	if (!is_zero_ether_addr(config->mac)) {
>  		pfmdev = pci_get_drvdata(pci_physfn(mdev->pdev));
>  		err = mlx5_mpfs_add_mac(pfmdev, config->mac); @@ -2632,6
> +2634,7 @@ static int mlx5v_probe(struct auxiliary_device *adev,
>  	mgtdev->mgtdev.ops = &mdev_ops;
>  	mgtdev->mgtdev.device = mdev->device;
>  	mgtdev->mgtdev.id_table = id_table;
> +	mgtdev->mgtdev.config_attr_mask = (1 <<
> +VDPA_ATTR_DEV_NET_CFG_MACADDR);
>  	mgtdev->madev = madev;
> 
>  	err = vdpa_mgmtdev_register(&mgtdev->mgtdev);
> --
> 2.25.4
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC
  2021-10-25 18:35   ` Parav Pandit via Virtualization
@ 2021-10-25 21:14     ` Michael S. Tsirkin
  2021-10-26  4:07       ` Parav Pandit via Virtualization
  0 siblings, 1 reply; 17+ messages in thread
From: Michael S. Tsirkin @ 2021-10-25 21:14 UTC (permalink / raw)
  To: Parav Pandit; +Cc: Eli Cohen, virtualization

On Mon, Oct 25, 2021 at 06:35:35PM +0000, Parav Pandit wrote:
> 
> > From: Parav Pandit <parav@nvidia.com>
> > Sent: Monday, October 25, 2021 6:23 PM
> > 
> > From: Eli Cohen <elic@nvidia.com>
> > 
> > Add code to accept MAC configuration through vdpa tool. The MAC is written
> > into the config struct and later can be retrieved through get_config().
> > 
> > Examples:
> > 1. Configure MAC while adding a device:
> > $ vdpa dev add mgmtdev pci/0000:06:00.2 name vdpa0 mac 00:11:22:33:44:55
> > 
> > 2. Show configured params:
> > $ vdpa dev config show
> > vdpa0: mac 00:11:22:33:44:55 link down link_announce false max_vq_pairs 8
> > mtu 1500
> > 
> > Signed-off-by: Eli Cohen <elic@nvidia.com>
> > Reviewed-by: Parav Pandit <parav@nvidia.com>
> > Acked-by: Jason Wang <jasowang@redhat.com>
> > ---
> >  drivers/vdpa/mlx5/net/mlx5_vnet.c | 17 ++++++++++-------
> >  1 file changed, 10 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> > b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> > index 8d1539728a59..860d80efa5d1 100644
> > --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> > +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> > @@ -6,6 +6,7 @@
> >  #include <linux/vringh.h>
> >  #include <uapi/linux/virtio_net.h>
> >  #include <uapi/linux/virtio_ids.h>
> > +#include <uapi/linux/vdpa.h>
> >  #include <linux/virtio_config.h>
> >  #include <linux/auxiliary_bus.h>
> >  #include <linux/mlx5/cq.h>
> > @@ -2523,18 +2524,19 @@ static int mlx5_vdpa_dev_add(struct
> > vdpa_mgmt_dev *v_mdev, const char *name,
> >  	if (err)
> >  		goto err_mtu;
> > 
> > -	ndev->config.mtu = cpu_to_mlx5vdpa16(mvdev, mtu);
> I messed up above line in the rebase conflict.
> Let me resend the series.

If it's happening it's better happen soon, rc7 is out.

> > -	ndev->config.status |= cpu_to_mlx5vdpa16(mvdev,
> > VIRTIO_NET_S_LINK_UP);
> > -
> > -	err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config->mac);
> > -	if (err)
> > -		goto err_mtu;
> > -
> >  	if (get_link_state(mvdev))
> >  		ndev->config.status |= cpu_to_mlx5vdpa16(mvdev,
> > VIRTIO_NET_S_LINK_UP);
> >  	else
> >  		ndev->config.status &= cpu_to_mlx5vdpa16(mvdev,
> > ~VIRTIO_NET_S_LINK_UP);
> > 
> > +	if (add_config->mask & (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR))
> > {
> > +		memcpy(ndev->config.mac, add_config->net.mac, ETH_ALEN);
> > +	} else {
> > +		err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config-
> > >mac);
> > +		if (err)
> > +			goto err_mtu;
> > +	}
> > +
> >  	if (!is_zero_ether_addr(config->mac)) {
> >  		pfmdev = pci_get_drvdata(pci_physfn(mdev->pdev));
> >  		err = mlx5_mpfs_add_mac(pfmdev, config->mac); @@ -2632,6
> > +2634,7 @@ static int mlx5v_probe(struct auxiliary_device *adev,
> >  	mgtdev->mgtdev.ops = &mdev_ops;
> >  	mgtdev->mgtdev.device = mdev->device;
> >  	mgtdev->mgtdev.id_table = id_table;
> > +	mgtdev->mgtdev.config_attr_mask = (1 <<
> > +VDPA_ATTR_DEV_NET_CFG_MACADDR);
> >  	mgtdev->madev = madev;
> > 
> >  	err = vdpa_mgmtdev_register(&mgtdev->mgtdev);
> > --
> > 2.25.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH linux-next v5 2/8] vdpa: Introduce query of device config layout
  2021-10-25 12:53 ` [PATCH linux-next v5 2/8] vdpa: Introduce query of device config layout Parav Pandit via Virtualization
@ 2021-10-26  2:47   ` Jason Wang
  0 siblings, 0 replies; 17+ messages in thread
From: Jason Wang @ 2021-10-26  2:47 UTC (permalink / raw)
  To: Parav Pandit; +Cc: Eli Cohen, mst, virtualization

On Mon, Oct 25, 2021 at 8:53 PM Parav Pandit <parav@nvidia.com> wrote:
>
> Introduce a command to query a device config layout.
>
> An example query of network vdpa device:
>
> $ vdpa dev add name bar mgmtdev vdpasim_net
>
> $ vdpa dev config show
> bar: mac 00:35:09:19:48:05 link up link_announce false mtu 1500
>
> $ vdpa dev config show -jp
> {
>     "config": {
>         "bar": {
>             "mac": "00:35:09:19:48:05",
>             "link ": "up",
>             "link_announce ": false,
>             "mtu": 1500,
>         }
>     }
> }
>
> Signed-off-by: Parav Pandit <parav@nvidia.com>
> Signed-off-by: Eli Cohen <elic@nvidia.com>

Acked-by: Jason Wang <jasowang@redhat.com>

> ---
> changelog:
> v3->v4:
>  - removed config space fields reporting which are not used by mlx5
>    and sim drivers
> ---
>  drivers/vdpa/vdpa.c       | 176 ++++++++++++++++++++++++++++++++++++++
>  include/linux/vdpa.h      |   2 +
>  include/uapi/linux/vdpa.h |   6 ++
>  3 files changed, 184 insertions(+)
>
> diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c
> index d42697699366..973c56fb60b9 100644
> --- a/drivers/vdpa/vdpa.c
> +++ b/drivers/vdpa/vdpa.c
> @@ -14,6 +14,8 @@
>  #include <uapi/linux/vdpa.h>
>  #include <net/genetlink.h>
>  #include <linux/mod_devicetable.h>
> +#include <linux/virtio_net.h>
> +#include <linux/virtio_ids.h>
>
>  static LIST_HEAD(mdev_head);
>  /* A global mutex that protects vdpa management device and device level operations. */
> @@ -66,6 +68,7 @@ static void vdpa_release_dev(struct device *d)
>                 ops->free(vdev);
>
>         ida_simple_remove(&vdpa_index_ida, vdev->index);
> +       mutex_destroy(&vdev->cf_mutex);
>         kfree(vdev);
>  }
>
> @@ -127,6 +130,7 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
>         if (err)
>                 goto err_name;
>
> +       mutex_init(&vdev->cf_mutex);
>         device_initialize(&vdev->dev);
>
>         return vdev;
> @@ -309,6 +313,7 @@ void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
>  {
>         const struct vdpa_config_ops *ops = vdev->config;
>
> +       mutex_lock(&vdev->cf_mutex);
>         /*
>          * Config accesses aren't supposed to trigger before features are set.
>          * If it does happen we assume a legacy guest.
> @@ -316,6 +321,7 @@ void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
>         if (!vdev->features_valid)
>                 vdpa_set_features(vdev, 0);
>         ops->get_config(vdev, offset, buf, len);
> +       mutex_unlock(&vdev->cf_mutex);
>  }
>  EXPORT_SYMBOL_GPL(vdpa_get_config);
>
> @@ -329,7 +335,9 @@ EXPORT_SYMBOL_GPL(vdpa_get_config);
>  void vdpa_set_config(struct vdpa_device *vdev, unsigned int offset,
>                      const void *buf, unsigned int length)
>  {
> +       mutex_lock(&vdev->cf_mutex);
>         vdev->config->set_config(vdev, offset, buf, length);
> +       mutex_unlock(&vdev->cf_mutex);
>  }
>  EXPORT_SYMBOL_GPL(vdpa_set_config);
>
> @@ -661,6 +669,168 @@ static int vdpa_nl_cmd_dev_get_dumpit(struct sk_buff *msg, struct netlink_callba
>         return msg->len;
>  }
>
> +static int vdpa_dev_net_mq_config_fill(struct vdpa_device *vdev,
> +                                      struct sk_buff *msg, u64 features,
> +                                      const struct virtio_net_config *config)
> +{
> +       u16 val_u16;
> +
> +       if ((features & (1ULL << VIRTIO_NET_F_MQ)) == 0)
> +               return 0;
> +
> +       val_u16 = le16_to_cpu(config->max_virtqueue_pairs);
> +       return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MAX_VQP, val_u16);
> +}
> +
> +static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *msg)
> +{
> +       struct virtio_net_config config = {};
> +       u64 features;
> +       u16 val_u16;
> +
> +       vdpa_get_config(vdev, 0, &config, sizeof(config));
> +
> +       if (nla_put(msg, VDPA_ATTR_DEV_NET_CFG_MACADDR, sizeof(config.mac),
> +                   config.mac))
> +               return -EMSGSIZE;
> +
> +       val_u16 = le16_to_cpu(config.status);
> +       if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_STATUS, val_u16))
> +               return -EMSGSIZE;
> +
> +       val_u16 = le16_to_cpu(config.mtu);
> +       if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MTU, val_u16))
> +               return -EMSGSIZE;
> +
> +       features = vdev->config->get_features(vdev);
> +
> +       return vdpa_dev_net_mq_config_fill(vdev, msg, features, &config);
> +}
> +
> +static int
> +vdpa_dev_config_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid, u32 seq,
> +                    int flags, struct netlink_ext_ack *extack)
> +{
> +       u32 device_id;
> +       void *hdr;
> +       int err;
> +
> +       hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags,
> +                         VDPA_CMD_DEV_CONFIG_GET);
> +       if (!hdr)
> +               return -EMSGSIZE;
> +
> +       if (nla_put_string(msg, VDPA_ATTR_DEV_NAME, dev_name(&vdev->dev))) {
> +               err = -EMSGSIZE;
> +               goto msg_err;
> +       }
> +
> +       device_id = vdev->config->get_device_id(vdev);
> +       if (nla_put_u32(msg, VDPA_ATTR_DEV_ID, device_id)) {
> +               err = -EMSGSIZE;
> +               goto msg_err;
> +       }
> +
> +       switch (device_id) {
> +       case VIRTIO_ID_NET:
> +               err = vdpa_dev_net_config_fill(vdev, msg);
> +               break;
> +       default:
> +               err = -EOPNOTSUPP;
> +               break;
> +       }
> +       if (err)
> +               goto msg_err;
> +
> +       genlmsg_end(msg, hdr);
> +       return 0;
> +
> +msg_err:
> +       genlmsg_cancel(msg, hdr);
> +       return err;
> +}
> +
> +static int vdpa_nl_cmd_dev_config_get_doit(struct sk_buff *skb, struct genl_info *info)
> +{
> +       struct vdpa_device *vdev;
> +       struct sk_buff *msg;
> +       const char *devname;
> +       struct device *dev;
> +       int err;
> +
> +       if (!info->attrs[VDPA_ATTR_DEV_NAME])
> +               return -EINVAL;
> +       devname = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
> +       msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
> +       if (!msg)
> +               return -ENOMEM;
> +
> +       mutex_lock(&vdpa_dev_mutex);
> +       dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
> +       if (!dev) {
> +               NL_SET_ERR_MSG_MOD(info->extack, "device not found");
> +               err = -ENODEV;
> +               goto dev_err;
> +       }
> +       vdev = container_of(dev, struct vdpa_device, dev);
> +       if (!vdev->mdev) {
> +               NL_SET_ERR_MSG_MOD(info->extack, "unmanaged vdpa device");
> +               err = -EINVAL;
> +               goto mdev_err;
> +       }
> +       err = vdpa_dev_config_fill(vdev, msg, info->snd_portid, info->snd_seq,
> +                                  0, info->extack);
> +       if (!err)
> +               err = genlmsg_reply(msg, info);
> +
> +mdev_err:
> +       put_device(dev);
> +dev_err:
> +       mutex_unlock(&vdpa_dev_mutex);
> +       if (err)
> +               nlmsg_free(msg);
> +       return err;
> +}
> +
> +static int vdpa_dev_config_dump(struct device *dev, void *data)
> +{
> +       struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
> +       struct vdpa_dev_dump_info *info = data;
> +       int err;
> +
> +       if (!vdev->mdev)
> +               return 0;
> +       if (info->idx < info->start_idx) {
> +               info->idx++;
> +               return 0;
> +       }
> +       err = vdpa_dev_config_fill(vdev, info->msg, NETLINK_CB(info->cb->skb).portid,
> +                                  info->cb->nlh->nlmsg_seq, NLM_F_MULTI,
> +                                  info->cb->extack);
> +       if (err)
> +               return err;
> +
> +       info->idx++;
> +       return 0;
> +}
> +
> +static int
> +vdpa_nl_cmd_dev_config_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
> +{
> +       struct vdpa_dev_dump_info info;
> +
> +       info.msg = msg;
> +       info.cb = cb;
> +       info.start_idx = cb->args[0];
> +       info.idx = 0;
> +
> +       mutex_lock(&vdpa_dev_mutex);
> +       bus_for_each_dev(&vdpa_bus, NULL, &info, vdpa_dev_config_dump);
> +       mutex_unlock(&vdpa_dev_mutex);
> +       cb->args[0] = info.idx;
> +       return msg->len;
> +}
> +
>  static const struct nla_policy vdpa_nl_policy[VDPA_ATTR_MAX + 1] = {
>         [VDPA_ATTR_MGMTDEV_BUS_NAME] = { .type = NLA_NUL_STRING },
>         [VDPA_ATTR_MGMTDEV_DEV_NAME] = { .type = NLA_STRING },
> @@ -692,6 +862,12 @@ static const struct genl_ops vdpa_nl_ops[] = {
>                 .doit = vdpa_nl_cmd_dev_get_doit,
>                 .dumpit = vdpa_nl_cmd_dev_get_dumpit,
>         },
> +       {
> +               .cmd = VDPA_CMD_DEV_CONFIG_GET,
> +               .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
> +               .doit = vdpa_nl_cmd_dev_config_get_doit,
> +               .dumpit = vdpa_nl_cmd_dev_config_get_dumpit,
> +       },
>  };
>
>  static struct genl_family vdpa_nl_family __ro_after_init = {
> diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
> index 267236aab34c..5cc5e501397f 100644
> --- a/include/linux/vdpa.h
> +++ b/include/linux/vdpa.h
> @@ -63,6 +63,7 @@ struct vdpa_mgmt_dev;
>   * @dev: underlying device
>   * @dma_dev: the actual device that is performing DMA
>   * @config: the configuration ops for this device.
> + * @cf_mutex: Protects get and set access to configuration layout.
>   * @index: device index
>   * @features_valid: were features initialized? for legacy guests
>   * @use_va: indicate whether virtual address must be used by this device
> @@ -74,6 +75,7 @@ struct vdpa_device {
>         struct device dev;
>         struct device *dma_dev;
>         const struct vdpa_config_ops *config;
> +       struct mutex cf_mutex; /* Protects get/set config */
>         unsigned int index;
>         bool features_valid;
>         bool use_va;
> diff --git a/include/uapi/linux/vdpa.h b/include/uapi/linux/vdpa.h
> index e3b87879514c..a252f06f9dfd 100644
> --- a/include/uapi/linux/vdpa.h
> +++ b/include/uapi/linux/vdpa.h
> @@ -17,6 +17,7 @@ enum vdpa_command {
>         VDPA_CMD_DEV_NEW,
>         VDPA_CMD_DEV_DEL,
>         VDPA_CMD_DEV_GET,               /* can dump */
> +       VDPA_CMD_DEV_CONFIG_GET,        /* can dump */
>  };
>
>  enum vdpa_attr {
> @@ -34,6 +35,11 @@ enum vdpa_attr {
>         VDPA_ATTR_DEV_MAX_VQ_SIZE,              /* u16 */
>         VDPA_ATTR_DEV_MIN_VQ_SIZE,              /* u16 */
>
> +       VDPA_ATTR_DEV_NET_CFG_MACADDR,          /* binary */
> +       VDPA_ATTR_DEV_NET_STATUS,               /* u8 */
> +       VDPA_ATTR_DEV_NET_CFG_MAX_VQP,          /* u16 */
> +       VDPA_ATTR_DEV_NET_CFG_MTU,              /* u16 */
> +
>         /* new attributes must be added above here */
>         VDPA_ATTR_MAX,
>  };
> --
> 2.25.4
>

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH linux-next v5 4/8] vdpa: Enable user to set mac and mtu of vdpa device
  2021-10-25 12:53 ` [PATCH linux-next v5 4/8] vdpa: Enable user to set mac and mtu of vdpa device Parav Pandit via Virtualization
@ 2021-10-26  2:47   ` Jason Wang
  0 siblings, 0 replies; 17+ messages in thread
From: Jason Wang @ 2021-10-26  2:47 UTC (permalink / raw)
  To: Parav Pandit; +Cc: Eli Cohen, mst, virtualization

On Mon, Oct 25, 2021 at 8:53 PM Parav Pandit <parav@nvidia.com> wrote:
>
> $ vdpa dev add name bar mgmtdev vdpasim_net mac 00:11:22:33:44:55 mtu 9000
>
> $ vdpa dev config show
> bar: mac 00:11:22:33:44:55 link up link_announce false mtu 9000
>
> $ vdpa dev config show -jp
> {
>     "config": {
>         "bar": {
>             "mac": "00:11:22:33:44:55",
>             "link ": "up",
>             "link_announce ": false,
>             "mtu": 9000,
>         }
>     }
> }
>
> Signed-off-by: Parav Pandit <parav@nvidia.com>
> Reviewed-by: Eli Cohen <elic@nvidia.com>

Acked-by: Jason Wang <jasowang@redhat.com>

> ---
> changelog:
> v4->v5:
>  - added comment for checking device capabilities
> v3->v4:
>  - provide config attributes during device addition time
> ---
>  drivers/vdpa/ifcvf/ifcvf_main.c      |  3 ++-
>  drivers/vdpa/mlx5/net/mlx5_vnet.c    |  3 ++-
>  drivers/vdpa/vdpa.c                  | 38 ++++++++++++++++++++++++++--
>  drivers/vdpa/vdpa_sim/vdpa_sim_blk.c |  3 ++-
>  drivers/vdpa/vdpa_sim/vdpa_sim_net.c |  3 ++-
>  drivers/vdpa/vdpa_user/vduse_dev.c   |  3 ++-
>  include/linux/vdpa.h                 | 17 ++++++++++++-
>  7 files changed, 62 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
> index dcd648e1f7e7..6dc75ca70b37 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_main.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c
> @@ -499,7 +499,8 @@ static u32 get_dev_type(struct pci_dev *pdev)
>         return dev_type;
>  }
>
> -static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
> +static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
> +                             const struct vdpa_dev_set_config *config)
>  {
>         struct ifcvf_vdpa_mgmt_dev *ifcvf_mgmt_dev;
>         struct ifcvf_adapter *adapter;
> diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> index b5bd1a553256..6bbdc0ece707 100644
> --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> @@ -2482,7 +2482,8 @@ static int event_handler(struct notifier_block *nb, unsigned long event, void *p
>         return ret;
>  }
>
> -static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name)
> +static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
> +                            const struct vdpa_dev_set_config *add_config)
>  {
>         struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
>         struct virtio_net_config *config;
> diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c
> index 973c56fb60b9..a1168a7fa8b8 100644
> --- a/drivers/vdpa/vdpa.c
> +++ b/drivers/vdpa/vdpa.c
> @@ -14,7 +14,6 @@
>  #include <uapi/linux/vdpa.h>
>  #include <net/genetlink.h>
>  #include <linux/mod_devicetable.h>
> -#include <linux/virtio_net.h>
>  #include <linux/virtio_ids.h>
>
>  static LIST_HEAD(mdev_head);
> @@ -480,9 +479,15 @@ vdpa_nl_cmd_mgmtdev_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
>         return msg->len;
>  }
>
> +#define VDPA_DEV_NET_ATTRS_MASK ((1 << VDPA_ATTR_DEV_NET_CFG_MACADDR) | \
> +                                (1 << VDPA_ATTR_DEV_NET_CFG_MTU))
> +
>  static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *info)
>  {
> +       struct vdpa_dev_set_config config = {};
> +       struct nlattr **nl_attrs = info->attrs;
>         struct vdpa_mgmt_dev *mdev;
> +       const u8 *macaddr;
>         const char *name;
>         int err = 0;
>
> @@ -491,6 +496,26 @@ static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *i
>
>         name = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
>
> +       if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]) {
> +               macaddr = nla_data(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]);
> +               memcpy(config.net.mac, macaddr, sizeof(config.net.mac));
> +               config.mask |= (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR);
> +       }
> +       if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]) {
> +               config.net.mtu =
> +                       nla_get_u16(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]);
> +               config.mask |= (1 << VDPA_ATTR_DEV_NET_CFG_MTU);
> +       }
> +
> +       /* Skip checking capability if user didn't prefer to configure any
> +        * device networking attributes. It is likely that user might have used
> +        * a device specific method to configure such attributes or using device
> +        * default attributes.
> +        */
> +       if ((config.mask & VDPA_DEV_NET_ATTRS_MASK) &&
> +           !netlink_capable(skb, CAP_NET_ADMIN))
> +               return -EPERM;
> +
>         mutex_lock(&vdpa_dev_mutex);
>         mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
>         if (IS_ERR(mdev)) {
> @@ -498,8 +523,14 @@ static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *i
>                 err = PTR_ERR(mdev);
>                 goto err;
>         }
> +       if ((config.mask & mdev->config_attr_mask) != config.mask) {
> +               NL_SET_ERR_MSG_MOD(info->extack,
> +                                  "All provided attributes are not supported");
> +               err = -EOPNOTSUPP;
> +               goto err;
> +       }
>
> -       err = mdev->ops->dev_add(mdev, name);
> +       err = mdev->ops->dev_add(mdev, name, &config);
>  err:
>         mutex_unlock(&vdpa_dev_mutex);
>         return err;
> @@ -835,6 +866,9 @@ static const struct nla_policy vdpa_nl_policy[VDPA_ATTR_MAX + 1] = {
>         [VDPA_ATTR_MGMTDEV_BUS_NAME] = { .type = NLA_NUL_STRING },
>         [VDPA_ATTR_MGMTDEV_DEV_NAME] = { .type = NLA_STRING },
>         [VDPA_ATTR_DEV_NAME] = { .type = NLA_STRING },
> +       [VDPA_ATTR_DEV_NET_CFG_MACADDR] = NLA_POLICY_ETH_ADDR,
> +       /* virtio spec 1.1 section 5.1.4.1 for valid MTU range */
> +       [VDPA_ATTR_DEV_NET_CFG_MTU] = NLA_POLICY_MIN(NLA_U16, 68),
>  };
>
>  static const struct genl_ops vdpa_nl_ops[] = {
> diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
> index a790903f243e..42d401d43911 100644
> --- a/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
> +++ b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
> @@ -248,7 +248,8 @@ static struct device vdpasim_blk_mgmtdev = {
>         .release = vdpasim_blk_mgmtdev_release,
>  };
>
> -static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
> +static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
> +                              const struct vdpa_dev_set_config *config)
>  {
>         struct vdpasim_dev_attr dev_attr = {};
>         struct vdpasim *simdev;
> diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
> index a1ab6163f7d1..d681e423e64f 100644
> --- a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
> +++ b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
> @@ -126,7 +126,8 @@ static struct device vdpasim_net_mgmtdev = {
>         .release = vdpasim_net_mgmtdev_release,
>  };
>
> -static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
> +static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
> +                              const struct vdpa_dev_set_config *config)
>  {
>         struct vdpasim_dev_attr dev_attr = {};
>         struct vdpasim *simdev;
> diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c
> index 841667a896dd..c9204c62f339 100644
> --- a/drivers/vdpa/vdpa_user/vduse_dev.c
> +++ b/drivers/vdpa/vdpa_user/vduse_dev.c
> @@ -1503,7 +1503,8 @@ static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
>         return 0;
>  }
>
> -static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
> +static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
> +                       const struct vdpa_dev_set_config *config)
>  {
>         struct vduse_dev *dev;
>         int ret;
> diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
> index fafb7202482c..bf9ddf743e2f 100644
> --- a/include/linux/vdpa.h
> +++ b/include/linux/vdpa.h
> @@ -6,6 +6,8 @@
>  #include <linux/device.h>
>  #include <linux/interrupt.h>
>  #include <linux/vhost_iotlb.h>
> +#include <linux/virtio_net.h>
> +#include <linux/if_ether.h>
>
>  /**
>   * struct vdpa_calllback - vDPA callback definition.
> @@ -93,6 +95,14 @@ struct vdpa_iova_range {
>         u64 last;
>  };
>
> +struct vdpa_dev_set_config {
> +       struct {
> +               u8 mac[ETH_ALEN];
> +               u16 mtu;
> +       } net;
> +       u64 mask;
> +};
> +
>  /**
>   * Corresponding file area for device memory mapping
>   * @file: vma->vm_file for the mapping
> @@ -397,6 +407,7 @@ void vdpa_set_config(struct vdpa_device *dev, unsigned int offset,
>   * @dev_add: Add a vdpa device using alloc and register
>   *          @mdev: parent device to use for device addition
>   *          @name: name of the new vdpa device
> + *          @config: config attributes to apply to the device under creation
>   *          Driver need to add a new device using _vdpa_register_device()
>   *          after fully initializing the vdpa device. Driver must return 0
>   *          on success or appropriate error code.
> @@ -407,7 +418,8 @@ void vdpa_set_config(struct vdpa_device *dev, unsigned int offset,
>   *          _vdpa_unregister_device().
>   */
>  struct vdpa_mgmtdev_ops {
> -       int (*dev_add)(struct vdpa_mgmt_dev *mdev, const char *name);
> +       int (*dev_add)(struct vdpa_mgmt_dev *mdev, const char *name,
> +                      const struct vdpa_dev_set_config *config);
>         void (*dev_del)(struct vdpa_mgmt_dev *mdev, struct vdpa_device *dev);
>  };
>
> @@ -416,12 +428,15 @@ struct vdpa_mgmtdev_ops {
>   * @device: Management parent device
>   * @ops: operations supported by management device
>   * @id_table: Pointer to device id table of supported ids
> + * @config_attr_mask: bit mask of attributes of type enum vdpa_attr that
> + *                   management devie support during dev_add callback
>   * @list: list entry
>   */
>  struct vdpa_mgmt_dev {
>         struct device *device;
>         const struct vdpa_mgmtdev_ops *ops;
>         const struct virtio_device_id *id_table;
> +       u64 config_attr_mask;
>         struct list_head list;
>  };
>
> --
> 2.25.4
>

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* RE: [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC
  2021-10-25 21:14     ` Michael S. Tsirkin
@ 2021-10-26  4:07       ` Parav Pandit via Virtualization
  0 siblings, 0 replies; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-26  4:07 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Eli Cohen, virtualization



> From: Michael S. Tsirkin <mst@redhat.com>
> Sent: Tuesday, October 26, 2021 2:45 AM
> 
> On Mon, Oct 25, 2021 at 06:35:35PM +0000, Parav Pandit wrote:
> >
> > > From: Parav Pandit <parav@nvidia.com>
> > > Sent: Monday, October 25, 2021 6:23 PM
> > >
> > > From: Eli Cohen <elic@nvidia.com>
> > >
> > > Add code to accept MAC configuration through vdpa tool. The MAC is
> > > written into the config struct and later can be retrieved through
> get_config().
> > >
> > > Examples:
> > > 1. Configure MAC while adding a device:
> > > $ vdpa dev add mgmtdev pci/0000:06:00.2 name vdpa0 mac
> > > 00:11:22:33:44:55
> > >
> > > 2. Show configured params:
> > > $ vdpa dev config show
> > > vdpa0: mac 00:11:22:33:44:55 link down link_announce false
> > > max_vq_pairs 8 mtu 1500
> > >
> > > Signed-off-by: Eli Cohen <elic@nvidia.com>
> > > Reviewed-by: Parav Pandit <parav@nvidia.com>
> > > Acked-by: Jason Wang <jasowang@redhat.com>
> > > ---
> > >  drivers/vdpa/mlx5/net/mlx5_vnet.c | 17 ++++++++++-------
> > >  1 file changed, 10 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> > > b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> > > index 8d1539728a59..860d80efa5d1 100644
> > > --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> > > +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> > > @@ -6,6 +6,7 @@
> > >  #include <linux/vringh.h>
> > >  #include <uapi/linux/virtio_net.h>
> > >  #include <uapi/linux/virtio_ids.h>
> > > +#include <uapi/linux/vdpa.h>
> > >  #include <linux/virtio_config.h>
> > >  #include <linux/auxiliary_bus.h>
> > >  #include <linux/mlx5/cq.h>
> > > @@ -2523,18 +2524,19 @@ static int mlx5_vdpa_dev_add(struct
> > > vdpa_mgmt_dev *v_mdev, const char *name,
> > >  	if (err)
> > >  		goto err_mtu;
> > >
> > > -	ndev->config.mtu = cpu_to_mlx5vdpa16(mvdev, mtu);
> > I messed up above line in the rebase conflict.
> > Let me resend the series.
> 
> If it's happening it's better happen soon, rc7 is out.
> 
Done at [1].
[1] https://lore.kernel.org/virtualization/20211026040243.79005-1-parav@nvidia.com/T/#t
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC
  2021-10-25 12:53 ` [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC Parav Pandit via Virtualization
  2021-10-25 18:35   ` Parav Pandit via Virtualization
@ 2021-10-26  4:58   ` leohou1402
  2021-10-26  5:00     ` Parav Pandit via Virtualization
  1 sibling, 1 reply; 17+ messages in thread
From: leohou1402 @ 2021-10-26  4:58 UTC (permalink / raw)
  To: parav; +Cc: elic, mst, virtualization

[-- Attachment #1: Type: text/html, Size: 4374 bytes --]

[-- Attachment #2: Type: text/plain, Size: 183 bytes --]

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* RE: [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC
  2021-10-26  4:58   ` leohou1402
@ 2021-10-26  5:00     ` Parav Pandit via Virtualization
  2021-10-26  5:40       ` Leo Hou
  0 siblings, 1 reply; 17+ messages in thread
From: Parav Pandit via Virtualization @ 2021-10-26  5:00 UTC (permalink / raw)
  To: leohou1402; +Cc: Eli Cohen, mst, virtualization


> From: leohou1402 <leohou1402@gmail.com> 
> Sent: Tuesday, October 26, 2021 10:28 AM

> Which device does mlX5 refer to ? Connectx-4 or ConnectX-5 ?
> I want to test it out.
ConnectX-6 dx.

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC
  2021-10-26  5:00     ` Parav Pandit via Virtualization
@ 2021-10-26  5:40       ` Leo Hou
  0 siblings, 0 replies; 17+ messages in thread
From: Leo Hou @ 2021-10-26  5:40 UTC (permalink / raw)
  To: Parav Pandit; +Cc: Eli Cohen, mst, virtualization


[-- Attachment #1.1: Type: text/plain, Size: 308 bytes --]

Thanks!

Parav Pandit <parav@nvidia.com> 于2021年10月26日周二 下午1:00写道:

>
> > From: leohou1402 <leohou1402@gmail.com>
> > Sent: Tuesday, October 26, 2021 10:28 AM
>
> > Which device does mlX5 refer to ? Connectx-4 or ConnectX-5 ?
> > I want to test it out.
> ConnectX-6 dx.
>
>

[-- Attachment #1.2: Type: text/html, Size: 678 bytes --]

[-- Attachment #2: Type: text/plain, Size: 183 bytes --]

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

end of thread, other threads:[~2021-10-26  5:41 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-25 12:53 [PATCH linux-next v5 0/8] vdpa: enable user to set mac, mtu Parav Pandit via Virtualization
2021-10-25 12:53 ` [PATCH linux-next v5 1/8] vdpa: Introduce and use vdpa device get, set config helpers Parav Pandit via Virtualization
2021-10-25 12:53 ` [PATCH linux-next v5 2/8] vdpa: Introduce query of device config layout Parav Pandit via Virtualization
2021-10-26  2:47   ` Jason Wang
2021-10-25 12:53 ` [PATCH linux-next v5 3/8] vdpa: Use kernel coding style for structure comments Parav Pandit via Virtualization
2021-10-25 12:53 ` [PATCH linux-next v5 4/8] vdpa: Enable user to set mac and mtu of vdpa device Parav Pandit via Virtualization
2021-10-26  2:47   ` Jason Wang
2021-10-25 12:53 ` [PATCH linux-next v5 5/8] vdpa_sim_net: Enable user to set mac address and mtu Parav Pandit via Virtualization
2021-10-25 12:53 ` [PATCH linux-next v5 6/8] vdpa/mlx5: Fix clearing of VIRTIO_NET_F_MAC feature bit Parav Pandit via Virtualization
2021-10-25 12:53 ` [PATCH linux-next v5 7/8] vdpa/mlx5: Support configuration of MAC Parav Pandit via Virtualization
2021-10-25 18:35   ` Parav Pandit via Virtualization
2021-10-25 21:14     ` Michael S. Tsirkin
2021-10-26  4:07       ` Parav Pandit via Virtualization
2021-10-26  4:58   ` leohou1402
2021-10-26  5:00     ` Parav Pandit via Virtualization
2021-10-26  5:40       ` Leo Hou
2021-10-25 12:53 ` [PATCH linux-next v5 8/8] vdpa/mlx5: Forward only packets with allowed MAC address Parav Pandit via Virtualization

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.