Re: [PATCH linux-next v6 4/8] vdpa: Enable user to set mac and mtu of vdpa device

2021-10-26 Thread Stefano Garzarella

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

2021-10-26 Thread Parav Pandit via Virtualization



> 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

2021-10-26 Thread Michael S. Tsirkin
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

2021-10-26 Thread Parav Pandit via Virtualization



> 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

2021-10-26 Thread Stefano Garzarella

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);