Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 158396
b: refs/heads/master
c: 3adc54f
h: refs/heads/master
v: v3
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed Jul 7, 2009
1 parent fe11a4c commit 85ceb36
Show file tree
Hide file tree
Showing 10 changed files with 113 additions and 104 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a35780005eb256eb5ec83ffcc802967295887a45
refs/heads/master: 3adc54fa82a68be1cd1ac82ad786ee362796e50a
41 changes: 28 additions & 13 deletions trunk/kernel/trace/kmemtrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ struct kmemtrace_user_event_alloc {
};

static enum print_line_t
kmemtrace_print_alloc(struct trace_iterator *iter, int flags)
kmemtrace_print_alloc_user(struct trace_iterator *iter, int flags)
{
struct trace_seq *s = &iter->seq;
struct kmemtrace_alloc_entry *entry;
Expand All @@ -259,7 +259,7 @@ kmemtrace_print_alloc(struct trace_iterator *iter, int flags)
}

static enum print_line_t
kmemtrace_print_free(struct trace_iterator *iter, int flags)
kmemtrace_print_free_user(struct trace_iterator *iter, int flags)
{
struct trace_seq *s = &iter->seq;
struct kmemtrace_free_entry *entry;
Expand All @@ -277,7 +277,7 @@ kmemtrace_print_free(struct trace_iterator *iter, int flags)
}

static enum print_line_t
kmemtrace_print_alloc_user(struct trace_iterator *iter, int flags)
kmemtrace_print_alloc_user_bin(struct trace_iterator *iter, int flags)
{
struct trace_seq *s = &iter->seq;
struct kmemtrace_alloc_entry *entry;
Expand Down Expand Up @@ -311,7 +311,7 @@ kmemtrace_print_alloc_user(struct trace_iterator *iter, int flags)
}

static enum print_line_t
kmemtrace_print_free_user(struct trace_iterator *iter, int flags)
kmemtrace_print_free_user_bin(struct trace_iterator *iter, int flags)
{
struct trace_seq *s = &iter->seq;
struct kmemtrace_free_entry *entry;
Expand Down Expand Up @@ -389,12 +389,19 @@ kmemtrace_print_alloc_compress(struct trace_iterator *iter)
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;

/* Node and call site*/
ret = trace_seq_printf(s, "%4d %pf\n", entry->node,
(void *)entry->call_site);
/* Node */
ret = trace_seq_printf(s, "%4d ", entry->node);
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;

/* Call site */
ret = seq_print_ip_sym(s, entry->call_site, 0);
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;

if (!trace_seq_printf(s, "\n"))
return TRACE_TYPE_PARTIAL_LINE;

return TRACE_TYPE_HANDLED;
}

Expand Down Expand Up @@ -440,11 +447,19 @@ kmemtrace_print_free_compress(struct trace_iterator *iter)
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;

/* Skip node and print call site*/
ret = trace_seq_printf(s, " %pf\n", (void *)entry->call_site);
/* Skip node */
ret = trace_seq_printf(s, " ");
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;

/* Call site */
ret = seq_print_ip_sym(s, entry->call_site, 0);
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;

if (!trace_seq_printf(s, "\n"))
return TRACE_TYPE_PARTIAL_LINE;

return TRACE_TYPE_HANDLED;
}

Expand All @@ -467,14 +482,14 @@ static enum print_line_t kmemtrace_print_line(struct trace_iterator *iter)

static struct trace_event kmem_trace_alloc = {
.type = TRACE_KMEM_ALLOC,
.trace = kmemtrace_print_alloc,
.binary = kmemtrace_print_alloc_user,
.trace = kmemtrace_print_alloc_user,
.binary = kmemtrace_print_alloc_user_bin,
};

static struct trace_event kmem_trace_free = {
.type = TRACE_KMEM_FREE,
.trace = kmemtrace_print_free,
.binary = kmemtrace_print_free_user,
.trace = kmemtrace_print_free_user,
.binary = kmemtrace_print_free_user_bin,
};

static struct tracer kmem_tracer __read_mostly = {
Expand Down
49 changes: 32 additions & 17 deletions trunk/kernel/trace/ring_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ struct ring_buffer_per_cpu {
spinlock_t reader_lock; /* serialize readers */
raw_spinlock_t lock;
struct lock_class_key lock_key;
struct list_head pages;
struct list_head *pages;
struct buffer_page *head_page; /* read from head */
struct buffer_page *tail_page; /* write to tail */
struct buffer_page *commit_page; /* committed pages */
Expand Down Expand Up @@ -498,7 +498,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_normalize_time_stamp);
*/
static int rb_check_pages(struct ring_buffer_per_cpu *cpu_buffer)
{
struct list_head *head = &cpu_buffer->pages;
struct list_head *head = cpu_buffer->pages;
struct buffer_page *bpage, *tmp;

if (RB_WARN_ON(cpu_buffer, head->next->prev != head))
Expand All @@ -521,12 +521,13 @@ static int rb_check_pages(struct ring_buffer_per_cpu *cpu_buffer)
static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
unsigned nr_pages)
{
struct list_head *head = &cpu_buffer->pages;
struct buffer_page *bpage, *tmp;
unsigned long addr;
LIST_HEAD(pages);
unsigned i;

WARN_ON(!nr_pages);

for (i = 0; i < nr_pages; i++) {
bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()),
GFP_KERNEL, cpu_to_node(cpu_buffer->cpu));
Expand All @@ -541,7 +542,13 @@ static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
rb_init_page(bpage->page);
}

list_splice(&pages, head);
/*
* The ring buffer page list is a circular list that does not
* start and end with a list head. All page list items point to
* other pages.
*/
cpu_buffer->pages = pages.next;
list_del(&pages);

rb_check_pages(cpu_buffer);

Expand Down Expand Up @@ -573,7 +580,6 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)
spin_lock_init(&cpu_buffer->reader_lock);
lockdep_set_class(&cpu_buffer->reader_lock, buffer->reader_lock_key);
cpu_buffer->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
INIT_LIST_HEAD(&cpu_buffer->pages);

bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()),
GFP_KERNEL, cpu_to_node(cpu));
Expand All @@ -594,7 +600,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)
goto fail_free_reader;

cpu_buffer->head_page
= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
= list_entry(cpu_buffer->pages, struct buffer_page, list);
cpu_buffer->tail_page = cpu_buffer->commit_page = cpu_buffer->head_page;

return cpu_buffer;
Expand All @@ -609,15 +615,20 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)

static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
{
struct list_head *head = &cpu_buffer->pages;
struct list_head *head = cpu_buffer->pages;
struct buffer_page *bpage, *tmp;

free_buffer_page(cpu_buffer->reader_page);

list_for_each_entry_safe(bpage, tmp, head, list) {
list_del_init(&bpage->list);
if (head) {
list_for_each_entry_safe(bpage, tmp, head, list) {
list_del_init(&bpage->list);
free_buffer_page(bpage);
}
bpage = list_entry(head, struct buffer_page, list);
free_buffer_page(bpage);
}

kfree(cpu_buffer);
}

Expand Down Expand Up @@ -760,14 +771,14 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages)
synchronize_sched();

for (i = 0; i < nr_pages; i++) {
if (RB_WARN_ON(cpu_buffer, list_empty(&cpu_buffer->pages)))
if (RB_WARN_ON(cpu_buffer, list_empty(cpu_buffer->pages)))
return;
p = cpu_buffer->pages.next;
p = cpu_buffer->pages->next;
bpage = list_entry(p, struct buffer_page, list);
list_del_init(&bpage->list);
free_buffer_page(bpage);
}
if (RB_WARN_ON(cpu_buffer, list_empty(&cpu_buffer->pages)))
if (RB_WARN_ON(cpu_buffer, list_empty(cpu_buffer->pages)))
return;

rb_reset_cpu(cpu_buffer);
Expand Down Expand Up @@ -795,7 +806,7 @@ rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer,
p = pages->next;
bpage = list_entry(p, struct buffer_page, list);
list_del_init(&bpage->list);
list_add_tail(&bpage->list, &cpu_buffer->pages);
list_add_tail(&bpage->list, cpu_buffer->pages);
}
rb_reset_cpu(cpu_buffer);

Expand Down Expand Up @@ -992,9 +1003,6 @@ static inline void rb_inc_page(struct ring_buffer_per_cpu *cpu_buffer,
{
struct list_head *p = (*bpage)->list.next;

if (p == &cpu_buffer->pages)
p = p->next;

*bpage = list_entry(p, struct buffer_page, list);
}

Expand Down Expand Up @@ -2247,6 +2255,13 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
cpu_buffer->reader_page->list.next = reader->list.next;
cpu_buffer->reader_page->list.prev = reader->list.prev;

/*
* cpu_buffer->pages just needs to point to the buffer, it
* has no specific buffer page to point to. Lets move it out
* of our way so we don't accidently swap it.
*/
cpu_buffer->pages = reader->list.prev;

local_set(&cpu_buffer->reader_page->write, 0);
local_set(&cpu_buffer->reader_page->entries, 0);
local_set(&cpu_buffer->reader_page->page->commit, 0);
Expand Down Expand Up @@ -2719,7 +2734,7 @@ static void
rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
{
cpu_buffer->head_page
= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
= list_entry(cpu_buffer->pages, struct buffer_page, list);
local_set(&cpu_buffer->head_page->write, 0);
local_set(&cpu_buffer->head_page->entries, 0);
local_set(&cpu_buffer->head_page->page->commit, 0);
Expand Down
1 change: 0 additions & 1 deletion trunk/kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -757,7 +757,6 @@ struct event_subsystem {
const char *name;
struct dentry *entry;
void *filter;
int nr_events;
};

struct filter_pred;
Expand Down
32 changes: 1 addition & 31 deletions trunk/kernel/trace/trace_events.c
Original file line number Diff line number Diff line change
Expand Up @@ -851,10 +851,8 @@ event_subsystem_dir(const char *name, struct dentry *d_events)

/* First see if we did not already create this dir */
list_for_each_entry(system, &event_subsystems, list) {
if (strcmp(system->name, name) == 0) {
system->nr_events++;
if (strcmp(system->name, name) == 0)
return system->entry;
}
}

/* need to create new entry */
Expand All @@ -873,7 +871,6 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
return d_events;
}

system->nr_events = 1;
system->name = kstrdup(name, GFP_KERNEL);
if (!system->name) {
debugfs_remove(system->entry);
Expand Down Expand Up @@ -908,32 +905,6 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
return system->entry;
}

static void remove_subsystem_dir(const char *name)
{
struct event_subsystem *system;

if (strcmp(name, TRACE_SYSTEM) == 0)
return;

list_for_each_entry(system, &event_subsystems, list) {
if (strcmp(system->name, name) == 0) {
if (!--system->nr_events) {
struct event_filter *filter = system->filter;

debugfs_remove_recursive(system->entry);
list_del(&system->list);
if (filter) {
kfree(filter->filter_string);
kfree(filter);
}
kfree(system->name);
kfree(system);
}
break;
}
}
}

static int
event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
const struct file_operations *id,
Expand Down Expand Up @@ -1108,7 +1079,6 @@ static void trace_module_remove_events(struct module *mod)
list_del(&call->list);
trace_destroy_fields(call);
destroy_preds(call);
remove_subsystem_dir(call->system);
}
}

Expand Down
39 changes: 33 additions & 6 deletions trunk/kernel/trace/trace_events_filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,17 @@ EXPORT_SYMBOL_GPL(init_preds);

static void filter_free_subsystem_preds(struct event_subsystem *system)
{
struct event_filter *filter = system->filter;
struct ftrace_event_call *call;
int i;

if (filter->n_preds) {
for (i = 0; i < filter->n_preds; i++)
filter_free_pred(filter->preds[i]);
kfree(filter->preds);
filter->preds = NULL;
filter->n_preds = 0;
}

list_for_each_entry(call, &ftrace_events, list) {
if (!call->define_fields)
Expand Down Expand Up @@ -597,9 +607,26 @@ static int filter_add_subsystem_pred(struct filter_parse_state *ps,
struct filter_pred *pred,
char *filter_string)
{
struct event_filter *filter = system->filter;
struct ftrace_event_call *call;
int err = 0;

if (!filter->preds) {
filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred),
GFP_KERNEL);

if (!filter->preds)
return -ENOMEM;
}

if (filter->n_preds == MAX_FILTER_PRED) {
parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
return -ENOSPC;
}

filter->preds[filter->n_preds] = pred;
filter->n_preds++;

list_for_each_entry(call, &ftrace_events, list) {

if (!call->define_fields)
Expand Down Expand Up @@ -1002,12 +1029,12 @@ static int replace_preds(struct event_subsystem *system,

if (elt->op == OP_AND || elt->op == OP_OR) {
pred = create_logical_pred(elt->op);
if (call)
if (call) {
err = filter_add_pred(ps, call, pred);
else
filter_free_pred(pred);
} else
err = filter_add_subsystem_pred(ps, system,
pred, filter_string);
filter_free_pred(pred);
if (err)
return err;

Expand All @@ -1021,12 +1048,12 @@ static int replace_preds(struct event_subsystem *system,
}

pred = create_pred(elt->op, operand1, operand2);
if (call)
if (call) {
err = filter_add_pred(ps, call, pred);
else
filter_free_pred(pred);
} else
err = filter_add_subsystem_pred(ps, system, pred,
filter_string);
filter_free_pred(pred);
if (err)
return err;

Expand Down
Loading

0 comments on commit 85ceb36

Please sign in to comment.