On 12/9/24 06:47, John Fastabend wrote: > Michal Luczaj wrote: >> Consider a sockmap entry being updated with the same socket: >> >> osk = stab->sks[idx]; >> sock_map_add_link(psock, link, map, &stab->sks[idx]); >> stab->sks[idx] = sk; >> if (osk) >> sock_map_unref(osk, &stab->sks[idx]); >> >> Due to sock_map_unref(), which invokes sock_map_del_link(), all the psock's >> links for stab->sks[idx] are torn: >> >> list_for_each_entry_safe(link, tmp, &psock->link, list) { >> if (link->link_raw == link_raw) { >> ... >> list_del(&link->list); >> sk_psock_free_link(link); >> } >> } >> >> And that includes the new link sock_map_add_link() added just before the >> unref. >> >> This results in a sockmap holding a socket, but without the respective >> link. This in turn means that close(sock) won't trigger the cleanup, i.e. a >> closed socket will not be automatically removed from the sockmap. >> >> Stop tearing the links when a matching link_raw is found. >> >> Signed-off-by: Michal Luczaj <mhal@xxxxxxx> >> --- > > Thanks. LGTM. > > Reviewed-by: John Fastabend <john.fastabend@xxxxxxxxx> Thanks, and sorry for a missing tag: Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface")