sock_diag: define destruction multicast groups
These groups will contain socket-destruction events for AF_INET/AF_INET6, IPPROTO_TCP/IPPROTO_UDP. Near the end of socket destruction, a check for listeners is performed. In the presence of a listener, rather than completely cleanup the socket, a unit of work will be added to a private work queue which will first broadcast information about the socket and then finish the cleanup operation. Signed-off-by: Craig Gallek <kraig@google.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
916035ddd3
commit
eb4cb00852
@@ -131,6 +131,7 @@
|
||||
#include <linux/ipsec.h>
|
||||
#include <net/cls_cgroup.h>
|
||||
#include <net/netprio_cgroup.h>
|
||||
#include <linux/sock_diag.h>
|
||||
|
||||
#include <linux/filter.h>
|
||||
|
||||
@@ -1423,7 +1424,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
|
||||
}
|
||||
EXPORT_SYMBOL(sk_alloc);
|
||||
|
||||
static void __sk_free(struct sock *sk)
|
||||
void sk_destruct(struct sock *sk)
|
||||
{
|
||||
struct sk_filter *filter;
|
||||
|
||||
@@ -1451,6 +1452,14 @@ static void __sk_free(struct sock *sk)
|
||||
sk_prot_free(sk->sk_prot_creator, sk);
|
||||
}
|
||||
|
||||
static void __sk_free(struct sock *sk)
|
||||
{
|
||||
if (unlikely(sock_diag_has_destroy_listeners(sk)))
|
||||
sock_diag_broadcast_destroy(sk);
|
||||
else
|
||||
sk_destruct(sk);
|
||||
}
|
||||
|
||||
void sk_free(struct sock *sk)
|
||||
{
|
||||
/*
|
||||
|
Reference in New Issue
Block a user