Merge branch 'perf/urgent' into perf/core
Merge reason: we need to queue up dependent patch Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -306,7 +306,7 @@ int capable(int cap)
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (security_capable(cap) == 0) {
|
||||
if (security_capable(current_cred(), cap) == 0) {
|
||||
current->flags |= PF_SUPERPRIV;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -851,6 +851,10 @@ retry:
|
||||
raw_spin_unlock_irq(&ctx->lock);
|
||||
}
|
||||
|
||||
#define MAX_INTERRUPTS (~0ULL)
|
||||
|
||||
static void perf_log_throttle(struct perf_event *event, int enable);
|
||||
|
||||
static int
|
||||
event_sched_in(struct perf_event *event,
|
||||
struct perf_cpu_context *cpuctx,
|
||||
@@ -863,6 +867,17 @@ event_sched_in(struct perf_event *event,
|
||||
|
||||
event->state = PERF_EVENT_STATE_ACTIVE;
|
||||
event->oncpu = smp_processor_id();
|
||||
|
||||
/*
|
||||
* Unthrottle events, since we scheduled we might have missed several
|
||||
* ticks already, also for a heavily scheduling task there is little
|
||||
* guarantee it'll get a tick in a timely manner.
|
||||
*/
|
||||
if (unlikely(event->hw.interrupts == MAX_INTERRUPTS)) {
|
||||
perf_log_throttle(event, 1);
|
||||
event->hw.interrupts = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The new state must be visible before we turn it on in the hardware:
|
||||
*/
|
||||
@@ -1661,10 +1676,6 @@ void __perf_event_task_sched_in(struct task_struct *task)
|
||||
}
|
||||
}
|
||||
|
||||
#define MAX_INTERRUPTS (~0ULL)
|
||||
|
||||
static void perf_log_throttle(struct perf_event *event, int enable);
|
||||
|
||||
static u64 perf_calculate_period(struct perf_event *event, u64 nsec, u64 count)
|
||||
{
|
||||
u64 frequency = event->attr.sample_freq;
|
||||
|
||||
@@ -262,25 +262,47 @@ int dmesg_restrict = 1;
|
||||
int dmesg_restrict;
|
||||
#endif
|
||||
|
||||
static int syslog_action_restricted(int type)
|
||||
{
|
||||
if (dmesg_restrict)
|
||||
return 1;
|
||||
/* Unless restricted, we allow "read all" and "get buffer size" for everybody */
|
||||
return type != SYSLOG_ACTION_READ_ALL && type != SYSLOG_ACTION_SIZE_BUFFER;
|
||||
}
|
||||
|
||||
static int check_syslog_permissions(int type, bool from_file)
|
||||
{
|
||||
/*
|
||||
* If this is from /proc/kmsg and we've already opened it, then we've
|
||||
* already done the capabilities checks at open time.
|
||||
*/
|
||||
if (from_file && type != SYSLOG_ACTION_OPEN)
|
||||
return 0;
|
||||
|
||||
if (syslog_action_restricted(type)) {
|
||||
if (capable(CAP_SYSLOG))
|
||||
return 0;
|
||||
/* For historical reasons, accept CAP_SYS_ADMIN too, with a warning */
|
||||
if (capable(CAP_SYS_ADMIN)) {
|
||||
WARN_ONCE(1, "Attempt to access syslog with CAP_SYS_ADMIN "
|
||||
"but no CAP_SYSLOG (deprecated).\n");
|
||||
return 0;
|
||||
}
|
||||
return -EPERM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int do_syslog(int type, char __user *buf, int len, bool from_file)
|
||||
{
|
||||
unsigned i, j, limit, count;
|
||||
int do_clear = 0;
|
||||
char c;
|
||||
int error = 0;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* If this is from /proc/kmsg we only do the capabilities checks
|
||||
* at open time.
|
||||
*/
|
||||
if (type == SYSLOG_ACTION_OPEN || !from_file) {
|
||||
if (dmesg_restrict && !capable(CAP_SYSLOG))
|
||||
goto warn; /* switch to return -EPERM after 2.6.39 */
|
||||
if ((type != SYSLOG_ACTION_READ_ALL &&
|
||||
type != SYSLOG_ACTION_SIZE_BUFFER) &&
|
||||
!capable(CAP_SYSLOG))
|
||||
goto warn; /* switch to return -EPERM after 2.6.39 */
|
||||
}
|
||||
error = check_syslog_permissions(type, from_file);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
error = security_syslog(type);
|
||||
if (error)
|
||||
@@ -423,12 +445,6 @@ int do_syslog(int type, char __user *buf, int len, bool from_file)
|
||||
}
|
||||
out:
|
||||
return error;
|
||||
warn:
|
||||
/* remove after 2.6.39 */
|
||||
if (capable(CAP_SYS_ADMIN))
|
||||
WARN_ONCE(1, "Attempt to access syslog with CAP_SYS_ADMIN "
|
||||
"but no CAP_SYSLOG (deprecated and denied).\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
|
||||
|
||||
@@ -313,7 +313,7 @@ int ptrace_detach(struct task_struct *child, unsigned int data)
|
||||
child->exit_code = data;
|
||||
dead = __ptrace_detach(current, child);
|
||||
if (!child->exit_state)
|
||||
wake_up_process(child);
|
||||
wake_up_state(child, TASK_TRACED | TASK_STOPPED);
|
||||
}
|
||||
write_unlock_irq(&tasklist_lock);
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ static void print_name_offset(struct seq_file *m, void *sym)
|
||||
char symname[KSYM_NAME_LEN];
|
||||
|
||||
if (lookup_symbol_name((unsigned long)sym, symname) < 0)
|
||||
SEQ_printf(m, "<%p>", sym);
|
||||
SEQ_printf(m, "<%pK>", sym);
|
||||
else
|
||||
SEQ_printf(m, "%s", symname);
|
||||
}
|
||||
@@ -112,7 +112,7 @@ next_one:
|
||||
static void
|
||||
print_base(struct seq_file *m, struct hrtimer_clock_base *base, u64 now)
|
||||
{
|
||||
SEQ_printf(m, " .base: %p\n", base);
|
||||
SEQ_printf(m, " .base: %pK\n", base);
|
||||
SEQ_printf(m, " .index: %d\n",
|
||||
base->index);
|
||||
SEQ_printf(m, " .resolution: %Lu nsecs\n",
|
||||
|
||||
@@ -959,7 +959,7 @@ EXPORT_SYMBOL(try_to_del_timer_sync);
|
||||
*
|
||||
* Synchronization rules: Callers must prevent restarting of the timer,
|
||||
* otherwise this function is meaningless. It must not be called from
|
||||
* hardirq contexts. The caller must not hold locks which would prevent
|
||||
* interrupt contexts. The caller must not hold locks which would prevent
|
||||
* completion of the timer's handler. The timer's handler must not call
|
||||
* add_timer_on(). Upon exit the timer is not queued and the handler is
|
||||
* not running on any CPU.
|
||||
@@ -971,12 +971,10 @@ int del_timer_sync(struct timer_list *timer)
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
unsigned long flags;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
local_bh_disable();
|
||||
local_irq_save(flags);
|
||||
lock_map_acquire(&timer->lockdep_map);
|
||||
lock_map_release(&timer->lockdep_map);
|
||||
_local_bh_enable();
|
||||
raw_local_irq_restore(flags);
|
||||
local_irq_restore(flags);
|
||||
#endif
|
||||
/*
|
||||
* don't use it in hardirq context, because it
|
||||
|
||||
@@ -138,6 +138,13 @@ void __trace_note_message(struct blk_trace *bt, const char *fmt, ...)
|
||||
!blk_tracer_enabled))
|
||||
return;
|
||||
|
||||
/*
|
||||
* If the BLK_TC_NOTIFY action mask isn't set, don't send any note
|
||||
* message to the trace.
|
||||
*/
|
||||
if (!(bt->act_mask & BLK_TC_NOTIFY))
|
||||
return;
|
||||
|
||||
local_irq_save(flags);
|
||||
buf = per_cpu_ptr(bt->msg_data, smp_processor_id());
|
||||
va_start(args, fmt);
|
||||
|
||||
Reference in New Issue
Block a user