ref_tracker: allow pr_ostream() to print directly to a seq_file

Allow pr_ostream to also output directly to a seq_file without an
intermediate buffer. The first caller of +ref_tracker_dir_seq_print()
will come in a later patch, so mark that __maybe_unused for now. That
designation will be removed once it is used.

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20250618-reftrack-dbgfs-v15-5-24fc37ead144@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jeff Layton 2025-06-18 10:24:18 -04:00 committed by Jakub Kicinski
parent aa7d26c3c3
commit f6dbe294a1
1 changed files with 26 additions and 0 deletions

View File

@ -8,6 +8,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/stacktrace.h> #include <linux/stacktrace.h>
#include <linux/stackdepot.h> #include <linux/stackdepot.h>
#include <linux/seq_file.h>
#define REF_TRACKER_STACK_ENTRIES 16 #define REF_TRACKER_STACK_ENTRIES 16
#define STACK_BUF_SIZE 1024 #define STACK_BUF_SIZE 1024
@ -66,6 +67,7 @@ struct ostream {
void __ostream_printf (*func)(struct ostream *stream, char *fmt, ...); void __ostream_printf (*func)(struct ostream *stream, char *fmt, ...);
char *prefix; char *prefix;
char *buf; char *buf;
struct seq_file *seq;
int size, used; int size, used;
}; };
@ -301,6 +303,30 @@ EXPORT_SYMBOL_GPL(ref_tracker_free);
static struct dentry *ref_tracker_debug_dir = (struct dentry *)-ENOENT; static struct dentry *ref_tracker_debug_dir = (struct dentry *)-ENOENT;
static void __ostream_printf pr_ostream_seq(struct ostream *stream, char *fmt, ...)
{
va_list args;
va_start(args, fmt);
seq_vprintf(stream->seq, fmt, args);
va_end(args);
}
static __maybe_unused int
ref_tracker_dir_seq_print(struct ref_tracker_dir *dir, struct seq_file *seq)
{
struct ostream os = { .func = pr_ostream_seq,
.prefix = "",
.seq = seq };
unsigned long flags;
spin_lock_irqsave(&dir->lock, flags);
__ref_tracker_dir_pr_ostream(dir, 16, &os);
spin_unlock_irqrestore(&dir->lock, flags);
return os.used;
}
static int __init ref_tracker_debugfs_init(void) static int __init ref_tracker_debugfs_init(void)
{ {
ref_tracker_debug_dir = debugfs_create_dir("ref_tracker", NULL); ref_tracker_debug_dir = debugfs_create_dir("ref_tracker", NULL);