Message ID | 20230704001136.2301645-3-anjali.k.kulkarni@oracle.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Process connector bug fixes & enhancements | expand |
* Anjali Kulkarni <anjali.k.kulkarni@oracle.com> [691231 23:00]: > A new function netlink_release is added in netlink_sock to store the > protocol's release function. This is called when the socket is deleted. > This can be supplied by the protocol via the release function in > netlink_kernel_cfg. This is being added for the NETLINK_CONNECTOR > protocol, so it can free it's data when socket is deleted. > > Signed-off-by: Anjali Kulkarni <anjali.k.kulkarni@oracle.com> Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com> > --- > include/linux/netlink.h | 1 + > net/netlink/af_netlink.c | 6 ++++++ > net/netlink/af_netlink.h | 4 ++++ > 3 files changed, 11 insertions(+) > > diff --git a/include/linux/netlink.h b/include/linux/netlink.h > index d73cfe5b6bc2..0db4ffe6186b 100644 > --- a/include/linux/netlink.h > +++ b/include/linux/netlink.h > @@ -50,6 +50,7 @@ struct netlink_kernel_cfg { > struct mutex *cb_mutex; > int (*bind)(struct net *net, int group); > void (*unbind)(struct net *net, int group); > + void (*release) (struct sock *sk, unsigned long *groups); > }; > > struct sock *__netlink_kernel_create(struct net *net, int unit, > diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c > index e75e5156e4ac..383c10c6e6e3 100644 > --- a/net/netlink/af_netlink.c > +++ b/net/netlink/af_netlink.c > @@ -677,6 +677,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, > struct netlink_sock *nlk; > int (*bind)(struct net *net, int group); > void (*unbind)(struct net *net, int group); > + void (*release)(struct sock *sock, unsigned long *groups); > int err = 0; > > sock->state = SS_UNCONNECTED; > @@ -704,6 +705,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, > cb_mutex = nl_table[protocol].cb_mutex; > bind = nl_table[protocol].bind; > unbind = nl_table[protocol].unbind; > + release = nl_table[protocol].release; > netlink_unlock_table(); > > if (err < 0) > @@ -719,6 +721,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, > nlk->module = module; > nlk->netlink_bind = bind; > nlk->netlink_unbind = unbind; > + nlk->netlink_release = release; > out: > return err; > > @@ -763,6 +766,8 @@ static int netlink_release(struct socket *sock) > * OK. Socket is unlinked, any packets that arrive now > * will be purged. > */ > + if (nlk->netlink_release) > + nlk->netlink_release(sk, nlk->groups); > > /* must not acquire netlink_table_lock in any way again before unbind > * and notifying genetlink is done as otherwise it might deadlock > @@ -2091,6 +2096,7 @@ __netlink_kernel_create(struct net *net, int unit, struct module *module, > if (cfg) { > nl_table[unit].bind = cfg->bind; > nl_table[unit].unbind = cfg->unbind; > + nl_table[unit].release = cfg->release; > nl_table[unit].flags = cfg->flags; > } > nl_table[unit].registered = 1; > diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h > index 90a3198a9b7f..fd424cd63f31 100644 > --- a/net/netlink/af_netlink.h > +++ b/net/netlink/af_netlink.h > @@ -42,6 +42,8 @@ struct netlink_sock { > void (*netlink_rcv)(struct sk_buff *skb); > int (*netlink_bind)(struct net *net, int group); > void (*netlink_unbind)(struct net *net, int group); > + void (*netlink_release)(struct sock *sk, > + unsigned long *groups); > struct module *module; > > struct rhash_head node; > @@ -64,6 +66,8 @@ struct netlink_table { > struct module *module; > int (*bind)(struct net *net, int group); > void (*unbind)(struct net *net, int group); > + void (*release)(struct sock *sk, > + unsigned long *groups); > int registered; > }; > > -- > 2.41.0 >
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index d73cfe5b6bc2..0db4ffe6186b 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -50,6 +50,7 @@ struct netlink_kernel_cfg { struct mutex *cb_mutex; int (*bind)(struct net *net, int group); void (*unbind)(struct net *net, int group); + void (*release) (struct sock *sk, unsigned long *groups); }; struct sock *__netlink_kernel_create(struct net *net, int unit, diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index e75e5156e4ac..383c10c6e6e3 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -677,6 +677,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, struct netlink_sock *nlk; int (*bind)(struct net *net, int group); void (*unbind)(struct net *net, int group); + void (*release)(struct sock *sock, unsigned long *groups); int err = 0; sock->state = SS_UNCONNECTED; @@ -704,6 +705,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, cb_mutex = nl_table[protocol].cb_mutex; bind = nl_table[protocol].bind; unbind = nl_table[protocol].unbind; + release = nl_table[protocol].release; netlink_unlock_table(); if (err < 0) @@ -719,6 +721,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, nlk->module = module; nlk->netlink_bind = bind; nlk->netlink_unbind = unbind; + nlk->netlink_release = release; out: return err; @@ -763,6 +766,8 @@ static int netlink_release(struct socket *sock) * OK. Socket is unlinked, any packets that arrive now * will be purged. */ + if (nlk->netlink_release) + nlk->netlink_release(sk, nlk->groups); /* must not acquire netlink_table_lock in any way again before unbind * and notifying genetlink is done as otherwise it might deadlock @@ -2091,6 +2096,7 @@ __netlink_kernel_create(struct net *net, int unit, struct module *module, if (cfg) { nl_table[unit].bind = cfg->bind; nl_table[unit].unbind = cfg->unbind; + nl_table[unit].release = cfg->release; nl_table[unit].flags = cfg->flags; } nl_table[unit].registered = 1; diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h index 90a3198a9b7f..fd424cd63f31 100644 --- a/net/netlink/af_netlink.h +++ b/net/netlink/af_netlink.h @@ -42,6 +42,8 @@ struct netlink_sock { void (*netlink_rcv)(struct sk_buff *skb); int (*netlink_bind)(struct net *net, int group); void (*netlink_unbind)(struct net *net, int group); + void (*netlink_release)(struct sock *sk, + unsigned long *groups); struct module *module; struct rhash_head node; @@ -64,6 +66,8 @@ struct netlink_table { struct module *module; int (*bind)(struct net *net, int group); void (*unbind)(struct net *net, int group); + void (*release)(struct sock *sk, + unsigned long *groups); int registered; };
A new function netlink_release is added in netlink_sock to store the protocol's release function. This is called when the socket is deleted. This can be supplied by the protocol via the release function in netlink_kernel_cfg. This is being added for the NETLINK_CONNECTOR protocol, so it can free it's data when socket is deleted. Signed-off-by: Anjali Kulkarni <anjali.k.kulkarni@oracle.com> --- include/linux/netlink.h | 1 + net/netlink/af_netlink.c | 6 ++++++ net/netlink/af_netlink.h | 4 ++++ 3 files changed, 11 insertions(+)