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

netfs: Update tracepoints in a number of ways

Make a number of updates to the netfs tracepoints:

(1) Remove a duplicate trace from netfs_unbuffered_write_iter_locked().

(2) Move the trace in netfs_wake_rreq_flag() to after the flag is cleared
so that the change appears in the trace.

(3) Differentiate the use of netfs_rreq_trace_wait/woke_queue symbols.

(4) Don't do so many trace emissions in the wait functions as some of them
are redundant.

(5) In netfs_collect_read_results(), differentiate a subreq that's being
abandoned vs one that has been consumed in a regular way.

(6) Add a tracepoint to indicate the call to ->ki_complete().

(7) Don't double-increment the subreq_counter when retrying a write.

(8) Move the netfs_sreq_trace_io_progress tracepoint within cifs code to
just MID_RESPONSE_RECEIVED and add different tracepoints for other MID
states and note check failure.

Signed-off-by: David Howells <dhowells@redhat.com>
Co-developed-by: Paulo Alcantara <pc@manguebit.org>
Signed-off-by: Paulo Alcantara <pc@manguebit.org>
Link: https://lore.kernel.org/20250701163852.2171681-14-dhowells@redhat.com
cc: Steve French <sfrench@samba.org>
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
cc: linux-cifs@vger.kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

David Howells and committed by
Christian Brauner
90b3ccf5 4e325410

+82 -30
-1
fs/netfs/direct_write.c
··· 91 91 } 92 92 93 93 if (!async) { 94 - trace_netfs_rreq(wreq, netfs_rreq_trace_wait_ip); 95 94 ret = netfs_wait_for_write(wreq); 96 95 if (ret > 0) 97 96 iocb->ki_pos += ret;
+1 -1
fs/netfs/internal.h
··· 273 273 enum netfs_rreq_trace trace) 274 274 { 275 275 if (test_bit(rreq_flag, &rreq->flags)) { 276 - trace_netfs_rreq(rreq, trace); 277 276 clear_bit_unlock(rreq_flag, &rreq->flags); 278 277 smp_mb__after_atomic(); /* Set flag before task state */ 278 + trace_netfs_rreq(rreq, trace); 279 279 wake_up(&rreq->waitq); 280 280 } 281 281 }
+6 -8
fs/netfs/misc.c
··· 359 359 if (!netfs_check_subreq_in_progress(subreq)) 360 360 continue; 361 361 362 - trace_netfs_rreq(rreq, netfs_rreq_trace_wait_queue); 362 + trace_netfs_rreq(rreq, netfs_rreq_trace_wait_quiesce); 363 363 for (;;) { 364 364 prepare_to_wait(&rreq->waitq, &myself, TASK_UNINTERRUPTIBLE); 365 365 ··· 368 368 369 369 trace_netfs_sreq(subreq, netfs_sreq_trace_wait_for); 370 370 schedule(); 371 - trace_netfs_rreq(rreq, netfs_rreq_trace_woke_queue); 372 371 } 373 372 } 374 373 374 + trace_netfs_rreq(rreq, netfs_rreq_trace_waited_quiesce); 375 375 finish_wait(&rreq->waitq, &myself); 376 376 } 377 377 ··· 437 437 ssize_t ret; 438 438 439 439 for (;;) { 440 - trace_netfs_rreq(rreq, netfs_rreq_trace_wait_queue); 441 440 prepare_to_wait(&rreq->waitq, &myself, TASK_UNINTERRUPTIBLE); 442 441 443 442 if (!test_bit(NETFS_RREQ_OFFLOAD_COLLECTION, &rreq->flags)) { ··· 456 457 if (!netfs_check_rreq_in_progress(rreq)) 457 458 break; 458 459 460 + trace_netfs_rreq(rreq, netfs_rreq_trace_wait_ip); 459 461 schedule(); 460 - trace_netfs_rreq(rreq, netfs_rreq_trace_woke_queue); 461 462 } 462 463 463 464 all_collected: 465 + trace_netfs_rreq(rreq, netfs_rreq_trace_waited_ip); 464 466 finish_wait(&rreq->waitq, &myself); 465 467 466 468 ret = rreq->error; ··· 504 504 { 505 505 DEFINE_WAIT(myself); 506 506 507 - trace_netfs_rreq(rreq, netfs_rreq_trace_wait_pause); 508 - 509 507 for (;;) { 510 - trace_netfs_rreq(rreq, netfs_rreq_trace_wait_queue); 508 + trace_netfs_rreq(rreq, netfs_rreq_trace_wait_pause); 511 509 prepare_to_wait(&rreq->waitq, &myself, TASK_UNINTERRUPTIBLE); 512 510 513 511 if (!test_bit(NETFS_RREQ_OFFLOAD_COLLECTION, &rreq->flags)) { ··· 528 530 break; 529 531 530 532 schedule(); 531 - trace_netfs_rreq(rreq, netfs_rreq_trace_woke_queue); 532 533 } 533 534 534 535 all_collected: 536 + trace_netfs_rreq(rreq, netfs_rreq_trace_waited_pause); 535 537 finish_wait(&rreq->waitq, &myself); 536 538 } 537 539
+9 -3
fs/netfs/read_collect.c
··· 293 293 spin_lock(&rreq->lock); 294 294 295 295 remove = front; 296 - trace_netfs_sreq(front, netfs_sreq_trace_discard); 296 + trace_netfs_sreq(front, 297 + notes & ABANDON_SREQ ? 298 + netfs_sreq_trace_abandoned : netfs_sreq_trace_consumed); 297 299 list_del_init(&front->rreq_link); 298 300 front = list_first_entry_or_null(&stream->subrequests, 299 301 struct netfs_io_subrequest, rreq_link); ··· 355 353 356 354 if (rreq->iocb) { 357 355 rreq->iocb->ki_pos += rreq->transferred; 358 - if (rreq->iocb->ki_complete) 356 + if (rreq->iocb->ki_complete) { 357 + trace_netfs_rreq(rreq, netfs_rreq_trace_ki_complete); 359 358 rreq->iocb->ki_complete( 360 359 rreq->iocb, rreq->error ? rreq->error : rreq->transferred); 360 + } 361 361 } 362 362 if (rreq->netfs_ops->done) 363 363 rreq->netfs_ops->done(rreq); ··· 383 379 384 380 if (rreq->iocb) { 385 381 rreq->iocb->ki_pos += rreq->transferred; 386 - if (rreq->iocb->ki_complete) 382 + if (rreq->iocb->ki_complete) { 383 + trace_netfs_rreq(rreq, netfs_rreq_trace_ki_complete); 387 384 rreq->iocb->ki_complete( 388 385 rreq->iocb, rreq->error ? rreq->error : rreq->transferred); 386 + } 389 387 } 390 388 if (rreq->netfs_ops->done) 391 389 rreq->netfs_ops->done(rreq);
+3 -1
fs/netfs/write_collect.c
··· 421 421 if (wreq->iocb) { 422 422 size_t written = min(wreq->transferred, wreq->len); 423 423 wreq->iocb->ki_pos += written; 424 - if (wreq->iocb->ki_complete) 424 + if (wreq->iocb->ki_complete) { 425 + trace_netfs_rreq(wreq, netfs_rreq_trace_ki_complete); 425 426 wreq->iocb->ki_complete( 426 427 wreq->iocb, wreq->error ? wreq->error : written); 428 + } 427 429 wreq->iocb = VFS_PTR_POISON; 428 430 } 429 431
-1
fs/netfs/write_retry.c
··· 146 146 subreq = netfs_alloc_subrequest(wreq); 147 147 subreq->source = to->source; 148 148 subreq->start = start; 149 - subreq->debug_index = atomic_inc_return(&wreq->subreq_counter); 150 149 subreq->stream_nr = to->stream_nr; 151 150 subreq->retry_count = 1; 152 151
+22 -2
fs/smb/client/cifssmb.c
··· 1334 1334 cifs_stats_bytes_read(tcon, rdata->got_bytes); 1335 1335 break; 1336 1336 case MID_REQUEST_SUBMITTED: 1337 + trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_req_submitted); 1338 + goto do_retry; 1337 1339 case MID_RETRY_NEEDED: 1340 + trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_retry_needed); 1341 + do_retry: 1338 1342 __set_bit(NETFS_SREQ_NEED_RETRY, &rdata->subreq.flags); 1339 1343 rdata->result = -EAGAIN; 1340 1344 if (server->sign && rdata->got_bytes) ··· 1348 1344 task_io_account_read(rdata->got_bytes); 1349 1345 cifs_stats_bytes_read(tcon, rdata->got_bytes); 1350 1346 break; 1351 - default: 1347 + case MID_RESPONSE_MALFORMED: 1348 + trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_malformed); 1352 1349 rdata->result = -EIO; 1350 + break; 1351 + default: 1352 + trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_unknown); 1353 + rdata->result = -EIO; 1354 + break; 1353 1355 } 1354 1356 1355 1357 if (rdata->result == -ENODATA) { ··· 1724 1714 } 1725 1715 break; 1726 1716 case MID_REQUEST_SUBMITTED: 1727 - case MID_RETRY_NEEDED: 1717 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_req_submitted); 1728 1718 __set_bit(NETFS_SREQ_NEED_RETRY, &wdata->subreq.flags); 1729 1719 result = -EAGAIN; 1730 1720 break; 1721 + case MID_RETRY_NEEDED: 1722 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_retry_needed); 1723 + __set_bit(NETFS_SREQ_NEED_RETRY, &wdata->subreq.flags); 1724 + result = -EAGAIN; 1725 + break; 1726 + case MID_RESPONSE_MALFORMED: 1727 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_malformed); 1728 + result = -EIO; 1729 + break; 1731 1730 default: 1731 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_unknown); 1732 1732 result = -EIO; 1733 1733 break; 1734 1734 }
+23 -5
fs/smb/client/smb2pdu.c
··· 4567 4567 cifs_stats_bytes_read(tcon, rdata->got_bytes); 4568 4568 break; 4569 4569 case MID_REQUEST_SUBMITTED: 4570 + trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_req_submitted); 4571 + goto do_retry; 4570 4572 case MID_RETRY_NEEDED: 4573 + trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_retry_needed); 4574 + do_retry: 4571 4575 __set_bit(NETFS_SREQ_NEED_RETRY, &rdata->subreq.flags); 4572 4576 rdata->result = -EAGAIN; 4573 4577 if (server->sign && rdata->got_bytes) ··· 4582 4578 cifs_stats_bytes_read(tcon, rdata->got_bytes); 4583 4579 break; 4584 4580 case MID_RESPONSE_MALFORMED: 4581 + trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_malformed); 4585 4582 credits.value = le16_to_cpu(shdr->CreditRequest); 4586 4583 credits.instance = server->reconnect_instance; 4587 - fallthrough; 4588 - default: 4589 4584 rdata->result = -EIO; 4585 + break; 4586 + default: 4587 + trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_unknown); 4588 + rdata->result = -EIO; 4589 + break; 4590 4590 } 4591 4591 #ifdef CONFIG_CIFS_SMB_DIRECT 4592 4592 /* ··· 4843 4835 4844 4836 switch (mid->mid_state) { 4845 4837 case MID_RESPONSE_RECEIVED: 4838 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_progress); 4846 4839 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); 4847 4840 credits.instance = server->reconnect_instance; 4848 4841 result = smb2_check_receive(mid, server, 0); 4849 - if (result != 0) 4842 + if (result != 0) { 4843 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_bad); 4850 4844 break; 4845 + } 4851 4846 4852 4847 written = le32_to_cpu(rsp->DataLength); 4853 4848 /* ··· 4872 4861 } 4873 4862 break; 4874 4863 case MID_REQUEST_SUBMITTED: 4864 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_req_submitted); 4865 + __set_bit(NETFS_SREQ_NEED_RETRY, &wdata->subreq.flags); 4866 + result = -EAGAIN; 4867 + break; 4875 4868 case MID_RETRY_NEEDED: 4869 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_retry_needed); 4876 4870 __set_bit(NETFS_SREQ_NEED_RETRY, &wdata->subreq.flags); 4877 4871 result = -EAGAIN; 4878 4872 break; 4879 4873 case MID_RESPONSE_MALFORMED: 4874 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_malformed); 4880 4875 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); 4881 4876 credits.instance = server->reconnect_instance; 4882 - fallthrough; 4877 + result = -EIO; 4878 + break; 4883 4879 default: 4880 + trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_unknown); 4884 4881 result = -EIO; 4885 4882 break; 4886 4883 } ··· 4928 4909 server->credits, server->in_flight, 4929 4910 0, cifs_trace_rw_credits_write_response_clear); 4930 4911 wdata->credits.value = 0; 4931 - trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_progress); 4932 4912 cifs_write_subrequest_terminated(wdata, result ?: written); 4933 4913 release_mid(mid); 4934 4914 trace_smb3_rw_credits(rreq_debug_id, subreq_debug_index, 0,
+18 -8
include/trace/events/netfs.h
··· 50 50 51 51 #define netfs_rreq_traces \ 52 52 EM(netfs_rreq_trace_assess, "ASSESS ") \ 53 - EM(netfs_rreq_trace_copy, "COPY ") \ 54 53 EM(netfs_rreq_trace_collect, "COLLECT") \ 55 54 EM(netfs_rreq_trace_complete, "COMPLET") \ 55 + EM(netfs_rreq_trace_copy, "COPY ") \ 56 56 EM(netfs_rreq_trace_dirty, "DIRTY ") \ 57 57 EM(netfs_rreq_trace_done, "DONE ") \ 58 58 EM(netfs_rreq_trace_free, "FREE ") \ 59 + EM(netfs_rreq_trace_ki_complete, "KI-CMPL") \ 59 60 EM(netfs_rreq_trace_recollect, "RECLLCT") \ 60 61 EM(netfs_rreq_trace_redirty, "REDIRTY") \ 61 62 EM(netfs_rreq_trace_resubmit, "RESUBMT") \ ··· 65 64 EM(netfs_rreq_trace_unlock, "UNLOCK ") \ 66 65 EM(netfs_rreq_trace_unlock_pgpriv2, "UNLCK-2") \ 67 66 EM(netfs_rreq_trace_unmark, "UNMARK ") \ 67 + EM(netfs_rreq_trace_unpause, "UNPAUSE") \ 68 68 EM(netfs_rreq_trace_wait_ip, "WAIT-IP") \ 69 - EM(netfs_rreq_trace_wait_pause, "WT-PAUS") \ 70 - EM(netfs_rreq_trace_wait_queue, "WAIT-Q ") \ 69 + EM(netfs_rreq_trace_wait_pause, "--PAUSED--") \ 70 + EM(netfs_rreq_trace_wait_quiesce, "WAIT-QUIESCE") \ 71 + EM(netfs_rreq_trace_waited_ip, "DONE-IP") \ 72 + EM(netfs_rreq_trace_waited_pause, "--UNPAUSED--") \ 73 + EM(netfs_rreq_trace_waited_quiesce, "DONE-QUIESCE") \ 71 74 EM(netfs_rreq_trace_wake_ip, "WAKE-IP") \ 72 75 EM(netfs_rreq_trace_wake_queue, "WAKE-Q ") \ 73 - EM(netfs_rreq_trace_woke_queue, "WOKE-Q ") \ 74 - EM(netfs_rreq_trace_unpause, "UNPAUSE") \ 75 76 E_(netfs_rreq_trace_write_done, "WR-DONE") 76 77 77 78 #define netfs_sreq_sources \ ··· 86 83 E_(NETFS_WRITE_TO_CACHE, "WRIT") 87 84 88 85 #define netfs_sreq_traces \ 86 + EM(netfs_sreq_trace_abandoned, "ABNDN") \ 89 87 EM(netfs_sreq_trace_add_donations, "+DON ") \ 90 88 EM(netfs_sreq_trace_added, "ADD ") \ 91 89 EM(netfs_sreq_trace_cache_nowrite, "CA-NW") \ ··· 94 90 EM(netfs_sreq_trace_cache_write, "CA-WR") \ 95 91 EM(netfs_sreq_trace_cancel, "CANCL") \ 96 92 EM(netfs_sreq_trace_clear, "CLEAR") \ 93 + EM(netfs_sreq_trace_consumed, "CONSM") \ 97 94 EM(netfs_sreq_trace_discard, "DSCRD") \ 98 95 EM(netfs_sreq_trace_donate_to_prev, "DON-P") \ 99 96 EM(netfs_sreq_trace_donate_to_next, "DON-N") \ ··· 102 97 EM(netfs_sreq_trace_fail, "FAIL ") \ 103 98 EM(netfs_sreq_trace_free, "FREE ") \ 104 99 EM(netfs_sreq_trace_hit_eof, "EOF ") \ 105 - EM(netfs_sreq_trace_io_progress, "IO ") \ 100 + EM(netfs_sreq_trace_io_bad, "I-BAD") \ 101 + EM(netfs_sreq_trace_io_malformed, "I-MLF") \ 102 + EM(netfs_sreq_trace_io_unknown, "I-UNK") \ 103 + EM(netfs_sreq_trace_io_progress, "I-OK ") \ 104 + EM(netfs_sreq_trace_io_req_submitted, "I-RSB") \ 105 + EM(netfs_sreq_trace_io_retry_needed, "I-RTR") \ 106 106 EM(netfs_sreq_trace_limited, "LIMIT") \ 107 107 EM(netfs_sreq_trace_need_clear, "N-CLR") \ 108 108 EM(netfs_sreq_trace_partial_read, "PARTR") \ ··· 153 143 154 144 #define netfs_sreq_ref_traces \ 155 145 EM(netfs_sreq_trace_get_copy_to_cache, "GET COPY2C ") \ 156 - EM(netfs_sreq_trace_get_resubmit, "GET RESUBMIT") \ 157 - EM(netfs_sreq_trace_get_submit, "GET SUBMIT") \ 146 + EM(netfs_sreq_trace_get_resubmit, "GET RESUBMT") \ 147 + EM(netfs_sreq_trace_get_submit, "GET SUBMIT ") \ 158 148 EM(netfs_sreq_trace_get_short_read, "GET SHORTRD") \ 159 149 EM(netfs_sreq_trace_new, "NEW ") \ 160 150 EM(netfs_sreq_trace_put_abandon, "PUT ABANDON") \