Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: perf: x86: Add support for the ANY bit perf: Change the is_software_event() definition perf: Honour event state for aux stream data perf: Fix perf_event_do_pending() fallback callsite perf kmem: Print usage help for unknown commands perf kmem: Increase "Hit" column length hw-breakpoints, perf: Fix broken mmiotrace due to dr6 by reference change perf timechart: Use tid not pid for COMM change
This commit is contained in:
Коммит
e80b135985
|
@ -19,6 +19,7 @@
|
|||
#define MSR_ARCH_PERFMON_EVENTSEL1 0x187
|
||||
|
||||
#define ARCH_PERFMON_EVENTSEL0_ENABLE (1 << 22)
|
||||
#define ARCH_PERFMON_EVENTSEL_ANY (1 << 21)
|
||||
#define ARCH_PERFMON_EVENTSEL_INT (1 << 20)
|
||||
#define ARCH_PERFMON_EVENTSEL_OS (1 << 17)
|
||||
#define ARCH_PERFMON_EVENTSEL_USR (1 << 16)
|
||||
|
|
|
@ -1343,6 +1343,13 @@ intel_pmu_enable_fixed(struct hw_perf_event *hwc, int __idx)
|
|||
bits |= 0x2;
|
||||
if (hwc->config & ARCH_PERFMON_EVENTSEL_OS)
|
||||
bits |= 0x1;
|
||||
|
||||
/*
|
||||
* ANY bit is supported in v3 and up
|
||||
*/
|
||||
if (x86_pmu.version > 2 && hwc->config & ARCH_PERFMON_EVENTSEL_ANY)
|
||||
bits |= 0x4;
|
||||
|
||||
bits <<= (idx * 4);
|
||||
mask = 0xfULL << (idx * 4);
|
||||
|
||||
|
|
|
@ -538,14 +538,15 @@ static int
|
|||
kmmio_die_notifier(struct notifier_block *nb, unsigned long val, void *args)
|
||||
{
|
||||
struct die_args *arg = args;
|
||||
unsigned long* dr6_p = (unsigned long *)ERR_PTR(arg->err);
|
||||
|
||||
if (val == DIE_DEBUG && (arg->err & DR_STEP))
|
||||
if (post_kmmio_handler(arg->err, arg->regs) == 1) {
|
||||
if (val == DIE_DEBUG && (*dr6_p & DR_STEP))
|
||||
if (post_kmmio_handler(*dr6_p, arg->regs) == 1) {
|
||||
/*
|
||||
* Reset the BS bit in dr6 (pointed by args->err) to
|
||||
* denote completion of processing
|
||||
*/
|
||||
(*(unsigned long *)ERR_PTR(arg->err)) &= ~DR_STEP;
|
||||
*dr6_p &= ~DR_STEP;
|
||||
return NOTIFY_STOP;
|
||||
}
|
||||
|
||||
|
|
|
@ -814,9 +814,14 @@ extern int perf_event_overflow(struct perf_event *event, int nmi,
|
|||
*/
|
||||
static inline int is_software_event(struct perf_event *event)
|
||||
{
|
||||
return (event->attr.type != PERF_TYPE_RAW) &&
|
||||
(event->attr.type != PERF_TYPE_HARDWARE) &&
|
||||
(event->attr.type != PERF_TYPE_HW_CACHE);
|
||||
switch (event->attr.type) {
|
||||
case PERF_TYPE_SOFTWARE:
|
||||
case PERF_TYPE_TRACEPOINT:
|
||||
/* for now the breakpoint stuff also works as software event */
|
||||
case PERF_TYPE_BREAKPOINT:
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX];
|
||||
|
|
|
@ -3268,6 +3268,9 @@ static void perf_event_task_output(struct perf_event *event,
|
|||
|
||||
static int perf_event_task_match(struct perf_event *event)
|
||||
{
|
||||
if (event->state != PERF_EVENT_STATE_ACTIVE)
|
||||
return 0;
|
||||
|
||||
if (event->cpu != -1 && event->cpu != smp_processor_id())
|
||||
return 0;
|
||||
|
||||
|
@ -3377,6 +3380,9 @@ static void perf_event_comm_output(struct perf_event *event,
|
|||
|
||||
static int perf_event_comm_match(struct perf_event *event)
|
||||
{
|
||||
if (event->state != PERF_EVENT_STATE_ACTIVE)
|
||||
return 0;
|
||||
|
||||
if (event->cpu != -1 && event->cpu != smp_processor_id())
|
||||
return 0;
|
||||
|
||||
|
@ -3494,6 +3500,9 @@ static void perf_event_mmap_output(struct perf_event *event,
|
|||
static int perf_event_mmap_match(struct perf_event *event,
|
||||
struct perf_mmap_event *mmap_event)
|
||||
{
|
||||
if (event->state != PERF_EVENT_STATE_ACTIVE)
|
||||
return 0;
|
||||
|
||||
if (event->cpu != -1 && event->cpu != smp_processor_id())
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -1198,6 +1198,7 @@ void update_process_times(int user_tick)
|
|||
run_local_timers();
|
||||
rcu_check_callbacks(cpu, user_tick);
|
||||
printk_tick();
|
||||
perf_event_do_pending();
|
||||
scheduler_tick();
|
||||
run_posix_cpu_timers(p);
|
||||
}
|
||||
|
@ -1209,8 +1210,6 @@ static void run_timer_softirq(struct softirq_action *h)
|
|||
{
|
||||
struct tvec_base *base = __get_cpu_var(tvec_bases);
|
||||
|
||||
perf_event_do_pending();
|
||||
|
||||
hrtimer_run_pending();
|
||||
|
||||
if (time_after_eq(jiffies, base->timer_jiffies))
|
||||
|
|
|
@ -375,7 +375,7 @@ static void __print_result(struct rb_root *root, struct perf_session *session,
|
|||
|
||||
printf("%.102s\n", graph_dotted_line);
|
||||
printf(" %-34s |", is_caller ? "Callsite": "Alloc Ptr");
|
||||
printf(" Total_alloc/Per | Total_req/Per | Hit | Ping-pong | Frag\n");
|
||||
printf(" Total_alloc/Per | Total_req/Per | Hit | Ping-pong | Frag\n");
|
||||
printf("%.102s\n", graph_dotted_line);
|
||||
|
||||
next = rb_first(root);
|
||||
|
@ -401,7 +401,7 @@ static void __print_result(struct rb_root *root, struct perf_session *session,
|
|||
snprintf(buf, sizeof(buf), "%#Lx", addr);
|
||||
printf(" %-34s |", buf);
|
||||
|
||||
printf(" %9llu/%-5lu | %9llu/%-5lu | %6lu | %8lu | %6.3f%%\n",
|
||||
printf(" %9llu/%-5lu | %9llu/%-5lu | %8lu | %8lu | %6.3f%%\n",
|
||||
(unsigned long long)data->bytes_alloc,
|
||||
(unsigned long)data->bytes_alloc / data->hit,
|
||||
(unsigned long long)data->bytes_req,
|
||||
|
@ -784,7 +784,8 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __used)
|
|||
setup_sorting(&alloc_sort, default_sort_order);
|
||||
|
||||
return __cmd_kmem();
|
||||
}
|
||||
} else
|
||||
usage_with_options(kmem_usage, kmem_options);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -280,7 +280,7 @@ static u64 cpus_pstate_state[MAX_CPUS];
|
|||
|
||||
static int process_comm_event(event_t *event, struct perf_session *session __used)
|
||||
{
|
||||
pid_set_comm(event->comm.pid, event->comm.comm);
|
||||
pid_set_comm(event->comm.tid, event->comm.comm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче