Commit 4f67bcf6 authored by David Howells's avatar David Howells
Browse files

afs: Improve afs_volume tracing to display a debug ID



Improve the tracing of afs_volume objects to include displaying a debug ID
so that different instances of volumes with the same "vid" can be
distinguished.

Also be consistent about displaying the volume's refcount (and not the
cell's).

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/20250224234154.2014840-9-dhowells@redhat.com/ # v1
Link: https://lore.kernel.org/r/20250310094206.801057-5-dhowells@redhat.com/ # v4
parent 1d0b929f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -623,6 +623,7 @@ struct afs_volume {
	afs_volid_t		vid;		/* The volume ID of this volume */
	afs_volid_t		vids[AFS_MAXTYPES]; /* All associated volume IDs */
	refcount_t		ref;
	unsigned int		debug_id;	/* Debugging ID for traces */
	time64_t		update_at;	/* Time at which to next update */
	struct afs_cell		*cell;		/* Cell to which belongs (pins ref) */
	struct rb_node		cell_node;	/* Link in cell->volumes */
+9 −6
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include "internal.h"

static unsigned __read_mostly afs_volume_record_life = 60 * 60;
static atomic_t afs_volume_debug_id;

static void afs_destroy_volume(struct work_struct *work);

@@ -59,7 +60,7 @@ static void afs_remove_volume_from_cell(struct afs_volume *volume)
	struct afs_cell *cell = volume->cell;

	if (!hlist_unhashed(&volume->proc_link)) {
		trace_afs_volume(volume->vid, refcount_read(&cell->ref),
		trace_afs_volume(volume->debug_id, volume->vid, refcount_read(&volume->ref),
				 afs_volume_trace_remove);
		write_seqlock(&cell->volume_lock);
		hlist_del_rcu(&volume->proc_link);
@@ -84,6 +85,7 @@ static struct afs_volume *afs_alloc_volume(struct afs_fs_context *params,
	if (!volume)
		goto error_0;

	volume->debug_id	= atomic_inc_return(&afs_volume_debug_id);
	volume->vid		= vldb->vid[params->type];
	volume->update_at	= ktime_get_real_seconds() + afs_volume_record_life;
	volume->cell		= afs_get_cell(params->cell, afs_cell_trace_get_vol);
@@ -115,7 +117,7 @@ static struct afs_volume *afs_alloc_volume(struct afs_fs_context *params,

	*_slist = slist;
	rcu_assign_pointer(volume->servers, slist);
	trace_afs_volume(volume->vid, 1, afs_volume_trace_alloc);
	trace_afs_volume(volume->debug_id, volume->vid, 1, afs_volume_trace_alloc);
	return volume;

error_1:
@@ -247,7 +249,7 @@ static void afs_destroy_volume(struct work_struct *work)
	afs_remove_volume_from_cell(volume);
	afs_put_serverlist(volume->cell->net, slist);
	afs_put_cell(volume->cell, afs_cell_trace_put_vol);
	trace_afs_volume(volume->vid, refcount_read(&volume->ref),
	trace_afs_volume(volume->debug_id, volume->vid, refcount_read(&volume->ref),
			 afs_volume_trace_free);
	kfree_rcu(volume, rcu);

@@ -262,7 +264,7 @@ bool afs_try_get_volume(struct afs_volume *volume, enum afs_volume_trace reason)
	int r;

	if (__refcount_inc_not_zero(&volume->ref, &r)) {
		trace_afs_volume(volume->vid, r + 1, reason);
		trace_afs_volume(volume->debug_id, volume->vid, r + 1, reason);
		return true;
	}
	return false;
@@ -278,7 +280,7 @@ struct afs_volume *afs_get_volume(struct afs_volume *volume,
		int r;

		__refcount_inc(&volume->ref, &r);
		trace_afs_volume(volume->vid, r + 1, reason);
		trace_afs_volume(volume->debug_id, volume->vid, r + 1, reason);
	}
	return volume;
}
@@ -290,12 +292,13 @@ struct afs_volume *afs_get_volume(struct afs_volume *volume,
void afs_put_volume(struct afs_volume *volume, enum afs_volume_trace reason)
{
	if (volume) {
		unsigned int debug_id = volume->debug_id;
		afs_volid_t vid = volume->vid;
		bool zero;
		int r;

		zero = __refcount_dec_and_test(&volume->ref, &r);
		trace_afs_volume(vid, r - 1, reason);
		trace_afs_volume(debug_id, vid, r - 1, reason);
		if (zero)
			schedule_work(&volume->destructor);
	}
+11 −7
Original line number Diff line number Diff line
@@ -1539,25 +1539,29 @@ TRACE_EVENT(afs_server,
	    );

TRACE_EVENT(afs_volume,
	    TP_PROTO(afs_volid_t vid, int ref, enum afs_volume_trace reason),
	    TP_PROTO(unsigned int debug_id, afs_volid_t vid, int ref,
		     enum afs_volume_trace reason),

	    TP_ARGS(vid, ref, reason),
	    TP_ARGS(debug_id, vid, ref, reason),

	    TP_STRUCT__entry(
		    __field(unsigned int,		debug_id)
		    __field(afs_volid_t,		vid)
		    __field(int,			ref)
		    __field(enum afs_volume_trace,	reason)
			     ),

	    TP_fast_assign(
		    __entry->debug_id	= debug_id;
		    __entry->vid	= vid;
		    __entry->ref	= ref;
		    __entry->reason	= reason;
			   ),

	    TP_printk("V=%llx %s ur=%d",
		      __entry->vid,
	    TP_printk("V=%08x %s vid=%llx r=%d",
		      __entry->debug_id,
		      __print_symbolic(__entry->reason, afs_volume_traces),
		      __entry->vid,
		      __entry->ref)
	    );