This series simulates one or more PCI PF and SF port addition and function
configuration functionality.
Example sequence:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show devlink port:
$ devlink port show netdevsim/netdevsim10/2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00 state inactive opstate detached
Set the MAC address and activate the function:
$ devlink port function set netdevsim/netdevsim10/2 hw_addr 00:11:22:33:44:55 state active
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:11:22:33:44:55",
"state": "active",
"opstate": "attached"
}
}
}
}
Delete PCI SF and PF ports:
$ devlink port del netdevsim/netdevsim10/2
Patch summary:
patch-1 adds support for adding/remove PCI PF port
patch-2 adds support for adding/remove PCI SF port
patch-3 simulates MAC address query
patch-4 simulates setting MAC address
patch-5 simulates state query
patch-6 simulates setting state
patch-7 adds tests
Parav Pandit (7):
netdevsim: Add support for add and delete of a PCI PF port
netdevsim: Add support for add and delete PCI SF port
netdevsim: Simulate get hardware address of a PCI port
netdevsim: Simulate set hardware address of a PCI port
netdevsim: Simulate port function state for a PCI port
netdevsim: Simulate port function set state for a PCI port
netdevsim: Add netdevsim port add test cases
drivers/net/netdevsim/Makefile | 2 +-
drivers/net/netdevsim/dev.c | 14 +
drivers/net/netdevsim/netdevsim.h | 38 ++
drivers/net/netdevsim/port_function.c | 521 ++++++++++++++++++
.../drivers/net/netdevsim/devlink.sh | 72 ++-
5 files changed, 645 insertions(+), 2 deletions(-)
create mode 100644 drivers/net/netdevsim/port_function.c
--
2.26.2
@@ -1039,6 +1041,8 @@ static int nsim_dev_reload_create(struct nsim_dev *nsim_dev,nsim_dev->ddir,nsim_dev,&nsim_dev_take_snapshot_fops);++nsim_dev_port_fn_enable(nsim_dev);return0;err_health_exit:
@@ -1073,6 +1077,7 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)nsim_dev->max_macs=NSIM_DEV_MAX_MACS_DEFAULT;nsim_dev->test1=NSIM_DEV_TEST1_DEFAULT;spin_lock_init(&nsim_dev->fa_cookie_lock);+nsim_dev_port_fn_init(nsim_dev);dev_set_drvdata(&nsim_bus_dev->dev,nsim_dev);
@@ -1120,6 +1125,7 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)if(err)gotoerr_bpf_dev_exit;+nsim_dev_port_fn_enable(nsim_dev);devlink_params_publish(devlink);devlink_reload_enable(devlink);return0;
@@ -1154,6 +1160,9 @@ static void nsim_dev_reload_destroy(struct nsim_dev *nsim_dev)if(devlink_is_reload_failed(devlink))return;++/* Disable and destroy any user created devlink ports */+nsim_dev_port_fn_disable(nsim_dev);debugfs_remove(nsim_dev->take_snapshot);nsim_dev_port_del_all(nsim_dev);nsim_dev_health_exit(nsim_dev);
@@ -0,0 +1,340 @@+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB+/* Copyright (c) 2020 Mellanox Technologies Ltd. */++#include<linux/etherdevice.h>+#include<uapi/linux/devlink.h>++#include"netdevsim.h"++structnsim_port_fn{+structdevlink_portdl_port;+structnet_device*netdev;+structlist_headlist;+unsignedintport_index;+enumdevlink_port_flavourflavour;+u16pfnum;+};++staticstructdevlink_port*+nsim_dev_port_fn_get_devlink_port(structnet_device*dev)+{+structnsim_port_fn*port=netdev_priv(dev);++return&port->dl_port;+}++staticnetdev_tx_t+nsim_dev_port_fn_start_xmit(structsk_buff*skb,structnet_device*dev)+{+dev_kfree_skb(skb);+returnNETDEV_TX_OK;+}++staticconststructnet_device_opsnsim_netdev_ops={+.ndo_start_xmit=nsim_dev_port_fn_start_xmit,+.ndo_get_devlink_port=nsim_dev_port_fn_get_devlink_port,+};++staticvoidnsim_port_fn_ndev_setup(structnet_device*dev)+{+ether_setup(dev);+eth_hw_addr_random(dev);++dev->tx_queue_len=0;+dev->flags|=IFF_NOARP;+dev->flags&=~IFF_MULTICAST;+dev->max_mtu=ETH_MAX_MTU;+}++staticstructnsim_port_fn*+nsim_devlink_port_fn_alloc(structnsim_dev*dev,+conststructdevlink_port_new_attrs*attrs)+{+structnsim_bus_dev*nsim_bus_dev=dev->nsim_bus_dev;+structnsim_port_fn*port;+structnet_device*netdev;+intret;++netdev=alloc_netdev(sizeof(*port),"eth%d",NET_NAME_UNKNOWN,+nsim_port_fn_ndev_setup);+if(!netdev)+returnERR_PTR(-ENOMEM);++dev_net_set(netdev,nsim_dev_net(dev));+netdev->netdev_ops=&nsim_netdev_ops;+nsim_bus_dev=dev->nsim_bus_dev;+SET_NETDEV_DEV(netdev,&nsim_bus_dev->dev);++port=netdev_priv(netdev);+memset(port,0,sizeof(*port));+port->netdev=netdev;+port->flavour=attrs->flavour;++if(attrs->port_index_valid)+ret=ida_alloc_range(&dev->port_functions.ida,+attrs->port_index,+attrs->port_index,GFP_KERNEL);+else+ret=ida_alloc_min(&dev->port_functions.ida,+nsim_bus_dev->port_count,GFP_KERNEL);+if(ret<0)+gotoport_ida_err;++port->port_index=ret;++switch(port->flavour){+caseDEVLINK_PORT_FLAVOUR_PCI_PF:+ret=ida_alloc_range(&dev->port_functions.pfnum_ida,+attrs->pfnum,attrs->pfnum,+GFP_KERNEL);+if(ret<0)+gotofn_ida_err;+port->pfnum=ret;+break;+default:+break;+}+returnport;++fn_ida_err:+ida_simple_remove(&dev->port_functions.ida,port->port_index);+port_ida_err:+free_netdev(netdev);+returnERR_PTR(ret);+}++staticvoid+nsim_devlink_port_fn_free(structnsim_dev*dev,structnsim_port_fn*port)+{+switch(port->flavour){+caseDEVLINK_PORT_FLAVOUR_PCI_PF:+ida_simple_remove(&dev->port_functions.pfnum_ida,port->pfnum);+break;+default:+break;+}+ida_simple_remove(&dev->port_functions.ida,port->port_index);+free_netdev(port->netdev);+}++staticbool+nsim_dev_port_index_internal(structnsim_dev*nsim_dev,unsignedintport_index)+{+structnsim_bus_dev*nsim_bus_dev=nsim_dev->nsim_bus_dev;++return(port_index<nsim_bus_dev->port_count)?true:false;+}++staticbool+nsim_dev_port_port_exists(structnsim_dev*nsim_dev,+conststructdevlink_port_new_attrs*attrs)+{+structnsim_port_fn*tmp;++list_for_each_entry(tmp,&nsim_dev->port_functions.head,list){+if(attrs->port_index_valid&&+tmp->port_index==attrs->port_index)+returntrue;+if(attrs->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF&&+tmp->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF&&+tmp->pfnum==attrs->pfnum)+returntrue;+}+returnfalse;+}++staticstructnsim_port_fn*+nsim_dev_devlink_port_index_lookup(conststructnsim_dev*nsim_dev,+unsignedintport_index,+structnetlink_ext_ack*extack)+{+structnsim_port_fn*port;++list_for_each_entry(port,&nsim_dev->port_functions.head,list){+if(port->port_index!=port_index)+continue;+returnport;+}+NL_SET_ERR_MSG_MOD(extack,"User created port not found");+returnERR_PTR(-ENOENT);+}++staticintnsim_devlink_port_fn_add(structdevlink*devlink,+structnsim_dev*nsim_dev,+structnsim_port_fn*port,+structnetlink_ext_ack*extack)+{+interr;++list_add(&port->list,&nsim_dev->port_functions.head);++err=devlink_port_register(devlink,&port->dl_port,port->port_index);+if(err)+gotoreg_err;++err=register_netdev(port->netdev);+if(err)+gotonetdev_err;++devlink_port_type_eth_set(&port->dl_port,port->netdev);+return0;++netdev_err:+devlink_port_type_clear(&port->dl_port);+devlink_port_unregister(&port->dl_port);+reg_err:+list_del(&port->list);+returnerr;+}++staticvoidnsim_devlink_port_fn_del(structnsim_dev*nsim_dev,+structnsim_port_fn*port)+{+devlink_port_type_clear(&port->dl_port);+unregister_netdev(port->netdev);+devlink_port_unregister(&port->dl_port);+list_del(&port->list);+}++staticbool+nsim_dev_port_flavour_supported(conststructnsim_dev*nsim_dev,+conststructdevlink_port_new_attrs*attrs)+{+returnattrs->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF;+}++intnsim_dev_devlink_port_new(structdevlink*devlink,+conststructdevlink_port_new_attrs*attrs,+structnetlink_ext_ack*extack,+unsignedint*new_port_index)+{+structnsim_dev*nsim_dev=devlink_priv(devlink);+structnsim_bus_dev*nsim_bus_dev;+structnsim_port_fn*port;+interr;++nsim_bus_dev=nsim_dev->nsim_bus_dev;+if(attrs->port_index_valid&&+attrs->port_index<nsim_bus_dev->port_count){+NL_SET_ERR_MSG_MOD(extack,+"Port with given port index already exist");+return-EEXIST;+}+if(!nsim_dev_port_flavour_supported(nsim_dev,attrs)){+NL_SET_ERR_MSG_MOD(extack,"Unsupported port flavour specified");+return-EOPNOTSUPP;+}+mutex_lock(&nsim_dev->port_functions.disable_mutex);+if(!nsim_dev->port_functions.enabled){+err=-ENODEV;+gotoalloc_err;+}+if(nsim_dev_port_port_exists(nsim_dev,attrs)){+NL_SET_ERR_MSG_MOD(extack,+"Port with given attributes already exists");+err=-EEXIST;+gotoalloc_err;+}+port=nsim_devlink_port_fn_alloc(nsim_dev,attrs);+if(IS_ERR(port)){+NL_SET_ERR_MSG_MOD(extack,"Fail to allocate port");+err=PTR_ERR(port);+gotoalloc_err;+}+memcpy(port->dl_port.attrs.switch_id.id,nsim_dev->switch_id.id,+nsim_dev->switch_id.id_len);+port->dl_port.attrs.switch_id.id_len=nsim_dev->switch_id.id_len;++devlink_port_attrs_pci_pf_set(&port->dl_port,0,port->pfnum,false);++err=nsim_devlink_port_fn_add(devlink,nsim_dev,port,extack);+if(err)+gotoadd_err;+*new_port_index=port->port_index;+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+return0;++add_err:+nsim_devlink_port_fn_free(nsim_dev,port);+alloc_err:+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+returnerr;+}++intnsim_dev_devlink_port_del(structdevlink*devlink,unsignedintport_index,+structnetlink_ext_ack*extack)+{+structnsim_dev*nsim_dev=devlink_priv(devlink);+structnsim_port_fn*port;+interr=0;++if(nsim_dev_port_index_internal(nsim_dev,port_index)){+NL_SET_ERR_MSG_MOD(extack,"Port index doesn't belong to user created port");+return-EINVAL;+}++mutex_lock(&nsim_dev->port_functions.disable_mutex);+if(!nsim_dev->port_functions.enabled){+err=-ENODEV;+gotoerr;+}++port=nsim_dev_devlink_port_index_lookup(nsim_dev,port_index,extack);+if(IS_ERR(port)){+err=PTR_ERR(port);+gotoerr;+}+nsim_devlink_port_fn_del(nsim_dev,port);+nsim_devlink_port_fn_free(nsim_dev,port);+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+return0;++err:+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+returnPTR_ERR(port);+}++voidnsim_dev_port_fn_init(structnsim_dev*nsim_dev)+{+mutex_init(&nsim_dev->port_functions.disable_mutex);+INIT_LIST_HEAD(&nsim_dev->port_functions.head);+ida_init(&nsim_dev->port_functions.ida);+ida_init(&nsim_dev->port_functions.pfnum_ida);+}++voidnsim_dev_port_fn_exit(structnsim_dev*nsim_dev)+{+WARN_ON(!ida_is_empty(&nsim_dev->port_functions.pfnum_ida));+ida_destroy(&nsim_dev->port_functions.pfnum_ida);+WARN_ON(!ida_is_empty(&nsim_dev->port_functions.ida));+ida_destroy(&nsim_dev->port_functions.ida);+WARN_ON(!list_empty(&nsim_dev->port_functions.head));+mutex_destroy(&nsim_dev->port_functions.disable_mutex);+}++voidnsim_dev_port_fn_enable(structnsim_dev*nsim_dev)+{+mutex_lock(&nsim_dev->port_functions.disable_mutex);+nsim_dev->port_functions.enabled=true;+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+}++voidnsim_dev_port_fn_disable(structnsim_dev*nsim_dev)+{+structnsim_port_fn*port;+structnsim_port_fn*tmp;++mutex_lock(&nsim_dev->port_functions.disable_mutex);+nsim_dev->port_functions.enabled=false;+mutex_unlock(&nsim_dev->port_functions.disable_mutex);++/* At this point, no new user commands can start and any ongoing+*commandshavecompleted,soitissafetodeleteallusercreated+*ports.+*/+list_for_each_entry_safe_reverse(port,tmp,+&nsim_dev->port_functions.head,list){+nsim_devlink_port_fn_del(nsim_dev,port);+nsim_devlink_port_fn_free(nsim_dev,port);+}+}
Allow users to get/set hardware address for the PCI port.
Below example creates one devlink port, queries a port, sets a
hardware address.
Example of a PCI SF port which supports a port function hw_addr set:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Set the MAC address:
$ devlink port function set netdevsim/netdevsim10/2 hw_addr 00:11:22:33:44:55
Show devlink ports:
$ devlink port show
netdevsim/netdevsim10/0: type eth netdev eth0 flavour physical port 1 splittable false
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:11:22:33:44:55
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:11:22:33:44:55"
}
}
}
}
Signed-off-by: Parav Pandit <redacted>
---
drivers/net/netdevsim/dev.c | 1 +
drivers/net/netdevsim/netdevsim.h | 4 ++++
drivers/net/netdevsim/port_function.c | 21 +++++++++++++++++++++
3 files changed, 26 insertions(+)
@@ -461,3 +461,24 @@ int nsim_dev_port_fn_hw_addr_get(struct devlink *devlink,*hw_addr_len=ETH_ALEN;return0;}++intnsim_dev_port_fn_hw_addr_set(structdevlink*devlink,+structdevlink_port*dl_port,+constu8*hw_addr,inthw_addr_len,+structnetlink_ext_ack*extack)+{+structnsim_dev*nsim_dev=devlink_priv(devlink);+structnsim_port_fn*port;++if(hw_addr_len!=ETH_ALEN){+NL_SET_ERR_MSG_MOD(extack,+"Hardware address must be 6 bytes long");+return-EOPNOTSUPP;+}+port=nsim_dev_to_port_fn(nsim_dev,dl_port,extack);+if(IS_ERR(port))+returnPTR_ERR(port);++memcpy(port->hw_addr,hw_addr,ETH_ALEN);+return0;+}
Allow users to get hardware address for the PCI port.
Below example creates one devlink port, queries a port and its hardware
address.
Example of a PCI SF port which supports a port function hw_addr set:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show devlink ports:
$ devlink port show
netdevsim/netdevsim10/0: type eth netdev eth0 flavour physical port 1 splittable false
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:00:00:00:00:00"
}
}
}
}
Signed-off-by: Parav Pandit <redacted>
---
drivers/net/netdevsim/dev.c | 1 +
drivers/net/netdevsim/netdevsim.h | 4 ++++
drivers/net/netdevsim/port_function.c | 30 +++++++++++++++++++++++++++
3 files changed, 35 insertions(+)
@@ -16,6 +16,7 @@ struct nsim_port_fn {intrefcount;/* Counts how many sf ports are bound attached to this pf port. */u32sfnum;u16pfnum;+u8hw_addr[ETH_ALEN];};staticstructdevlink_port*
@@ -431,3 +432,32 @@ void nsim_dev_port_fn_disable(struct nsim_dev *nsim_dev)nsim_devlink_port_fn_free(nsim_dev,port);}}++staticstructnsim_port_fn*+nsim_dev_to_port_fn(structnsim_dev*nsim_dev,structdevlink_port*dl_port,+structnetlink_ext_ack*extack)+{+if(nsim_dev_port_index_internal(nsim_dev,dl_port->index)){+NL_SET_ERR_MSG_MOD(extack,+"Port index doesn't belong to user created port");+returnERR_PTR(-EOPNOTSUPP);+}+returncontainer_of(dl_port,structnsim_port_fn,dl_port);+}++intnsim_dev_port_fn_hw_addr_get(structdevlink*devlink,+structdevlink_port*dl_port,+u8*hw_addr,int*hw_addr_len,+structnetlink_ext_ack*extack)+{+structnsim_dev*nsim_dev=devlink_priv(devlink);+structnsim_port_fn*port;++port=nsim_dev_to_port_fn(nsim_dev,dl_port,extack);+if(IS_ERR(port))+returnPTR_ERR(port);++memcpy(hw_addr,port->hw_addr,ETH_ALEN);+*hw_addr_len=ETH_ALEN;+return0;+}
Simulate PCI SF ports. Allow user to create one or more PCI SF ports.
Examples:
echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
Add PCI SF port where port index and sfnum are auto assigned by driver.
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
Show devlink ports:
$ devlink port show
netdevsim/netdevsim10/0: type eth netdev eth0 flavour physical port 1 splittable false
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
Create a PCI SF port whose port index and SF number are assigned by
the user.
$ devlink port add netdevsim/netdevsim10/66 flavour pcisf pfnum 2 sfnum 66
netdevsim/netdevsim10/66: type eth netdev eth3 flavour pcisf controller 0 pfnum 2 sfnum 66 splittable false
Delete PCI SF and PF ports:
$ devlink port del netdevsim/netdevsim10/66
$ devlink port del netdevsim/netdevsim10/2
$ devlink port del netdevsim/netdevsim10/1
Signed-off-by: Parav Pandit <redacted>
Reviewed-by: Jiri Pirko <redacted>
---
drivers/net/netdevsim/netdevsim.h | 1 +
drivers/net/netdevsim/port_function.c | 99 ++++++++++++++++++++++++++-
2 files changed, 97 insertions(+), 3 deletions(-)
@@ -9,9 +9,12 @@structnsim_port_fn{structdevlink_portdl_port;structnet_device*netdev;+structnsim_port_fn*pf_pfn;structlist_headlist;unsignedintport_index;enumdevlink_port_flavourflavour;+intrefcount;/* Counts how many sf ports are bound attached to this pf port. */+u32sfnum;u16pfnum;};
@@ -91,9 +94,24 @@ nsim_devlink_port_fn_alloc(struct nsim_dev *dev,gotofn_ida_err;port->pfnum=ret;break;+caseDEVLINK_PORT_FLAVOUR_PCI_SF:+if(attrs->sfnum_valid)+ret=ida_alloc_range(&dev->port_functions.sfnum_ida,attrs->sfnum,+attrs->sfnum,GFP_KERNEL);+else+ret=ida_alloc(&dev->port_functions.sfnum_ida,GFP_KERNEL);+if(ret<0)+gotofn_ida_err;+port->sfnum=ret;+port->pfnum=attrs->pfnum;+break;default:break;}+/* refcount_t is not needed as port is protected by port_functions.mutex.+*ThiscountistokeeptrackofhowmanySFportsareattachedaPFport.+*/+port->refcount=1;returnport;fn_ida_err:
@@ -153,20 +180,72 @@ nsim_dev_devlink_port_index_lookup(const struct nsim_dev *nsim_dev,list_for_each_entry(port,&nsim_dev->port_functions.head,list){if(port->port_index!=port_index)continue;+if(port->refcount>1){+NL_SET_ERR_MSG_MOD(extack,"Port is in use");+returnERR_PTR(-EBUSY);+}returnport;}NL_SET_ERR_MSG_MOD(extack,"User created port not found");returnERR_PTR(-ENOENT);}+staticstructnsim_port_fn*+pf_port_get(structnsim_dev*nsim_dev,structnsim_port_fn*port)+{+structnsim_port_fn*tmp;++/* PF port addition doesn't need a parent. */+if(port->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF)+returnNULL;++list_for_each_entry(tmp,&nsim_dev->port_functions.head,list){+if(tmp->flavour!=DEVLINK_PORT_FLAVOUR_PCI_PF||+tmp->pfnum!=port->pfnum)+continue;++if(tmp->refcount+1==INT_MAX)+returnERR_PTR(-ENOSPC);++port->pf_pfn=tmp;+tmp->refcount++;+returntmp;+}+returnERR_PTR(-ENOENT);+}++staticvoidpf_port_put(structnsim_port_fn*port)+{+if(port->pf_pfn){+port->pf_pfn->refcount--;+WARN_ON(port->pf_pfn->refcount<0);+}+port->refcount--;+WARN_ON(port->refcount!=0);+}+staticintnsim_devlink_port_fn_add(structdevlink*devlink,structnsim_dev*nsim_dev,structnsim_port_fn*port,structnetlink_ext_ack*extack){+structnsim_port_fn*pf_pfn;interr;-list_add(&port->list,&nsim_dev->port_functions.head);+/* Keep all PF ports at the start, so that when driver is unloaded+*AllSFportsfromtheendofthelistcanberemovedfirst.+*/+if(port->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF)+list_add(&port->list,&nsim_dev->port_functions.head);+else+list_add_tail(&port->list,&nsim_dev->port_functions.head);++pf_pfn=pf_port_get(nsim_dev,port);+if(IS_ERR(pf_pfn)){+NL_SET_ERR_MSG_MOD(extack,"Fail to get pf port");+err=PTR_ERR(pf_pfn);+gotopf_err;+}err=devlink_port_register(devlink,&port->dl_port,port->port_index);if(err)
@@ -183,6 +262,8 @@ static int nsim_devlink_port_fn_add(struct devlink *devlink,devlink_port_type_clear(&port->dl_port);devlink_port_unregister(&port->dl_port);reg_err:+pf_port_put(port);+pf_err:list_del(&port->list);returnerr;}
Simulate port function state of a PCI port.
This enables users to get the state of the PCI port function.
Example of a PCI SF port which supports a port function hw_addr set:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show devlink port:
$ devlink port show netdevsim/netdevsim10/2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00 state inactive opstate detached
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:00:00:00:00:00",
"state": "inactive",
"opstate": "detached"
}
}
}
}
Signed-off-by: Parav Pandit <redacted>
---
drivers/net/netdevsim/dev.c | 1 +
drivers/net/netdevsim/netdevsim.h | 5 +++++
drivers/net/netdevsim/port_function.c | 22 ++++++++++++++++++++++
3 files changed, 28 insertions(+)
Simulate port function state of a PCI port.
This enables users to get and set the state of the PCI port function.
Example of a PCI SF port which supports a port function:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show devlink port:
$ devlink port show netdevsim/netdevsim10/2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00 state inactive opstate detached
Set the MAC address and activate the function:
$ devlink port function set netdevsim/netdevsim10/2 hw_addr 00:11:22:33:44:55 state active
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:11:22:33:44:55",
"state": "active",
"opstate": "attached"
}
}
}
}
Signed-off-by: Parav Pandit <redacted>
---
drivers/net/netdevsim/dev.c | 1 +
drivers/net/netdevsim/netdevsim.h | 4 ++++
drivers/net/netdevsim/port_function.c | 15 +++++++++++++++
3 files changed, 20 insertions(+)
Add tests for PCI PF and SF port add, configure and delete using user
specified port index and sfumber; and also using auto generated port
index.
Signed-off-by: Parav Pandit <redacted>
---
.../drivers/net/netdevsim/devlink.sh | 72 ++++++++++++++++++-
1 file changed, 71 insertions(+), 1 deletion(-)
@@ -507,6 +507,76 @@ dummy_reporter_test()log_test"dummy reporter test"}+function_state_get()+{+localname=$1++cmd_jq"devlink port show $DL_HANDLE/$USR_SF_PORT_INDEX -j"\+" .[][].function.$1"+}++devlink_port_add_test()+{+RET=0+USR_PF_PORT_INDEX=600+USR_PFNUM_A=2+USR_PFNUM_B=3+USR_SF_PORT_INDEX=601+USR_SFNUM_A=44+USR_SFNUM_B=55++devlinkportadd$DL_HANDLEflavourpcipfpfnum$USR_PFNUM_A+check_err$?"Failed PF port addition"++devlinkportshow+check_err$?"Failed PF port show"++devlinkportadd$DL_HANDLEflavourpcisfpfnum$USR_PFNUM_A+check_err$?"Failed SF port addition"++devlinkportadd$DL_HANDLEflavourpcisfpfnum$USR_PFNUM_A\+sfnum$USR_SFNUM_A+check_err$?"Failed SF port addition"++devlinkportadd$DL_HANDLEflavourpcipfpfnum$USR_PFNUM_B+check_err$?"Failed second PF port addition"++devlinkportadd$DL_HANDLE/$USR_SF_PORT_INDEXflavourpcisf\+pfnum$USR_PFNUM_Bsfnum$USR_SFNUM_B+check_err$?"Failed SF port addition"++devlinkportshow+check_err$?"Failed PF port show"++state=$(function_state_get"state")+check_err$?"Failed to get function state"+["$state"=="inactive"]+check_err$?"Unexpected function state $state"++state=$(function_state_get"opstate")+check_err$?"Failed to get operational state"+["$state"=="detached"]+check_err$?"Unexpected function opstate $opstate"++devlinkportfunctionset$DL_HANDLE/$USR_SF_PORT_INDEXstateactive+check_err$?"Failed to set state"++state=$(function_state_get"state")+check_err$?"Failed to get function state"+["$state"=="active"]+check_err$?"Unexpected function state $state"++state=$(function_state_get"opstate")+check_err$?"Failed to get operational state"+["$state"=="attached"]+check_err$?"Unexpected function opstate $opstate"++devlinkportdel$DL_HANDLE/$USR_SF_PORT_INDEX+check_err$?"Failed SF port deletion"++log_test"port_add test"+}+ setup_prepare(){modprobenetdevsim
drivers/net/netdevsim/netdevsim.h:317:23: warning: 'struct devlink_port_new_attrs' declared inside parameter list will not be visible outside of this definition or declaration
317 | const struct devlink_port_new_attrs *attrs,
| ^~~~~~~~~~~~~~~~~~~~~~
--
In file included from drivers/net/netdevsim/dev.c:36:
quoted
drivers/net/netdevsim/netdevsim.h:317:23: warning: 'struct devlink_port_new_attrs' declared inside parameter list will not be visible outside of this definition or declaration
317 | const struct devlink_port_new_attrs *attrs,
| ^~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/dev.c:908:3: error: 'const struct devlink_ops' has no member named 'port_new'
908 | .port_new = nsim_dev_devlink_port_new,
| ^~~~~~~~
drivers/net/netdevsim/dev.c:908:14: error: initialization of 'int (*)(struct devlink *, struct devlink_port *, u8 *, int *, struct netlink_ext_ack *)' {aka 'int (*)(struct devlink *, struct devlink_port *, unsigned char *, int *, struct netlink_ext_ack *)'} from incompatible pointer type 'int (*)(struct devlink *, const struct devlink_port_new_attrs *, struct netlink_ext_ack *, unsigned int *)' [-Werror=incompatible-pointer-types]
908 | .port_new = nsim_dev_devlink_port_new,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/dev.c:908:14: note: (near initialization for 'nsim_dev_devlink_ops.port_function_hw_addr_get')
drivers/net/netdevsim/dev.c:909:3: error: 'const struct devlink_ops' has no member named 'port_del'; did you mean 'port_split'?
909 | .port_del = nsim_dev_devlink_port_del,
| ^~~~~~~~
| port_split
drivers/net/netdevsim/dev.c:909:14: error: initialization of 'int (*)(struct devlink *, struct devlink_port *, const u8 *, int, struct netlink_ext_ack *)' {aka 'int (*)(struct devlink *, struct devlink_port *, const unsigned char *, int, struct netlink_ext_ack *)'} from incompatible pointer type 'int (*)(struct devlink *, unsigned int, struct netlink_ext_ack *)' [-Werror=incompatible-pointer-types]
909 | .port_del = nsim_dev_devlink_port_del,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/dev.c:909:14: note: (near initialization for 'nsim_dev_devlink_ops.port_function_hw_addr_set')
cc1: some warnings being treated as errors
--
In file included from drivers/net/netdevsim/port_function.c:7:
quoted
drivers/net/netdevsim/netdevsim.h:317:23: warning: 'struct devlink_port_new_attrs' declared inside parameter list will not be visible outside of this definition or declaration
317 | const struct devlink_port_new_attrs *attrs,
| ^~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/port_function.c:51:20: warning: 'struct devlink_port_new_attrs' declared inside parameter list will not be visible outside of this definition or declaration
51 | const struct devlink_port_new_attrs *attrs)
| ^~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/port_function.c: In function 'nsim_devlink_port_fn_alloc':
drivers/net/netdevsim/port_function.c:71:23: error: dereferencing pointer to incomplete type 'const struct devlink_port_new_attrs'
71 | port->flavour = attrs->flavour;
| ^~
drivers/net/netdevsim/port_function.c: At top level:
drivers/net/netdevsim/port_function.c:130:19: warning: 'struct devlink_port_new_attrs' declared inside parameter list will not be visible outside of this definition or declaration
130 | const struct devlink_port_new_attrs *attrs)
| ^~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/port_function.c: In function 'nsim_dev_port_port_exists':
drivers/net/netdevsim/port_function.c:135:12: error: dereferencing pointer to incomplete type 'const struct devlink_port_new_attrs'
135 | if (attrs->port_index_valid &&
| ^~
drivers/net/netdevsim/port_function.c: At top level:
drivers/net/netdevsim/port_function.c:201:18: warning: 'struct devlink_port_new_attrs' declared inside parameter list will not be visible outside of this definition or declaration
201 | const struct devlink_port_new_attrs *attrs)
| ^~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/port_function.c: In function 'nsim_dev_port_flavour_supported':
drivers/net/netdevsim/port_function.c:203:14: error: dereferencing pointer to incomplete type 'const struct devlink_port_new_attrs'
203 | return attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF;
| ^~
drivers/net/netdevsim/port_function.c: At top level:
drivers/net/netdevsim/port_function.c:207:23: warning: 'struct devlink_port_new_attrs' declared inside parameter list will not be visible outside of this definition or declaration
207 | const struct devlink_port_new_attrs *attrs,
| ^~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/port_function.c:206:5: error: conflicting types for 'nsim_dev_devlink_port_new'
206 | int nsim_dev_devlink_port_new(struct devlink *devlink,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/netdevsim/port_function.c:7:
drivers/net/netdevsim/netdevsim.h:316:5: note: previous declaration of 'nsim_dev_devlink_port_new' was here
316 | int nsim_dev_devlink_port_new(struct devlink *devlink,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/netdevsim/port_function.c: In function 'nsim_dev_devlink_port_new':
drivers/net/netdevsim/port_function.c:217:11: error: dereferencing pointer to incomplete type 'const struct devlink_port_new_attrs'
217 | if (attrs->port_index_valid &&
| ^~
drivers/net/netdevsim/port_function.c:223:49: error: passing argument 2 of 'nsim_dev_port_flavour_supported' from incompatible pointer type [-Werror=incompatible-pointer-types]
223 | if (!nsim_dev_port_flavour_supported(nsim_dev, attrs)) {
| ^~~~~
| |
| const struct devlink_port_new_attrs *
drivers/net/netdevsim/port_function.c:201:42: note: expected 'const struct devlink_port_new_attrs *' but argument is of type 'const struct devlink_port_new_attrs *'
201 | const struct devlink_port_new_attrs *attrs)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
drivers/net/netdevsim/port_function.c:232:42: error: passing argument 2 of 'nsim_dev_port_port_exists' from incompatible pointer type [-Werror=incompatible-pointer-types]
232 | if (nsim_dev_port_port_exists(nsim_dev, attrs)) {
| ^~~~~
| |
| const struct devlink_port_new_attrs *
drivers/net/netdevsim/port_function.c:130:43: note: expected 'const struct devlink_port_new_attrs *' but argument is of type 'const struct devlink_port_new_attrs *'
130 | const struct devlink_port_new_attrs *attrs)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
drivers/net/netdevsim/port_function.c:238:46: error: passing argument 2 of 'nsim_devlink_port_fn_alloc' from incompatible pointer type [-Werror=incompatible-pointer-types]
238 | port = nsim_devlink_port_fn_alloc(nsim_dev, attrs);
| ^~~~~
| |
| const struct devlink_port_new_attrs *
drivers/net/netdevsim/port_function.c:51:44: note: expected 'const struct devlink_port_new_attrs *' but argument is of type 'const struct devlink_port_new_attrs *'
51 | const struct devlink_port_new_attrs *attrs)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
drivers/net/netdevsim/port_function.c: In function 'nsim_dev_devlink_port_del':
drivers/net/netdevsim/port_function.c:269:6: warning: variable 'err' set but not used [-Wunused-but-set-variable]
269 | int err = 0;
| ^~~
drivers/net/netdevsim/port_function.c: In function 'nsim_dev_port_flavour_supported':
drivers/net/netdevsim/port_function.c:204:1: error: control reaches end of non-void function [-Werror=return-type]
204 | }
| ^
cc1: some warnings being treated as errors
vim +317 drivers/net/netdevsim/netdevsim.h
311
312 void nsim_dev_port_fn_init(struct nsim_dev *nsim_dev);
313 void nsim_dev_port_fn_exit(struct nsim_dev *nsim_dev);
314 void nsim_dev_port_fn_enable(struct nsim_dev *nsim_dev);
315 void nsim_dev_port_fn_disable(struct nsim_dev *nsim_dev);
316 int nsim_dev_devlink_port_new(struct devlink *devlink,
> 317 const struct devlink_port_new_attrs *attrs,
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
drivers/net/netdevsim/netdevsim.h:317:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
1 warning generated.
--
In file included from drivers/net/netdevsim/dev.c:36:
quoted
drivers/net/netdevsim/netdevsim.h:317:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/dev.c:908:3: error: field designator 'port_new' does not refer to any field in type 'const struct devlink_ops'
.port_new = nsim_dev_devlink_port_new,
^
quoted
drivers/net/netdevsim/dev.c:909:3: error: field designator 'port_del' does not refer to any field in type 'const struct devlink_ops'
.port_del = nsim_dev_devlink_port_del,
^
1 warning and 2 errors generated.
--
In file included from drivers/net/netdevsim/port_function.c:7:
quoted
drivers/net/netdevsim/netdevsim.h:317:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/port_function.c:51:20: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
quoted
drivers/net/netdevsim/port_function.c:71:23: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->flavour = attrs->flavour;
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:73:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:75:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index,
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:76:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:88:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:88:30: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:130:19: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:135:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:130:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:136:31: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->port_index == attrs->port_index)
~~~~~^
drivers/net/netdevsim/port_function.c:130:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:138:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF &&
~~~~~^
drivers/net/netdevsim/port_function.c:130:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:140:26: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->pfnum == attrs->pfnum)
~~~~~^
drivers/net/netdevsim/port_function.c:130:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:201:18: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:203:14: error: incomplete definition of type 'struct devlink_port_new_attrs'
return attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF;
~~~~~^
drivers/net/netdevsim/port_function.c:201:18: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:207:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
drivers/net/netdevsim/port_function.c:206:5: error: conflicting types for 'nsim_dev_devlink_port_new'
int nsim_dev_devlink_port_new(struct devlink *devlink,
^
drivers/net/netdevsim/netdevsim.h:316:5: note: previous declaration is here
int nsim_dev_devlink_port_new(struct devlink *devlink,
^
drivers/net/netdevsim/port_function.c:217:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:207:23: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs,
^
drivers/net/netdevsim/port_function.c:218:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index < nsim_bus_dev->port_count) {
~~~~~^
drivers/net/netdevsim/port_function.c:207:23: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs,
^
drivers/net/netdevsim/port_function.c:223:49: error: incompatible pointer types passing 'const struct devlink_port_new_attrs *' to parameter of type 'const struct devlink_port_new_attrs *' [-Werror,-Wincompatible-pointer-types]
if (!nsim_dev_port_flavour_supported(nsim_dev, attrs)) {
^~~~~
drivers/net/netdevsim/port_function.c:201:42: note: passing argument to parameter 'attrs' here
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:232:42: error: incompatible pointer types passing 'const struct devlink_port_new_attrs *' to parameter of type 'const struct devlink_port_new_attrs *' [-Werror,-Wincompatible-pointer-types]
if (nsim_dev_port_port_exists(nsim_dev, attrs)) {
vim +908 drivers/net/netdevsim/dev.c
894
895 static const struct devlink_ops nsim_dev_devlink_ops = {
896 .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT |
897 DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK,
898 .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),
899 .reload_down = nsim_dev_reload_down,
900 .reload_up = nsim_dev_reload_up,
901 .info_get = nsim_dev_info_get,
902 .flash_update = nsim_dev_flash_update,
903 .trap_init = nsim_dev_devlink_trap_init,
904 .trap_action_set = nsim_dev_devlink_trap_action_set,
905 .trap_group_set = nsim_dev_devlink_trap_group_set,
906 .trap_policer_set = nsim_dev_devlink_trap_policer_set,
907 .trap_policer_counter_get = nsim_dev_devlink_trap_policer_counter_get,
> 908 .port_new = nsim_dev_devlink_port_new,
> 909 .port_del = nsim_dev_devlink_port_del,
910 };
911
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
From: kernel test robot <hidden> Date: 2021-02-06 17:44:26
Hi Parav,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/0day-ci/linux/commits/Parav-Pandit/netdevsim-port-add-delete-support/20210206-210153
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 6626a0266566c5aea16178c5e6cd7fc4db3f2f56
config: x86_64-randconfig-a004-20210206 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project c9439ca36342fb6013187d0a69aef92736951476)
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 x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# https://github.com/0day-ci/linux/commit/980b8cbe1c29602278397d53732cc258b1d62416
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Parav-Pandit/netdevsim-port-add-delete-support/20210206-210153
git checkout 980b8cbe1c29602278397d53732cc258b1d62416
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <redacted>
All errors (new ones prefixed by >>):
In file included from drivers/net/netdevsim/port_function.c:7:
drivers/net/netdevsim/netdevsim.h:318:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
drivers/net/netdevsim/port_function.c:54:20: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:74:23: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->flavour = attrs->flavour;
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:76:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:78:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index,
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:79:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:91:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:91:30: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
quoted
drivers/net/netdevsim/port_function.c:97:7: error: use of undeclared identifier 'DEVLINK_PORT_FLAVOUR_PCI_SF'
case DEVLINK_PORT_FLAVOUR_PCI_SF:
^
drivers/net/netdevsim/port_function.c:98:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->sfnum_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:99:63: error: incomplete definition of type 'struct devlink_port_new_attrs'
ret = ida_alloc_range(&dev->port_functions.sfnum_ida, attrs->sfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:100:17: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->sfnum, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:106:22: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->pfnum = attrs->pfnum;
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:131:7: error: use of undeclared identifier 'DEVLINK_PORT_FLAVOUR_PCI_SF'
case DEVLINK_PORT_FLAVOUR_PCI_SF:
^
drivers/net/netdevsim/port_function.c:151:19: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:156:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:157:31: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->port_index == attrs->port_index)
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:159:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF &&
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:161:26: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->pfnum == attrs->pfnum)
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:164:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_SF &&
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:166:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->sfnum_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:167:26: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->sfnum == attrs->sfnum && tmp->pfnum == attrs->pfnum)
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
3 warnings and 20 errors generated.
vim +/DEVLINK_PORT_FLAVOUR_PCI_SF +97 drivers/net/netdevsim/port_function.c
51
52 static struct nsim_port_fn *
53 nsim_devlink_port_fn_alloc(struct nsim_dev *dev,
54 const struct devlink_port_new_attrs *attrs)
55 {
56 struct nsim_bus_dev *nsim_bus_dev = dev->nsim_bus_dev;
57 struct nsim_port_fn *port;
58 struct net_device *netdev;
59 int ret;
60
61 netdev = alloc_netdev(sizeof(*port), "eth%d", NET_NAME_UNKNOWN,
62 nsim_port_fn_ndev_setup);
63 if (!netdev)
64 return ERR_PTR(-ENOMEM);
65
66 dev_net_set(netdev, nsim_dev_net(dev));
67 netdev->netdev_ops = &nsim_netdev_ops;
68 nsim_bus_dev = dev->nsim_bus_dev;
69 SET_NETDEV_DEV(netdev, &nsim_bus_dev->dev);
70
71 port = netdev_priv(netdev);
72 memset(port, 0, sizeof(*port));
73 port->netdev = netdev;
74 port->flavour = attrs->flavour;
75
76 if (attrs->port_index_valid)
77 ret = ida_alloc_range(&dev->port_functions.ida,
78 attrs->port_index,
79 attrs->port_index, GFP_KERNEL);
80 else
81 ret = ida_alloc_min(&dev->port_functions.ida,
82 nsim_bus_dev->port_count, GFP_KERNEL);
83 if (ret < 0)
84 goto port_ida_err;
85
86 port->port_index = ret;
87
88 switch (port->flavour) {
89 case DEVLINK_PORT_FLAVOUR_PCI_PF:
90 ret = ida_alloc_range(&dev->port_functions.pfnum_ida,
91 attrs->pfnum, attrs->pfnum,
92 GFP_KERNEL);
93 if (ret < 0)
94 goto fn_ida_err;
95 port->pfnum = ret;
96 break;
> 97 case DEVLINK_PORT_FLAVOUR_PCI_SF:
98 if (attrs->sfnum_valid)
99 ret = ida_alloc_range(&dev->port_functions.sfnum_ida, attrs->sfnum,
100 attrs->sfnum, GFP_KERNEL);
101 else
102 ret = ida_alloc(&dev->port_functions.sfnum_ida, GFP_KERNEL);
103 if (ret < 0)
104 goto fn_ida_err;
105 port->sfnum = ret;
106 port->pfnum = attrs->pfnum;
107 break;
108 default:
109 break;
110 }
111 /* refcount_t is not needed as port is protected by port_functions.mutex.
112 * This count is to keep track of how many SF ports are attached a PF port.
113 */
114 port->refcount = 1;
115 return port;
116
117 fn_ida_err:
118 ida_simple_remove(&dev->port_functions.ida, port->port_index);
119 port_ida_err:
120 free_netdev(netdev);
121 return ERR_PTR(ret);
122 }
123
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
From: kernel test robot <hidden> Date: 2021-02-06 18:31:02
Hi Parav,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/0day-ci/linux/commits/Parav-Pandit/netdevsim-port-add-delete-support/20210206-210153
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 6626a0266566c5aea16178c5e6cd7fc4db3f2f56
config: x86_64-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# https://github.com/0day-ci/linux/commit/4234edd1adbb2da7f6f156c2bfdac5170eb97dbb
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Parav-Pandit/netdevsim-port-add-delete-support/20210206-210153
git checkout 4234edd1adbb2da7f6f156c2bfdac5170eb97dbb
# save the attached .config to linux build tree
make W=1 ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <redacted>
All errors (new ones prefixed by >>):
In file included from drivers/net/netdevsim/dev.c:36:
drivers/net/netdevsim/netdevsim.h:317:23: warning: 'struct devlink_port_new_attrs' declared inside parameter list will not be visible outside of this definition or declaration
317 | const struct devlink_port_new_attrs *attrs,
| ^~~~~~~~~~~~~~~~~~~~~~
quoted
drivers/net/netdevsim/dev.c:908:3: error: 'const struct devlink_ops' has no member named 'port_new'
From: kernel test robot <hidden> Date: 2021-02-06 18:32:21
Hi Parav,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/0day-ci/linux/commits/Parav-Pandit/netdevsim-port-add-delete-support/20210206-210153
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 6626a0266566c5aea16178c5e6cd7fc4db3f2f56
config: x86_64-randconfig-a004-20210206 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project c9439ca36342fb6013187d0a69aef92736951476)
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 x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# https://github.com/0day-ci/linux/commit/9949947ea5985420405ec8649676757144240a7a
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Parav-Pandit/netdevsim-port-add-delete-support/20210206-210153
git checkout 9949947ea5985420405ec8649676757144240a7a
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <redacted>
All error/warnings (new ones prefixed by >>):
In file included from drivers/net/netdevsim/netdev.c:27:
drivers/net/netdevsim/netdevsim.h:318:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/netdevsim.h:333:16: warning: declaration of 'enum devlink_port_fn_state' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_state *state,
^
quoted
drivers/net/netdevsim/netdevsim.h:334:16: warning: declaration of 'enum devlink_port_fn_opstate' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_opstate *opstate,
^
3 warnings generated.
--
In file included from drivers/net/netdevsim/dev.c:36:
drivers/net/netdevsim/netdevsim.h:318:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/netdevsim.h:333:16: warning: declaration of 'enum devlink_port_fn_state' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_state *state,
^
quoted
drivers/net/netdevsim/netdevsim.h:334:16: warning: declaration of 'enum devlink_port_fn_opstate' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_opstate *opstate,
^
drivers/net/netdevsim/dev.c:908:3: error: field designator 'port_new' does not refer to any field in type 'const struct devlink_ops'
.port_new = nsim_dev_devlink_port_new,
^
drivers/net/netdevsim/dev.c:909:3: error: field designator 'port_del' does not refer to any field in type 'const struct devlink_ops'
.port_del = nsim_dev_devlink_port_del,
^
quoted
drivers/net/netdevsim/dev.c:912:3: error: field designator 'port_fn_state_get' does not refer to any field in type 'const struct devlink_ops'
.port_fn_state_get = nsim_dev_port_fn_state_get,
^
3 warnings and 3 errors generated.
--
In file included from drivers/net/netdevsim/port_function.c:7:
drivers/net/netdevsim/netdevsim.h:318:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/netdevsim.h:333:16: warning: declaration of 'enum devlink_port_fn_state' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_state *state,
^
quoted
drivers/net/netdevsim/netdevsim.h:334:16: warning: declaration of 'enum devlink_port_fn_opstate' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_opstate *opstate,
^
drivers/net/netdevsim/port_function.c:56:20: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:76:23: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->flavour = attrs->flavour;
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:78:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:80:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index,
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:81:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:93:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:93:30: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:99:7: error: use of undeclared identifier 'DEVLINK_PORT_FLAVOUR_PCI_SF'
case DEVLINK_PORT_FLAVOUR_PCI_SF:
^
drivers/net/netdevsim/port_function.c:100:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->sfnum_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:101:63: error: incomplete definition of type 'struct devlink_port_new_attrs'
ret = ida_alloc_range(&dev->port_functions.sfnum_ida, attrs->sfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:102:17: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->sfnum, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:108:22: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->pfnum = attrs->pfnum;
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:133:7: error: use of undeclared identifier 'DEVLINK_PORT_FLAVOUR_PCI_SF'
case DEVLINK_PORT_FLAVOUR_PCI_SF:
^
drivers/net/netdevsim/port_function.c:153:19: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:158:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:153:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:159:31: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->port_index == attrs->port_index)
~~~~~^
drivers/net/netdevsim/port_function.c:153:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:161:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF &&
~~~~~^
drivers/net/netdevsim/port_function.c:153:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:163:26: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->pfnum == attrs->pfnum)
~~~~~^
drivers/net/netdevsim/port_function.c:153:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:166:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_SF &&
vim +912 drivers/net/netdevsim/dev.c
894
895 static const struct devlink_ops nsim_dev_devlink_ops = {
896 .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT |
897 DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK,
898 .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),
899 .reload_down = nsim_dev_reload_down,
900 .reload_up = nsim_dev_reload_up,
901 .info_get = nsim_dev_info_get,
902 .flash_update = nsim_dev_flash_update,
903 .trap_init = nsim_dev_devlink_trap_init,
904 .trap_action_set = nsim_dev_devlink_trap_action_set,
905 .trap_group_set = nsim_dev_devlink_trap_group_set,
906 .trap_policer_set = nsim_dev_devlink_trap_policer_set,
907 .trap_policer_counter_get = nsim_dev_devlink_trap_policer_counter_get,
908 .port_new = nsim_dev_devlink_port_new,
909 .port_del = nsim_dev_devlink_port_del,
910 .port_function_hw_addr_get = nsim_dev_port_fn_hw_addr_get,
911 .port_function_hw_addr_set = nsim_dev_port_fn_hw_addr_set,
> 912 .port_fn_state_get = nsim_dev_port_fn_state_get,
913 };
914
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
This commit tag doesn't contain the devlink patches required upto commit 142d93d12dc1.
Can you please update the 0day-ci to move to at least commit 142d93d12dc1?
drivers/net/netdevsim/port_function.c:269:6: warning: variable 'err' set
but not used [-Wunused-but-set-variable]
269 | int err = 0;
| ^~~
This commit tag doesn't contain the devlink patches required upto commit 142d93d12dc1.
Can you please update the 0day-ci to move to at least commit 142d93d12dc1?
Thanks for the feedback, we'll take a look.
Best Regards,
Rong Chen
quoted
drivers/net/netdevsim/port_function.c:269:6: warning: variable 'err' set
but not used [-Wunused-but-set-variable]
269 | int err = 0;
| ^~~
Sending v2 to fix this warning.
_______________________________________________
kbuild-all mailing list -- kbuild-all@lists.01.org
To unsubscribe send an email to kbuild-all-leave@lists.01.org
This series simulates one or more PCI PF and SF port addition and function
configuration functionality.
Example sequence:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show devlink port:
$ devlink port show netdevsim/netdevsim10/2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00 state inactive opstate detached
Set the MAC address and activate the function:
$ devlink port function set netdevsim/netdevsim10/2 hw_addr 00:11:22:33:44:55 state active
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:11:22:33:44:55",
"state": "active",
"opstate": "attached"
}
}
}
}
Delete PCI SF and PF ports:
$ devlink port del netdevsim/netdevsim10/2
Patch summary:
patch-1 adds support for adding/remove PCI PF port
patch-2 adds support for adding/remove PCI SF port
patch-3 simulates MAC address query
patch-4 simulates setting MAC address
patch-5 simulates state query
patch-6 simulates setting state
patch-7 adds tests
Parav Pandit (7):
netdevsim: Add support for add and delete of a PCI PF port
netdevsim: Add support for add and delete PCI SF port
netdevsim: Simulate get hardware address of a PCI port
netdevsim: Simulate set hardware address of a PCI port
netdevsim: Simulate port function state for a PCI port
netdevsim: Simulate port function set state for a PCI port
netdevsim: Add netdevsim port add test cases
drivers/net/netdevsim/Makefile | 2 +-
drivers/net/netdevsim/dev.c | 14 +
drivers/net/netdevsim/netdevsim.h | 38 ++
drivers/net/netdevsim/port_function.c | 521 ++++++++++++++++++
.../drivers/net/netdevsim/devlink.sh | 72 ++-
5 files changed, 645 insertions(+), 2 deletions(-)
create mode 100644 drivers/net/netdevsim/port_function.c
--
2.26.2
@@ -1039,6 +1041,8 @@ static int nsim_dev_reload_create(struct nsim_dev *nsim_dev,nsim_dev->ddir,nsim_dev,&nsim_dev_take_snapshot_fops);++nsim_dev_port_fn_enable(nsim_dev);return0;err_health_exit:
@@ -1073,6 +1077,7 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)nsim_dev->max_macs=NSIM_DEV_MAX_MACS_DEFAULT;nsim_dev->test1=NSIM_DEV_TEST1_DEFAULT;spin_lock_init(&nsim_dev->fa_cookie_lock);+nsim_dev_port_fn_init(nsim_dev);dev_set_drvdata(&nsim_bus_dev->dev,nsim_dev);
@@ -1120,6 +1125,7 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)if(err)gotoerr_bpf_dev_exit;+nsim_dev_port_fn_enable(nsim_dev);devlink_params_publish(devlink);devlink_reload_enable(devlink);return0;
@@ -1154,6 +1160,9 @@ static void nsim_dev_reload_destroy(struct nsim_dev *nsim_dev)if(devlink_is_reload_failed(devlink))return;++/* Disable and destroy any user created devlink ports */+nsim_dev_port_fn_disable(nsim_dev);debugfs_remove(nsim_dev->take_snapshot);nsim_dev_port_del_all(nsim_dev);nsim_dev_health_exit(nsim_dev);
@@ -0,0 +1,340 @@+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB+/* Copyright (c) 2020 Mellanox Technologies Ltd. */++#include<linux/etherdevice.h>+#include<uapi/linux/devlink.h>++#include"netdevsim.h"++structnsim_port_fn{+structdevlink_portdl_port;+structnet_device*netdev;+structlist_headlist;+unsignedintport_index;+enumdevlink_port_flavourflavour;+u16pfnum;+};++staticstructdevlink_port*+nsim_dev_port_fn_get_devlink_port(structnet_device*dev)+{+structnsim_port_fn*port=netdev_priv(dev);++return&port->dl_port;+}++staticnetdev_tx_t+nsim_dev_port_fn_start_xmit(structsk_buff*skb,structnet_device*dev)+{+dev_kfree_skb(skb);+returnNETDEV_TX_OK;+}++staticconststructnet_device_opsnsim_netdev_ops={+.ndo_start_xmit=nsim_dev_port_fn_start_xmit,+.ndo_get_devlink_port=nsim_dev_port_fn_get_devlink_port,+};++staticvoidnsim_port_fn_ndev_setup(structnet_device*dev)+{+ether_setup(dev);+eth_hw_addr_random(dev);++dev->tx_queue_len=0;+dev->flags|=IFF_NOARP;+dev->flags&=~IFF_MULTICAST;+dev->max_mtu=ETH_MAX_MTU;+}++staticstructnsim_port_fn*+nsim_devlink_port_fn_alloc(structnsim_dev*dev,+conststructdevlink_port_new_attrs*attrs)+{+structnsim_bus_dev*nsim_bus_dev=dev->nsim_bus_dev;+structnsim_port_fn*port;+structnet_device*netdev;+intret;++netdev=alloc_netdev(sizeof(*port),"eth%d",NET_NAME_UNKNOWN,+nsim_port_fn_ndev_setup);+if(!netdev)+returnERR_PTR(-ENOMEM);++dev_net_set(netdev,nsim_dev_net(dev));+netdev->netdev_ops=&nsim_netdev_ops;+nsim_bus_dev=dev->nsim_bus_dev;+SET_NETDEV_DEV(netdev,&nsim_bus_dev->dev);++port=netdev_priv(netdev);+memset(port,0,sizeof(*port));+port->netdev=netdev;+port->flavour=attrs->flavour;++if(attrs->port_index_valid)+ret=ida_alloc_range(&dev->port_functions.ida,+attrs->port_index,+attrs->port_index,GFP_KERNEL);+else+ret=ida_alloc_min(&dev->port_functions.ida,+nsim_bus_dev->port_count,GFP_KERNEL);+if(ret<0)+gotoport_ida_err;++port->port_index=ret;++switch(port->flavour){+caseDEVLINK_PORT_FLAVOUR_PCI_PF:+ret=ida_alloc_range(&dev->port_functions.pfnum_ida,+attrs->pfnum,attrs->pfnum,+GFP_KERNEL);+if(ret<0)+gotofn_ida_err;+port->pfnum=ret;+break;+default:+break;+}+returnport;++fn_ida_err:+ida_simple_remove(&dev->port_functions.ida,port->port_index);+port_ida_err:+free_netdev(netdev);+returnERR_PTR(ret);+}++staticvoid+nsim_devlink_port_fn_free(structnsim_dev*dev,structnsim_port_fn*port)+{+switch(port->flavour){+caseDEVLINK_PORT_FLAVOUR_PCI_PF:+ida_simple_remove(&dev->port_functions.pfnum_ida,port->pfnum);+break;+default:+break;+}+ida_simple_remove(&dev->port_functions.ida,port->port_index);+free_netdev(port->netdev);+}++staticbool+nsim_dev_port_index_internal(structnsim_dev*nsim_dev,unsignedintport_index)+{+structnsim_bus_dev*nsim_bus_dev=nsim_dev->nsim_bus_dev;++return(port_index<nsim_bus_dev->port_count)?true:false;+}++staticbool+nsim_dev_port_port_exists(structnsim_dev*nsim_dev,+conststructdevlink_port_new_attrs*attrs)+{+structnsim_port_fn*tmp;++list_for_each_entry(tmp,&nsim_dev->port_functions.head,list){+if(attrs->port_index_valid&&+tmp->port_index==attrs->port_index)+returntrue;+if(attrs->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF&&+tmp->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF&&+tmp->pfnum==attrs->pfnum)+returntrue;+}+returnfalse;+}++staticstructnsim_port_fn*+nsim_dev_devlink_port_index_lookup(conststructnsim_dev*nsim_dev,+unsignedintport_index,+structnetlink_ext_ack*extack)+{+structnsim_port_fn*port;++list_for_each_entry(port,&nsim_dev->port_functions.head,list){+if(port->port_index!=port_index)+continue;+returnport;+}+NL_SET_ERR_MSG_MOD(extack,"User created port not found");+returnERR_PTR(-ENOENT);+}++staticintnsim_devlink_port_fn_add(structdevlink*devlink,+structnsim_dev*nsim_dev,+structnsim_port_fn*port,+structnetlink_ext_ack*extack)+{+interr;++list_add(&port->list,&nsim_dev->port_functions.head);++err=devlink_port_register(devlink,&port->dl_port,port->port_index);+if(err)+gotoreg_err;++err=register_netdev(port->netdev);+if(err)+gotonetdev_err;++devlink_port_type_eth_set(&port->dl_port,port->netdev);+return0;++netdev_err:+devlink_port_type_clear(&port->dl_port);+devlink_port_unregister(&port->dl_port);+reg_err:+list_del(&port->list);+returnerr;+}++staticvoidnsim_devlink_port_fn_del(structnsim_dev*nsim_dev,+structnsim_port_fn*port)+{+devlink_port_type_clear(&port->dl_port);+unregister_netdev(port->netdev);+devlink_port_unregister(&port->dl_port);+list_del(&port->list);+}++staticbool+nsim_dev_port_flavour_supported(conststructnsim_dev*nsim_dev,+conststructdevlink_port_new_attrs*attrs)+{+returnattrs->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF;+}++intnsim_dev_devlink_port_new(structdevlink*devlink,+conststructdevlink_port_new_attrs*attrs,+structnetlink_ext_ack*extack,+unsignedint*new_port_index)+{+structnsim_dev*nsim_dev=devlink_priv(devlink);+structnsim_bus_dev*nsim_bus_dev;+structnsim_port_fn*port;+interr;++nsim_bus_dev=nsim_dev->nsim_bus_dev;+if(attrs->port_index_valid&&+attrs->port_index<nsim_bus_dev->port_count){+NL_SET_ERR_MSG_MOD(extack,+"Port with given port index already exist");+return-EEXIST;+}+if(!nsim_dev_port_flavour_supported(nsim_dev,attrs)){+NL_SET_ERR_MSG_MOD(extack,"Unsupported port flavour specified");+return-EOPNOTSUPP;+}+mutex_lock(&nsim_dev->port_functions.disable_mutex);+if(!nsim_dev->port_functions.enabled){+err=-ENODEV;+gotoalloc_err;+}+if(nsim_dev_port_port_exists(nsim_dev,attrs)){+NL_SET_ERR_MSG_MOD(extack,+"Port with given attributes already exists");+err=-EEXIST;+gotoalloc_err;+}+port=nsim_devlink_port_fn_alloc(nsim_dev,attrs);+if(IS_ERR(port)){+NL_SET_ERR_MSG_MOD(extack,"Fail to allocate port");+err=PTR_ERR(port);+gotoalloc_err;+}+memcpy(port->dl_port.attrs.switch_id.id,nsim_dev->switch_id.id,+nsim_dev->switch_id.id_len);+port->dl_port.attrs.switch_id.id_len=nsim_dev->switch_id.id_len;++devlink_port_attrs_pci_pf_set(&port->dl_port,0,port->pfnum,false);++err=nsim_devlink_port_fn_add(devlink,nsim_dev,port,extack);+if(err)+gotoadd_err;+*new_port_index=port->port_index;+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+return0;++add_err:+nsim_devlink_port_fn_free(nsim_dev,port);+alloc_err:+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+returnerr;+}++intnsim_dev_devlink_port_del(structdevlink*devlink,unsignedintport_index,+structnetlink_ext_ack*extack)+{+structnsim_dev*nsim_dev=devlink_priv(devlink);+structnsim_port_fn*port;+interr;++if(nsim_dev_port_index_internal(nsim_dev,port_index)){+NL_SET_ERR_MSG_MOD(extack,"Port index doesn't belong to user created port");+return-EINVAL;+}++mutex_lock(&nsim_dev->port_functions.disable_mutex);+if(!nsim_dev->port_functions.enabled){+err=-ENODEV;+gotoerr;+}++port=nsim_dev_devlink_port_index_lookup(nsim_dev,port_index,extack);+if(IS_ERR(port)){+err=PTR_ERR(port);+gotoerr;+}+nsim_devlink_port_fn_del(nsim_dev,port);+nsim_devlink_port_fn_free(nsim_dev,port);+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+return0;++err:+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+returnerr;+}++voidnsim_dev_port_fn_init(structnsim_dev*nsim_dev)+{+mutex_init(&nsim_dev->port_functions.disable_mutex);+INIT_LIST_HEAD(&nsim_dev->port_functions.head);+ida_init(&nsim_dev->port_functions.ida);+ida_init(&nsim_dev->port_functions.pfnum_ida);+}++voidnsim_dev_port_fn_exit(structnsim_dev*nsim_dev)+{+WARN_ON(!ida_is_empty(&nsim_dev->port_functions.pfnum_ida));+ida_destroy(&nsim_dev->port_functions.pfnum_ida);+WARN_ON(!ida_is_empty(&nsim_dev->port_functions.ida));+ida_destroy(&nsim_dev->port_functions.ida);+WARN_ON(!list_empty(&nsim_dev->port_functions.head));+mutex_destroy(&nsim_dev->port_functions.disable_mutex);+}++voidnsim_dev_port_fn_enable(structnsim_dev*nsim_dev)+{+mutex_lock(&nsim_dev->port_functions.disable_mutex);+nsim_dev->port_functions.enabled=true;+mutex_unlock(&nsim_dev->port_functions.disable_mutex);+}++voidnsim_dev_port_fn_disable(structnsim_dev*nsim_dev)+{+structnsim_port_fn*port;+structnsim_port_fn*tmp;++mutex_lock(&nsim_dev->port_functions.disable_mutex);+nsim_dev->port_functions.enabled=false;+mutex_unlock(&nsim_dev->port_functions.disable_mutex);++/* At this point, no new user commands can start and any ongoing+*commandshavecompleted,soitissafetodeleteallusercreated+*ports.+*/+list_for_each_entry_safe_reverse(port,tmp,+&nsim_dev->port_functions.head,list){+nsim_devlink_port_fn_del(nsim_dev,port);+nsim_devlink_port_fn_free(nsim_dev,port);+}+}
Allow users to get hardware address for the PCI port.
Below example creates one devlink port, queries a port and its hardware
address.
Example of a PCI SF port which supports a port function hw_addr set:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show devlink ports:
$ devlink port show
netdevsim/netdevsim10/0: type eth netdev eth0 flavour physical port 1 splittable false
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:00:00:00:00:00"
}
}
}
}
Signed-off-by: Parav Pandit <redacted>
---
drivers/net/netdevsim/dev.c | 1 +
drivers/net/netdevsim/netdevsim.h | 4 ++++
drivers/net/netdevsim/port_function.c | 30 +++++++++++++++++++++++++++
3 files changed, 35 insertions(+)
@@ -16,6 +16,7 @@ struct nsim_port_fn {intrefcount;/* Counts how many sf ports are bound attached to this pf port. */u32sfnum;u16pfnum;+u8hw_addr[ETH_ALEN];};staticstructdevlink_port*
@@ -431,3 +432,32 @@ void nsim_dev_port_fn_disable(struct nsim_dev *nsim_dev)nsim_devlink_port_fn_free(nsim_dev,port);}}++staticstructnsim_port_fn*+nsim_dev_to_port_fn(structnsim_dev*nsim_dev,structdevlink_port*dl_port,+structnetlink_ext_ack*extack)+{+if(nsim_dev_port_index_internal(nsim_dev,dl_port->index)){+NL_SET_ERR_MSG_MOD(extack,+"Port index doesn't belong to user created port");+returnERR_PTR(-EOPNOTSUPP);+}+returncontainer_of(dl_port,structnsim_port_fn,dl_port);+}++intnsim_dev_port_fn_hw_addr_get(structdevlink*devlink,+structdevlink_port*dl_port,+u8*hw_addr,int*hw_addr_len,+structnetlink_ext_ack*extack)+{+structnsim_dev*nsim_dev=devlink_priv(devlink);+structnsim_port_fn*port;++port=nsim_dev_to_port_fn(nsim_dev,dl_port,extack);+if(IS_ERR(port))+returnPTR_ERR(port);++memcpy(hw_addr,port->hw_addr,ETH_ALEN);+*hw_addr_len=ETH_ALEN;+return0;+}
Allow users to get/set hardware address for the PCI port.
Below example creates one devlink port, queries a port, sets a
hardware address.
Example of a PCI SF port which supports a port function hw_addr set:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Set the MAC address:
$ devlink port function set netdevsim/netdevsim10/2 hw_addr 00:11:22:33:44:55
Show devlink ports:
$ devlink port show
netdevsim/netdevsim10/0: type eth netdev eth0 flavour physical port 1 splittable false
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:11:22:33:44:55
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:11:22:33:44:55"
}
}
}
}
Signed-off-by: Parav Pandit <redacted>
---
drivers/net/netdevsim/dev.c | 1 +
drivers/net/netdevsim/netdevsim.h | 4 ++++
drivers/net/netdevsim/port_function.c | 21 +++++++++++++++++++++
3 files changed, 26 insertions(+)
@@ -461,3 +461,24 @@ int nsim_dev_port_fn_hw_addr_get(struct devlink *devlink,*hw_addr_len=ETH_ALEN;return0;}++intnsim_dev_port_fn_hw_addr_set(structdevlink*devlink,+structdevlink_port*dl_port,+constu8*hw_addr,inthw_addr_len,+structnetlink_ext_ack*extack)+{+structnsim_dev*nsim_dev=devlink_priv(devlink);+structnsim_port_fn*port;++if(hw_addr_len!=ETH_ALEN){+NL_SET_ERR_MSG_MOD(extack,+"Hardware address must be 6 bytes long");+return-EOPNOTSUPP;+}+port=nsim_dev_to_port_fn(nsim_dev,dl_port,extack);+if(IS_ERR(port))+returnPTR_ERR(port);++memcpy(port->hw_addr,hw_addr,ETH_ALEN);+return0;+}
Simulate PCI SF ports. Allow user to create one or more PCI SF ports.
Examples:
echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
Add PCI SF port where port index and sfnum are auto assigned by driver.
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
Show devlink ports:
$ devlink port show
netdevsim/netdevsim10/0: type eth netdev eth0 flavour physical port 1 splittable false
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
Create a PCI SF port whose port index and SF number are assigned by
the user.
$ devlink port add netdevsim/netdevsim10/66 flavour pcisf pfnum 2 sfnum 66
netdevsim/netdevsim10/66: type eth netdev eth3 flavour pcisf controller 0 pfnum 2 sfnum 66 splittable false
Delete PCI SF and PF ports:
$ devlink port del netdevsim/netdevsim10/66
$ devlink port del netdevsim/netdevsim10/2
$ devlink port del netdevsim/netdevsim10/1
Signed-off-by: Parav Pandit <redacted>
Reviewed-by: Jiri Pirko <redacted>
---
drivers/net/netdevsim/netdevsim.h | 1 +
drivers/net/netdevsim/port_function.c | 99 ++++++++++++++++++++++++++-
2 files changed, 97 insertions(+), 3 deletions(-)
@@ -9,9 +9,12 @@structnsim_port_fn{structdevlink_portdl_port;structnet_device*netdev;+structnsim_port_fn*pf_pfn;structlist_headlist;unsignedintport_index;enumdevlink_port_flavourflavour;+intrefcount;/* Counts how many sf ports are bound attached to this pf port. */+u32sfnum;u16pfnum;};
@@ -91,9 +94,24 @@ nsim_devlink_port_fn_alloc(struct nsim_dev *dev,gotofn_ida_err;port->pfnum=ret;break;+caseDEVLINK_PORT_FLAVOUR_PCI_SF:+if(attrs->sfnum_valid)+ret=ida_alloc_range(&dev->port_functions.sfnum_ida,attrs->sfnum,+attrs->sfnum,GFP_KERNEL);+else+ret=ida_alloc(&dev->port_functions.sfnum_ida,GFP_KERNEL);+if(ret<0)+gotofn_ida_err;+port->sfnum=ret;+port->pfnum=attrs->pfnum;+break;default:break;}+/* refcount_t is not needed as port is protected by port_functions.mutex.+*ThiscountistokeeptrackofhowmanySFportsareattachedaPFport.+*/+port->refcount=1;returnport;fn_ida_err:
@@ -153,20 +180,72 @@ nsim_dev_devlink_port_index_lookup(const struct nsim_dev *nsim_dev,list_for_each_entry(port,&nsim_dev->port_functions.head,list){if(port->port_index!=port_index)continue;+if(port->refcount>1){+NL_SET_ERR_MSG_MOD(extack,"Port is in use");+returnERR_PTR(-EBUSY);+}returnport;}NL_SET_ERR_MSG_MOD(extack,"User created port not found");returnERR_PTR(-ENOENT);}+staticstructnsim_port_fn*+pf_port_get(structnsim_dev*nsim_dev,structnsim_port_fn*port)+{+structnsim_port_fn*tmp;++/* PF port addition doesn't need a parent. */+if(port->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF)+returnNULL;++list_for_each_entry(tmp,&nsim_dev->port_functions.head,list){+if(tmp->flavour!=DEVLINK_PORT_FLAVOUR_PCI_PF||+tmp->pfnum!=port->pfnum)+continue;++if(tmp->refcount+1==INT_MAX)+returnERR_PTR(-ENOSPC);++port->pf_pfn=tmp;+tmp->refcount++;+returntmp;+}+returnERR_PTR(-ENOENT);+}++staticvoidpf_port_put(structnsim_port_fn*port)+{+if(port->pf_pfn){+port->pf_pfn->refcount--;+WARN_ON(port->pf_pfn->refcount<0);+}+port->refcount--;+WARN_ON(port->refcount!=0);+}+staticintnsim_devlink_port_fn_add(structdevlink*devlink,structnsim_dev*nsim_dev,structnsim_port_fn*port,structnetlink_ext_ack*extack){+structnsim_port_fn*pf_pfn;interr;-list_add(&port->list,&nsim_dev->port_functions.head);+/* Keep all PF ports at the start, so that when driver is unloaded+*AllSFportsfromtheendofthelistcanberemovedfirst.+*/+if(port->flavour==DEVLINK_PORT_FLAVOUR_PCI_PF)+list_add(&port->list,&nsim_dev->port_functions.head);+else+list_add_tail(&port->list,&nsim_dev->port_functions.head);++pf_pfn=pf_port_get(nsim_dev,port);+if(IS_ERR(pf_pfn)){+NL_SET_ERR_MSG_MOD(extack,"Fail to get pf port");+err=PTR_ERR(pf_pfn);+gotopf_err;+}err=devlink_port_register(devlink,&port->dl_port,port->port_index);if(err)
@@ -183,6 +262,8 @@ static int nsim_devlink_port_fn_add(struct devlink *devlink,devlink_port_type_clear(&port->dl_port);devlink_port_unregister(&port->dl_port);reg_err:+pf_port_put(port);+pf_err:list_del(&port->list);returnerr;}
Simulate port function state of a PCI port.
This enables users to get the state of the PCI port function.
Example of a PCI SF port which supports a port function hw_addr set:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show devlink port:
$ devlink port show netdevsim/netdevsim10/2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00 state inactive opstate detached
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:00:00:00:00:00",
"state": "inactive",
"opstate": "detached"
}
}
}
}
Signed-off-by: Parav Pandit <redacted>
---
drivers/net/netdevsim/dev.c | 1 +
drivers/net/netdevsim/netdevsim.h | 5 +++++
drivers/net/netdevsim/port_function.c | 22 ++++++++++++++++++++++
3 files changed, 28 insertions(+)
Simulate port function state of a PCI port.
This enables users to get and set the state of the PCI port function.
Example of a PCI SF port which supports a port function:
Create a device with ID=10 and one physical port.
$ echo "10 1" > /sys/bus/netdevsim/new_device
Add PCI PF port:
$ devlink port add netdevsim/netdevsim10 flavour pcipf pfnum 2
netdevsim/netdevsim10/1: type eth netdev eth1 flavour pcipf controller 0 pfnum 2 external false splittable false
function:
hw_addr 00:00:00:00:00:00
$ devlink port add netdevsim/netdevsim10 flavour pcisf pfnum 2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00
Show devlink port:
$ devlink port show netdevsim/netdevsim10/2
netdevsim/netdevsim10/2: type eth netdev eth2 flavour pcisf controller 0 pfnum 2 sfnum 0 splittable false
function:
hw_addr 00:00:00:00:00:00 state inactive opstate detached
Set the MAC address and activate the function:
$ devlink port function set netdevsim/netdevsim10/2 hw_addr 00:11:22:33:44:55 state active
Show the port and function attributes in JSON format:
$ devlink port show netdevsim/netdevsim10/2 -jp
{
"port": {
"netdevsim/netdevsim10/2": {
"type": "eth",
"netdev": "eth2",
"flavour": "pcisf",
"controller": 0,
"pfnum": 2,
"sfnum": 0,
"splittable": false,
"function": {
"hw_addr": "00:11:22:33:44:55",
"state": "active",
"opstate": "attached"
}
}
}
}
Signed-off-by: Parav Pandit <redacted>
---
drivers/net/netdevsim/dev.c | 1 +
drivers/net/netdevsim/netdevsim.h | 4 ++++
drivers/net/netdevsim/port_function.c | 15 +++++++++++++++
3 files changed, 20 insertions(+)
@@ -507,6 +507,76 @@ dummy_reporter_test()log_test"dummy reporter test"}+function_state_get()+{+localname=$1++cmd_jq"devlink port show $DL_HANDLE/$USR_SF_PORT_INDEX -j"\+" .[][].function.$1"+}++devlink_port_add_test()+{+RET=0+USR_PF_PORT_INDEX=600+USR_PFNUM_A=2+USR_PFNUM_B=3+USR_SF_PORT_INDEX=601+USR_SFNUM_A=44+USR_SFNUM_B=55++devlinkportadd$DL_HANDLEflavourpcipfpfnum$USR_PFNUM_A+check_err$?"Failed PF port addition"++devlinkportshow+check_err$?"Failed PF port show"++devlinkportadd$DL_HANDLEflavourpcisfpfnum$USR_PFNUM_A+check_err$?"Failed SF port addition"++devlinkportadd$DL_HANDLEflavourpcisfpfnum$USR_PFNUM_A\+sfnum$USR_SFNUM_A+check_err$?"Failed SF port addition"++devlinkportadd$DL_HANDLEflavourpcipfpfnum$USR_PFNUM_B+check_err$?"Failed second PF port addition"++devlinkportadd$DL_HANDLE/$USR_SF_PORT_INDEXflavourpcisf\+pfnum$USR_PFNUM_Bsfnum$USR_SFNUM_B+check_err$?"Failed SF port addition"++devlinkportshow+check_err$?"Failed PF port show"++state=$(function_state_get"state")+check_err$?"Failed to get function state"+["$state"=="inactive"]+check_err$?"Unexpected function state $state"++state=$(function_state_get"opstate")+check_err$?"Failed to get operational state"+["$state"=="detached"]+check_err$?"Unexpected function opstate $opstate"++devlinkportfunctionset$DL_HANDLE/$USR_SF_PORT_INDEXstateactive+check_err$?"Failed to set state"++state=$(function_state_get"state")+check_err$?"Failed to get function state"+["$state"=="active"]+check_err$?"Unexpected function state $state"++state=$(function_state_get"opstate")+check_err$?"Failed to get operational state"+["$state"=="attached"]+check_err$?"Unexpected function opstate $opstate"++devlinkportdel$DL_HANDLE/$USR_SF_PORT_INDEX+check_err$?"Failed SF port deletion"++log_test"port_add test"+}+ setup_prepare(){modprobenetdevsim
drivers/net/netdevsim/netdevsim.h:317:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
1 warning generated.
--
In file included from drivers/net/netdevsim/dev.c:36:
quoted
drivers/net/netdevsim/netdevsim.h:317:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/dev.c:908:3: error: field designator 'port_new' does not refer to any field in type 'const struct devlink_ops'
.port_new = nsim_dev_devlink_port_new,
^
quoted
drivers/net/netdevsim/dev.c:909:3: error: field designator 'port_del' does not refer to any field in type 'const struct devlink_ops'
.port_del = nsim_dev_devlink_port_del,
^
1 warning and 2 errors generated.
--
In file included from drivers/net/netdevsim/port_function.c:7:
quoted
drivers/net/netdevsim/netdevsim.h:317:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/port_function.c:51:20: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
quoted
drivers/net/netdevsim/port_function.c:71:23: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->flavour = attrs->flavour;
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:73:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:75:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index,
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:76:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:88:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:88:30: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:51:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:130:19: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:135:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:130:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:136:31: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->port_index == attrs->port_index)
~~~~~^
drivers/net/netdevsim/port_function.c:130:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:138:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF &&
~~~~~^
drivers/net/netdevsim/port_function.c:130:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:140:26: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->pfnum == attrs->pfnum)
~~~~~^
drivers/net/netdevsim/port_function.c:130:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:201:18: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:203:14: error: incomplete definition of type 'struct devlink_port_new_attrs'
return attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF;
~~~~~^
drivers/net/netdevsim/port_function.c:201:18: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:207:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
drivers/net/netdevsim/port_function.c:206:5: error: conflicting types for 'nsim_dev_devlink_port_new'
int nsim_dev_devlink_port_new(struct devlink *devlink,
^
drivers/net/netdevsim/netdevsim.h:316:5: note: previous declaration is here
int nsim_dev_devlink_port_new(struct devlink *devlink,
^
drivers/net/netdevsim/port_function.c:217:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:207:23: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs,
^
drivers/net/netdevsim/port_function.c:218:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index < nsim_bus_dev->port_count) {
~~~~~^
drivers/net/netdevsim/port_function.c:207:23: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs,
^
drivers/net/netdevsim/port_function.c:223:49: error: incompatible pointer types passing 'const struct devlink_port_new_attrs *' to parameter of type 'const struct devlink_port_new_attrs *' [-Werror,-Wincompatible-pointer-types]
if (!nsim_dev_port_flavour_supported(nsim_dev, attrs)) {
^~~~~
drivers/net/netdevsim/port_function.c:201:42: note: passing argument to parameter 'attrs' here
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:232:42: error: incompatible pointer types passing 'const struct devlink_port_new_attrs *' to parameter of type 'const struct devlink_port_new_attrs *' [-Werror,-Wincompatible-pointer-types]
if (nsim_dev_port_port_exists(nsim_dev, attrs)) {
vim +908 drivers/net/netdevsim/dev.c
894
895 static const struct devlink_ops nsim_dev_devlink_ops = {
896 .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT |
897 DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK,
898 .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),
899 .reload_down = nsim_dev_reload_down,
900 .reload_up = nsim_dev_reload_up,
901 .info_get = nsim_dev_info_get,
902 .flash_update = nsim_dev_flash_update,
903 .trap_init = nsim_dev_devlink_trap_init,
904 .trap_action_set = nsim_dev_devlink_trap_action_set,
905 .trap_group_set = nsim_dev_devlink_trap_group_set,
906 .trap_policer_set = nsim_dev_devlink_trap_policer_set,
907 .trap_policer_counter_get = nsim_dev_devlink_trap_policer_counter_get,
> 908 .port_new = nsim_dev_devlink_port_new,
> 909 .port_del = nsim_dev_devlink_port_del,
910 };
911
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
From: kernel test robot <hidden> Date: 2021-02-07 12:29:56
Hi Parav,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/0day-ci/linux/commits/Parav-Pandit/netdevsim-Add-support-for-add-and-delete-of-a-PCI-PF-port/20210207-174501
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 6626a0266566c5aea16178c5e6cd7fc4db3f2f56
config: arm-randconfig-r004-20210207 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project c9439ca36342fb6013187d0a69aef92736951476)
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/9cd1b543da8076288ba231ed010e8a610e238bae
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Parav-Pandit/netdevsim-Add-support-for-add-and-delete-of-a-PCI-PF-port/20210207-174501
git checkout 9cd1b543da8076288ba231ed010e8a610e238bae
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <redacted>
All errors (new ones prefixed by >>):
In file included from drivers/net/netdevsim/port_function.c:7:
drivers/net/netdevsim/netdevsim.h:318:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
drivers/net/netdevsim/port_function.c:54:20: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:74:23: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->flavour = attrs->flavour;
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:76:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:78:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index,
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:79:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:91:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:91:30: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
quoted
drivers/net/netdevsim/port_function.c:97:7: error: use of undeclared identifier 'DEVLINK_PORT_FLAVOUR_PCI_SF'
case DEVLINK_PORT_FLAVOUR_PCI_SF:
^
drivers/net/netdevsim/port_function.c:98:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->sfnum_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:99:63: error: incomplete definition of type 'struct devlink_port_new_attrs'
ret = ida_alloc_range(&dev->port_functions.sfnum_ida, attrs->sfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:100:17: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->sfnum, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:106:22: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->pfnum = attrs->pfnum;
~~~~~^
drivers/net/netdevsim/port_function.c:54:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:131:7: error: use of undeclared identifier 'DEVLINK_PORT_FLAVOUR_PCI_SF'
case DEVLINK_PORT_FLAVOUR_PCI_SF:
^
drivers/net/netdevsim/port_function.c:151:19: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:156:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:157:31: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->port_index == attrs->port_index)
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:159:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF &&
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:161:26: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->pfnum == attrs->pfnum)
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:164:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_SF &&
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:166:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->sfnum_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:167:26: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->sfnum == attrs->sfnum && tmp->pfnum == attrs->pfnum)
~~~~~^
drivers/net/netdevsim/port_function.c:151:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
3 warnings and 20 errors generated.
vim +/DEVLINK_PORT_FLAVOUR_PCI_SF +97 drivers/net/netdevsim/port_function.c
51
52 static struct nsim_port_fn *
53 nsim_devlink_port_fn_alloc(struct nsim_dev *dev,
54 const struct devlink_port_new_attrs *attrs)
55 {
56 struct nsim_bus_dev *nsim_bus_dev = dev->nsim_bus_dev;
57 struct nsim_port_fn *port;
58 struct net_device *netdev;
59 int ret;
60
61 netdev = alloc_netdev(sizeof(*port), "eth%d", NET_NAME_UNKNOWN,
62 nsim_port_fn_ndev_setup);
63 if (!netdev)
64 return ERR_PTR(-ENOMEM);
65
66 dev_net_set(netdev, nsim_dev_net(dev));
67 netdev->netdev_ops = &nsim_netdev_ops;
68 nsim_bus_dev = dev->nsim_bus_dev;
69 SET_NETDEV_DEV(netdev, &nsim_bus_dev->dev);
70
71 port = netdev_priv(netdev);
72 memset(port, 0, sizeof(*port));
73 port->netdev = netdev;
74 port->flavour = attrs->flavour;
75
76 if (attrs->port_index_valid)
77 ret = ida_alloc_range(&dev->port_functions.ida,
78 attrs->port_index,
79 attrs->port_index, GFP_KERNEL);
80 else
81 ret = ida_alloc_min(&dev->port_functions.ida,
82 nsim_bus_dev->port_count, GFP_KERNEL);
83 if (ret < 0)
84 goto port_ida_err;
85
86 port->port_index = ret;
87
88 switch (port->flavour) {
89 case DEVLINK_PORT_FLAVOUR_PCI_PF:
90 ret = ida_alloc_range(&dev->port_functions.pfnum_ida,
91 attrs->pfnum, attrs->pfnum,
92 GFP_KERNEL);
93 if (ret < 0)
94 goto fn_ida_err;
95 port->pfnum = ret;
96 break;
> 97 case DEVLINK_PORT_FLAVOUR_PCI_SF:
98 if (attrs->sfnum_valid)
99 ret = ida_alloc_range(&dev->port_functions.sfnum_ida, attrs->sfnum,
100 attrs->sfnum, GFP_KERNEL);
101 else
102 ret = ida_alloc(&dev->port_functions.sfnum_ida, GFP_KERNEL);
103 if (ret < 0)
104 goto fn_ida_err;
105 port->sfnum = ret;
106 port->pfnum = attrs->pfnum;
107 break;
108 default:
109 break;
110 }
111 /* refcount_t is not needed as port is protected by port_functions.mutex.
112 * This count is to keep track of how many SF ports are attached a PF port.
113 */
114 port->refcount = 1;
115 return port;
116
117 fn_ida_err:
118 ida_simple_remove(&dev->port_functions.ida, port->port_index);
119 port_ida_err:
120 free_netdev(netdev);
121 return ERR_PTR(ret);
122 }
123
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
drivers/net/netdevsim/netdevsim.h:333:16: warning: declaration of 'enum devlink_port_fn_state' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_state *state,
^
quoted
drivers/net/netdevsim/netdevsim.h:334:16: warning: declaration of 'enum devlink_port_fn_opstate' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_opstate *opstate,
^
3 warnings generated.
--
In file included from drivers/net/netdevsim/dev.c:36:
drivers/net/netdevsim/netdevsim.h:318:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/netdevsim.h:333:16: warning: declaration of 'enum devlink_port_fn_state' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_state *state,
^
quoted
drivers/net/netdevsim/netdevsim.h:334:16: warning: declaration of 'enum devlink_port_fn_opstate' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_opstate *opstate,
^
drivers/net/netdevsim/dev.c:908:3: error: field designator 'port_new' does not refer to any field in type 'const struct devlink_ops'
.port_new = nsim_dev_devlink_port_new,
^
drivers/net/netdevsim/dev.c:909:3: error: field designator 'port_del' does not refer to any field in type 'const struct devlink_ops'
.port_del = nsim_dev_devlink_port_del,
^
quoted
drivers/net/netdevsim/dev.c:912:3: error: field designator 'port_fn_state_get' does not refer to any field in type 'const struct devlink_ops'
.port_fn_state_get = nsim_dev_port_fn_state_get,
^
3 warnings and 3 errors generated.
--
In file included from drivers/net/netdevsim/port_function.c:7:
drivers/net/netdevsim/netdevsim.h:318:23: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs,
^
quoted
drivers/net/netdevsim/netdevsim.h:333:16: warning: declaration of 'enum devlink_port_fn_state' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_state *state,
^
quoted
drivers/net/netdevsim/netdevsim.h:334:16: warning: declaration of 'enum devlink_port_fn_opstate' will not be visible outside of this function [-Wvisibility]
enum devlink_port_fn_opstate *opstate,
^
drivers/net/netdevsim/port_function.c:56:20: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:76:23: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->flavour = attrs->flavour;
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:78:11: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:80:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index,
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:81:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->port_index, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:93:16: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:93:30: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->pfnum, attrs->pfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:99:7: error: use of undeclared identifier 'DEVLINK_PORT_FLAVOUR_PCI_SF'
case DEVLINK_PORT_FLAVOUR_PCI_SF:
^
drivers/net/netdevsim/port_function.c:100:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->sfnum_valid)
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:101:63: error: incomplete definition of type 'struct devlink_port_new_attrs'
ret = ida_alloc_range(&dev->port_functions.sfnum_ida, attrs->sfnum,
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:102:17: error: incomplete definition of type 'struct devlink_port_new_attrs'
attrs->sfnum, GFP_KERNEL);
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:108:22: error: incomplete definition of type 'struct devlink_port_new_attrs'
port->pfnum = attrs->pfnum;
~~~~~^
drivers/net/netdevsim/port_function.c:56:20: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:133:7: error: use of undeclared identifier 'DEVLINK_PORT_FLAVOUR_PCI_SF'
case DEVLINK_PORT_FLAVOUR_PCI_SF:
^
drivers/net/netdevsim/port_function.c:153:19: warning: declaration of 'struct devlink_port_new_attrs' will not be visible outside of this function [-Wvisibility]
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:158:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->port_index_valid &&
~~~~~^
drivers/net/netdevsim/port_function.c:153:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:159:31: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->port_index == attrs->port_index)
~~~~~^
drivers/net/netdevsim/port_function.c:153:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:161:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_PF &&
~~~~~^
drivers/net/netdevsim/port_function.c:153:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:163:26: error: incomplete definition of type 'struct devlink_port_new_attrs'
tmp->pfnum == attrs->pfnum)
~~~~~^
drivers/net/netdevsim/port_function.c:153:19: note: forward declaration of 'struct devlink_port_new_attrs'
const struct devlink_port_new_attrs *attrs)
^
drivers/net/netdevsim/port_function.c:166:12: error: incomplete definition of type 'struct devlink_port_new_attrs'
if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_SF &&
vim +912 drivers/net/netdevsim/dev.c
894
895 static const struct devlink_ops nsim_dev_devlink_ops = {
896 .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT |
897 DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK,
898 .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),
899 .reload_down = nsim_dev_reload_down,
900 .reload_up = nsim_dev_reload_up,
901 .info_get = nsim_dev_info_get,
902 .flash_update = nsim_dev_flash_update,
903 .trap_init = nsim_dev_devlink_trap_init,
904 .trap_action_set = nsim_dev_devlink_trap_action_set,
905 .trap_group_set = nsim_dev_devlink_trap_group_set,
906 .trap_policer_set = nsim_dev_devlink_trap_policer_set,
907 .trap_policer_counter_get = nsim_dev_devlink_trap_policer_counter_get,
908 .port_new = nsim_dev_devlink_port_new,
909 .port_del = nsim_dev_devlink_port_del,
910 .port_function_hw_addr_get = nsim_dev_port_fn_hw_addr_get,
911 .port_function_hw_addr_set = nsim_dev_port_fn_hw_addr_set,
> 912 .port_fn_state_get = nsim_dev_port_fn_state_get,
913 };
914
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-02-08 21:22:27
On Sun, 7 Feb 2021 10:44:12 +0200 Parav Pandit wrote:
+ RET=0
+ USR_PF_PORT_INDEX=600
+ USR_PFNUM_A=2
+ USR_PFNUM_B=3
+ USR_SF_PORT_INDEX=601
+ USR_SFNUM_A=44
+ USR_SFNUM_B=55
+
+ devlink port add $DL_HANDLE flavour pcipf pfnum $USR_PFNUM_A
+ check_err $? "Failed PF port addition"
+
+ devlink port show
+ check_err $? "Failed PF port show"
+
+ devlink port add $DL_HANDLE flavour pcisf pfnum $USR_PFNUM_A
+ check_err $? "Failed SF port addition"
+
+ devlink port add $DL_HANDLE flavour pcisf pfnum $USR_PFNUM_A \
+ sfnum $USR_SFNUM_A
+ check_err $? "Failed SF port addition"
+
+ devlink port add $DL_HANDLE flavour pcipf pfnum $USR_PFNUM_B
+ check_err $? "Failed second PF port addition"
+
+ devlink port add $DL_HANDLE/$USR_SF_PORT_INDEX flavour pcisf \
+ pfnum $USR_PFNUM_B sfnum $USR_SFNUM_B
+ check_err $? "Failed SF port addition"
+
+ devlink port show
+ check_err $? "Failed PF port show"
+
+ state=$(function_state_get "state")
+ check_err $? "Failed to get function state"
+ [ "$state" == "inactive" ]
+ check_err $? "Unexpected function state $state"
+
+ state=$(function_state_get "opstate")
+ check_err $? "Failed to get operational state"
+ [ "$state" == "detached" ]
+ check_err $? "Unexpected function opstate $opstate"
+
+ devlink port function set $DL_HANDLE/$USR_SF_PORT_INDEX state active
+ check_err $? "Failed to set state"
+
+ state=$(function_state_get "state")
+ check_err $? "Failed to get function state"
+ [ "$state" == "active" ]
+ check_err $? "Unexpected function state $state"
+
+ state=$(function_state_get "opstate")
+ check_err $? "Failed to get operational state"
+ [ "$state" == "attached" ]
+ check_err $? "Unexpected function opstate $opstate"
+
+ devlink port del $DL_HANDLE/$USR_SF_PORT_INDEX
+ check_err $? "Failed SF port deletion"
+
+ log_test "port_add test"
I don't think this very basic test is worth the 600 LoC of netdevsim
code.
If you come up with something better please don't post v3 it in reply
to previous threads.