Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Chuck Lever and committed by
Anna Schumaker
0c77668d a0584ee9

+530 -92
+361
include/trace/events/rpcgss.h
··· 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>
+10 -2
include/trace/events/rpcrdma.h
··· 521 521 522 522 TP_STRUCT__entry( 523 523 __field(const void *, req) 524 + __field(unsigned int, task_id) 525 + __field(unsigned int, client_id) 524 526 __field(int, num_sge) 525 527 __field(int, signaled) 526 528 __field(int, status) 527 529 ), 528 530 529 531 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; 530 536 __entry->req = req; 531 537 __entry->num_sge = req->rl_sendctx->sc_wr.num_sge; 532 538 __entry->signaled = req->rl_sendctx->sc_wr.send_flags & ··· 540 534 __entry->status = status; 541 535 ), 542 536 543 - TP_printk("req=%p, %d SGEs%s, status=%d", 537 + TP_printk("task:%u@%u req=%p (%d SGE%s) %sstatus=%d", 538 + __entry->task_id, __entry->client_id, 544 539 __entry->req, __entry->num_sge, 545 - (__entry->signaled ? ", signaled" : ""), 540 + (__entry->num_sge == 1 ? "" : "s"), 541 + (__entry->signaled ? "signaled " : ""), 546 542 __entry->status 547 543 ) 548 544 );
+60 -1
include/trace/events/sunrpc.h
··· 655 655 656 656 DEFINE_RPC_XPRT_EVENT(timer); 657 657 DEFINE_RPC_XPRT_EVENT(lookup_rqst); 658 - DEFINE_RPC_XPRT_EVENT(transmit); 659 658 DEFINE_RPC_XPRT_EVENT(complete_rqst); 659 + 660 + TRACE_EVENT(xprt_transmit, 661 + TP_PROTO( 662 + const struct rpc_rqst *rqst, 663 + int status 664 + ), 665 + 666 + TP_ARGS(rqst, status), 667 + 668 + TP_STRUCT__entry( 669 + __field(unsigned int, task_id) 670 + __field(unsigned int, client_id) 671 + __field(u32, xid) 672 + __field(u32, seqno) 673 + __field(int, status) 674 + ), 675 + 676 + TP_fast_assign( 677 + __entry->task_id = rqst->rq_task->tk_pid; 678 + __entry->client_id = rqst->rq_task->tk_client->cl_clid; 679 + __entry->xid = be32_to_cpu(rqst->rq_xid); 680 + __entry->seqno = rqst->rq_seqno; 681 + __entry->status = status; 682 + ), 683 + 684 + TP_printk( 685 + "task:%u@%u xid=0x%08x seqno=%u status=%d", 686 + __entry->task_id, __entry->client_id, __entry->xid, 687 + __entry->seqno, __entry->status) 688 + ); 689 + 690 + TRACE_EVENT(xprt_enq_xmit, 691 + TP_PROTO( 692 + const struct rpc_task *task, 693 + int stage 694 + ), 695 + 696 + TP_ARGS(task, stage), 697 + 698 + TP_STRUCT__entry( 699 + __field(unsigned int, task_id) 700 + __field(unsigned int, client_id) 701 + __field(u32, xid) 702 + __field(u32, seqno) 703 + __field(int, stage) 704 + ), 705 + 706 + TP_fast_assign( 707 + __entry->task_id = task->tk_pid; 708 + __entry->client_id = task->tk_client->cl_clid; 709 + __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); 710 + __entry->seqno = task->tk_rqstp->rq_seqno; 711 + __entry->stage = stage; 712 + ), 713 + 714 + TP_printk( 715 + "task:%u@%u xid=0x%08x seqno=%u stage=%d", 716 + __entry->task_id, __entry->client_id, __entry->xid, 717 + __entry->seqno, __entry->stage) 718 + ); 660 719 661 720 TRACE_EVENT(xprt_ping, 662 721 TP_PROTO(const struct rpc_xprt *xprt, int status),
+1 -1
net/sunrpc/auth_gss/Makefile
··· 7 7 8 8 auth_rpcgss-y := auth_gss.o gss_generic_token.o \ 9 9 gss_mech_switch.o svcauth_gss.o \ 10 - gss_rpc_upcall.o gss_rpc_xdr.o 10 + gss_rpc_upcall.o gss_rpc_xdr.o trace.o 11 11 12 12 obj-$(CONFIG_RPCSEC_GSS_KRB5) += rpcsec_gss_krb5.o 13 13
+81 -84
net/sunrpc/auth_gss/auth_gss.c
··· 55 55 56 56 #include "../netns.h" 57 57 58 + #include <trace/events/rpcgss.h> 59 + 58 60 static const struct rpc_authops authgss_ops; 59 61 60 62 static const struct rpc_credops gss_credops; ··· 262 260 } 263 261 ret = gss_import_sec_context(p, seclen, gm, &ctx->gc_gss_ctx, NULL, GFP_NOFS); 264 262 if (ret < 0) { 263 + trace_rpcgss_import_ctx(ret); 265 264 p = ERR_PTR(ret); 266 265 goto err; 267 266 } ··· 278 275 if (IS_ERR(p)) 279 276 goto err; 280 277 done: 281 - dprintk("RPC: %s Success. gc_expiry %lu now %lu timeout %u acceptor %.*s\n", 282 - __func__, ctx->gc_expiry, now, timeout, ctx->gc_acceptor.len, 283 - ctx->gc_acceptor.data); 284 - return p; 278 + trace_rpcgss_context(ctx->gc_expiry, now, timeout, 279 + ctx->gc_acceptor.len, ctx->gc_acceptor.data); 285 280 err: 286 - dprintk("RPC: %s returns error %ld\n", __func__, -PTR_ERR(p)); 287 281 return p; 288 282 } 289 283 ··· 354 354 if (auth && pos->auth->service != auth->service) 355 355 continue; 356 356 refcount_inc(&pos->count); 357 - dprintk("RPC: %s found msg %p\n", __func__, pos); 358 357 return pos; 359 358 } 360 - dprintk("RPC: %s found nothing\n", __func__); 361 359 return NULL; 362 360 } 363 361 ··· 454 456 size_t buflen = sizeof(gss_msg->databuf); 455 457 int len; 456 458 457 - len = scnprintf(p, buflen, "mech=%s uid=%d ", mech->gm_name, 459 + len = scnprintf(p, buflen, "mech=%s uid=%d", mech->gm_name, 458 460 from_kuid(&init_user_ns, gss_msg->uid)); 459 461 buflen -= len; 460 462 p += len; ··· 465 467 * identity that we are authenticating to. 466 468 */ 467 469 if (target_name) { 468 - len = scnprintf(p, buflen, "target=%s ", target_name); 470 + len = scnprintf(p, buflen, " target=%s", target_name); 469 471 buflen -= len; 470 472 p += len; 471 473 gss_msg->msg.len += len; ··· 485 487 char *c = strchr(service_name, '@'); 486 488 487 489 if (!c) 488 - len = scnprintf(p, buflen, "service=%s ", 490 + len = scnprintf(p, buflen, " service=%s", 489 491 service_name); 490 492 else 491 493 len = scnprintf(p, buflen, 492 - "service=%.*s srchost=%s ", 494 + " service=%.*s srchost=%s", 493 495 (int)(c - service_name), 494 496 service_name, c + 1); 495 497 buflen -= len; ··· 498 500 } 499 501 500 502 if (mech->gm_upcall_enctypes) { 501 - len = scnprintf(p, buflen, "enctypes=%s ", 503 + len = scnprintf(p, buflen, " enctypes=%s", 502 504 mech->gm_upcall_enctypes); 503 505 buflen -= len; 504 506 p += len; 505 507 gss_msg->msg.len += len; 506 508 } 509 + trace_rpcgss_upcall_msg(gss_msg->databuf); 507 510 len = scnprintf(p, buflen, "\n"); 508 511 if (len == 0) 509 512 goto out_overflow; 510 513 gss_msg->msg.len += len; 511 - 512 514 gss_msg->msg.data = gss_msg->databuf; 513 515 return 0; 514 516 out_overflow: ··· 601 603 struct rpc_pipe *pipe; 602 604 int err = 0; 603 605 604 - dprintk("RPC: %5u %s for uid %u\n", 605 - task->tk_pid, __func__, from_kuid(&init_user_ns, cred->cr_cred->fsuid)); 606 606 gss_msg = gss_setup_upcall(gss_auth, cred); 607 607 if (PTR_ERR(gss_msg) == -EAGAIN) { 608 608 /* XXX: warning on the first, under the assumption we ··· 608 612 warn_gssd(); 609 613 task->tk_timeout = 15*HZ; 610 614 rpc_sleep_on(&pipe_version_rpc_waitqueue, task, NULL); 611 - return -EAGAIN; 615 + err = -EAGAIN; 616 + goto out; 612 617 } 613 618 if (IS_ERR(gss_msg)) { 614 619 err = PTR_ERR(gss_msg); ··· 632 635 spin_unlock(&pipe->lock); 633 636 gss_release_msg(gss_msg); 634 637 out: 635 - dprintk("RPC: %5u %s for uid %u result %d\n", 636 - task->tk_pid, __func__, 637 - from_kuid(&init_user_ns, cred->cr_cred->fsuid), err); 638 + trace_rpcgss_upcall_result(from_kuid(&init_user_ns, 639 + cred->cr_cred->fsuid), err); 638 640 return err; 639 641 } 640 642 ··· 648 652 DEFINE_WAIT(wait); 649 653 int err; 650 654 651 - dprintk("RPC: %s for uid %u\n", 652 - __func__, from_kuid(&init_user_ns, cred->cr_cred->fsuid)); 653 655 retry: 654 656 err = 0; 655 657 /* if gssd is down, just skip upcalling altogether */ 656 658 if (!gssd_running(net)) { 657 659 warn_gssd(); 658 - return -EACCES; 660 + err = -EACCES; 661 + goto out; 659 662 } 660 663 gss_msg = gss_setup_upcall(gss_auth, cred); 661 664 if (PTR_ERR(gss_msg) == -EAGAIN) { ··· 695 700 finish_wait(&gss_msg->waitqueue, &wait); 696 701 gss_release_msg(gss_msg); 697 702 out: 698 - dprintk("RPC: %s for uid %u result %d\n", 699 - __func__, from_kuid(&init_user_ns, cred->cr_cred->fsuid), err); 703 + trace_rpcgss_upcall_result(from_kuid(&init_user_ns, 704 + cred->cr_cred->fsuid), err); 700 705 return err; 701 706 } 702 707 ··· 789 794 err: 790 795 kfree(buf); 791 796 out: 792 - dprintk("RPC: %s returning %zd\n", __func__, err); 793 797 return err; 794 798 } 795 799 ··· 857 863 struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg); 858 864 859 865 if (msg->errno < 0) { 860 - dprintk("RPC: %s releasing msg %p\n", 861 - __func__, gss_msg); 862 866 refcount_inc(&gss_msg->count); 863 867 gss_unhash_msg(gss_msg); 864 868 if (msg->errno == -ETIMEDOUT) ··· 1016 1024 struct rpc_auth * auth; 1017 1025 int err = -ENOMEM; /* XXX? */ 1018 1026 1019 - dprintk("RPC: creating GSS authenticator for client %p\n", clnt); 1020 - 1021 1027 if (!try_module_get(THIS_MODULE)) 1022 1028 return ERR_PTR(err); 1023 1029 if (!(gss_auth = kmalloc(sizeof(*gss_auth), GFP_KERNEL))) ··· 1031 1041 gss_auth->net = get_net(rpc_net_ns(clnt)); 1032 1042 err = -EINVAL; 1033 1043 gss_auth->mech = gss_mech_get_by_pseudoflavor(flavor); 1034 - if (!gss_auth->mech) { 1035 - dprintk("RPC: Pseudoflavor %d not found!\n", flavor); 1044 + if (!gss_auth->mech) 1036 1045 goto err_put_net; 1037 - } 1038 1046 gss_auth->service = gss_pseudoflavor_to_service(gss_auth->mech, flavor); 1039 1047 if (gss_auth->service == 0) 1040 1048 goto err_put_mech; ··· 1087 1099 kfree(gss_auth); 1088 1100 out_dec: 1089 1101 module_put(THIS_MODULE); 1102 + trace_rpcgss_createauth(flavor, err); 1090 1103 return ERR_PTR(err); 1091 1104 } 1092 1105 ··· 1123 1134 { 1124 1135 struct gss_auth *gss_auth = container_of(auth, 1125 1136 struct gss_auth, rpc_auth); 1126 - 1127 - dprintk("RPC: destroying GSS authenticator %p flavor %d\n", 1128 - auth, auth->au_flavor); 1129 1137 1130 1138 if (hash_hashed(&gss_auth->hash)) { 1131 1139 spin_lock(&gss_auth_hash_lock); ··· 1286 1300 static void 1287 1301 gss_do_free_ctx(struct gss_cl_ctx *ctx) 1288 1302 { 1289 - dprintk("RPC: %s\n", __func__); 1290 - 1291 1303 gss_delete_sec_context(&ctx->gc_gss_ctx); 1292 1304 kfree(ctx->gc_wire_ctx.data); 1293 1305 kfree(ctx->gc_acceptor.data); ··· 1308 1324 static void 1309 1325 gss_free_cred(struct gss_cred *gss_cred) 1310 1326 { 1311 - dprintk("RPC: %s cred=%p\n", __func__, gss_cred); 1312 1327 kfree(gss_cred); 1313 1328 } 1314 1329 ··· 1364 1381 struct gss_cred *cred = NULL; 1365 1382 int err = -ENOMEM; 1366 1383 1367 - dprintk("RPC: %s for uid %d, flavor %d\n", 1368 - __func__, from_kuid(&init_user_ns, acred->cred->fsuid), 1369 - auth->au_flavor); 1370 - 1371 1384 if (!(cred = kzalloc(sizeof(*cred), gfp))) 1372 1385 goto out_err; 1373 1386 ··· 1379 1400 return &cred->gc_base; 1380 1401 1381 1402 out_err: 1382 - dprintk("RPC: %s failed with error %d\n", __func__, err); 1383 1403 return ERR_PTR(err); 1384 1404 } 1385 1405 ··· 1522 1544 struct xdr_netobj mic; 1523 1545 struct kvec iov; 1524 1546 struct xdr_buf verf_buf; 1525 - 1526 - dprintk("RPC: %5u %s\n", task->tk_pid, __func__); 1547 + int status; 1527 1548 1528 1549 /* Credential */ 1529 1550 1530 1551 p = xdr_reserve_space(xdr, 7 * sizeof(*p) + 1531 1552 ctx->gc_wire_ctx.len); 1532 1553 if (!p) 1533 - goto out_put_ctx; 1554 + goto marshal_failed; 1534 1555 *p++ = rpc_auth_gss; 1535 1556 cred_len = p++; 1536 1557 ··· 1537 1560 req->rq_seqno = (ctx->gc_seq < MAXSEQ) ? ctx->gc_seq++ : MAXSEQ; 1538 1561 spin_unlock(&ctx->gc_seq_lock); 1539 1562 if (req->rq_seqno == MAXSEQ) 1540 - goto out_expired; 1563 + goto expired; 1564 + trace_rpcgss_seqno(task); 1541 1565 1542 1566 *p++ = cpu_to_be32(RPC_GSS_VERSION); 1543 1567 *p++ = cpu_to_be32(ctx->gc_proc); ··· 1557 1579 1558 1580 p = xdr_reserve_space(xdr, sizeof(*p)); 1559 1581 if (!p) 1560 - goto out_put_ctx; 1582 + goto marshal_failed; 1561 1583 *p++ = rpc_auth_gss; 1562 1584 mic.data = (u8 *)(p + 1); 1563 1585 maj_stat = gss_get_mic(ctx->gc_gss_ctx, &verf_buf, &mic); 1564 1586 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1565 - goto out_expired; 1587 + goto expired; 1566 1588 else if (maj_stat != 0) 1567 - goto out_put_ctx; 1589 + goto bad_mic; 1568 1590 if (xdr_stream_encode_opaque_inline(xdr, (void **)&p, mic.len) < 0) 1569 - goto out_put_ctx; 1591 + goto marshal_failed; 1592 + status = 0; 1593 + out: 1570 1594 gss_put_ctx(ctx); 1571 - return 0; 1572 - out_expired: 1573 - gss_put_ctx(ctx); 1595 + return status; 1596 + expired: 1574 1597 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1575 - return -EKEYEXPIRED; 1576 - out_put_ctx: 1577 - gss_put_ctx(ctx); 1578 - return -EMSGSIZE; 1598 + status = -EKEYEXPIRED; 1599 + goto out; 1600 + marshal_failed: 1601 + status = -EMSGSIZE; 1602 + goto out; 1603 + bad_mic: 1604 + trace_rpcgss_get_mic(task, maj_stat); 1605 + status = -EIO; 1606 + goto out; 1579 1607 } 1580 1608 1581 1609 static int gss_renew_cred(struct rpc_task *task) ··· 1707 1723 status = -EIO; 1708 1724 goto out; 1709 1725 bad_mic: 1710 - dprintk("RPC: %5u %s: gss_verify_mic returned error 0x%08x\n", 1711 - task->tk_pid, __func__, maj_stat); 1726 + trace_rpcgss_verify_mic(task, maj_stat); 1712 1727 status = -EACCES; 1713 1728 goto out; 1714 1729 } ··· 1744 1761 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1745 1762 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1746 1763 else if (maj_stat) 1747 - goto wrap_failed; 1764 + goto bad_mic; 1748 1765 /* Check that the trailing MIC fit in the buffer, after the fact */ 1749 1766 if (xdr_stream_encode_opaque_inline(xdr, (void **)&p, mic.len) < 0) 1750 1767 goto wrap_failed; 1751 1768 return 0; 1752 1769 wrap_failed: 1753 1770 return -EMSGSIZE; 1771 + bad_mic: 1772 + trace_rpcgss_get_mic(task, maj_stat); 1773 + return -EIO; 1754 1774 } 1755 1775 1756 1776 static void ··· 1846 1860 memcpy(tmp, snd_buf->tail[0].iov_base, snd_buf->tail[0].iov_len); 1847 1861 snd_buf->tail[0].iov_base = tmp; 1848 1862 } 1849 - status = -EIO; 1850 1863 offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base; 1851 1864 maj_stat = gss_wrap(ctx->gc_gss_ctx, offset, snd_buf, inpages); 1852 1865 /* slack space should prevent this ever happening: */ ··· 1856 1871 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1857 1872 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1858 1873 else if (maj_stat) 1859 - goto wrap_failed; 1874 + goto bad_wrap; 1860 1875 1861 1876 *opaque_len = cpu_to_be32(snd_buf->len - offset); 1862 1877 /* guess whether the pad goes into the head or the tail: */ ··· 1873 1888 return 0; 1874 1889 wrap_failed: 1875 1890 return status; 1891 + bad_wrap: 1892 + trace_rpcgss_wrap(task, maj_stat); 1893 + return -EIO; 1876 1894 } 1877 1895 1878 1896 static int gss_wrap_req(struct rpc_task *task, struct xdr_stream *xdr) ··· 1886 1898 struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); 1887 1899 int status; 1888 1900 1889 - dprintk("RPC: %5u %s\n", task->tk_pid, __func__); 1890 1901 status = -EIO; 1891 1902 if (ctx->gc_proc != RPC_GSS_PROC_DATA) { 1892 1903 /* The spec seems a little ambiguous here, but I think that not ··· 1904 1917 case RPC_GSS_SVC_PRIVACY: 1905 1918 status = gss_wrap_req_priv(cred, ctx, task, xdr); 1906 1919 break; 1920 + default: 1921 + status = -EIO; 1907 1922 } 1908 1923 out: 1909 1924 gss_put_ctx(ctx); 1910 - dprintk("RPC: %5u %s returning %d\n", task->tk_pid, __func__, status); 1911 1925 return status; 1912 1926 } 1913 1927 ··· 1920 1932 } 1921 1933 1922 1934 static int 1923 - gss_unwrap_resp_integ(struct rpc_cred *cred, struct gss_cl_ctx *ctx, 1924 - struct rpc_rqst *rqstp, struct xdr_stream *xdr) 1935 + gss_unwrap_resp_integ(struct rpc_task *task, struct rpc_cred *cred, 1936 + struct gss_cl_ctx *ctx, struct rpc_rqst *rqstp, 1937 + struct xdr_stream *xdr) 1925 1938 { 1926 1939 struct xdr_buf integ_buf, *rcv_buf = &rqstp->rq_rcv_buf; 1927 1940 u32 data_offset, mic_offset, integ_len, maj_stat; ··· 1940 1951 if (mic_offset > rcv_buf->len) 1941 1952 goto unwrap_failed; 1942 1953 if (be32_to_cpup(p) != rqstp->rq_seqno) 1943 - goto unwrap_failed; 1954 + goto bad_seqno; 1944 1955 1945 1956 if (xdr_buf_subsegment(rcv_buf, &integ_buf, data_offset, integ_len)) 1946 1957 goto unwrap_failed; ··· 1956 1967 1 + XDR_QUADLEN(mic.len); 1957 1968 return 0; 1958 1969 unwrap_failed: 1970 + trace_rpcgss_unwrap_failed(task); 1971 + return -EIO; 1972 + bad_seqno: 1973 + trace_rpcgss_bad_seqno(task, rqstp->rq_seqno, be32_to_cpup(p)); 1959 1974 return -EIO; 1960 1975 bad_mic: 1961 - dprintk("RPC: %s: gss_verify_mic returned error 0x%08x\n", 1962 - __func__, maj_stat); 1976 + trace_rpcgss_verify_mic(task, maj_stat); 1963 1977 return -EIO; 1964 1978 } 1965 1979 1966 1980 static int 1967 - gss_unwrap_resp_priv(struct rpc_cred *cred, struct gss_cl_ctx *ctx, 1968 - struct rpc_rqst *rqstp, struct xdr_stream *xdr) 1981 + gss_unwrap_resp_priv(struct rpc_task *task, struct rpc_cred *cred, 1982 + struct gss_cl_ctx *ctx, struct rpc_rqst *rqstp, 1983 + struct xdr_stream *xdr) 1969 1984 { 1970 1985 struct xdr_buf *rcv_buf = &rqstp->rq_rcv_buf; 1971 1986 struct kvec *head = rqstp->rq_rcv_buf.head; ··· 1993 2000 goto bad_unwrap; 1994 2001 /* gss_unwrap decrypted the sequence number */ 1995 2002 if (be32_to_cpup(p++) != rqstp->rq_seqno) 1996 - goto unwrap_failed; 2003 + goto bad_seqno; 1997 2004 1998 2005 /* gss_unwrap redacts the opaque blob from the head iovec. 1999 2006 * rcv_buf has changed, thus the stream needs to be reset. ··· 2004 2011 XDR_QUADLEN(savedlen - rcv_buf->len); 2005 2012 return 0; 2006 2013 unwrap_failed: 2014 + trace_rpcgss_unwrap_failed(task); 2015 + return -EIO; 2016 + bad_seqno: 2017 + trace_rpcgss_bad_seqno(task, rqstp->rq_seqno, be32_to_cpup(--p)); 2007 2018 return -EIO; 2008 2019 bad_unwrap: 2009 - dprintk("RPC: %s: gss_unwrap returned error 0x%08x\n", 2010 - __func__, maj_stat); 2020 + trace_rpcgss_unwrap(task, maj_stat); 2011 2021 return -EIO; 2012 2022 } 2013 2023 ··· 2026 2030 struct rpc_rqst *req = task->tk_rqstp; 2027 2031 struct rpc_cred *cred = req->rq_cred; 2028 2032 struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); 2029 - u32 win, seq_xmit; 2033 + u32 win, seq_xmit = 0; 2030 2034 bool ret = true; 2031 2035 2032 2036 if (!ctx) 2033 - return true; 2037 + goto out; 2034 2038 2035 2039 if (gss_seq_is_newer(req->rq_seqno, READ_ONCE(ctx->gc_seq))) 2036 - goto out; 2040 + goto out_ctx; 2037 2041 2038 2042 seq_xmit = READ_ONCE(ctx->gc_seq_xmit); 2039 2043 while (gss_seq_is_newer(req->rq_seqno, seq_xmit)) { ··· 2042 2046 seq_xmit = cmpxchg(&ctx->gc_seq_xmit, tmp, req->rq_seqno); 2043 2047 if (seq_xmit == tmp) { 2044 2048 ret = false; 2045 - goto out; 2049 + goto out_ctx; 2046 2050 } 2047 2051 } 2048 2052 2049 2053 win = ctx->gc_win; 2050 2054 if (win > 0) 2051 2055 ret = !gss_seq_is_newer(req->rq_seqno, seq_xmit - win); 2052 - out: 2056 + 2057 + out_ctx: 2053 2058 gss_put_ctx(ctx); 2059 + out: 2060 + trace_rpcgss_need_reencode(task, seq_xmit, ret); 2054 2061 return ret; 2055 2062 } 2056 2063 ··· 2074 2075 status = gss_unwrap_resp_auth(cred); 2075 2076 break; 2076 2077 case RPC_GSS_SVC_INTEGRITY: 2077 - status = gss_unwrap_resp_integ(cred, ctx, rqstp, xdr); 2078 + status = gss_unwrap_resp_integ(task, cred, ctx, rqstp, xdr); 2078 2079 break; 2079 2080 case RPC_GSS_SVC_PRIVACY: 2080 - status = gss_unwrap_resp_priv(cred, ctx, rqstp, xdr); 2081 + status = gss_unwrap_resp_priv(task, cred, ctx, rqstp, xdr); 2081 2082 break; 2082 2083 } 2083 2084 if (status) ··· 2087 2088 status = rpcauth_unwrap_resp_decode(task, xdr); 2088 2089 out: 2089 2090 gss_put_ctx(ctx); 2090 - dprintk("RPC: %5u %s returning %d\n", 2091 - task->tk_pid, __func__, status); 2092 2091 return status; 2093 2092 } 2094 2093
+11
net/sunrpc/auth_gss/trace.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2018, 2019 Oracle. All rights reserved. 4 + */ 5 + 6 + #include <linux/sunrpc/clnt.h> 7 + #include <linux/sunrpc/sched.h> 8 + #include <linux/sunrpc/gss_err.h> 9 + 10 + #define CREATE_TRACE_POINTS 11 + #include <trace/events/rpcgss.h>
+6 -4
net/sunrpc/xprt.c
··· 1165 1165 /* Note: req is added _before_ pos */ 1166 1166 list_add_tail(&req->rq_xmit, &pos->rq_xmit); 1167 1167 INIT_LIST_HEAD(&req->rq_xmit2); 1168 + trace_xprt_enq_xmit(task, 1); 1168 1169 goto out; 1169 1170 } 1170 1171 } else if (RPC_IS_SWAPPER(task)) { ··· 1177 1176 /* Note: req is added _before_ pos */ 1178 1177 list_add_tail(&req->rq_xmit, &pos->rq_xmit); 1179 1178 INIT_LIST_HEAD(&req->rq_xmit2); 1179 + trace_xprt_enq_xmit(task, 2); 1180 1180 goto out; 1181 1181 } 1182 1182 } else if (!req->rq_seqno) { ··· 1186 1184 continue; 1187 1185 list_add_tail(&req->rq_xmit2, &pos->rq_xmit2); 1188 1186 INIT_LIST_HEAD(&req->rq_xmit); 1187 + trace_xprt_enq_xmit(task, 3); 1189 1188 goto out; 1190 1189 } 1191 1190 } 1192 1191 list_add_tail(&req->rq_xmit, &xprt->xmit_queue); 1193 1192 INIT_LIST_HEAD(&req->rq_xmit2); 1193 + trace_xprt_enq_xmit(task, 4); 1194 1194 out: 1195 1195 set_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate); 1196 1196 spin_unlock(&xprt->queue_lock); ··· 1317 1313 int is_retrans = RPC_WAS_SENT(task); 1318 1314 int status; 1319 1315 1320 - dprintk("RPC: %5u xprt_transmit(%u)\n", task->tk_pid, req->rq_slen); 1321 - 1322 1316 if (!req->rq_bytes_sent) { 1323 1317 if (xprt_request_data_received(task)) { 1324 1318 status = 0; ··· 1338 1336 1339 1337 connect_cookie = xprt->connect_cookie; 1340 1338 status = xprt->ops->send_request(req); 1341 - trace_xprt_transmit(xprt, req->rq_xid, status); 1342 1339 if (status != 0) { 1343 1340 req->rq_ntrans--; 1341 + trace_xprt_transmit(req, status); 1344 1342 return status; 1345 1343 } 1346 1344 ··· 1349 1347 1350 1348 xprt_inject_disconnect(xprt); 1351 1349 1352 - dprintk("RPC: %5u xmit complete\n", task->tk_pid); 1353 1350 task->tk_flags |= RPC_TASK_SENT; 1354 1351 spin_lock_bh(&xprt->transport_lock); 1355 1352 ··· 1361 1360 1362 1361 req->rq_connect_cookie = connect_cookie; 1363 1362 out_dequeue: 1363 + trace_xprt_transmit(req, status); 1364 1364 xprt_request_dequeue_transmit(task); 1365 1365 rpc_wake_up_queued_task_set_status(&xprt->sending, task, status); 1366 1366 return status;