Skip to content

Commit c42bebc

Browse files
committed
SUNRPC: Trace struct svc_sock lifetime events
Capture a timestamp and pointer address during the creation and destruction of struct svc_sock to record its lifetime. This helps to diagnose transport reference counting issues. Reviewed-by: Jeff Layton <[email protected]> Signed-off-by: Chuck Lever <[email protected]>
1 parent d7900da commit c42bebc

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

include/trace/events/sunrpc.h

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2104,31 +2104,46 @@ DEFINE_SVC_DEFERRED_EVENT(drop);
21042104
DEFINE_SVC_DEFERRED_EVENT(queue);
21052105
DEFINE_SVC_DEFERRED_EVENT(recv);
21062106

2107-
TRACE_EVENT(svcsock_new_socket,
2107+
DECLARE_EVENT_CLASS(svcsock_lifetime_class,
21082108
TP_PROTO(
2109+
const void *svsk,
21092110
const struct socket *socket
21102111
),
2111-
2112-
TP_ARGS(socket),
2113-
2112+
TP_ARGS(svsk, socket),
21142113
TP_STRUCT__entry(
2114+
__field(unsigned int, netns_ino)
2115+
__field(const void *, svsk)
2116+
__field(const void *, sk)
21152117
__field(unsigned long, type)
21162118
__field(unsigned long, family)
2117-
__field(bool, listener)
2119+
__field(unsigned long, state)
21182120
),
2119-
21202121
TP_fast_assign(
2122+
struct sock *sk = socket->sk;
2123+
2124+
__entry->netns_ino = sock_net(sk)->ns.inum;
2125+
__entry->svsk = svsk;
2126+
__entry->sk = sk;
21212127
__entry->type = socket->type;
2122-
__entry->family = socket->sk->sk_family;
2123-
__entry->listener = (socket->sk->sk_state == TCP_LISTEN);
2128+
__entry->family = sk->sk_family;
2129+
__entry->state = sk->sk_state;
21242130
),
2125-
2126-
TP_printk("type=%s family=%s%s",
2127-
show_socket_type(__entry->type),
2131+
TP_printk("svsk=%p type=%s family=%s%s",
2132+
__entry->svsk, show_socket_type(__entry->type),
21282133
rpc_show_address_family(__entry->family),
2129-
__entry->listener ? " (listener)" : ""
2134+
__entry->state == TCP_LISTEN ? " (listener)" : ""
21302135
)
21312136
);
2137+
#define DEFINE_SVCSOCK_LIFETIME_EVENT(name) \
2138+
DEFINE_EVENT(svcsock_lifetime_class, name, \
2139+
TP_PROTO( \
2140+
const void *svsk, \
2141+
const struct socket *socket \
2142+
), \
2143+
TP_ARGS(svsk, socket))
2144+
2145+
DEFINE_SVCSOCK_LIFETIME_EVENT(svcsock_new);
2146+
DEFINE_SVCSOCK_LIFETIME_EVENT(svcsock_free);
21322147

21332148
TRACE_EVENT(svcsock_marker,
21342149
TP_PROTO(

net/sunrpc/svcsock.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1470,7 +1470,7 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
14701470
else
14711471
svc_tcp_init(svsk, serv);
14721472

1473-
trace_svcsock_new_socket(sock);
1473+
trace_svcsock_new(svsk, sock);
14741474
return svsk;
14751475
}
14761476

@@ -1651,6 +1651,8 @@ static void svc_sock_free(struct svc_xprt *xprt)
16511651
struct svc_sock *svsk = container_of(xprt, struct svc_sock, sk_xprt);
16521652
struct socket *sock = svsk->sk_sock;
16531653

1654+
trace_svcsock_free(svsk, sock);
1655+
16541656
tls_handshake_cancel(sock->sk);
16551657
if (sock->file)
16561658
sockfd_put(sock);

0 commit comments

Comments
 (0)