Skip to content

Commit cddbff4

Browse files
Jiri PirkoPaolo Abeni
authored andcommitted
devlink: send notifications only if there are listeners
Introduce devlink_nl_notify_need() helper and using it to check at the beginning of notification functions to avoid overhead of composing notification messages in case nobody listens. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 11280dd commit cddbff4

File tree

9 files changed

+21
-9
lines changed

9 files changed

+21
-9
lines changed

net/devlink/dev.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@ static void devlink_notify(struct devlink *devlink, enum devlink_command cmd)
204204
WARN_ON(cmd != DEVLINK_CMD_NEW && cmd != DEVLINK_CMD_DEL);
205205
WARN_ON(!devl_is_registered(devlink));
206206

207+
if (!devlink_nl_notify_need(devlink))
208+
return;
209+
207210
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
208211
if (!msg)
209212
return;
@@ -999,7 +1002,7 @@ static void __devlink_flash_update_notify(struct devlink *devlink,
9991002
cmd != DEVLINK_CMD_FLASH_UPDATE_END &&
10001003
cmd != DEVLINK_CMD_FLASH_UPDATE_STATUS);
10011004

1002-
if (!devl_is_registered(devlink))
1005+
if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
10031006
return;
10041007

10051008
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);

net/devlink/devl_internal.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ int devlink_nl_put_nested_handle(struct sk_buff *msg, struct net *net,
185185
struct devlink *devlink, int attrtype);
186186
int devlink_nl_msg_reply_and_new(struct sk_buff **msg, struct genl_info *info);
187187

188+
static inline bool devlink_nl_notify_need(struct devlink *devlink)
189+
{
190+
return genl_has_listeners(&devlink_nl_family, devlink_net(devlink),
191+
DEVLINK_MCGRP_CONFIG);
192+
}
193+
188194
/* Notify */
189195
void devlink_notify_register(struct devlink *devlink);
190196
void devlink_notify_unregister(struct devlink *devlink);

net/devlink/health.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,9 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter,
496496
WARN_ON(cmd != DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
497497
ASSERT_DEVLINK_REGISTERED(devlink);
498498

499+
if (!devlink_nl_notify_need(devlink))
500+
return;
501+
499502
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
500503
if (!msg)
501504
return;

net/devlink/linecard.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static void devlink_linecard_notify(struct devlink_linecard *linecard,
136136
WARN_ON(cmd != DEVLINK_CMD_LINECARD_NEW &&
137137
cmd != DEVLINK_CMD_LINECARD_DEL);
138138

139-
if (!__devl_is_registered(devlink))
139+
if (!__devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
140140
return;
141141

142142
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);

net/devlink/param.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ static void devlink_param_notify(struct devlink *devlink,
343343
* will replay the notifications if the params are added/removed
344344
* outside of the lifetime of the instance.
345345
*/
346-
if (!devl_is_registered(devlink))
346+
if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
347347
return;
348348

349349
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);

net/devlink/port.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ static void devlink_port_notify(struct devlink_port *devlink_port,
512512

513513
WARN_ON(cmd != DEVLINK_CMD_PORT_NEW && cmd != DEVLINK_CMD_PORT_DEL);
514514

515-
if (!__devl_is_registered(devlink))
515+
if (!__devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
516516
return;
517517

518518
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);

net/devlink/rate.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ static void devlink_rate_notify(struct devlink_rate *devlink_rate,
146146

147147
WARN_ON(cmd != DEVLINK_CMD_RATE_NEW && cmd != DEVLINK_CMD_RATE_DEL);
148148

149-
if (!devl_is_registered(devlink))
149+
if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
150150
return;
151151

152152
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);

net/devlink/region.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ static void devlink_nl_region_notify(struct devlink_region *region,
235235

236236
WARN_ON(cmd != DEVLINK_CMD_REGION_NEW && cmd != DEVLINK_CMD_REGION_DEL);
237237

238-
if (!__devl_is_registered(devlink))
238+
if (!__devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
239239
return;
240240

241241
msg = devlink_nl_region_notify_build(region, snapshot, cmd, 0, 0);

net/devlink/trap.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,7 +1174,7 @@ devlink_trap_group_notify(struct devlink *devlink,
11741174
WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_GROUP_NEW &&
11751175
cmd != DEVLINK_CMD_TRAP_GROUP_DEL);
11761176

1177-
if (!devl_is_registered(devlink))
1177+
if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
11781178
return;
11791179

11801180
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
@@ -1236,7 +1236,7 @@ static void devlink_trap_notify(struct devlink *devlink,
12361236
WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_NEW &&
12371237
cmd != DEVLINK_CMD_TRAP_DEL);
12381238

1239-
if (!devl_is_registered(devlink))
1239+
if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
12401240
return;
12411241

12421242
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
@@ -1713,7 +1713,7 @@ devlink_trap_policer_notify(struct devlink *devlink,
17131713
WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_POLICER_NEW &&
17141714
cmd != DEVLINK_CMD_TRAP_POLICER_DEL);
17151715

1716-
if (!devl_is_registered(devlink))
1716+
if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
17171717
return;
17181718

17191719
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);

0 commit comments

Comments
 (0)