mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 22:51:37 +00:00
devlink: Support add and delete devlink port
Extended devlink interface for the user to add and delete a port. Extend devlink to connect user requests to driver to add/delete a port in the device. Driver routines are invoked without holding devlink instance lock. This enables driver to perform several devlink objects registration, unregistration such as (port, health reporter, resource etc) by using existing devlink APIs. This also helps to uniformly use the code for port unregistration during driver unload and during port deletion initiated by user. Examples of add, show and delete commands: $ devlink dev eswitch set pci/0000:06:00.0 mode switchdev $ devlink port show pci/0000:06:00.0/65535: type eth netdev ens2f0np0 flavour physical port 0 splittable false $ devlink port add pci/0000:06:00.0 flavour pcisf pfnum 0 sfnum 88 pci/0000:06:00.0/32768: type eth netdev eth6 flavour pcisf controller 0 pfnum 0 sfnum 88 external false splittable false function: hw_addr 00:00:00:00:00:00 state inactive opstate detached $ devlink port show pci/0000:06:00.0/32768 pci/0000:06:00.0/32768: type eth netdev eth6 flavour pcisf controller 0 pfnum 0 sfnum 88 external false splittable false function: hw_addr 00:00:00:00:00:00 state inactive opstate detached $ udevadm test-builtin net_id /sys/class/net/eth6 Load module index Parsed configuration file /usr/lib/systemd/network/99-default.link Created link configuration context. Using default interface naming scheme 'v245'. ID_NET_NAMING_SCHEME=v245 ID_NET_NAME_PATH=enp6s0f0npf0sf88 ID_NET_NAME_SLOT=ens2f0npf0sf88 Unload module index Unloaded link configuration context. Signed-off-by: Parav Pandit <parav@nvidia.com> Reviewed-by: Vu Pham <vuhuong@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
b8288837ef
commit
cd76dcd68d
2 changed files with 173 additions and 0 deletions
|
@ -1147,6 +1147,111 @@ static int devlink_nl_cmd_port_unsplit_doit(struct sk_buff *skb,
|
|||
return devlink_port_unsplit(devlink, port_index, info->extack);
|
||||
}
|
||||
|
||||
static int devlink_port_new_notifiy(struct devlink *devlink,
|
||||
unsigned int port_index,
|
||||
struct genl_info *info)
|
||||
{
|
||||
struct devlink_port *devlink_port;
|
||||
struct sk_buff *msg;
|
||||
int err;
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&devlink->lock);
|
||||
devlink_port = devlink_port_get_by_index(devlink, port_index);
|
||||
if (!devlink_port) {
|
||||
err = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = devlink_nl_port_fill(msg, devlink, devlink_port,
|
||||
DEVLINK_CMD_NEW, info->snd_portid,
|
||||
info->snd_seq, 0, NULL);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = genlmsg_reply(msg, info);
|
||||
mutex_unlock(&devlink->lock);
|
||||
return err;
|
||||
|
||||
out:
|
||||
mutex_unlock(&devlink->lock);
|
||||
nlmsg_free(msg);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int devlink_nl_cmd_port_new_doit(struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
struct netlink_ext_ack *extack = info->extack;
|
||||
struct devlink_port_new_attrs new_attrs = {};
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
unsigned int new_port_index;
|
||||
int err;
|
||||
|
||||
if (!devlink->ops->port_new || !devlink->ops->port_del)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!info->attrs[DEVLINK_ATTR_PORT_FLAVOUR] ||
|
||||
!info->attrs[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Port flavour or PCI PF are not specified");
|
||||
return -EINVAL;
|
||||
}
|
||||
new_attrs.flavour = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_FLAVOUR]);
|
||||
new_attrs.pfnum =
|
||||
nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]);
|
||||
|
||||
if (info->attrs[DEVLINK_ATTR_PORT_INDEX]) {
|
||||
/* Port index of the new port being created by driver. */
|
||||
new_attrs.port_index =
|
||||
nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_INDEX]);
|
||||
new_attrs.port_index_valid = true;
|
||||
}
|
||||
if (info->attrs[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER]) {
|
||||
new_attrs.controller =
|
||||
nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER]);
|
||||
new_attrs.controller_valid = true;
|
||||
}
|
||||
if (new_attrs.flavour == DEVLINK_PORT_FLAVOUR_PCI_SF &&
|
||||
info->attrs[DEVLINK_ATTR_PORT_PCI_SF_NUMBER]) {
|
||||
new_attrs.sfnum = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_PCI_SF_NUMBER]);
|
||||
new_attrs.sfnum_valid = true;
|
||||
}
|
||||
|
||||
err = devlink->ops->port_new(devlink, &new_attrs, extack,
|
||||
&new_port_index);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = devlink_port_new_notifiy(devlink, new_port_index, info);
|
||||
if (err && err != -ENODEV) {
|
||||
/* Fail to send the response; destroy newly created port. */
|
||||
devlink->ops->port_del(devlink, new_port_index, extack);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int devlink_nl_cmd_port_del_doit(struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
struct netlink_ext_ack *extack = info->extack;
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
unsigned int port_index;
|
||||
|
||||
if (!devlink->ops->port_del)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!info->attrs[DEVLINK_ATTR_PORT_INDEX]) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Port index is not specified");
|
||||
return -EINVAL;
|
||||
}
|
||||
port_index = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_INDEX]);
|
||||
|
||||
return devlink->ops->port_del(devlink, port_index, extack);
|
||||
}
|
||||
|
||||
static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink,
|
||||
struct devlink_sb *devlink_sb,
|
||||
enum devlink_command cmd, u32 portid,
|
||||
|
@ -7605,6 +7710,10 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = {
|
|||
[DEVLINK_ATTR_RELOAD_ACTION] = NLA_POLICY_RANGE(NLA_U8, DEVLINK_RELOAD_ACTION_DRIVER_REINIT,
|
||||
DEVLINK_RELOAD_ACTION_MAX),
|
||||
[DEVLINK_ATTR_RELOAD_LIMITS] = NLA_POLICY_BITFIELD32(DEVLINK_RELOAD_LIMITS_VALID_MASK),
|
||||
[DEVLINK_ATTR_PORT_FLAVOUR] = { .type = NLA_U16 },
|
||||
[DEVLINK_ATTR_PORT_PCI_PF_NUMBER] = { .type = NLA_U16 },
|
||||
[DEVLINK_ATTR_PORT_PCI_SF_NUMBER] = { .type = NLA_U32 },
|
||||
[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
static const struct genl_small_ops devlink_nl_ops[] = {
|
||||
|
@ -7644,6 +7753,18 @@ static const struct genl_small_ops devlink_nl_ops[] = {
|
|||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = DEVLINK_NL_FLAG_NO_LOCK,
|
||||
},
|
||||
{
|
||||
.cmd = DEVLINK_CMD_PORT_NEW,
|
||||
.doit = devlink_nl_cmd_port_new_doit,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = DEVLINK_NL_FLAG_NO_LOCK,
|
||||
},
|
||||
{
|
||||
.cmd = DEVLINK_CMD_PORT_DEL,
|
||||
.doit = devlink_nl_cmd_port_del_doit,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = DEVLINK_NL_FLAG_NO_LOCK,
|
||||
},
|
||||
{
|
||||
.cmd = DEVLINK_CMD_SB_GET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue