107 lines
4.6 KiB
C
107 lines
4.6 KiB
C
/*
|
||
* diagnose-tools 工具通用调试缓冲区模块
|
||
* 这是为了解决procfs/trace的问题而编写
|
||
*
|
||
* Copyright (C) 2020 Alibaba Ltd.
|
||
*
|
||
* 作者: Baoyou Xie <baoyou.xie@linux.alibaba.com>
|
||
*
|
||
* License terms: GNU General Public License (GPL) version 3
|
||
*
|
||
*/
|
||
|
||
#include <linux/spinlock.h>
|
||
#include <linux/mutex.h>
|
||
#include <linux/stddef.h>
|
||
|
||
/**
|
||
* 调试缓冲区描述符
|
||
* buffer: 当前正在接受调用者输出的缓冲区
|
||
* data: 数据起始指针
|
||
* pos: 当前写入位置
|
||
* circle: 是否已经产生了回绕
|
||
* tail: 有效位置的尾部
|
||
* product: 将buffer中数据临时保存到此,避免影响记录速度
|
||
* data: 数据起始指针
|
||
* len: 数据有效长度
|
||
* buf_size: buffer/product的大小
|
||
*/
|
||
#define DIAG_TRACE_BUF_SIZE 1024
|
||
|
||
struct diag_trace_buffer {
|
||
struct {
|
||
char *data;
|
||
unsigned int pos;
|
||
int circle;
|
||
unsigned int tail;
|
||
spinlock_t lock;
|
||
struct mutex mutex;
|
||
} buffer;
|
||
|
||
struct {
|
||
char *data;
|
||
unsigned int len;
|
||
} product;
|
||
|
||
char fmt_buffer[DIAG_TRACE_BUF_SIZE];
|
||
unsigned int buf_size;
|
||
};
|
||
|
||
int init_diag_trace_buffer(struct diag_trace_buffer *buffer,
|
||
unsigned int buf_size);
|
||
void destroy_diag_trace_buffer(struct diag_trace_buffer *buffer);
|
||
void discard_diag_trace_buffer(struct diag_trace_buffer *buffer);
|
||
void backup_diag_trace_buffer(struct diag_trace_buffer *buffer);
|
||
asmlinkage int
|
||
diag_trace_buffer_printk_nolock(struct diag_trace_buffer *buffer,
|
||
const char *fmt, ...);
|
||
asmlinkage int
|
||
diag_trace_buffer_printk(struct diag_trace_buffer *buffer,
|
||
const char *fmt, ...);
|
||
asmlinkage int
|
||
diag_trace_buffer_write_nolock(struct diag_trace_buffer *buffer,
|
||
const void *data, size_t len);
|
||
asmlinkage int
|
||
diag_trace_buffer_write(struct diag_trace_buffer *buffer,
|
||
const void *data, size_t len);
|
||
#define diag_trace_buffer_spin_lock(__buffer, flags) \
|
||
spin_lock_irqsave(&((__buffer)->buffer.lock), flags)
|
||
#define diag_trace_buffer_spin_unlock(__buffer, flags) \
|
||
spin_unlock_irqrestore(&((__buffer)->buffer.lock), flags)
|
||
void diag_trace_buffer_mutex_lock(struct diag_trace_buffer *buffer);
|
||
void diag_trace_buffer_mutex_unlock(struct diag_trace_buffer *buffer);
|
||
|
||
void diagnose_trace_buffer_stack_trace(int pre, struct diag_trace_buffer *buffer,
|
||
struct task_struct *p, unsigned long *backtrace);
|
||
void diagnose_trace_buffer_nolock_stack_trace(int pre, struct diag_trace_buffer *buffer,
|
||
struct task_struct *p, unsigned long *backtrace);
|
||
void diagnose_trace_buffer_nolock_stack_trace_user(int pre, struct diag_trace_buffer *buffer,
|
||
unsigned long *backtrace);
|
||
void diagnose_trace_buffer_stack_trace_user(int pre, struct diag_trace_buffer *buffer,
|
||
unsigned long *backtrace);
|
||
void diagnose_trace_buffer_nolock_stack_trace_user_tsk(int pre, struct diag_trace_buffer *buffer,
|
||
struct task_struct *tsk, unsigned long *backtrace);
|
||
void diagnose_trace_buffer_stack_trace_user_tsk(int pre, struct diag_trace_buffer *buffer,
|
||
struct task_struct *tsk, unsigned long *backtrace);
|
||
void diag_trace_buffer_process_chain(int pre, struct diag_trace_buffer *buffer, struct task_struct *tsk);
|
||
void diag_trace_buffer_nolock_process_chain(int pre, struct diag_trace_buffer *buffer, struct task_struct *tsk);
|
||
void diag_trace_buffer_process_chain_cmdline(int pre, struct diag_trace_buffer *buffer, struct task_struct *tsk);
|
||
void diag_trace_buffer_nolock_process_chain_cmdline(int pre, struct diag_trace_buffer *buffer, struct task_struct *tsk);
|
||
void trace_buffer_cgroups_tsk(int pre, struct diag_trace_buffer *buffer, struct task_struct *tsk);
|
||
void trace_buffer_nolock_cgroups_tsk(int pre, struct diag_trace_buffer *buffer, struct task_struct *tsk);
|
||
void trace_buffer_cgroups(int pre, struct diag_trace_buffer *buffer);
|
||
void trace_buffer_nolock_cgroups(int pre, struct diag_trace_buffer *buffer);
|
||
void diag_trace_buffer_all_task_stack(int pre, struct diag_trace_buffer *buffer);
|
||
void diag_trace_buffer_nolock_all_task_stack(int pre,
|
||
struct diag_trace_buffer *buffer);
|
||
void diagnose_trace_buffer_nolock_stack_trace_unfold(int pre, struct diag_trace_buffer *buffer,
|
||
struct task_struct *p, unsigned long *backtrace);
|
||
void diagnose_trace_buffer_nolock_stack_trace_unfold_user(int pre, struct diag_trace_buffer *buffer,
|
||
unsigned long *backtrace);
|
||
void diagnose_print_stack_trace_unfold_user_tsk(int pre, int might_sleep, struct task_struct *tsk, unsigned long *backtrace);
|
||
void diagnose_trace_buffer_nolock_stack_trace_unfold_user_tsk(int pre, int might_sleep, struct diag_trace_buffer *buffer,
|
||
struct task_struct *tsk, unsigned long *backtrace);
|
||
void diagnose_trace_buffer_stack_trace_unfold_user_tsk(int pre, int might_sleep, struct diag_trace_buffer *buffer,
|
||
struct task_struct *tsk, unsigned long *backtrace);
|
||
|