Skip to content

Commit c1e5786

Browse files
Vasundhara Volamdavem330
authored andcommitted
devlink: Add devlink notifications support for port params
Add notification call for devlink port param set, register and unregister functions. Add devlink_port_param_value_changed() function to enable the driver notify devlink on value change. Driver should use this function after value was changed on any configuration mode part to driverinit. v7->v8: Order devlink_port_param_value_changed() definitions followed by devlink_param_value_changed() Cc: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 5473a7b commit c1e5786

File tree

3 files changed

+94
-27
lines changed

3 files changed

+94
-27
lines changed

include/net/devlink.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,8 @@ int devlink_port_param_driverinit_value_set(struct devlink_port *devlink_port,
586586
u32 param_id,
587587
union devlink_param_value init_val);
588588
void devlink_param_value_changed(struct devlink *devlink, u32 param_id);
589+
void devlink_port_param_value_changed(struct devlink_port *devlink_port,
590+
u32 param_id);
589591
void devlink_param_value_str_fill(union devlink_param_value *dst_val,
590592
const char *src);
591593
struct devlink_region *devlink_region_create(struct devlink *devlink,
@@ -855,6 +857,12 @@ devlink_param_value_changed(struct devlink *devlink, u32 param_id)
855857
{
856858
}
857859

860+
static inline void
861+
devlink_port_param_value_changed(struct devlink_port *devlink_port,
862+
u32 param_id)
863+
{
864+
}
865+
858866
static inline void
859867
devlink_param_value_str_fill(union devlink_param_value *dst_val,
860868
const char *src)

include/uapi/linux/devlink.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ enum devlink_command {
9191

9292
DEVLINK_CMD_PORT_PARAM_GET, /* can dump */
9393
DEVLINK_CMD_PORT_PARAM_SET,
94+
DEVLINK_CMD_PORT_PARAM_NEW,
95+
DEVLINK_CMD_PORT_PARAM_DEL,
9496

9597
/* add new commands above here */
9698
__DEVLINK_CMD_MAX,

net/core/devlink.c

Lines changed: 84 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2882,7 +2882,9 @@ static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink,
28822882
if (devlink_nl_put_handle(msg, devlink))
28832883
goto genlmsg_cancel;
28842884

2885-
if (cmd == DEVLINK_CMD_PORT_PARAM_GET)
2885+
if (cmd == DEVLINK_CMD_PORT_PARAM_GET ||
2886+
cmd == DEVLINK_CMD_PORT_PARAM_NEW ||
2887+
cmd == DEVLINK_CMD_PORT_PARAM_DEL)
28862888
if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, port_index))
28872889
goto genlmsg_cancel;
28882890

@@ -2928,18 +2930,22 @@ static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink,
29282930
}
29292931

29302932
static void devlink_param_notify(struct devlink *devlink,
2933+
unsigned int port_index,
29312934
struct devlink_param_item *param_item,
29322935
enum devlink_command cmd)
29332936
{
29342937
struct sk_buff *msg;
29352938
int err;
29362939

2937-
WARN_ON(cmd != DEVLINK_CMD_PARAM_NEW && cmd != DEVLINK_CMD_PARAM_DEL);
2940+
WARN_ON(cmd != DEVLINK_CMD_PARAM_NEW && cmd != DEVLINK_CMD_PARAM_DEL &&
2941+
cmd != DEVLINK_CMD_PORT_PARAM_NEW &&
2942+
cmd != DEVLINK_CMD_PORT_PARAM_DEL);
29382943

29392944
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
29402945
if (!msg)
29412946
return;
2942-
err = devlink_nl_param_fill(msg, devlink, 0, param_item, cmd, 0, 0, 0);
2947+
err = devlink_nl_param_fill(msg, devlink, port_index, param_item, cmd,
2948+
0, 0, 0);
29432949
if (err) {
29442950
nlmsg_free(msg);
29452951
return;
@@ -3097,6 +3103,7 @@ static int devlink_nl_cmd_param_get_doit(struct sk_buff *skb,
30973103
}
30983104

30993105
static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
3106+
unsigned int port_index,
31003107
struct list_head *param_list,
31013108
struct genl_info *info,
31023109
enum devlink_command cmd)
@@ -3149,7 +3156,7 @@ static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
31493156
return err;
31503157
}
31513158

3152-
devlink_param_notify(devlink, param_item, cmd);
3159+
devlink_param_notify(devlink, port_index, param_item, cmd);
31533160
return 0;
31543161
}
31553162

@@ -3158,13 +3165,15 @@ static int devlink_nl_cmd_param_set_doit(struct sk_buff *skb,
31583165
{
31593166
struct devlink *devlink = info->user_ptr[0];
31603167

3161-
return __devlink_nl_cmd_param_set_doit(devlink, &devlink->param_list,
3168+
return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->param_list,
31623169
info, DEVLINK_CMD_PARAM_NEW);
31633170
}
31643171

31653172
static int devlink_param_register_one(struct devlink *devlink,
3173+
unsigned int port_index,
31663174
struct list_head *param_list,
3167-
const struct devlink_param *param)
3175+
const struct devlink_param *param,
3176+
enum devlink_command cmd)
31683177
{
31693178
struct devlink_param_item *param_item;
31703179

@@ -3182,19 +3191,21 @@ static int devlink_param_register_one(struct devlink *devlink,
31823191
param_item->param = param;
31833192

31843193
list_add_tail(&param_item->list, param_list);
3185-
devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW);
3194+
devlink_param_notify(devlink, port_index, param_item, cmd);
31863195
return 0;
31873196
}
31883197

31893198
static void devlink_param_unregister_one(struct devlink *devlink,
3199+
unsigned int port_index,
31903200
struct list_head *param_list,
3191-
const struct devlink_param *param)
3201+
const struct devlink_param *param,
3202+
enum devlink_command cmd)
31923203
{
31933204
struct devlink_param_item *param_item;
31943205

31953206
param_item = devlink_param_find_by_name(param_list, param->name);
31963207
WARN_ON(!param_item);
3197-
devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_DEL);
3208+
devlink_param_notify(devlink, port_index, param_item, cmd);
31983209
list_del(&param_item->list);
31993210
kfree(param_item);
32003211
}
@@ -3279,8 +3290,9 @@ static int devlink_nl_cmd_port_param_set_doit(struct sk_buff *skb,
32793290
struct devlink_port *devlink_port = info->user_ptr[0];
32803291

32813292
return __devlink_nl_cmd_param_set_doit(devlink_port->devlink,
3282-
&devlink_port->param_list,
3283-
info, 0);
3293+
devlink_port->index,
3294+
&devlink_port->param_list, info,
3295+
DEVLINK_CMD_PORT_PARAM_NEW);
32843296
}
32853297

32863298
static int devlink_nl_region_snapshot_id_put(struct sk_buff *msg,
@@ -4598,9 +4610,12 @@ static int devlink_param_verify(const struct devlink_param *param)
45984610
}
45994611

46004612
static int __devlink_params_register(struct devlink *devlink,
4613+
unsigned int port_index,
46014614
struct list_head *param_list,
46024615
const struct devlink_param *params,
4603-
size_t params_count)
4616+
size_t params_count,
4617+
enum devlink_command reg_cmd,
4618+
enum devlink_command unreg_cmd)
46044619
{
46054620
const struct devlink_param *param = params;
46064621
int i;
@@ -4612,7 +4627,8 @@ static int __devlink_params_register(struct devlink *devlink,
46124627
if (err)
46134628
goto rollback;
46144629

4615-
err = devlink_param_register_one(devlink, param_list, param);
4630+
err = devlink_param_register_one(devlink, port_index,
4631+
param_list, param, reg_cmd);
46164632
if (err)
46174633
goto rollback;
46184634
}
@@ -4624,23 +4640,27 @@ static int __devlink_params_register(struct devlink *devlink,
46244640
if (!i)
46254641
goto unlock;
46264642
for (param--; i > 0; i--, param--)
4627-
devlink_param_unregister_one(devlink, param_list, param);
4643+
devlink_param_unregister_one(devlink, port_index, param_list,
4644+
param, unreg_cmd);
46284645
unlock:
46294646
mutex_unlock(&devlink->lock);
46304647
return err;
46314648
}
46324649

46334650
static void __devlink_params_unregister(struct devlink *devlink,
4651+
unsigned int port_index,
46344652
struct list_head *param_list,
46354653
const struct devlink_param *params,
4636-
size_t params_count)
4654+
size_t params_count,
4655+
enum devlink_command cmd)
46374656
{
46384657
const struct devlink_param *param = params;
46394658
int i;
46404659

46414660
mutex_lock(&devlink->lock);
46424661
for (i = 0; i < params_count; i++, param++)
4643-
devlink_param_unregister_one(devlink, param_list, param);
4662+
devlink_param_unregister_one(devlink, 0, param_list, param,
4663+
cmd);
46444664
mutex_unlock(&devlink->lock);
46454665
}
46464666

@@ -4657,8 +4677,10 @@ int devlink_params_register(struct devlink *devlink,
46574677
const struct devlink_param *params,
46584678
size_t params_count)
46594679
{
4660-
return __devlink_params_register(devlink, &devlink->param_list, params,
4661-
params_count);
4680+
return __devlink_params_register(devlink, 0, &devlink->param_list,
4681+
params, params_count,
4682+
DEVLINK_CMD_PARAM_NEW,
4683+
DEVLINK_CMD_PARAM_DEL);
46624684
}
46634685
EXPORT_SYMBOL_GPL(devlink_params_register);
46644686

@@ -4672,8 +4694,9 @@ void devlink_params_unregister(struct devlink *devlink,
46724694
const struct devlink_param *params,
46734695
size_t params_count)
46744696
{
4675-
return __devlink_params_unregister(devlink, &devlink->param_list,
4676-
params, params_count);
4697+
return __devlink_params_unregister(devlink, 0, &devlink->param_list,
4698+
params, params_count,
4699+
DEVLINK_CMD_PARAM_DEL);
46774700
}
46784701
EXPORT_SYMBOL_GPL(devlink_params_unregister);
46794702

@@ -4691,8 +4714,11 @@ int devlink_port_params_register(struct devlink_port *devlink_port,
46914714
size_t params_count)
46924715
{
46934716
return __devlink_params_register(devlink_port->devlink,
4717+
devlink_port->index,
46944718
&devlink_port->param_list, params,
4695-
params_count);
4719+
params_count,
4720+
DEVLINK_CMD_PORT_PARAM_NEW,
4721+
DEVLINK_CMD_PORT_PARAM_DEL);
46964722
}
46974723
EXPORT_SYMBOL_GPL(devlink_port_params_register);
46984724

@@ -4709,8 +4735,10 @@ void devlink_port_params_unregister(struct devlink_port *devlink_port,
47094735
size_t params_count)
47104736
{
47114737
return __devlink_params_unregister(devlink_port->devlink,
4738+
devlink_port->index,
47124739
&devlink_port->param_list,
4713-
params, params_count);
4740+
params, params_count,
4741+
DEVLINK_CMD_PORT_PARAM_DEL);
47144742
}
47154743
EXPORT_SYMBOL_GPL(devlink_port_params_unregister);
47164744

@@ -4739,6 +4767,7 @@ __devlink_param_driverinit_value_get(struct list_head *param_list, u32 param_id,
47394767

47404768
static int
47414769
__devlink_param_driverinit_value_set(struct devlink *devlink,
4770+
unsigned int port_index,
47424771
struct list_head *param_list, u32 param_id,
47434772
union devlink_param_value init_val,
47444773
enum devlink_command cmd)
@@ -4759,7 +4788,7 @@ __devlink_param_driverinit_value_set(struct devlink *devlink,
47594788
param_item->driverinit_value = init_val;
47604789
param_item->driverinit_value_valid = true;
47614790

4762-
devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW);
4791+
devlink_param_notify(devlink, port_index, param_item, cmd);
47634792
return 0;
47644793
}
47654794

@@ -4800,7 +4829,7 @@ EXPORT_SYMBOL_GPL(devlink_param_driverinit_value_get);
48004829
int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
48014830
union devlink_param_value init_val)
48024831
{
4803-
return __devlink_param_driverinit_value_set(devlink,
4832+
return __devlink_param_driverinit_value_set(devlink, 0,
48044833
&devlink->param_list,
48054834
param_id, init_val,
48064835
DEVLINK_CMD_PARAM_NEW);
@@ -4849,8 +4878,10 @@ int devlink_port_param_driverinit_value_set(struct devlink_port *devlink_port,
48494878
union devlink_param_value init_val)
48504879
{
48514880
return __devlink_param_driverinit_value_set(devlink_port->devlink,
4881+
devlink_port->index,
48524882
&devlink_port->param_list,
4853-
param_id, init_val, 0);
4883+
param_id, init_val,
4884+
DEVLINK_CMD_PORT_PARAM_NEW);
48544885
}
48554886
EXPORT_SYMBOL_GPL(devlink_port_param_driverinit_value_set);
48564887

@@ -4865,7 +4896,6 @@ EXPORT_SYMBOL_GPL(devlink_port_param_driverinit_value_set);
48654896
* This function should be used by the driver to notify devlink on value
48664897
* change, excluding driverinit configuration mode.
48674898
* For driverinit configuration mode driver should use the function
4868-
* devlink_param_driverinit_value_set() instead.
48694899
*/
48704900
void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
48714901
{
@@ -4874,10 +4904,37 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
48744904
param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
48754905
WARN_ON(!param_item);
48764906

4877-
devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW);
4907+
devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW);
48784908
}
48794909
EXPORT_SYMBOL_GPL(devlink_param_value_changed);
48804910

4911+
/**
4912+
* devlink_port_param_value_changed - notify devlink on a parameter's value
4913+
* change. Should be called by the driver
4914+
* right after the change.
4915+
*
4916+
* @devlink_port: devlink_port
4917+
* @param_id: parameter ID
4918+
*
4919+
* This function should be used by the driver to notify devlink on value
4920+
* change, excluding driverinit configuration mode.
4921+
* For driverinit configuration mode driver should use the function
4922+
* devlink_port_param_driverinit_value_set() instead.
4923+
*/
4924+
void devlink_port_param_value_changed(struct devlink_port *devlink_port,
4925+
u32 param_id)
4926+
{
4927+
struct devlink_param_item *param_item;
4928+
4929+
param_item = devlink_param_find_by_id(&devlink_port->param_list,
4930+
param_id);
4931+
WARN_ON(!param_item);
4932+
4933+
devlink_param_notify(devlink_port->devlink, devlink_port->index,
4934+
param_item, DEVLINK_CMD_PORT_PARAM_NEW);
4935+
}
4936+
EXPORT_SYMBOL_GPL(devlink_port_param_value_changed);
4937+
48814938
/**
48824939
* devlink_param_value_str_fill - Safely fill-up the string preventing
48834940
* from overflow of the preallocated buffer

0 commit comments

Comments
 (0)