mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
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: David 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
This commit is contained in:
parent
1d0b929fc0
commit
4f67bcf6d6
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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->vid = vid;
|
||||
__entry->ref = ref;
|
||||
__entry->reason = reason;
|
||||
__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)
|
||||
);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user