All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes
@ 2021-04-21 22:27 kernel test robot
  0 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2021-04-21 22:27 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 4266 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <1619020385-20220-13-git-send-email-dlinkin@nvidia.com>
References: <1619020385-20220-13-git-send-email-dlinkin@nvidia.com>
TO: dlinkin(a)nvidia.com

Hi,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/dlinkin-nvidia-com/devlink-rate-objects-API/20210421-235552
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git a926c025d56bb1acd8a192fca0e307331ee91b30
:::::: branch date: 7 hours ago
:::::: commit date: 7 hours ago
config: x86_64-randconfig-m001-20210421 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
net/core/devlink.c:1591 devlink_nl_rate_set() error: uninitialized symbol 'err'.

Old smatch warnings:
net/core/devlink.c:1604 devlink_nl_rate_set() error: uninitialized symbol 'err'.
net/core/devlink.c:6364 devlink_fmsg_prepare_skb() error: uninitialized symbol 'err'.

vim +/err +1591 net/core/devlink.c

cd76dcd68d96aa Parav Pandit  2020-12-11  1574  
709d06045321cd Dmytro Linkin 2021-04-21  1575  static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
709d06045321cd Dmytro Linkin 2021-04-21  1576  			       const struct devlink_ops *ops,
709d06045321cd Dmytro Linkin 2021-04-21  1577  			       struct genl_info *info)
709d06045321cd Dmytro Linkin 2021-04-21  1578  {
709d06045321cd Dmytro Linkin 2021-04-21  1579  	struct nlattr **attrs = info->attrs;
709d06045321cd Dmytro Linkin 2021-04-21  1580  	u64 rate;
709d06045321cd Dmytro Linkin 2021-04-21  1581  	int err;
709d06045321cd Dmytro Linkin 2021-04-21  1582  
709d06045321cd Dmytro Linkin 2021-04-21  1583  	if (attrs[DEVLINK_ATTR_RATE_TX_SHARE]) {
709d06045321cd Dmytro Linkin 2021-04-21  1584  		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1585  		if (devlink_rate_is_leaf(devlink_rate))
709d06045321cd Dmytro Linkin 2021-04-21  1586  			err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
709d06045321cd Dmytro Linkin 2021-04-21  1587  							  rate, info->extack);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1588  		else if (devlink_rate_is_node(devlink_rate))
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1589  			err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1590  							  rate, info->extack);
709d06045321cd Dmytro Linkin 2021-04-21 @1591  		if (err)
709d06045321cd Dmytro Linkin 2021-04-21  1592  			return err;
709d06045321cd Dmytro Linkin 2021-04-21  1593  		devlink_rate->tx_share = rate;
709d06045321cd Dmytro Linkin 2021-04-21  1594  	}
709d06045321cd Dmytro Linkin 2021-04-21  1595  
709d06045321cd Dmytro Linkin 2021-04-21  1596  	if (attrs[DEVLINK_ATTR_RATE_TX_MAX]) {
709d06045321cd Dmytro Linkin 2021-04-21  1597  		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1598  		if (devlink_rate_is_leaf(devlink_rate))
709d06045321cd Dmytro Linkin 2021-04-21  1599  			err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
709d06045321cd Dmytro Linkin 2021-04-21  1600  							rate, info->extack);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1601  		else if (devlink_rate_is_node(devlink_rate))
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1602  			err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1603  							rate, info->extack);
709d06045321cd Dmytro Linkin 2021-04-21  1604  		if (err)
709d06045321cd Dmytro Linkin 2021-04-21  1605  			return err;
709d06045321cd Dmytro Linkin 2021-04-21  1606  		devlink_rate->tx_max = rate;
709d06045321cd Dmytro Linkin 2021-04-21  1607  	}
709d06045321cd Dmytro Linkin 2021-04-21  1608  
709d06045321cd Dmytro Linkin 2021-04-21  1609  	return 0;
709d06045321cd Dmytro Linkin 2021-04-21  1610  }
709d06045321cd Dmytro Linkin 2021-04-21  1611  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 33141 bytes --]

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

* Re: [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes
  2021-04-23  9:37     ` Dan Carpenter
  (?)
@ 2021-04-23 10:26     ` Dmytro Linkin
  -1 siblings, 0 replies; 7+ messages in thread
From: Dmytro Linkin @ 2021-04-23 10:26 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 4579 bytes --]

On 4/23/21 12:37 PM, Dan Carpenter wrote:
> Hi,
> 
> url:    https://github.com/0day-ci/linux/commits/dlinkin-nvidia-com/devlink-rate-objects-API/20210421-235552
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git a926c025d56bb1acd8a192fca0e307331ee91b30
> config: x86_64-randconfig-m001-20210421 (attached as .config)
> compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
> 
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@intel.com>
> Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
> 
> New smatch warnings:
> net/core/devlink.c:1591 devlink_nl_rate_set() error: uninitialized symbol 'err'.
> 
> Old smatch warnings:
> net/core/devlink.c:1604 devlink_nl_rate_set() error: uninitialized symbol 'err'.
> net/core/devlink.c:6364 devlink_fmsg_prepare_skb() error: uninitialized symbol 'err'.
> 
> vim +/err +1591 net/core/devlink.c
> 
> 709d06045321cd Dmytro Linkin 2021-04-21  1575  static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
> 709d06045321cd Dmytro Linkin 2021-04-21  1576  			       const struct devlink_ops *ops,
> 709d06045321cd Dmytro Linkin 2021-04-21  1577  			       struct genl_info *info)
> 709d06045321cd Dmytro Linkin 2021-04-21  1578  {
> 709d06045321cd Dmytro Linkin 2021-04-21  1579  	struct nlattr **attrs = info->attrs;
> 709d06045321cd Dmytro Linkin 2021-04-21  1580  	u64 rate;
> 709d06045321cd Dmytro Linkin 2021-04-21  1581  	int err;
> 709d06045321cd Dmytro Linkin 2021-04-21  1582  
> 709d06045321cd Dmytro Linkin 2021-04-21  1583  	if (attrs[DEVLINK_ATTR_RATE_TX_SHARE]) {
> 709d06045321cd Dmytro Linkin 2021-04-21  1584  		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]);
> ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1585  		if (devlink_rate_is_leaf(devlink_rate))
> 709d06045321cd Dmytro Linkin 2021-04-21  1586  			err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
> 709d06045321cd Dmytro Linkin 2021-04-21  1587  							  rate, info->extack);
> ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1588  		else if (devlink_rate_is_node(devlink_rate))
> ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1589  			err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
> ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1590  							  rate, info->extack);
> 
> No else path.  Is there something else besides leafs and nodes?

Hi,
Before call of devlink_nl_rate_set() check for valid type is done, so
only leafs and nodes are allowed.
I'll init 'err' to EOPNOTSUPP in next version.

> 
> 709d06045321cd Dmytro Linkin 2021-04-21 @1591  		if (err)
> 709d06045321cd Dmytro Linkin 2021-04-21  1592  			return err;
> 709d06045321cd Dmytro Linkin 2021-04-21  1593  		devlink_rate->tx_share = rate;
> 709d06045321cd Dmytro Linkin 2021-04-21  1594  	}
> 709d06045321cd Dmytro Linkin 2021-04-21  1595  
> 709d06045321cd Dmytro Linkin 2021-04-21  1596  	if (attrs[DEVLINK_ATTR_RATE_TX_MAX]) {
> 709d06045321cd Dmytro Linkin 2021-04-21  1597  		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]);
> ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1598  		if (devlink_rate_is_leaf(devlink_rate))
> 709d06045321cd Dmytro Linkin 2021-04-21  1599  			err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
> 709d06045321cd Dmytro Linkin 2021-04-21  1600  							rate, info->extack);
> ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1601  		else if (devlink_rate_is_node(devlink_rate))
> ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1602  			err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
> ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1603  							rate, info->extack);
> 709d06045321cd Dmytro Linkin 2021-04-21  1604  		if (err)
> 709d06045321cd Dmytro Linkin 2021-04-21  1605  			return err;
> 709d06045321cd Dmytro Linkin 2021-04-21  1606  		devlink_rate->tx_max = rate;
> 709d06045321cd Dmytro Linkin 2021-04-21  1607  	}
> 709d06045321cd Dmytro Linkin 2021-04-21  1608  
> 709d06045321cd Dmytro Linkin 2021-04-21  1609  	return 0;
> 709d06045321cd Dmytro Linkin 2021-04-21  1610  }
> 
> ---
> 0-DAY CI Kernel Test Service, Intel Corporation
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.01.org%2Fhyperkitty%2Flist%2Fkbuild-all%40lists.01.org&amp;data=04%7C01%7Cdlinkin%40nvidia.com%7C8c709dcce03841a6914408d9063b6baf%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637547674608679060%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=E8ybPHv3M1s1qkbEVssXjBWG72Il1bJEHFay5UhrZUw%3D&amp;reserved=0
> 

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

* Re: [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes
  2021-04-21 15:52 ` [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes dlinkin
@ 2021-04-23  9:37     ` Dan Carpenter
  2021-04-21 21:32   ` kernel test robot
  2021-04-23  9:37     ` Dan Carpenter
  2 siblings, 0 replies; 7+ messages in thread
From: Dan Carpenter @ 2021-04-23  9:37 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 3870 bytes --]

Hi,

url:    https://github.com/0day-ci/linux/commits/dlinkin-nvidia-com/devlink-rate-objects-API/20210421-235552
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git a926c025d56bb1acd8a192fca0e307331ee91b30
config: x86_64-randconfig-m001-20210421 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
net/core/devlink.c:1591 devlink_nl_rate_set() error: uninitialized symbol 'err'.

Old smatch warnings:
net/core/devlink.c:1604 devlink_nl_rate_set() error: uninitialized symbol 'err'.
net/core/devlink.c:6364 devlink_fmsg_prepare_skb() error: uninitialized symbol 'err'.

vim +/err +1591 net/core/devlink.c

709d06045321cd Dmytro Linkin 2021-04-21  1575  static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
709d06045321cd Dmytro Linkin 2021-04-21  1576  			       const struct devlink_ops *ops,
709d06045321cd Dmytro Linkin 2021-04-21  1577  			       struct genl_info *info)
709d06045321cd Dmytro Linkin 2021-04-21  1578  {
709d06045321cd Dmytro Linkin 2021-04-21  1579  	struct nlattr **attrs = info->attrs;
709d06045321cd Dmytro Linkin 2021-04-21  1580  	u64 rate;
709d06045321cd Dmytro Linkin 2021-04-21  1581  	int err;
709d06045321cd Dmytro Linkin 2021-04-21  1582  
709d06045321cd Dmytro Linkin 2021-04-21  1583  	if (attrs[DEVLINK_ATTR_RATE_TX_SHARE]) {
709d06045321cd Dmytro Linkin 2021-04-21  1584  		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1585  		if (devlink_rate_is_leaf(devlink_rate))
709d06045321cd Dmytro Linkin 2021-04-21  1586  			err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
709d06045321cd Dmytro Linkin 2021-04-21  1587  							  rate, info->extack);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1588  		else if (devlink_rate_is_node(devlink_rate))
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1589  			err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1590  							  rate, info->extack);

No else path.  Is there something else besides leafs and nodes?

709d06045321cd Dmytro Linkin 2021-04-21 @1591  		if (err)
709d06045321cd Dmytro Linkin 2021-04-21  1592  			return err;
709d06045321cd Dmytro Linkin 2021-04-21  1593  		devlink_rate->tx_share = rate;
709d06045321cd Dmytro Linkin 2021-04-21  1594  	}
709d06045321cd Dmytro Linkin 2021-04-21  1595  
709d06045321cd Dmytro Linkin 2021-04-21  1596  	if (attrs[DEVLINK_ATTR_RATE_TX_MAX]) {
709d06045321cd Dmytro Linkin 2021-04-21  1597  		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1598  		if (devlink_rate_is_leaf(devlink_rate))
709d06045321cd Dmytro Linkin 2021-04-21  1599  			err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
709d06045321cd Dmytro Linkin 2021-04-21  1600  							rate, info->extack);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1601  		else if (devlink_rate_is_node(devlink_rate))
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1602  			err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1603  							rate, info->extack);
709d06045321cd Dmytro Linkin 2021-04-21  1604  		if (err)
709d06045321cd Dmytro Linkin 2021-04-21  1605  			return err;
709d06045321cd Dmytro Linkin 2021-04-21  1606  		devlink_rate->tx_max = rate;
709d06045321cd Dmytro Linkin 2021-04-21  1607  	}
709d06045321cd Dmytro Linkin 2021-04-21  1608  
709d06045321cd Dmytro Linkin 2021-04-21  1609  	return 0;
709d06045321cd Dmytro Linkin 2021-04-21  1610  }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 33141 bytes --]

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

* Re: [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes
@ 2021-04-23  9:37     ` Dan Carpenter
  0 siblings, 0 replies; 7+ messages in thread
From: Dan Carpenter @ 2021-04-23  9:37 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 3870 bytes --]

Hi,

url:    https://github.com/0day-ci/linux/commits/dlinkin-nvidia-com/devlink-rate-objects-API/20210421-235552
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git a926c025d56bb1acd8a192fca0e307331ee91b30
config: x86_64-randconfig-m001-20210421 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
net/core/devlink.c:1591 devlink_nl_rate_set() error: uninitialized symbol 'err'.

Old smatch warnings:
net/core/devlink.c:1604 devlink_nl_rate_set() error: uninitialized symbol 'err'.
net/core/devlink.c:6364 devlink_fmsg_prepare_skb() error: uninitialized symbol 'err'.

vim +/err +1591 net/core/devlink.c

709d06045321cd Dmytro Linkin 2021-04-21  1575  static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
709d06045321cd Dmytro Linkin 2021-04-21  1576  			       const struct devlink_ops *ops,
709d06045321cd Dmytro Linkin 2021-04-21  1577  			       struct genl_info *info)
709d06045321cd Dmytro Linkin 2021-04-21  1578  {
709d06045321cd Dmytro Linkin 2021-04-21  1579  	struct nlattr **attrs = info->attrs;
709d06045321cd Dmytro Linkin 2021-04-21  1580  	u64 rate;
709d06045321cd Dmytro Linkin 2021-04-21  1581  	int err;
709d06045321cd Dmytro Linkin 2021-04-21  1582  
709d06045321cd Dmytro Linkin 2021-04-21  1583  	if (attrs[DEVLINK_ATTR_RATE_TX_SHARE]) {
709d06045321cd Dmytro Linkin 2021-04-21  1584  		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1585  		if (devlink_rate_is_leaf(devlink_rate))
709d06045321cd Dmytro Linkin 2021-04-21  1586  			err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
709d06045321cd Dmytro Linkin 2021-04-21  1587  							  rate, info->extack);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1588  		else if (devlink_rate_is_node(devlink_rate))
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1589  			err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1590  							  rate, info->extack);

No else path.  Is there something else besides leafs and nodes?

709d06045321cd Dmytro Linkin 2021-04-21 @1591  		if (err)
709d06045321cd Dmytro Linkin 2021-04-21  1592  			return err;
709d06045321cd Dmytro Linkin 2021-04-21  1593  		devlink_rate->tx_share = rate;
709d06045321cd Dmytro Linkin 2021-04-21  1594  	}
709d06045321cd Dmytro Linkin 2021-04-21  1595  
709d06045321cd Dmytro Linkin 2021-04-21  1596  	if (attrs[DEVLINK_ATTR_RATE_TX_MAX]) {
709d06045321cd Dmytro Linkin 2021-04-21  1597  		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1598  		if (devlink_rate_is_leaf(devlink_rate))
709d06045321cd Dmytro Linkin 2021-04-21  1599  			err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
709d06045321cd Dmytro Linkin 2021-04-21  1600  							rate, info->extack);
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1601  		else if (devlink_rate_is_node(devlink_rate))
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1602  			err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
ddc9bb1d01c107 Dmytro Linkin 2021-04-21  1603  							rate, info->extack);
709d06045321cd Dmytro Linkin 2021-04-21  1604  		if (err)
709d06045321cd Dmytro Linkin 2021-04-21  1605  			return err;
709d06045321cd Dmytro Linkin 2021-04-21  1606  		devlink_rate->tx_max = rate;
709d06045321cd Dmytro Linkin 2021-04-21  1607  	}
709d06045321cd Dmytro Linkin 2021-04-21  1608  
709d06045321cd Dmytro Linkin 2021-04-21  1609  	return 0;
709d06045321cd Dmytro Linkin 2021-04-21  1610  }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 33141 bytes --]

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

* Re: [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes
  2021-04-21 15:52 ` [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes dlinkin
  2021-04-21 21:31   ` kernel test robot
@ 2021-04-21 21:32   ` kernel test robot
  2021-04-23  9:37     ` Dan Carpenter
  2 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2021-04-21 21:32 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 3782 bytes --]

Hi,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/dlinkin-nvidia-com/devlink-rate-objects-API/20210421-235552
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git a926c025d56bb1acd8a192fca0e307331ee91b30
config: mips-randconfig-r031-20210421 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project d87b9b81ccb95217181ce75515c6c68bbb408ca4)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install mips cross compiling tool for clang build
        # apt-get install binutils-mips-linux-gnu
        # https://github.com/0day-ci/linux/commit/ddc9bb1d01c107824714706f9fbd6264b8eb4b38
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review dlinkin-nvidia-com/devlink-rate-objects-API/20210421-235552
        git checkout ddc9bb1d01c107824714706f9fbd6264b8eb4b38
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=mips 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> net/core/devlink.c:1588:12: warning: variable 'err' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
                   else if (devlink_rate_is_node(devlink_rate))
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   net/core/devlink.c:1591:7: note: uninitialized use occurs here
                   if (err)
                       ^~~
   net/core/devlink.c:1588:8: note: remove the 'if' if its condition is always true
                   else if (devlink_rate_is_node(devlink_rate))
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   net/core/devlink.c:1581:9: note: initialize the variable 'err' to silence this warning
           int err;
                  ^
                   = 0
   1 warning generated.


vim +1588 net/core/devlink.c

  1574	
  1575	static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
  1576				       const struct devlink_ops *ops,
  1577				       struct genl_info *info)
  1578	{
  1579		struct nlattr **attrs = info->attrs;
  1580		u64 rate;
  1581		int err;
  1582	
  1583		if (attrs[DEVLINK_ATTR_RATE_TX_SHARE]) {
  1584			rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]);
  1585			if (devlink_rate_is_leaf(devlink_rate))
  1586				err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
  1587								  rate, info->extack);
> 1588			else if (devlink_rate_is_node(devlink_rate))
  1589				err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
  1590								  rate, info->extack);
  1591			if (err)
  1592				return err;
  1593			devlink_rate->tx_share = rate;
  1594		}
  1595	
  1596		if (attrs[DEVLINK_ATTR_RATE_TX_MAX]) {
  1597			rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]);
  1598			if (devlink_rate_is_leaf(devlink_rate))
  1599				err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
  1600								rate, info->extack);
  1601			else if (devlink_rate_is_node(devlink_rate))
  1602				err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
  1603								rate, info->extack);
  1604			if (err)
  1605				return err;
  1606			devlink_rate->tx_max = rate;
  1607		}
  1608	
  1609		return 0;
  1610	}
  1611	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 39154 bytes --]

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

* Re: [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes
  2021-04-21 15:52 ` [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes dlinkin
@ 2021-04-21 21:31   ` kernel test robot
  2021-04-21 21:32   ` kernel test robot
  2021-04-23  9:37     ` Dan Carpenter
  2 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2021-04-21 21:31 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 3782 bytes --]

Hi,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/dlinkin-nvidia-com/devlink-rate-objects-API/20210421-235552
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git a926c025d56bb1acd8a192fca0e307331ee91b30
config: arm-randconfig-r036-20210421 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project d87b9b81ccb95217181ce75515c6c68bbb408ca4)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm cross compiling tool for clang build
        # apt-get install binutils-arm-linux-gnueabi
        # https://github.com/0day-ci/linux/commit/ddc9bb1d01c107824714706f9fbd6264b8eb4b38
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review dlinkin-nvidia-com/devlink-rate-objects-API/20210421-235552
        git checkout ddc9bb1d01c107824714706f9fbd6264b8eb4b38
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=arm 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> net/core/devlink.c:1588:12: warning: variable 'err' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
                   else if (devlink_rate_is_node(devlink_rate))
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   net/core/devlink.c:1591:7: note: uninitialized use occurs here
                   if (err)
                       ^~~
   net/core/devlink.c:1588:8: note: remove the 'if' if its condition is always true
                   else if (devlink_rate_is_node(devlink_rate))
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   net/core/devlink.c:1581:9: note: initialize the variable 'err' to silence this warning
           int err;
                  ^
                   = 0
   1 warning generated.


vim +1588 net/core/devlink.c

  1574	
  1575	static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
  1576				       const struct devlink_ops *ops,
  1577				       struct genl_info *info)
  1578	{
  1579		struct nlattr **attrs = info->attrs;
  1580		u64 rate;
  1581		int err;
  1582	
  1583		if (attrs[DEVLINK_ATTR_RATE_TX_SHARE]) {
  1584			rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]);
  1585			if (devlink_rate_is_leaf(devlink_rate))
  1586				err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
  1587								  rate, info->extack);
> 1588			else if (devlink_rate_is_node(devlink_rate))
  1589				err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
  1590								  rate, info->extack);
  1591			if (err)
  1592				return err;
  1593			devlink_rate->tx_share = rate;
  1594		}
  1595	
  1596		if (attrs[DEVLINK_ATTR_RATE_TX_MAX]) {
  1597			rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]);
  1598			if (devlink_rate_is_leaf(devlink_rate))
  1599				err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
  1600								rate, info->extack);
  1601			else if (devlink_rate_is_node(devlink_rate))
  1602				err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
  1603								rate, info->extack);
  1604			if (err)
  1605				return err;
  1606			devlink_rate->tx_max = rate;
  1607		}
  1608	
  1609		return 0;
  1610	}
  1611	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 34045 bytes --]

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

* [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes
  2021-04-21 15:52 [PATCH RESEND-2 RFC net-next 00/18] devlink: rate objects API dlinkin
@ 2021-04-21 15:52 ` dlinkin
  2021-04-21 21:31   ` kernel test robot
                     ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: dlinkin @ 2021-04-21 15:52 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, stephen, dsahern, vladbu, Dmytro Linkin

From: Dmytro Linkin <dlinkin@nvidia.com>

Implement support for DEVLINK_CMD_RATE_{NEW|DEL} commands that are used
to create and delete devlink rate nodes. Add new attribute
DEVLINK_ATTR_RATE_NODE_NAME that specify node name string. The node name
is an alphanumeric identifier. No valid node name can be a devlink port
index, eg. decimal number. Extend devlink ops with new callbacks
rate_node_{new|del}() and rate_node_tx_{share|max}_set() to allow
supporting drivers to implement ports rate grouping and setting tx rate
of rate nodes through devlink.
Disallow moving device from switchdev to legacy mode if any node exist
on that device.

Example:

$ devlink port func rate add netdevsim/netdevsim10/group1

$ devlink port func rate set netdevsim/netdevsim10/group1 \
        tx_share 10mbit tx_max 100mbit

Add + set command can be combined:

$ devlink port func rate add netdevsim/netdevsim10/group1 \
        tx_share 10mbit tx_max 100mbit

$ devlink port func rate show netdevsim/netdevsim10/group1
netdevsim/netdevsim10/group1: type node tx_share 10mbit tx_max 100mbit

$ devlink port func rate del netdevsim/netdevsim10/group1

Co-developed-by: Vlad Buslov <vladbu@nvidia.com>
Signed-off-by: Vlad Buslov <vladbu@nvidia.com>
Signed-off-by: Dmytro Linkin <dlinkin@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 include/net/devlink.h        |  13 ++-
 include/uapi/linux/devlink.h |   3 +
 net/core/devlink.c           | 209 +++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 218 insertions(+), 7 deletions(-)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index cbfa456..ac0b5eb 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -140,7 +140,10 @@ struct devlink_rate {
 	u64 tx_share;
 	u64 tx_max;
 
-	struct devlink_port *devlink_port;
+	union {
+		struct devlink_port *devlink_port;
+		char *name;
+	};
 };
 
 struct devlink_port {
@@ -1473,6 +1476,14 @@ struct devlink_ops {
 				      u64 tx_share, struct netlink_ext_ack *extack);
 	int (*rate_leaf_tx_max_set)(struct devlink_rate *devlink_rate, void *priv,
 				    u64 tx_max, struct netlink_ext_ack *extack);
+	int (*rate_node_tx_share_set)(struct devlink_rate *devlink_rate, void *priv,
+				      u64 tx_share, struct netlink_ext_ack *extack);
+	int (*rate_node_tx_max_set)(struct devlink_rate *devlink_rate, void *priv,
+				    u64 tx_max, struct netlink_ext_ack *extack);
+	int (*rate_node_new)(struct devlink_rate *rate_node, void **priv,
+			     struct netlink_ext_ack *extack);
+	int (*rate_node_del)(struct devlink_rate *rate_node, void *priv,
+			     struct netlink_ext_ack *extack);
 };
 
 static inline void *devlink_priv(struct devlink *devlink)
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index ae94cd2..7e15853 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -213,6 +213,7 @@ enum devlink_port_flavour {
 
 enum devlink_rate_type {
 	DEVLINK_RATE_TYPE_LEAF,
+	DEVLINK_RATE_TYPE_NODE,
 };
 
 enum devlink_param_cmode {
@@ -547,6 +548,8 @@ enum devlink_attr {
 	DEVLINK_ATTR_RATE_TYPE,			/* u16 */
 	DEVLINK_ATTR_RATE_TX_SHARE,		/* u64 */
 	DEVLINK_ATTR_RATE_TX_MAX,		/* u64 */
+	DEVLINK_ATTR_RATE_NODE_NAME,		/* string */
+
 	/* add new attributes above here, update the policy in devlink.c */
 
 	__DEVLINK_ATTR_MAX,
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 4f0412e..eca3f28 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -196,6 +196,12 @@ static struct devlink_port *devlink_port_get_from_info(struct devlink *devlink,
 	return devlink_rate->type == DEVLINK_RATE_TYPE_LEAF;
 }
 
+static inline bool
+devlink_rate_is_node(struct devlink_rate *devlink_rate)
+{
+	return devlink_rate->type == DEVLINK_RATE_TYPE_NODE;
+}
+
 static struct devlink_rate *
 devlink_rate_leaf_get_from_info(struct devlink *devlink, struct genl_info *info)
 {
@@ -209,6 +215,55 @@ static struct devlink_port *devlink_port_get_from_info(struct devlink *devlink,
 	return devlink_rate ?: ERR_PTR(-ENODEV);
 }
 
+static struct devlink_rate *
+devlink_rate_node_get_by_name(struct devlink *devlink, const char *node_name)
+{
+	static struct devlink_rate *devlink_rate;
+
+	list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
+		if (devlink_rate_is_node(devlink_rate) &&
+		    !strcmp(node_name, devlink_rate->name))
+			return devlink_rate;
+	}
+	return ERR_PTR(-ENODEV);
+}
+
+static struct devlink_rate *
+devlink_rate_node_get_from_attrs(struct devlink *devlink, struct nlattr **attrs)
+{
+	const char *rate_node_name;
+	size_t len;
+
+	if (!attrs[DEVLINK_ATTR_RATE_NODE_NAME])
+		return ERR_PTR(-EINVAL);
+	rate_node_name = nla_data(attrs[DEVLINK_ATTR_RATE_NODE_NAME]);
+	len = strlen(rate_node_name);
+	/* Name cannot be empty or decimal number */
+	if (!len || strspn(rate_node_name, "0123456789") == len)
+		return ERR_PTR(-EINVAL);
+
+	return devlink_rate_node_get_by_name(devlink, rate_node_name);
+}
+
+static struct devlink_rate *
+devlink_rate_node_get_from_info(struct devlink *devlink, struct genl_info *info)
+{
+	return devlink_rate_node_get_from_attrs(devlink, info->attrs);
+}
+
+static struct devlink_rate *
+devlink_rate_get_from_info(struct devlink *devlink, struct genl_info *info)
+{
+	struct nlattr **attrs = info->attrs;
+
+	if (attrs[DEVLINK_ATTR_PORT_INDEX])
+		return devlink_rate_leaf_get_from_info(devlink, info);
+	else if (attrs[DEVLINK_ATTR_RATE_NODE_NAME])
+		return devlink_rate_node_get_from_info(devlink, info);
+	else
+		return ERR_PTR(-EINVAL);
+}
+
 struct devlink_sb {
 	struct list_head list;
 	unsigned int index;
@@ -428,12 +483,13 @@ struct devlink_snapshot {
 #define DEVLINK_NL_FLAG_NEED_PORT		BIT(0)
 #define DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT	BIT(1)
 #define DEVLINK_NL_FLAG_NEED_RATE		BIT(2)
+#define DEVLINK_NL_FLAG_NEED_RATE_NODE		BIT(3)
 
 /* The per devlink instance lock is taken by default in the pre-doit
  * operation, yet several commands do not require this. The global
  * devlink lock is taken and protects from disruption by user-calls.
  */
-#define DEVLINK_NL_FLAG_NO_LOCK			BIT(3)
+#define DEVLINK_NL_FLAG_NO_LOCK			BIT(4)
 
 static int devlink_nl_pre_doit(const struct genl_ops *ops,
 			       struct sk_buff *skb, struct genl_info *info)
@@ -465,12 +521,21 @@ static int devlink_nl_pre_doit(const struct genl_ops *ops,
 	} else if (ops->internal_flags & DEVLINK_NL_FLAG_NEED_RATE) {
 		struct devlink_rate *devlink_rate;
 
-		devlink_rate = devlink_rate_leaf_get_from_info(devlink, info);
+		devlink_rate = devlink_rate_get_from_info(devlink, info);
 		if (IS_ERR(devlink_rate)) {
 			err = PTR_ERR(devlink_rate);
 			goto unlock;
 		}
 		info->user_ptr[1] = devlink_rate;
+	} else if (ops->internal_flags & DEVLINK_NL_FLAG_NEED_RATE_NODE) {
+		struct devlink_rate *rate_node;
+
+		rate_node = devlink_rate_node_get_from_info(devlink, info);
+		if (IS_ERR(rate_node)) {
+			err = PTR_ERR(rate_node);
+			goto unlock;
+		}
+		info->user_ptr[1] = rate_node;
 	}
 	return 0;
 
@@ -801,6 +866,10 @@ static int devlink_nl_rate_fill(struct sk_buff *msg,
 		if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX,
 				devlink_rate->devlink_port->index))
 			goto nla_put_failure;
+	} else if (devlink_rate_is_node(devlink_rate)) {
+		if (nla_put_string(msg, DEVLINK_ATTR_RATE_NODE_NAME,
+				   devlink_rate->name))
+			goto nla_put_failure;
 	}
 
 	if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_SHARE,
@@ -1513,8 +1582,12 @@ static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
 
 	if (attrs[DEVLINK_ATTR_RATE_TX_SHARE]) {
 		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]);
-		err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
-						  rate, info->extack);
+		if (devlink_rate_is_leaf(devlink_rate))
+			err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
+							  rate, info->extack);
+		else if (devlink_rate_is_node(devlink_rate))
+			err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
+							  rate, info->extack);
 		if (err)
 			return err;
 		devlink_rate->tx_share = rate;
@@ -1522,8 +1595,12 @@ static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
 
 	if (attrs[DEVLINK_ATTR_RATE_TX_MAX]) {
 		rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]);
-		err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
-						rate, info->extack);
+		if (devlink_rate_is_leaf(devlink_rate))
+			err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
+							rate, info->extack);
+		else if (devlink_rate_is_node(devlink_rate))
+			err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
+							rate, info->extack);
 		if (err)
 			return err;
 		devlink_rate->tx_max = rate;
@@ -1547,6 +1624,15 @@ static bool devlink_rate_set_ops_supported(const struct devlink_ops *ops,
 			NL_SET_ERR_MSG_MOD(info->extack, "TX max set isn't supported for the leafs");
 			return false;
 		}
+	} else if (type == DEVLINK_RATE_TYPE_NODE) {
+		if (attrs[DEVLINK_ATTR_RATE_TX_SHARE] && !ops->rate_node_tx_share_set) {
+			NL_SET_ERR_MSG_MOD(info->extack, "TX share set isn't supported for the nodes");
+			return false;
+		}
+		if (attrs[DEVLINK_ATTR_RATE_TX_MAX] && !ops->rate_node_tx_max_set) {
+			NL_SET_ERR_MSG_MOD(info->extack, "TX max set isn't supported for the nodes");
+			return false;
+		}
 	} else {
 		WARN_ON("Unknown type of rate object");
 		return false;
@@ -1573,6 +1659,78 @@ static int devlink_nl_cmd_rate_set_doit(struct sk_buff *skb,
 	return err;
 }
 
+static int devlink_nl_cmd_rate_new_doit(struct sk_buff *skb,
+					struct genl_info *info)
+{
+	struct devlink *devlink = info->user_ptr[0];
+	struct devlink_rate *rate_node;
+	const struct devlink_ops *ops;
+	int err;
+
+	ops = devlink->ops;
+	if (!ops || !ops->rate_node_new || !ops->rate_node_del) {
+		NL_SET_ERR_MSG_MOD(info->extack, "Rate nodes aren't supported");
+		return -EOPNOTSUPP;
+	}
+
+	if (!devlink_rate_set_ops_supported(ops, info, DEVLINK_RATE_TYPE_NODE))
+		return -EOPNOTSUPP;
+
+	rate_node = devlink_rate_node_get_from_attrs(devlink, info->attrs);
+	if (!IS_ERR(rate_node))
+		return -EEXIST;
+	else if (rate_node == ERR_PTR(-EINVAL))
+		return -EINVAL;
+
+	rate_node = kzalloc(sizeof(*rate_node), GFP_KERNEL);
+	if (!rate_node)
+		return -ENOMEM;
+
+	rate_node->devlink = devlink;
+	rate_node->type = DEVLINK_RATE_TYPE_NODE;
+	rate_node->name = nla_strdup(info->attrs[DEVLINK_ATTR_RATE_NODE_NAME], GFP_KERNEL);
+	if (!rate_node->name) {
+		err = -ENOMEM;
+		goto err_strdup;
+	}
+
+	err = ops->rate_node_new(rate_node, &rate_node->priv, info->extack);
+	if (err)
+		goto err_node_new;
+
+	err = devlink_nl_rate_set(rate_node, ops, info);
+	if (err)
+		goto err_rate_set;
+
+	list_add(&rate_node->list, &devlink->rate_list);
+	devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_NEW);
+	return 0;
+
+err_rate_set:
+	ops->rate_node_del(rate_node, rate_node->priv, info->extack);
+err_node_new:
+	kfree(rate_node->name);
+err_strdup:
+	kfree(rate_node);
+	return err;
+}
+
+static int devlink_nl_cmd_rate_del_doit(struct sk_buff *skb,
+					struct genl_info *info)
+{
+	struct devlink_rate *rate_node = info->user_ptr[1];
+	struct devlink *devlink = rate_node->devlink;
+	const struct devlink_ops *ops = devlink->ops;
+	int err;
+
+	devlink_rate_notify(rate_node, DEVLINK_CMD_RATE_DEL);
+	err = ops->rate_node_del(rate_node, rate_node->priv, info->extack);
+	list_del(&rate_node->list);
+	kfree(rate_node->name);
+	kfree(rate_node);
+	return err;
+}
+
 static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink,
 			      struct devlink_sb *devlink_sb,
 			      enum devlink_command cmd, u32 portid,
@@ -2441,6 +2599,30 @@ static int devlink_nl_cmd_eswitch_get_doit(struct sk_buff *skb,
 	return genlmsg_reply(msg, info);
 }
 
+static int devlink_rate_nodes_check(struct devlink *devlink, u16 mode,
+				    struct netlink_ext_ack *extack)
+{
+	struct devlink_rate *devlink_rate;
+	u16 old_mode;
+	int err;
+
+	if (!devlink->ops->eswitch_mode_get)
+		return -EOPNOTSUPP;
+	err = devlink->ops->eswitch_mode_get(devlink, &old_mode);
+	if (err)
+		return err;
+
+	if (old_mode == mode)
+		return 0;
+
+	list_for_each_entry(devlink_rate, &devlink->rate_list, list)
+		if (devlink_rate_is_node(devlink_rate)) {
+			NL_SET_ERR_MSG_MOD(extack, "Rate node(s) exists.");
+			return -EBUSY;
+		}
+	return 0;
+}
+
 static int devlink_nl_cmd_eswitch_set_doit(struct sk_buff *skb,
 					   struct genl_info *info)
 {
@@ -2455,6 +2637,9 @@ static int devlink_nl_cmd_eswitch_set_doit(struct sk_buff *skb,
 		if (!ops->eswitch_mode_set)
 			return -EOPNOTSUPP;
 		mode = nla_get_u16(info->attrs[DEVLINK_ATTR_ESWITCH_MODE]);
+		err = devlink_rate_nodes_check(devlink, mode, info->extack);
+		if (err)
+			return err;
 		err = ops->eswitch_mode_set(devlink, mode, info->extack);
 		if (err)
 			return err;
@@ -8038,6 +8223,7 @@ static int devlink_nl_cmd_trap_policer_set_doit(struct sk_buff *skb,
 	[DEVLINK_ATTR_RATE_TYPE] = { .type = NLA_U16 },
 	[DEVLINK_ATTR_RATE_TX_SHARE] = { .type = NLA_U64 },
 	[DEVLINK_ATTR_RATE_TX_MAX] = { .type = NLA_U64 },
+	[DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING },
 };
 
 static const struct genl_small_ops devlink_nl_ops[] = {
@@ -8077,6 +8263,17 @@ static int devlink_nl_cmd_trap_policer_set_doit(struct sk_buff *skb,
 		.internal_flags = DEVLINK_NL_FLAG_NEED_RATE,
 	},
 	{
+		.cmd = DEVLINK_CMD_RATE_NEW,
+		.doit = devlink_nl_cmd_rate_new_doit,
+		.flags = GENL_ADMIN_PERM,
+	},
+	{
+		.cmd = DEVLINK_CMD_RATE_DEL,
+		.doit = devlink_nl_cmd_rate_del_doit,
+		.flags = GENL_ADMIN_PERM,
+		.internal_flags = DEVLINK_NL_FLAG_NEED_RATE_NODE,
+	},
+	{
 		.cmd = DEVLINK_CMD_PORT_SPLIT,
 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 		.doit = devlink_nl_cmd_port_split_doit,
-- 
1.8.3.1


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

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

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-21 22:27 [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2021-04-21 15:52 [PATCH RESEND-2 RFC net-next 00/18] devlink: rate objects API dlinkin
2021-04-21 15:52 ` [PATCH RESEND-2 RFC net-next 12/18] devlink: Introduce rate nodes dlinkin
2021-04-21 21:31   ` kernel test robot
2021-04-21 21:32   ` kernel test robot
2021-04-23  9:37   ` Dan Carpenter
2021-04-23  9:37     ` Dan Carpenter
2021-04-23 10:26     ` Dmytro Linkin

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.