Re: [PATCH linux-next v6 4/8] vdpa: Enable user to set mac and mtu of vdpa device
On Tue, Oct 26, 2021 at 01:11:51PM +, Parav Pandit wrote: From: Michael S. Tsirkin Sent: Tuesday, October 26, 2021 6:38 PM On Tue, Oct 26, 2021 at 01:03:41PM +, Parav Pandit wrote: > > > > From: Stefano Garzarella > > Sent: Tuesday, October 26, 2021 6:31 PM > > > > On Tue, Oct 26, 2021 at 07:02:39AM +0300, Parav Pandit via > > Virtualization > > 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 > > >Reviewed-by: Eli Cohen > > >Acked-by: Jason Wang > > > > > >--- > > >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 > > > #include > > > #include -#include > > >#include > > > > > > 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) && > > >+
RE: [PATCH linux-next v6 4/8] vdpa: Enable user to set mac and mtu of vdpa device
> From: Michael S. Tsirkin > Sent: Tuesday, October 26, 2021 6:38 PM > > On Tue, Oct 26, 2021 at 01:03:41PM +, Parav Pandit wrote: > > > > > > > From: Stefano Garzarella > > > Sent: Tuesday, October 26, 2021 6:31 PM > > > > > > On Tue, Oct 26, 2021 at 07:02:39AM +0300, Parav Pandit via > > > Virtualization > > > 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 > > > >Reviewed-by: Eli Cohen > > > >Acked-by: Jason Wang > > > > > > > >--- > > > >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 > > > > #include > > > > #include -#include > > > >#include > > > > > > > > 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
Re: [PATCH linux-next v6 4/8] vdpa: Enable user to set mac and mtu of vdpa device
On Tue, Oct 26, 2021 at 01:03:41PM +, Parav Pandit wrote: > > > > From: Stefano Garzarella > > Sent: Tuesday, October 26, 2021 6:31 PM > > > > On Tue, Oct 26, 2021 at 07:02:39AM +0300, Parav Pandit via Virtualization > > 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 > > >Reviewed-by: Eli Cohen > > >Acked-by: Jason Wang > > > > > >--- > > >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 > > > #include > > > #include > > >-#include > > > #include > > > > > > 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 =
RE: [PATCH linux-next v6 4/8] vdpa: Enable user to set mac and mtu of vdpa device
> From: Stefano Garzarella > Sent: Tuesday, October 26, 2021 6:31 PM > > On Tue, Oct 26, 2021 at 07:02:39AM +0300, Parav Pandit via Virtualization > 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 > >Reviewed-by: Eli Cohen > >Acked-by: Jason Wang > > > >--- > >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 > > #include > > #include > >-#include > > #include > > > > 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 ((confi
Re: [PATCH linux-next v6 4/8] vdpa: Enable user to set mac and mtu of vdpa device
On Tue, Oct 26, 2021 at 07:02:39AM +0300, Parav Pandit via Virtualization 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 Reviewed-by: Eli Cohen Acked-by: Jason Wang --- 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 #include #include -#include #include 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);