This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
zhangyang-variable-monitor/source/buffer/trace_buffer.h
2023-11-16 14:07:37 +08:00

107 lines
4.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* diagnose-tools 工具通用调试缓冲区模块
* 这是为了解决procfs/trace的问题而编写
*
* Copyright (C) 20 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);