mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
tracing: Add full state to trace_seq
The trace_seq buffer might fill up, and right now one needs to check the return value of each printf into the buffer to check for that. Instead, have the buffer keep track of whether it is full or not, and reject more input if it is full or would have overflowed with an input that wasn't added. Cc: Lai Jiangshan <laijs@cn.fujitsu.com> Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
a63ce5b306
commit
d184b31c0e
2 changed files with 52 additions and 11 deletions
|
@ -14,6 +14,7 @@ struct trace_seq {
|
||||||
unsigned char buffer[PAGE_SIZE];
|
unsigned char buffer[PAGE_SIZE];
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
unsigned int readpos;
|
unsigned int readpos;
|
||||||
|
int full;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -21,6 +22,7 @@ trace_seq_init(struct trace_seq *s)
|
||||||
{
|
{
|
||||||
s->len = 0;
|
s->len = 0;
|
||||||
s->readpos = 0;
|
s->readpos = 0;
|
||||||
|
s->full = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -93,7 +93,7 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
|
||||||
va_list ap;
|
va_list ap;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!len)
|
if (s->full || !len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
|
@ -101,8 +101,10 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
/* If we can't write it all, don't bother writing anything */
|
/* If we can't write it all, don't bother writing anything */
|
||||||
if (ret >= len)
|
if (ret >= len) {
|
||||||
|
s->full = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
s->len += ret;
|
s->len += ret;
|
||||||
|
|
||||||
|
@ -127,14 +129,16 @@ trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
|
||||||
int len = (PAGE_SIZE - 1) - s->len;
|
int len = (PAGE_SIZE - 1) - s->len;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!len)
|
if (s->full || !len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = vsnprintf(s->buffer + s->len, len, fmt, args);
|
ret = vsnprintf(s->buffer + s->len, len, fmt, args);
|
||||||
|
|
||||||
/* If we can't write it all, don't bother writing anything */
|
/* If we can't write it all, don't bother writing anything */
|
||||||
if (ret >= len)
|
if (ret >= len) {
|
||||||
|
s->full = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
s->len += ret;
|
s->len += ret;
|
||||||
|
|
||||||
|
@ -147,14 +151,16 @@ int trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary)
|
||||||
int len = (PAGE_SIZE - 1) - s->len;
|
int len = (PAGE_SIZE - 1) - s->len;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!len)
|
if (s->full || !len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = bstr_printf(s->buffer + s->len, len, fmt, binary);
|
ret = bstr_printf(s->buffer + s->len, len, fmt, binary);
|
||||||
|
|
||||||
/* If we can't write it all, don't bother writing anything */
|
/* If we can't write it all, don't bother writing anything */
|
||||||
if (ret >= len)
|
if (ret >= len) {
|
||||||
|
s->full = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
s->len += ret;
|
s->len += ret;
|
||||||
|
|
||||||
|
@ -175,9 +181,14 @@ int trace_seq_puts(struct trace_seq *s, const char *str)
|
||||||
{
|
{
|
||||||
int len = strlen(str);
|
int len = strlen(str);
|
||||||
|
|
||||||
if (len > ((PAGE_SIZE - 1) - s->len))
|
if (s->full)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (len > ((PAGE_SIZE - 1) - s->len)) {
|
||||||
|
s->full = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(s->buffer + s->len, str, len);
|
memcpy(s->buffer + s->len, str, len);
|
||||||
s->len += len;
|
s->len += len;
|
||||||
|
|
||||||
|
@ -186,9 +197,14 @@ int trace_seq_puts(struct trace_seq *s, const char *str)
|
||||||
|
|
||||||
int trace_seq_putc(struct trace_seq *s, unsigned char c)
|
int trace_seq_putc(struct trace_seq *s, unsigned char c)
|
||||||
{
|
{
|
||||||
if (s->len >= (PAGE_SIZE - 1))
|
if (s->full)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (s->len >= (PAGE_SIZE - 1)) {
|
||||||
|
s->full = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
s->buffer[s->len++] = c;
|
s->buffer[s->len++] = c;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -196,9 +212,14 @@ int trace_seq_putc(struct trace_seq *s, unsigned char c)
|
||||||
|
|
||||||
int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len)
|
int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len)
|
||||||
{
|
{
|
||||||
if (len > ((PAGE_SIZE - 1) - s->len))
|
if (s->full)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (len > ((PAGE_SIZE - 1) - s->len)) {
|
||||||
|
s->full = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(s->buffer + s->len, mem, len);
|
memcpy(s->buffer + s->len, mem, len);
|
||||||
s->len += len;
|
s->len += len;
|
||||||
|
|
||||||
|
@ -211,6 +232,9 @@ int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, size_t len)
|
||||||
const unsigned char *data = mem;
|
const unsigned char *data = mem;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
|
if (s->full)
|
||||||
|
return 0;
|
||||||
|
|
||||||
#ifdef __BIG_ENDIAN
|
#ifdef __BIG_ENDIAN
|
||||||
for (i = 0, j = 0; i < len; i++) {
|
for (i = 0, j = 0; i < len; i++) {
|
||||||
#else
|
#else
|
||||||
|
@ -228,8 +252,13 @@ void *trace_seq_reserve(struct trace_seq *s, size_t len)
|
||||||
{
|
{
|
||||||
void *ret;
|
void *ret;
|
||||||
|
|
||||||
if (len > ((PAGE_SIZE - 1) - s->len))
|
if (s->full)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (len > ((PAGE_SIZE - 1) - s->len)) {
|
||||||
|
s->full = 1;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = s->buffer + s->len;
|
ret = s->buffer + s->len;
|
||||||
s->len += len;
|
s->len += len;
|
||||||
|
@ -241,8 +270,14 @@ int trace_seq_path(struct trace_seq *s, struct path *path)
|
||||||
{
|
{
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
|
|
||||||
if (s->len >= (PAGE_SIZE - 1))
|
if (s->full)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (s->len >= (PAGE_SIZE - 1)) {
|
||||||
|
s->full = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
p = d_path(path, s->buffer + s->len, PAGE_SIZE - s->len);
|
p = d_path(path, s->buffer + s->len, PAGE_SIZE - s->len);
|
||||||
if (!IS_ERR(p)) {
|
if (!IS_ERR(p)) {
|
||||||
p = mangle_path(s->buffer + s->len, p, "\n");
|
p = mangle_path(s->buffer + s->len, p, "\n");
|
||||||
|
@ -255,6 +290,7 @@ int trace_seq_path(struct trace_seq *s, struct path *path)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->full = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,6 +417,9 @@ int seq_print_user_ip(struct trace_seq *s, struct mm_struct *mm,
|
||||||
unsigned long vmstart = 0;
|
unsigned long vmstart = 0;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
|
||||||
|
if (s->full)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (mm) {
|
if (mm) {
|
||||||
const struct vm_area_struct *vma;
|
const struct vm_area_struct *vma;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue