Merge tag 'nfs-for-5.8-1' of git://git.linux-nfs.org/projects/anna/linux-nfs
[linux-2.6-microblaze.git] / include / trace / events / sunrpc.h
index 73193c7..6a12935 100644 (file)
 #include <linux/net.h>
 #include <linux/tracepoint.h>
 
+TRACE_DEFINE_ENUM(SOCK_STREAM);
+TRACE_DEFINE_ENUM(SOCK_DGRAM);
+TRACE_DEFINE_ENUM(SOCK_RAW);
+TRACE_DEFINE_ENUM(SOCK_RDM);
+TRACE_DEFINE_ENUM(SOCK_SEQPACKET);
+TRACE_DEFINE_ENUM(SOCK_DCCP);
+TRACE_DEFINE_ENUM(SOCK_PACKET);
+
+#define show_socket_type(type)                                 \
+       __print_symbolic(type,                                  \
+               { SOCK_STREAM,          "STREAM" },             \
+               { SOCK_DGRAM,           "DGRAM" },              \
+               { SOCK_RAW,             "RAW" },                \
+               { SOCK_RDM,             "RDM" },                \
+               { SOCK_SEQPACKET,       "SEQPACKET" },          \
+               { SOCK_DCCP,            "DCCP" },               \
+               { SOCK_PACKET,          "PACKET" })
+
+/* This list is known to be incomplete, add new enums as needed. */
+TRACE_DEFINE_ENUM(AF_UNSPEC);
+TRACE_DEFINE_ENUM(AF_UNIX);
+TRACE_DEFINE_ENUM(AF_LOCAL);
+TRACE_DEFINE_ENUM(AF_INET);
+TRACE_DEFINE_ENUM(AF_INET6);
+
+#define rpc_show_address_family(family)                                \
+       __print_symbolic(family,                                \
+               { AF_UNSPEC,            "AF_UNSPEC" },          \
+               { AF_UNIX,              "AF_UNIX" },            \
+               { AF_LOCAL,             "AF_LOCAL" },           \
+               { AF_INET,              "AF_INET" },            \
+               { AF_INET6,             "AF_INET6" })
+
 DECLARE_EVENT_CLASS(rpc_xdr_buf_class,
        TP_PROTO(
                const struct rpc_task *task,
@@ -1251,6 +1284,17 @@ TRACE_EVENT(svc_recv,
                        show_rqstp_flags(__entry->flags))
 );
 
+TRACE_DEFINE_ENUM(SVC_GARBAGE);
+TRACE_DEFINE_ENUM(SVC_SYSERR);
+TRACE_DEFINE_ENUM(SVC_VALID);
+TRACE_DEFINE_ENUM(SVC_NEGATIVE);
+TRACE_DEFINE_ENUM(SVC_OK);
+TRACE_DEFINE_ENUM(SVC_DROP);
+TRACE_DEFINE_ENUM(SVC_CLOSE);
+TRACE_DEFINE_ENUM(SVC_DENIED);
+TRACE_DEFINE_ENUM(SVC_PENDING);
+TRACE_DEFINE_ENUM(SVC_COMPLETE);
+
 #define svc_show_status(status)                                \
        __print_symbolic(status,                        \
                { SVC_GARBAGE,  "SVC_GARBAGE" },        \
@@ -1394,28 +1438,54 @@ DEFINE_EVENT(svc_rqst_status, svc_send,
                { (1UL << XPT_KILL_TEMP),       "XPT_KILL_TEMP"},       \
                { (1UL << XPT_CONG_CTRL),       "XPT_CONG_CTRL"})
 
+TRACE_EVENT(svc_xprt_create_err,
+       TP_PROTO(
+               const char *program,
+               const char *protocol,
+               struct sockaddr *sap,
+               const struct svc_xprt *xprt
+       ),
+
+       TP_ARGS(program, protocol, sap, xprt),
+
+       TP_STRUCT__entry(
+               __field(long, error)
+               __string(program, program)
+               __string(protocol, protocol)
+               __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+       ),
+
+       TP_fast_assign(
+               __entry->error = PTR_ERR(xprt);
+               __assign_str(program, program);
+               __assign_str(protocol, protocol);
+               memcpy(__entry->addr, sap, sizeof(__entry->addr));
+       ),
+
+       TP_printk("addr=%pISpc program=%s protocol=%s error=%ld",
+               __entry->addr, __get_str(program), __get_str(protocol),
+               __entry->error)
+);
+
 TRACE_EVENT(svc_xprt_do_enqueue,
        TP_PROTO(struct svc_xprt *xprt, struct svc_rqst *rqst),
 
        TP_ARGS(xprt, rqst),
 
        TP_STRUCT__entry(
-               __field(struct svc_xprt *, xprt)
                __field(int, pid)
                __field(unsigned long, flags)
                __string(addr, xprt->xpt_remotebuf)
        ),
 
        TP_fast_assign(
-               __entry->xprt = xprt;
                __entry->pid = rqst? rqst->rq_task->pid : 0;
                __entry->flags = xprt->xpt_flags;
                __assign_str(addr, xprt->xpt_remotebuf);
        ),
 
-       TP_printk("xprt=%p addr=%s pid=%d flags=%s",
-                       __entry->xprt, __get_str(addr),
-                       __entry->pid, show_svc_xprt_flags(__entry->flags))
+       TP_printk("addr=%s pid=%d flags=%s", __get_str(addr),
+               __entry->pid, show_svc_xprt_flags(__entry->flags))
 );
 
 DECLARE_EVENT_CLASS(svc_xprt_event,
@@ -1424,25 +1494,55 @@ DECLARE_EVENT_CLASS(svc_xprt_event,
        TP_ARGS(xprt),
 
        TP_STRUCT__entry(
-               __field(struct svc_xprt *, xprt)
                __field(unsigned long, flags)
                __string(addr, xprt->xpt_remotebuf)
        ),
 
        TP_fast_assign(
-               __entry->xprt = xprt;
                __entry->flags = xprt->xpt_flags;
                __assign_str(addr, xprt->xpt_remotebuf);
        ),
 
-       TP_printk("xprt=%p addr=%s flags=%s",
-                       __entry->xprt, __get_str(addr),
-                       show_svc_xprt_flags(__entry->flags))
+       TP_printk("addr=%s flags=%s", __get_str(addr),
+               show_svc_xprt_flags(__entry->flags))
 );
 
-DEFINE_EVENT(svc_xprt_event, svc_xprt_no_write_space,
-       TP_PROTO(struct svc_xprt *xprt),
-       TP_ARGS(xprt));
+#define DEFINE_SVC_XPRT_EVENT(name) \
+       DEFINE_EVENT(svc_xprt_event, svc_xprt_##name, \
+                       TP_PROTO( \
+                               struct svc_xprt *xprt \
+                       ), \
+                       TP_ARGS(xprt))
+
+DEFINE_SVC_XPRT_EVENT(no_write_space);
+DEFINE_SVC_XPRT_EVENT(close);
+DEFINE_SVC_XPRT_EVENT(detach);
+DEFINE_SVC_XPRT_EVENT(free);
+
+TRACE_EVENT(svc_xprt_accept,
+       TP_PROTO(
+               const struct svc_xprt *xprt,
+               const char *service
+       ),
+
+       TP_ARGS(xprt, service),
+
+       TP_STRUCT__entry(
+               __string(addr, xprt->xpt_remotebuf)
+               __string(protocol, xprt->xpt_class->xcl_name)
+               __string(service, service)
+       ),
+
+       TP_fast_assign(
+               __assign_str(addr, xprt->xpt_remotebuf);
+               __assign_str(protocol, xprt->xpt_class->xcl_name)
+               __assign_str(service, service);
+       ),
+
+       TP_printk("addr=%s protocol=%s service=%s",
+               __get_str(addr), __get_str(protocol), __get_str(service)
+       )
+);
 
 TRACE_EVENT(svc_xprt_dequeue,
        TP_PROTO(struct svc_rqst *rqst),
@@ -1450,24 +1550,20 @@ TRACE_EVENT(svc_xprt_dequeue,
        TP_ARGS(rqst),
 
        TP_STRUCT__entry(
-               __field(struct svc_xprt *, xprt)
                __field(unsigned long, flags)
                __field(unsigned long, wakeup)
                __string(addr, rqst->rq_xprt->xpt_remotebuf)
        ),
 
        TP_fast_assign(
-               __entry->xprt = rqst->rq_xprt;
                __entry->flags = rqst->rq_xprt->xpt_flags;
                __entry->wakeup = ktime_to_us(ktime_sub(ktime_get(),
                                                        rqst->rq_qtime));
                __assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
        ),
 
-       TP_printk("xprt=%p addr=%s flags=%s wakeup-us=%lu",
-                       __entry->xprt, __get_str(addr),
-                       show_svc_xprt_flags(__entry->flags),
-                       __entry->wakeup)
+       TP_printk("addr=%s flags=%s wakeup-us=%lu", __get_str(addr),
+               show_svc_xprt_flags(__entry->flags), __entry->wakeup)
 );
 
 TRACE_EVENT(svc_wake_up,
@@ -1492,21 +1588,18 @@ TRACE_EVENT(svc_handle_xprt,
        TP_ARGS(xprt, len),
 
        TP_STRUCT__entry(
-               __field(struct svc_xprt *, xprt)
                __field(int, len)
                __field(unsigned long, flags)
                __string(addr, xprt->xpt_remotebuf)
        ),
 
        TP_fast_assign(
-               __entry->xprt = xprt;
                __entry->len = len;
                __entry->flags = xprt->xpt_flags;
                __assign_str(addr, xprt->xpt_remotebuf);
        ),
 
-       TP_printk("xprt=%p addr=%s len=%d flags=%s",
-               __entry->xprt, __get_str(addr),
+       TP_printk("addr=%s len=%d flags=%s", __get_str(addr),
                __entry->len, show_svc_xprt_flags(__entry->flags))
 );
 
@@ -1540,27 +1633,221 @@ DECLARE_EVENT_CLASS(svc_deferred_event,
        TP_ARGS(dr),
 
        TP_STRUCT__entry(
+               __field(const void *, dr)
                __field(u32, xid)
                __string(addr, dr->xprt->xpt_remotebuf)
        ),
 
        TP_fast_assign(
+               __entry->dr = dr;
                __entry->xid = be32_to_cpu(*(__be32 *)(dr->args +
                                                       (dr->xprt_hlen>>2)));
                __assign_str(addr, dr->xprt->xpt_remotebuf);
        ),
 
-       TP_printk("addr=%s xid=0x%08x", __get_str(addr), __entry->xid)
+       TP_printk("addr=%s dr=%p xid=0x%08x", __get_str(addr), __entry->dr,
+               __entry->xid)
 );
+
 #define DEFINE_SVC_DEFERRED_EVENT(name) \
-       DEFINE_EVENT(svc_deferred_event, svc_##name##_deferred, \
+       DEFINE_EVENT(svc_deferred_event, svc_defer_##name, \
                        TP_PROTO( \
                                const struct svc_deferred_req *dr \
                        ), \
                        TP_ARGS(dr))
 
 DEFINE_SVC_DEFERRED_EVENT(drop);
-DEFINE_SVC_DEFERRED_EVENT(revisit);
+DEFINE_SVC_DEFERRED_EVENT(queue);
+DEFINE_SVC_DEFERRED_EVENT(recv);
+
+TRACE_EVENT(svcsock_new_socket,
+       TP_PROTO(
+               const struct socket *socket
+       ),
+
+       TP_ARGS(socket),
+
+       TP_STRUCT__entry(
+               __field(unsigned long, type)
+               __field(unsigned long, family)
+               __field(bool, listener)
+       ),
+
+       TP_fast_assign(
+               __entry->type = socket->type;
+               __entry->family = socket->sk->sk_family;
+               __entry->listener = (socket->sk->sk_state == TCP_LISTEN);
+       ),
+
+       TP_printk("type=%s family=%s%s",
+               show_socket_type(__entry->type),
+               rpc_show_address_family(__entry->family),
+               __entry->listener ? " (listener)" : ""
+       )
+);
+
+TRACE_EVENT(svcsock_marker,
+       TP_PROTO(
+               const struct svc_xprt *xprt,
+               __be32 marker
+       ),
+
+       TP_ARGS(xprt, marker),
+
+       TP_STRUCT__entry(
+               __field(unsigned int, length)
+               __field(bool, last)
+               __string(addr, xprt->xpt_remotebuf)
+       ),
+
+       TP_fast_assign(
+               __entry->length = be32_to_cpu(marker) & RPC_FRAGMENT_SIZE_MASK;
+               __entry->last = be32_to_cpu(marker) & RPC_LAST_STREAM_FRAGMENT;
+               __assign_str(addr, xprt->xpt_remotebuf);
+       ),
+
+       TP_printk("addr=%s length=%u%s", __get_str(addr),
+               __entry->length, __entry->last ? " (last)" : "")
+);
+
+DECLARE_EVENT_CLASS(svcsock_class,
+       TP_PROTO(
+               const struct svc_xprt *xprt,
+               ssize_t result
+       ),
+
+       TP_ARGS(xprt, result),
+
+       TP_STRUCT__entry(
+               __field(ssize_t, result)
+               __field(unsigned long, flags)
+               __string(addr, xprt->xpt_remotebuf)
+       ),
+
+       TP_fast_assign(
+               __entry->result = result;
+               __entry->flags = xprt->xpt_flags;
+               __assign_str(addr, xprt->xpt_remotebuf);
+       ),
+
+       TP_printk("addr=%s result=%zd flags=%s", __get_str(addr),
+               __entry->result, show_svc_xprt_flags(__entry->flags)
+       )
+);
+
+#define DEFINE_SVCSOCK_EVENT(name) \
+       DEFINE_EVENT(svcsock_class, svcsock_##name, \
+                       TP_PROTO( \
+                               const struct svc_xprt *xprt, \
+                               ssize_t result \
+                       ), \
+                       TP_ARGS(xprt, result))
+
+DEFINE_SVCSOCK_EVENT(udp_send);
+DEFINE_SVCSOCK_EVENT(udp_recv);
+DEFINE_SVCSOCK_EVENT(udp_recv_err);
+DEFINE_SVCSOCK_EVENT(tcp_send);
+DEFINE_SVCSOCK_EVENT(tcp_recv);
+DEFINE_SVCSOCK_EVENT(tcp_recv_eagain);
+DEFINE_SVCSOCK_EVENT(tcp_recv_err);
+DEFINE_SVCSOCK_EVENT(data_ready);
+DEFINE_SVCSOCK_EVENT(write_space);
+
+TRACE_EVENT(svcsock_tcp_recv_short,
+       TP_PROTO(
+               const struct svc_xprt *xprt,
+               u32 expected,
+               u32 received
+       ),
+
+       TP_ARGS(xprt, expected, received),
+
+       TP_STRUCT__entry(
+               __field(u32, expected)
+               __field(u32, received)
+               __field(unsigned long, flags)
+               __string(addr, xprt->xpt_remotebuf)
+       ),
+
+       TP_fast_assign(
+               __entry->expected = expected;
+               __entry->received = received;
+               __entry->flags = xprt->xpt_flags;
+               __assign_str(addr, xprt->xpt_remotebuf);
+       ),
+
+       TP_printk("addr=%s flags=%s expected=%u received=%u",
+               __get_str(addr), show_svc_xprt_flags(__entry->flags),
+               __entry->expected, __entry->received
+       )
+);
+
+TRACE_EVENT(svcsock_tcp_state,
+       TP_PROTO(
+               const struct svc_xprt *xprt,
+               const struct socket *socket
+       ),
+
+       TP_ARGS(xprt, socket),
+
+       TP_STRUCT__entry(
+               __field(unsigned long, socket_state)
+               __field(unsigned long, sock_state)
+               __field(unsigned long, flags)
+               __string(addr, xprt->xpt_remotebuf)
+       ),
+
+       TP_fast_assign(
+               __entry->socket_state = socket->state;
+               __entry->sock_state = socket->sk->sk_state;
+               __entry->flags = xprt->xpt_flags;
+               __assign_str(addr, xprt->xpt_remotebuf);
+       ),
+
+       TP_printk("addr=%s state=%s sk_state=%s flags=%s", __get_str(addr),
+               rpc_show_socket_state(__entry->socket_state),
+               rpc_show_sock_state(__entry->sock_state),
+               show_svc_xprt_flags(__entry->flags)
+       )
+);
+
+DECLARE_EVENT_CLASS(svcsock_accept_class,
+       TP_PROTO(
+               const struct svc_xprt *xprt,
+               const char *service,
+               long status
+       ),
+
+       TP_ARGS(xprt, service, status),
+
+       TP_STRUCT__entry(
+               __field(long, status)
+               __string(service, service)
+               __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+       ),
+
+       TP_fast_assign(
+               __entry->status = status;
+               __assign_str(service, service);
+               memcpy(__entry->addr, &xprt->xpt_local, sizeof(__entry->addr));
+       ),
+
+       TP_printk("listener=%pISpc service=%s status=%ld",
+               __entry->addr, __get_str(service), __entry->status
+       )
+);
+
+#define DEFINE_ACCEPT_EVENT(name) \
+       DEFINE_EVENT(svcsock_accept_class, svcsock_##name##_err, \
+                       TP_PROTO( \
+                               const struct svc_xprt *xprt, \
+                               const char *service, \
+                               long status \
+                       ), \
+                       TP_ARGS(xprt, service, status))
+
+DEFINE_ACCEPT_EVENT(accept);
+DEFINE_ACCEPT_EVENT(getpeername);
 
 DECLARE_EVENT_CLASS(cache_event,
        TP_PROTO(
@@ -1595,6 +1882,86 @@ DEFINE_CACHE_EVENT(cache_entry_update);
 DEFINE_CACHE_EVENT(cache_entry_make_negative);
 DEFINE_CACHE_EVENT(cache_entry_no_listener);
 
+DECLARE_EVENT_CLASS(register_class,
+       TP_PROTO(
+               const char *program,
+               const u32 version,
+               const int family,
+               const unsigned short protocol,
+               const unsigned short port,
+               int error
+       ),
+
+       TP_ARGS(program, version, family, protocol, port, error),
+
+       TP_STRUCT__entry(
+               __field(u32, version)
+               __field(unsigned long, family)
+               __field(unsigned short, protocol)
+               __field(unsigned short, port)
+               __field(int, error)
+               __string(program, program)
+       ),
+
+       TP_fast_assign(
+               __entry->version = version;
+               __entry->family = family;
+               __entry->protocol = protocol;
+               __entry->port = port;
+               __entry->error = error;
+               __assign_str(program, program);
+       ),
+
+       TP_printk("program=%sv%u proto=%s port=%u family=%s error=%d",
+               __get_str(program), __entry->version,
+               __entry->protocol == IPPROTO_UDP ? "udp" : "tcp",
+               __entry->port, rpc_show_address_family(__entry->family),
+               __entry->error
+       )
+);
+
+#define DEFINE_REGISTER_EVENT(name) \
+       DEFINE_EVENT(register_class, svc_##name, \
+                       TP_PROTO( \
+                               const char *program, \
+                               const u32 version, \
+                               const int family, \
+                               const unsigned short protocol, \
+                               const unsigned short port, \
+                               int error \
+                       ), \
+                       TP_ARGS(program, version, family, protocol, \
+                               port, error))
+
+DEFINE_REGISTER_EVENT(register);
+DEFINE_REGISTER_EVENT(noregister);
+
+TRACE_EVENT(svc_unregister,
+       TP_PROTO(
+               const char *program,
+               const u32 version,
+               int error
+       ),
+
+       TP_ARGS(program, version, error),
+
+       TP_STRUCT__entry(
+               __field(u32, version)
+               __field(int, error)
+               __string(program, program)
+       ),
+
+       TP_fast_assign(
+               __entry->version = version;
+               __entry->error = error;
+               __assign_str(program, program);
+       ),
+
+       TP_printk("program=%sv%u error=%d",
+               __get_str(program), __entry->version, __entry->error
+       )
+);
+
 #endif /* _TRACE_SUNRPC_H */
 
 #include <trace/define_trace.h>