Commit b4af5932 authored by Chuck Lever's avatar Chuck Lever
Browse files

SUNRPC: Trace server-side rpcbind registration events

parent a0469f46
Loading
Loading
Loading
Loading
+80 −0
Original line number Diff line number Diff line
@@ -1581,6 +1581,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>
+4 −15
Original line number Diff line number Diff line
@@ -991,6 +991,7 @@ static int __svc_register(struct net *net, const char *progname,
#endif
	}

	trace_svc_register(progname, version, protocol, port, family, error);
	return error;
}

@@ -1000,11 +1001,6 @@ int svc_rpcbind_set_version(struct net *net,
			    unsigned short proto,
			    unsigned short port)
{
	dprintk("svc: svc_register(%sv%d, %s, %u, %u)\n",
		progp->pg_name, version,
		proto == IPPROTO_UDP?  "udp" : "tcp",
		port, family);

	return __svc_register(net, progp->pg_name, progp->pg_prog,
				version, family, proto, port);

@@ -1024,11 +1020,8 @@ int svc_generic_rpcbind_set(struct net *net,
		return 0;

	if (vers->vs_hidden) {
		dprintk("svc: svc_register(%sv%d, %s, %u, %u)"
			" (but not telling portmap)\n",
			progp->pg_name, version,
			proto == IPPROTO_UDP?  "udp" : "tcp",
			port, family);
		trace_svc_noregister(progp->pg_name, version, proto,
				     port, family, 0);
		return 0;
	}

@@ -1106,8 +1099,7 @@ static void __svc_unregister(struct net *net, const u32 program, const u32 versi
	if (error == -EPROTONOSUPPORT)
		error = rpcb_register(net, program, version, 0, 0);

	dprintk("svc: %s(%sv%u), error %d\n",
			__func__, progname, version, error);
	trace_svc_unregister(progname, version, error);
}

/*
@@ -1132,9 +1124,6 @@ static void svc_unregister(const struct svc_serv *serv, struct net *net)
				continue;
			if (progp->pg_vers[i]->vs_hidden)
				continue;

			dprintk("svc: attempting to unregister %sv%u\n",
				progp->pg_name, i);
			__svc_unregister(net, progp->pg_prog, i, progp->pg_name);
		}
	}