Merge branch 'tracing/urgent' into tracing/core
Merge reason: Pick up tracing/filters fix from the urgent queue,
we will queue up dependent patches.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
+9
-6
@@ -703,7 +703,7 @@ static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, int mode);
|
||||
static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry);
|
||||
static int cgroup_populate_dir(struct cgroup *cgrp);
|
||||
static const struct inode_operations cgroup_dir_inode_operations;
|
||||
static struct file_operations proc_cgroupstats_operations;
|
||||
static const struct file_operations proc_cgroupstats_operations;
|
||||
|
||||
static struct backing_dev_info cgroup_backing_dev_info = {
|
||||
.name = "cgroup",
|
||||
@@ -1863,7 +1863,7 @@ static int cgroup_seqfile_release(struct inode *inode, struct file *file)
|
||||
return single_release(inode, file);
|
||||
}
|
||||
|
||||
static struct file_operations cgroup_seqfile_operations = {
|
||||
static const struct file_operations cgroup_seqfile_operations = {
|
||||
.read = seq_read,
|
||||
.write = cgroup_file_write,
|
||||
.llseek = seq_lseek,
|
||||
@@ -1922,7 +1922,7 @@ static int cgroup_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
return simple_rename(old_dir, old_dentry, new_dir, new_dentry);
|
||||
}
|
||||
|
||||
static struct file_operations cgroup_file_operations = {
|
||||
static const struct file_operations cgroup_file_operations = {
|
||||
.read = cgroup_file_read,
|
||||
.write = cgroup_file_write,
|
||||
.llseek = generic_file_llseek,
|
||||
@@ -3369,7 +3369,7 @@ static int cgroup_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, proc_cgroup_show, pid);
|
||||
}
|
||||
|
||||
struct file_operations proc_cgroup_operations = {
|
||||
const struct file_operations proc_cgroup_operations = {
|
||||
.open = cgroup_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
@@ -3398,7 +3398,7 @@ static int cgroupstats_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, proc_cgroupstats_show, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations proc_cgroupstats_operations = {
|
||||
static const struct file_operations proc_cgroupstats_operations = {
|
||||
.open = cgroupstats_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
@@ -3708,8 +3708,10 @@ static void check_for_release(struct cgroup *cgrp)
|
||||
void __css_put(struct cgroup_subsys_state *css)
|
||||
{
|
||||
struct cgroup *cgrp = css->cgroup;
|
||||
int val;
|
||||
rcu_read_lock();
|
||||
if (atomic_dec_return(&css->refcnt) == 1) {
|
||||
val = atomic_dec_return(&css->refcnt);
|
||||
if (val == 1) {
|
||||
if (notify_on_release(cgrp)) {
|
||||
set_bit(CGRP_RELEASABLE, &cgrp->flags);
|
||||
check_for_release(cgrp);
|
||||
@@ -3717,6 +3719,7 @@ void __css_put(struct cgroup_subsys_state *css)
|
||||
cgroup_wakeup_rmdir_waiter(cgrp);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
WARN_ON_ONCE(val < 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+2
-2
@@ -1333,7 +1333,7 @@ static int __kprobes kprobes_open(struct inode *inode, struct file *filp)
|
||||
return seq_open(filp, &kprobes_seq_ops);
|
||||
}
|
||||
|
||||
static struct file_operations debugfs_kprobes_operations = {
|
||||
static const struct file_operations debugfs_kprobes_operations = {
|
||||
.open = kprobes_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
@@ -1515,7 +1515,7 @@ static ssize_t write_enabled_file_bool(struct file *file,
|
||||
return count;
|
||||
}
|
||||
|
||||
static struct file_operations fops_kp = {
|
||||
static const struct file_operations fops_kp = {
|
||||
.read = read_enabled_file_bool,
|
||||
.write = write_enabled_file_bool,
|
||||
};
|
||||
|
||||
+4
-3
@@ -1992,12 +1992,14 @@ static inline unsigned long layout_symtab(struct module *mod,
|
||||
Elf_Shdr *sechdrs,
|
||||
unsigned int symindex,
|
||||
unsigned int strindex,
|
||||
const Elf_Hdr *hdr,
|
||||
const Elf_Ehdr *hdr,
|
||||
const char *secstrings,
|
||||
unsigned long *pstroffs,
|
||||
unsigned long *strmap)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void add_kallsyms(struct module *mod,
|
||||
Elf_Shdr *sechdrs,
|
||||
unsigned int shnum,
|
||||
@@ -2081,9 +2083,8 @@ static noinline struct module *load_module(void __user *umod,
|
||||
struct module *mod;
|
||||
long err = 0;
|
||||
void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
unsigned long symoffs, stroffs, *strmap;
|
||||
#endif
|
||||
|
||||
mm_segment_t old_fs;
|
||||
|
||||
DEBUGP("load_module: umod=%p, len=%lu, uargs=%p\n",
|
||||
|
||||
@@ -93,7 +93,7 @@ static int rcudata_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, show_rcudata, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations rcudata_fops = {
|
||||
static const struct file_operations rcudata_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = rcudata_open,
|
||||
.read = seq_read,
|
||||
@@ -145,7 +145,7 @@ static int rcudata_csv_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, show_rcudata_csv, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations rcudata_csv_fops = {
|
||||
static const struct file_operations rcudata_csv_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = rcudata_csv_open,
|
||||
.read = seq_read,
|
||||
@@ -196,7 +196,7 @@ static int rcuhier_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, show_rcuhier, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations rcuhier_fops = {
|
||||
static const struct file_operations rcuhier_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = rcuhier_open,
|
||||
.read = seq_read,
|
||||
@@ -222,7 +222,7 @@ static int rcugp_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, show_rcugp, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations rcugp_fops = {
|
||||
static const struct file_operations rcugp_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = rcugp_open,
|
||||
.read = seq_read,
|
||||
@@ -276,7 +276,7 @@ static int rcu_pending_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, show_rcu_pending, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations rcu_pending_fops = {
|
||||
static const struct file_operations rcu_pending_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = rcu_pending_open,
|
||||
.read = seq_read,
|
||||
|
||||
+2
-16
@@ -37,27 +37,17 @@ int res_counter_charge_locked(struct res_counter *counter, unsigned long val)
|
||||
}
|
||||
|
||||
int res_counter_charge(struct res_counter *counter, unsigned long val,
|
||||
struct res_counter **limit_fail_at,
|
||||
struct res_counter **soft_limit_fail_at)
|
||||
struct res_counter **limit_fail_at)
|
||||
{
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
struct res_counter *c, *u;
|
||||
|
||||
*limit_fail_at = NULL;
|
||||
if (soft_limit_fail_at)
|
||||
*soft_limit_fail_at = NULL;
|
||||
local_irq_save(flags);
|
||||
for (c = counter; c != NULL; c = c->parent) {
|
||||
spin_lock(&c->lock);
|
||||
ret = res_counter_charge_locked(c, val);
|
||||
/*
|
||||
* With soft limits, we return the highest ancestor
|
||||
* that exceeds its soft limit
|
||||
*/
|
||||
if (soft_limit_fail_at &&
|
||||
!res_counter_soft_limit_check_locked(c))
|
||||
*soft_limit_fail_at = c;
|
||||
spin_unlock(&c->lock);
|
||||
if (ret < 0) {
|
||||
*limit_fail_at = c;
|
||||
@@ -85,8 +75,7 @@ void res_counter_uncharge_locked(struct res_counter *counter, unsigned long val)
|
||||
counter->usage -= val;
|
||||
}
|
||||
|
||||
void res_counter_uncharge(struct res_counter *counter, unsigned long val,
|
||||
bool *was_soft_limit_excess)
|
||||
void res_counter_uncharge(struct res_counter *counter, unsigned long val)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct res_counter *c;
|
||||
@@ -94,9 +83,6 @@ void res_counter_uncharge(struct res_counter *counter, unsigned long val,
|
||||
local_irq_save(flags);
|
||||
for (c = counter; c != NULL; c = c->parent) {
|
||||
spin_lock(&c->lock);
|
||||
if (was_soft_limit_excess)
|
||||
*was_soft_limit_excess =
|
||||
!res_counter_soft_limit_check_locked(c);
|
||||
res_counter_uncharge_locked(c, val);
|
||||
spin_unlock(&c->lock);
|
||||
}
|
||||
|
||||
+1
-1
@@ -780,7 +780,7 @@ static int sched_feat_open(struct inode *inode, struct file *filp)
|
||||
return single_open(filp, sched_feat_show, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations sched_feat_fops = {
|
||||
static const struct file_operations sched_feat_fops = {
|
||||
.open = sched_feat_open,
|
||||
.write = sched_feat_write,
|
||||
.read = seq_read,
|
||||
|
||||
@@ -275,7 +275,7 @@ static int timer_list_open(struct inode *inode, struct file *filp)
|
||||
return single_open(filp, timer_list_show, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations timer_list_fops = {
|
||||
static const struct file_operations timer_list_fops = {
|
||||
.open = timer_list_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
|
||||
@@ -395,7 +395,7 @@ static int tstats_open(struct inode *inode, struct file *filp)
|
||||
return single_open(filp, tstats_show, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations tstats_fops = {
|
||||
static const struct file_operations tstats_fops = {
|
||||
.open = tstats_open,
|
||||
.read = seq_read,
|
||||
.write = tstats_write,
|
||||
|
||||
+7
-16
@@ -1078,14 +1078,9 @@ static void ftrace_replace_code(int enable)
|
||||
failed = __ftrace_replace_code(rec, enable);
|
||||
if (failed) {
|
||||
rec->flags |= FTRACE_FL_FAILED;
|
||||
if ((system_state == SYSTEM_BOOTING) ||
|
||||
!core_kernel_text(rec->ip)) {
|
||||
ftrace_free_rec(rec);
|
||||
} else {
|
||||
ftrace_bug(failed, rec->ip);
|
||||
/* Stop processing */
|
||||
return;
|
||||
}
|
||||
ftrace_bug(failed, rec->ip);
|
||||
/* Stop processing */
|
||||
return;
|
||||
}
|
||||
} while_for_each_ftrace_rec();
|
||||
}
|
||||
@@ -2608,19 +2603,17 @@ static int ftrace_convert_nops(struct module *mod,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
void ftrace_release(void *start, void *end)
|
||||
void ftrace_release_mod(struct module *mod)
|
||||
{
|
||||
struct dyn_ftrace *rec;
|
||||
struct ftrace_page *pg;
|
||||
unsigned long s = (unsigned long)start;
|
||||
unsigned long e = (unsigned long)end;
|
||||
|
||||
if (ftrace_disabled || !start || start == end)
|
||||
if (ftrace_disabled)
|
||||
return;
|
||||
|
||||
mutex_lock(&ftrace_lock);
|
||||
do_for_each_ftrace_rec(pg, rec) {
|
||||
if ((rec->ip >= s) && (rec->ip < e)) {
|
||||
if (within_module_core(rec->ip, mod)) {
|
||||
/*
|
||||
* rec->ip is changed in ftrace_free_rec()
|
||||
* It should not between s and e if record was freed.
|
||||
@@ -2652,9 +2645,7 @@ static int ftrace_module_notify(struct notifier_block *self,
|
||||
mod->num_ftrace_callsites);
|
||||
break;
|
||||
case MODULE_STATE_GOING:
|
||||
ftrace_release(mod->ftrace_callsites,
|
||||
mod->ftrace_callsites +
|
||||
mod->num_ftrace_callsites);
|
||||
ftrace_release_mod(mod);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -1393,7 +1393,7 @@ int trace_array_vprintk(struct trace_array *tr,
|
||||
|
||||
int trace_vprintk(unsigned long ip, const char *fmt, va_list args)
|
||||
{
|
||||
return trace_array_printk(&global_trace, ip, fmt, args);
|
||||
return trace_array_vprintk(&global_trace, ip, fmt, args);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(trace_vprintk);
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect)
|
||||
struct trace_array *tr = branch_tracer;
|
||||
struct ring_buffer_event *event;
|
||||
struct trace_branch *entry;
|
||||
struct ring_buffer *buffer;
|
||||
unsigned long flags;
|
||||
int cpu, pc;
|
||||
const char *p;
|
||||
@@ -54,7 +55,8 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect)
|
||||
goto out;
|
||||
|
||||
pc = preempt_count();
|
||||
event = trace_buffer_lock_reserve(tr, TRACE_BRANCH,
|
||||
buffer = tr->buffer;
|
||||
event = trace_buffer_lock_reserve(buffer, TRACE_BRANCH,
|
||||
sizeof(*entry), flags, pc);
|
||||
if (!event)
|
||||
goto out;
|
||||
@@ -74,8 +76,8 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect)
|
||||
entry->line = f->line;
|
||||
entry->correct = val == expect;
|
||||
|
||||
if (!filter_check_discard(call, entry, tr->buffer, event))
|
||||
ring_buffer_unlock_commit(tr->buffer, event);
|
||||
if (!filter_check_discard(call, entry, buffer, event))
|
||||
ring_buffer_unlock_commit(buffer, event);
|
||||
|
||||
out:
|
||||
atomic_dec(&tr->data[cpu]->disabled);
|
||||
|
||||
@@ -31,7 +31,7 @@ static int ftrace_profile_enable_event(struct ftrace_event_call *event)
|
||||
if (atomic_inc_return(&event->profile_count))
|
||||
return 0;
|
||||
|
||||
if (!total_profile_count++) {
|
||||
if (!total_profile_count) {
|
||||
buf = (char *)alloc_percpu(profile_buf_t);
|
||||
if (!buf)
|
||||
goto fail_buf;
|
||||
@@ -46,14 +46,19 @@ static int ftrace_profile_enable_event(struct ftrace_event_call *event)
|
||||
}
|
||||
|
||||
ret = event->profile_enable();
|
||||
if (!ret)
|
||||
if (!ret) {
|
||||
total_profile_count++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
kfree(trace_profile_buf_nmi);
|
||||
fail_buf_nmi:
|
||||
kfree(trace_profile_buf);
|
||||
if (!total_profile_count) {
|
||||
free_percpu(trace_profile_buf_nmi);
|
||||
free_percpu(trace_profile_buf);
|
||||
trace_profile_buf_nmi = NULL;
|
||||
trace_profile_buf = NULL;
|
||||
}
|
||||
fail_buf:
|
||||
total_profile_count--;
|
||||
atomic_dec(&event->profile_count);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -1052,8 +1052,9 @@ static void postfix_clear(struct filter_parse_state *ps)
|
||||
|
||||
while (!list_empty(&ps->postfix)) {
|
||||
elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
|
||||
kfree(elt->operand);
|
||||
list_del(&elt->list);
|
||||
kfree(elt->operand);
|
||||
kfree(elt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -165,6 +165,7 @@ void trace_hw_branch(u64 from, u64 to)
|
||||
struct ftrace_event_call *call = &event_hw_branch;
|
||||
struct trace_array *tr = hw_branch_trace;
|
||||
struct ring_buffer_event *event;
|
||||
struct ring_buffer *buf;
|
||||
struct hw_branch_entry *entry;
|
||||
unsigned long irq1;
|
||||
int cpu;
|
||||
@@ -180,7 +181,8 @@ void trace_hw_branch(u64 from, u64 to)
|
||||
if (atomic_inc_return(&tr->data[cpu]->disabled) != 1)
|
||||
goto out;
|
||||
|
||||
event = trace_buffer_lock_reserve(tr, TRACE_HW_BRANCHES,
|
||||
buf = tr->buffer;
|
||||
event = trace_buffer_lock_reserve(buf, TRACE_HW_BRANCHES,
|
||||
sizeof(*entry), 0, 0);
|
||||
if (!event)
|
||||
goto out;
|
||||
@@ -189,8 +191,8 @@ void trace_hw_branch(u64 from, u64 to)
|
||||
entry->ent.type = TRACE_HW_BRANCHES;
|
||||
entry->from = from;
|
||||
entry->to = to;
|
||||
if (!filter_check_discard(call, entry, tr->buffer, event))
|
||||
trace_buffer_unlock_commit(tr, event, 0, 0);
|
||||
if (!filter_check_discard(call, entry, buf, event))
|
||||
trace_buffer_unlock_commit(buf, event, 0, 0);
|
||||
|
||||
out:
|
||||
atomic_dec(&tr->data[cpu]->disabled);
|
||||
|
||||
@@ -486,16 +486,18 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
|
||||
hardirq ? 'h' : softirq ? 's' : '.'))
|
||||
return 0;
|
||||
|
||||
if (entry->lock_depth < 0)
|
||||
ret = trace_seq_putc(s, '.');
|
||||
if (entry->preempt_count)
|
||||
ret = trace_seq_printf(s, "%x", entry->preempt_count);
|
||||
else
|
||||
ret = trace_seq_printf(s, "%d", entry->lock_depth);
|
||||
ret = trace_seq_putc(s, '.');
|
||||
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
if (entry->preempt_count)
|
||||
return trace_seq_printf(s, "%x", entry->preempt_count);
|
||||
return trace_seq_putc(s, '.');
|
||||
if (entry->lock_depth < 0)
|
||||
return trace_seq_putc(s, '.');
|
||||
|
||||
return trace_seq_printf(s, "%d", entry->lock_depth);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -883,7 +885,7 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S)
|
||||
trace_assign_type(field, iter->ent);
|
||||
|
||||
if (!S)
|
||||
task_state_char(field->prev_state);
|
||||
S = task_state_char(field->prev_state);
|
||||
T = task_state_char(field->next_state);
|
||||
if (!trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n",
|
||||
field->prev_pid,
|
||||
@@ -918,7 +920,7 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S)
|
||||
trace_assign_type(field, iter->ent);
|
||||
|
||||
if (!S)
|
||||
task_state_char(field->prev_state);
|
||||
S = task_state_char(field->prev_state);
|
||||
T = task_state_char(field->next_state);
|
||||
|
||||
SEQ_PUT_HEX_FIELD_RET(s, field->prev_pid);
|
||||
|
||||
Reference in New Issue
Block a user