Skip to content

Commit 0c77668

Browse files
chuckleveramschuma-ntap
authored andcommitted
SUNRPC: Introduce trace points in rpc_auth_gss.ko
Add infrastructure for trace points in the RPC_AUTH_GSS kernel module, and add a few sample trace points. These report exceptional or unexpected events, and observe the assignment of GSS sequence numbers. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
1 parent a0584ee commit 0c77668

File tree

7 files changed

+530
-92
lines changed

7 files changed

+530
-92
lines changed

include/trace/events/rpcgss.h

Lines changed: 361 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,361 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
/*
3+
* Copyright (c) 2018 Oracle. All rights reserved.
4+
*
5+
* Trace point definitions for the "rpcgss" subsystem.
6+
*/
7+
8+
#undef TRACE_SYSTEM
9+
#define TRACE_SYSTEM rpcgss
10+
11+
#if !defined(_TRACE_RPCRDMA_H) || defined(TRACE_HEADER_MULTI_READ)
12+
#define _TRACE_RPCGSS_H
13+
14+
#include <linux/tracepoint.h>
15+
16+
/**
17+
** GSS-API related trace events
18+
**/
19+
20+
TRACE_DEFINE_ENUM(GSS_S_BAD_MECH);
21+
TRACE_DEFINE_ENUM(GSS_S_BAD_NAME);
22+
TRACE_DEFINE_ENUM(GSS_S_BAD_NAMETYPE);
23+
TRACE_DEFINE_ENUM(GSS_S_BAD_BINDINGS);
24+
TRACE_DEFINE_ENUM(GSS_S_BAD_STATUS);
25+
TRACE_DEFINE_ENUM(GSS_S_BAD_SIG);
26+
TRACE_DEFINE_ENUM(GSS_S_NO_CRED);
27+
TRACE_DEFINE_ENUM(GSS_S_NO_CONTEXT);
28+
TRACE_DEFINE_ENUM(GSS_S_DEFECTIVE_TOKEN);
29+
TRACE_DEFINE_ENUM(GSS_S_DEFECTIVE_CREDENTIAL);
30+
TRACE_DEFINE_ENUM(GSS_S_CREDENTIALS_EXPIRED);
31+
TRACE_DEFINE_ENUM(GSS_S_CONTEXT_EXPIRED);
32+
TRACE_DEFINE_ENUM(GSS_S_FAILURE);
33+
TRACE_DEFINE_ENUM(GSS_S_BAD_QOP);
34+
TRACE_DEFINE_ENUM(GSS_S_UNAUTHORIZED);
35+
TRACE_DEFINE_ENUM(GSS_S_UNAVAILABLE);
36+
TRACE_DEFINE_ENUM(GSS_S_DUPLICATE_ELEMENT);
37+
TRACE_DEFINE_ENUM(GSS_S_NAME_NOT_MN);
38+
TRACE_DEFINE_ENUM(GSS_S_CONTINUE_NEEDED);
39+
TRACE_DEFINE_ENUM(GSS_S_DUPLICATE_TOKEN);
40+
TRACE_DEFINE_ENUM(GSS_S_OLD_TOKEN);
41+
TRACE_DEFINE_ENUM(GSS_S_UNSEQ_TOKEN);
42+
TRACE_DEFINE_ENUM(GSS_S_GAP_TOKEN);
43+
44+
#define show_gss_status(x) \
45+
__print_flags(x, "|", \
46+
{ GSS_S_BAD_MECH, "GSS_S_BAD_MECH" }, \
47+
{ GSS_S_BAD_NAME, "GSS_S_BAD_NAME" }, \
48+
{ GSS_S_BAD_NAMETYPE, "GSS_S_BAD_NAMETYPE" }, \
49+
{ GSS_S_BAD_BINDINGS, "GSS_S_BAD_BINDINGS" }, \
50+
{ GSS_S_BAD_STATUS, "GSS_S_BAD_STATUS" }, \
51+
{ GSS_S_BAD_SIG, "GSS_S_BAD_SIG" }, \
52+
{ GSS_S_NO_CRED, "GSS_S_NO_CRED" }, \
53+
{ GSS_S_NO_CONTEXT, "GSS_S_NO_CONTEXT" }, \
54+
{ GSS_S_DEFECTIVE_TOKEN, "GSS_S_DEFECTIVE_TOKEN" }, \
55+
{ GSS_S_DEFECTIVE_CREDENTIAL, "GSS_S_DEFECTIVE_CREDENTIAL" }, \
56+
{ GSS_S_CREDENTIALS_EXPIRED, "GSS_S_CREDENTIALS_EXPIRED" }, \
57+
{ GSS_S_CONTEXT_EXPIRED, "GSS_S_CONTEXT_EXPIRED" }, \
58+
{ GSS_S_FAILURE, "GSS_S_FAILURE" }, \
59+
{ GSS_S_BAD_QOP, "GSS_S_BAD_QOP" }, \
60+
{ GSS_S_UNAUTHORIZED, "GSS_S_UNAUTHORIZED" }, \
61+
{ GSS_S_UNAVAILABLE, "GSS_S_UNAVAILABLE" }, \
62+
{ GSS_S_DUPLICATE_ELEMENT, "GSS_S_DUPLICATE_ELEMENT" }, \
63+
{ GSS_S_NAME_NOT_MN, "GSS_S_NAME_NOT_MN" }, \
64+
{ GSS_S_CONTINUE_NEEDED, "GSS_S_CONTINUE_NEEDED" }, \
65+
{ GSS_S_DUPLICATE_TOKEN, "GSS_S_DUPLICATE_TOKEN" }, \
66+
{ GSS_S_OLD_TOKEN, "GSS_S_OLD_TOKEN" }, \
67+
{ GSS_S_UNSEQ_TOKEN, "GSS_S_UNSEQ_TOKEN" }, \
68+
{ GSS_S_GAP_TOKEN, "GSS_S_GAP_TOKEN" })
69+
70+
71+
DECLARE_EVENT_CLASS(rpcgss_gssapi_event,
72+
TP_PROTO(
73+
const struct rpc_task *task,
74+
u32 maj_stat
75+
),
76+
77+
TP_ARGS(task, maj_stat),
78+
79+
TP_STRUCT__entry(
80+
__field(unsigned int, task_id)
81+
__field(unsigned int, client_id)
82+
__field(u32, maj_stat)
83+
84+
),
85+
86+
TP_fast_assign(
87+
__entry->task_id = task->tk_pid;
88+
__entry->client_id = task->tk_client->cl_clid;
89+
__entry->maj_stat = maj_stat;
90+
),
91+
92+
TP_printk("task:%u@%u maj_stat=%s",
93+
__entry->task_id, __entry->client_id,
94+
__entry->maj_stat == 0 ?
95+
"GSS_S_COMPLETE" : show_gss_status(__entry->maj_stat))
96+
);
97+
98+
#define DEFINE_GSSAPI_EVENT(name) \
99+
DEFINE_EVENT(rpcgss_gssapi_event, rpcgss_##name, \
100+
TP_PROTO( \
101+
const struct rpc_task *task, \
102+
u32 maj_stat \
103+
), \
104+
TP_ARGS(task, maj_stat))
105+
106+
TRACE_EVENT(rpcgss_import_ctx,
107+
TP_PROTO(
108+
int status
109+
),
110+
111+
TP_ARGS(status),
112+
113+
TP_STRUCT__entry(
114+
__field(int, status)
115+
),
116+
117+
TP_fast_assign(
118+
__entry->status = status;
119+
),
120+
121+
TP_printk("status=%d", __entry->status)
122+
);
123+
124+
DEFINE_GSSAPI_EVENT(get_mic);
125+
DEFINE_GSSAPI_EVENT(verify_mic);
126+
DEFINE_GSSAPI_EVENT(wrap);
127+
DEFINE_GSSAPI_EVENT(unwrap);
128+
129+
130+
/**
131+
** GSS auth unwrap failures
132+
**/
133+
134+
TRACE_EVENT(rpcgss_unwrap_failed,
135+
TP_PROTO(
136+
const struct rpc_task *task
137+
),
138+
139+
TP_ARGS(task),
140+
141+
TP_STRUCT__entry(
142+
__field(unsigned int, task_id)
143+
__field(unsigned int, client_id)
144+
),
145+
146+
TP_fast_assign(
147+
__entry->task_id = task->tk_pid;
148+
__entry->client_id = task->tk_client->cl_clid;
149+
),
150+
151+
TP_printk("task:%u@%u", __entry->task_id, __entry->client_id)
152+
);
153+
154+
TRACE_EVENT(rpcgss_bad_seqno,
155+
TP_PROTO(
156+
const struct rpc_task *task,
157+
u32 expected,
158+
u32 received
159+
),
160+
161+
TP_ARGS(task, expected, received),
162+
163+
TP_STRUCT__entry(
164+
__field(unsigned int, task_id)
165+
__field(unsigned int, client_id)
166+
__field(u32, expected)
167+
__field(u32, received)
168+
),
169+
170+
TP_fast_assign(
171+
__entry->task_id = task->tk_pid;
172+
__entry->client_id = task->tk_client->cl_clid;
173+
__entry->expected = expected;
174+
__entry->received = received;
175+
),
176+
177+
TP_printk("task:%u@%u expected seqno %u, received seqno %u",
178+
__entry->task_id, __entry->client_id,
179+
__entry->expected, __entry->received)
180+
);
181+
182+
TRACE_EVENT(rpcgss_seqno,
183+
TP_PROTO(
184+
const struct rpc_task *task
185+
),
186+
187+
TP_ARGS(task),
188+
189+
TP_STRUCT__entry(
190+
__field(unsigned int, task_id)
191+
__field(unsigned int, client_id)
192+
__field(u32, xid)
193+
__field(u32, seqno)
194+
),
195+
196+
TP_fast_assign(
197+
const struct rpc_rqst *rqst = task->tk_rqstp;
198+
199+
__entry->task_id = task->tk_pid;
200+
__entry->client_id = task->tk_client->cl_clid;
201+
__entry->xid = be32_to_cpu(rqst->rq_xid);
202+
__entry->seqno = rqst->rq_seqno;
203+
),
204+
205+
TP_printk("task:%u@%u xid=0x%08x seqno=%u",
206+
__entry->task_id, __entry->client_id,
207+
__entry->xid, __entry->seqno)
208+
);
209+
210+
TRACE_EVENT(rpcgss_need_reencode,
211+
TP_PROTO(
212+
const struct rpc_task *task,
213+
u32 seq_xmit,
214+
bool ret
215+
),
216+
217+
TP_ARGS(task, seq_xmit, ret),
218+
219+
TP_STRUCT__entry(
220+
__field(unsigned int, task_id)
221+
__field(unsigned int, client_id)
222+
__field(u32, xid)
223+
__field(u32, seq_xmit)
224+
__field(u32, seqno)
225+
__field(bool, ret)
226+
),
227+
228+
TP_fast_assign(
229+
__entry->task_id = task->tk_pid;
230+
__entry->client_id = task->tk_client->cl_clid;
231+
__entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid);
232+
__entry->seq_xmit = seq_xmit;
233+
__entry->seqno = task->tk_rqstp->rq_seqno;
234+
__entry->ret = ret;
235+
),
236+
237+
TP_printk("task:%u@%u xid=0x%08x rq_seqno=%u seq_xmit=%u reencode %sneeded",
238+
__entry->task_id, __entry->client_id,
239+
__entry->xid, __entry->seqno, __entry->seq_xmit,
240+
__entry->ret ? "" : "un")
241+
);
242+
243+
/**
244+
** gssd upcall related trace events
245+
**/
246+
247+
TRACE_EVENT(rpcgss_upcall_msg,
248+
TP_PROTO(
249+
const char *buf
250+
),
251+
252+
TP_ARGS(buf),
253+
254+
TP_STRUCT__entry(
255+
__string(msg, buf)
256+
),
257+
258+
TP_fast_assign(
259+
__assign_str(msg, buf)
260+
),
261+
262+
TP_printk("msg='%s'", __get_str(msg))
263+
);
264+
265+
TRACE_EVENT(rpcgss_upcall_result,
266+
TP_PROTO(
267+
u32 uid,
268+
int result
269+
),
270+
271+
TP_ARGS(uid, result),
272+
273+
TP_STRUCT__entry(
274+
__field(u32, uid)
275+
__field(int, result)
276+
277+
),
278+
279+
TP_fast_assign(
280+
__entry->uid = uid;
281+
__entry->result = result;
282+
),
283+
284+
TP_printk("for uid %u, result=%d", __entry->uid, __entry->result)
285+
);
286+
287+
TRACE_EVENT(rpcgss_context,
288+
TP_PROTO(
289+
unsigned long expiry,
290+
unsigned long now,
291+
unsigned int timeout,
292+
unsigned int len,
293+
const u8 *data
294+
),
295+
296+
TP_ARGS(expiry, now, timeout, len, data),
297+
298+
TP_STRUCT__entry(
299+
__field(unsigned long, expiry)
300+
__field(unsigned long, now)
301+
__field(unsigned int, timeout)
302+
__field(int, len)
303+
__string(acceptor, data)
304+
),
305+
306+
TP_fast_assign(
307+
__entry->expiry = expiry;
308+
__entry->now = now;
309+
__entry->timeout = timeout;
310+
__entry->len = len;
311+
strncpy(__get_str(acceptor), data, len);
312+
),
313+
314+
TP_printk("gc_expiry=%lu now=%lu timeout=%u acceptor=%.*s",
315+
__entry->expiry, __entry->now, __entry->timeout,
316+
__entry->len, __get_str(acceptor))
317+
);
318+
319+
320+
/**
321+
** Miscellaneous events
322+
*/
323+
324+
TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5);
325+
TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5I);
326+
TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5P);
327+
328+
#define show_pseudoflavor(x) \
329+
__print_symbolic(x, \
330+
{ RPC_AUTH_GSS_KRB5, "RPC_AUTH_GSS_KRB5" }, \
331+
{ RPC_AUTH_GSS_KRB5I, "RPC_AUTH_GSS_KRB5I" }, \
332+
{ RPC_AUTH_GSS_KRB5P, "RPC_AUTH_GSS_KRB5P" })
333+
334+
335+
TRACE_EVENT(rpcgss_createauth,
336+
TP_PROTO(
337+
unsigned int flavor,
338+
int error
339+
),
340+
341+
TP_ARGS(flavor, error),
342+
343+
TP_STRUCT__entry(
344+
__field(unsigned int, flavor)
345+
__field(int, error)
346+
347+
),
348+
349+
TP_fast_assign(
350+
__entry->flavor = flavor;
351+
__entry->error = error;
352+
),
353+
354+
TP_printk("flavor=%s error=%d",
355+
show_pseudoflavor(__entry->flavor), __entry->error)
356+
);
357+
358+
359+
#endif /* _TRACE_RPCGSS_H */
360+
361+
#include <trace/define_trace.h>

include/trace/events/rpcrdma.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -521,22 +521,30 @@ TRACE_EVENT(xprtrdma_post_send,
521521

522522
TP_STRUCT__entry(
523523
__field(const void *, req)
524+
__field(unsigned int, task_id)
525+
__field(unsigned int, client_id)
524526
__field(int, num_sge)
525527
__field(int, signaled)
526528
__field(int, status)
527529
),
528530

529531
TP_fast_assign(
532+
const struct rpc_rqst *rqst = &req->rl_slot;
533+
534+
__entry->task_id = rqst->rq_task->tk_pid;
535+
__entry->client_id = rqst->rq_task->tk_client->cl_clid;
530536
__entry->req = req;
531537
__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
532538
__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
533539
IB_SEND_SIGNALED;
534540
__entry->status = status;
535541
),
536542

537-
TP_printk("req=%p, %d SGEs%s, status=%d",
543+
TP_printk("task:%u@%u req=%p (%d SGE%s) %sstatus=%d",
544+
__entry->task_id, __entry->client_id,
538545
__entry->req, __entry->num_sge,
539-
(__entry->signaled ? ", signaled" : ""),
546+
(__entry->num_sge == 1 ? "" : "s"),
547+
(__entry->signaled ? "signaled " : ""),
540548
__entry->status
541549
)
542550
);

0 commit comments

Comments
 (0)