Unverified Commit 90b3ccf5 authored by David Howells's avatar David Howells Committed by Christian Brauner
Browse files

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: default avatarDavid Howells <dhowells@redhat.com>
Co-developed-by: default avatarPaulo Alcantara <pc@manguebit.org>
Signed-off-by: default avatarPaulo 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: default avatarChristian Brauner <brauner@kernel.org>
parent 4e325410
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -91,7 +91,6 @@ ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov_iter *
	}

	if (!async) {
		trace_netfs_rreq(wreq, netfs_rreq_trace_wait_ip);
		ret = netfs_wait_for_write(wreq);
		if (ret > 0)
			iocb->ki_pos += ret;
+1 −1
Original line number Diff line number Diff line
@@ -273,9 +273,9 @@ static inline void netfs_wake_rreq_flag(struct netfs_io_request *rreq,
					enum netfs_rreq_trace trace)
{
	if (test_bit(rreq_flag, &rreq->flags)) {
		trace_netfs_rreq(rreq, trace);
		clear_bit_unlock(rreq_flag, &rreq->flags);
		smp_mb__after_atomic(); /* Set flag before task state */
		trace_netfs_rreq(rreq, trace);
		wake_up(&rreq->waitq);
	}
}
+6 −8
Original line number Diff line number Diff line
@@ -359,7 +359,7 @@ void netfs_wait_for_in_progress_stream(struct netfs_io_request *rreq,
		if (!netfs_check_subreq_in_progress(subreq))
			continue;

		trace_netfs_rreq(rreq, netfs_rreq_trace_wait_queue);
		trace_netfs_rreq(rreq, netfs_rreq_trace_wait_quiesce);
		for (;;) {
			prepare_to_wait(&rreq->waitq, &myself, TASK_UNINTERRUPTIBLE);

@@ -368,10 +368,10 @@ void netfs_wait_for_in_progress_stream(struct netfs_io_request *rreq,

			trace_netfs_sreq(subreq, netfs_sreq_trace_wait_for);
			schedule();
			trace_netfs_rreq(rreq, netfs_rreq_trace_woke_queue);
		}
	}

	trace_netfs_rreq(rreq, netfs_rreq_trace_waited_quiesce);
	finish_wait(&rreq->waitq, &myself);
}

@@ -437,7 +437,6 @@ static ssize_t netfs_wait_for_in_progress(struct netfs_io_request *rreq,
	ssize_t ret;

	for (;;) {
		trace_netfs_rreq(rreq, netfs_rreq_trace_wait_queue);
		prepare_to_wait(&rreq->waitq, &myself, TASK_UNINTERRUPTIBLE);

		if (!test_bit(NETFS_RREQ_OFFLOAD_COLLECTION, &rreq->flags)) {
@@ -457,11 +456,12 @@ static ssize_t netfs_wait_for_in_progress(struct netfs_io_request *rreq,
		if (!netfs_check_rreq_in_progress(rreq))
			break;

		trace_netfs_rreq(rreq, netfs_rreq_trace_wait_ip);
		schedule();
		trace_netfs_rreq(rreq, netfs_rreq_trace_woke_queue);
	}

all_collected:
	trace_netfs_rreq(rreq, netfs_rreq_trace_waited_ip);
	finish_wait(&rreq->waitq, &myself);

	ret = rreq->error;
@@ -504,10 +504,8 @@ static void netfs_wait_for_pause(struct netfs_io_request *rreq,
{
	DEFINE_WAIT(myself);

	trace_netfs_rreq(rreq, netfs_rreq_trace_wait_pause);

	for (;;) {
		trace_netfs_rreq(rreq, netfs_rreq_trace_wait_queue);
		trace_netfs_rreq(rreq, netfs_rreq_trace_wait_pause);
		prepare_to_wait(&rreq->waitq, &myself, TASK_UNINTERRUPTIBLE);

		if (!test_bit(NETFS_RREQ_OFFLOAD_COLLECTION, &rreq->flags)) {
@@ -530,10 +528,10 @@ static void netfs_wait_for_pause(struct netfs_io_request *rreq,
			break;

		schedule();
		trace_netfs_rreq(rreq, netfs_rreq_trace_woke_queue);
	}

all_collected:
	trace_netfs_rreq(rreq, netfs_rreq_trace_waited_pause);
	finish_wait(&rreq->waitq, &myself);
}

+9 −3
Original line number Diff line number Diff line
@@ -293,7 +293,9 @@ static void netfs_collect_read_results(struct netfs_io_request *rreq)
		spin_lock(&rreq->lock);

		remove = front;
		trace_netfs_sreq(front, netfs_sreq_trace_discard);
		trace_netfs_sreq(front,
				 notes & ABANDON_SREQ ?
				 netfs_sreq_trace_abandoned : netfs_sreq_trace_consumed);
		list_del_init(&front->rreq_link);
		front = list_first_entry_or_null(&stream->subrequests,
						 struct netfs_io_subrequest, rreq_link);
@@ -353,10 +355,12 @@ static void netfs_rreq_assess_dio(struct netfs_io_request *rreq)

	if (rreq->iocb) {
		rreq->iocb->ki_pos += rreq->transferred;
		if (rreq->iocb->ki_complete)
		if (rreq->iocb->ki_complete) {
			trace_netfs_rreq(rreq, netfs_rreq_trace_ki_complete);
			rreq->iocb->ki_complete(
				rreq->iocb, rreq->error ? rreq->error : rreq->transferred);
		}
	}
	if (rreq->netfs_ops->done)
		rreq->netfs_ops->done(rreq);
	if (rreq->origin == NETFS_UNBUFFERED_READ ||
@@ -379,10 +383,12 @@ static void netfs_rreq_assess_single(struct netfs_io_request *rreq)

	if (rreq->iocb) {
		rreq->iocb->ki_pos += rreq->transferred;
		if (rreq->iocb->ki_complete)
		if (rreq->iocb->ki_complete) {
			trace_netfs_rreq(rreq, netfs_rreq_trace_ki_complete);
			rreq->iocb->ki_complete(
				rreq->iocb, rreq->error ? rreq->error : rreq->transferred);
		}
	}
	if (rreq->netfs_ops->done)
		rreq->netfs_ops->done(rreq);
}
+3 −1
Original line number Diff line number Diff line
@@ -421,9 +421,11 @@ bool netfs_write_collection(struct netfs_io_request *wreq)
	if (wreq->iocb) {
		size_t written = min(wreq->transferred, wreq->len);
		wreq->iocb->ki_pos += written;
		if (wreq->iocb->ki_complete)
		if (wreq->iocb->ki_complete) {
			trace_netfs_rreq(wreq, netfs_rreq_trace_ki_complete);
			wreq->iocb->ki_complete(
				wreq->iocb, wreq->error ? wreq->error : written);
		}
		wreq->iocb = VFS_PTR_POISON;
	}

Loading