On Thu, Aug 16, 2018 at 12:49 PM, Daniel Borkmann <dan...@iogearbox.net> wrote: > I found that in BPF sockmap programs once we either delete a socket > from the map or we updated a map slot and the old socket was purged > from the map that these socket can never get reattached into a map > even though their related psock has been dropped entirely at that > point. > > Reason is that tcp_cleanup_ulp() leaves the old icsk->icsk_ulp_ops > intact, so that on the next tcp_set_ulp_id() the kernel returns an > -EEXIST thinking there is still some active ULP attached. > > BPF sockmap is the only one that has this issue as the other user, > kTLS, only calls tcp_cleanup_ulp() from tcp_v4_destroy_sock() whereas > sockmap semantics allow dropping the socket from the map with all > related psock state being cleaned up. > > Fixes: 1aa12bdf1bfb ("bpf: sockmap, add sock close() hook to remove socks") > Signed-off-by: Daniel Borkmann <dan...@iogearbox.net> > Acked-by: John Fastabend <john.fastab...@gmail.com>
Acked-by: Song Liu <songliubrav...@fb.com> > --- > net/ipv4/tcp_ulp.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/net/ipv4/tcp_ulp.c b/net/ipv4/tcp_ulp.c > index 7dd44b6..a5995bb 100644 > --- a/net/ipv4/tcp_ulp.c > +++ b/net/ipv4/tcp_ulp.c > @@ -129,6 +129,8 @@ void tcp_cleanup_ulp(struct sock *sk) > if (icsk->icsk_ulp_ops->release) > icsk->icsk_ulp_ops->release(sk); > module_put(icsk->icsk_ulp_ops->owner); > + > + icsk->icsk_ulp_ops = NULL; > } > > /* Change upper layer protocol for socket */ > -- > 2.9.5 >