Commit b10dcb3b94010e3ac3951f68789400b1665effb1
Committed by
David S. Miller
1 parent
f8403a2e47
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
netlink: update listeners directly when removing socket
The code is now confusing to read - first in one function down (netlink_remove) any group subscriptions are implicitly removed by calling __sk_del_bind_node(), but the subscriber database is only updated far later by calling netlink_update_listeners(). Move the latter call to just after removal from the list so it is easier to follow the code. This also enables moving the locking inside the kernel-socket conditional, which improves the normal socket destruction path. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 1 changed file with 5 additions and 5 deletions Side-by-side Diff
net/netlink/af_netlink.c
... | ... | @@ -1091,8 +1091,10 @@ |
1091 | 1091 | mutex_unlock(&nl_sk_hash_lock); |
1092 | 1092 | |
1093 | 1093 | netlink_table_grab(); |
1094 | - if (nlk_sk(sk)->subscriptions) | |
1094 | + if (nlk_sk(sk)->subscriptions) { | |
1095 | 1095 | __sk_del_bind_node(sk); |
1096 | + netlink_update_listeners(sk); | |
1097 | + } | |
1096 | 1098 | netlink_table_ungrab(); |
1097 | 1099 | } |
1098 | 1100 | |
1099 | 1101 | |
... | ... | @@ -1226,8 +1228,8 @@ |
1226 | 1228 | |
1227 | 1229 | module_put(nlk->module); |
1228 | 1230 | |
1229 | - netlink_table_grab(); | |
1230 | 1231 | if (netlink_is_kernel(sk)) { |
1232 | + netlink_table_grab(); | |
1231 | 1233 | BUG_ON(nl_table[sk->sk_protocol].registered == 0); |
1232 | 1234 | if (--nl_table[sk->sk_protocol].registered == 0) { |
1233 | 1235 | struct listeners *old; |
1234 | 1236 | |
... | ... | @@ -1241,10 +1243,8 @@ |
1241 | 1243 | nl_table[sk->sk_protocol].flags = 0; |
1242 | 1244 | nl_table[sk->sk_protocol].registered = 0; |
1243 | 1245 | } |
1244 | - } else if (nlk->subscriptions) { | |
1245 | - netlink_update_listeners(sk); | |
1246 | + netlink_table_ungrab(); | |
1246 | 1247 | } |
1247 | - netlink_table_ungrab(); | |
1248 | 1248 | |
1249 | 1249 | kfree(nlk->groups); |
1250 | 1250 | nlk->groups = NULL; |