mirror of https://github.com/torvalds/linux.git
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:
parent
aa7d26c3c3
commit
f6dbe294a1
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue