Merge branch 'perf/urgent' into perf/core
Conflicts: tools/perf/util/ui/browsers/hists.c Merge reason: fix the conflict and merge in changes for dependent patch. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
00e8976200
@ -102,6 +102,7 @@ static int op_create_counter(int cpu, int event)
|
|||||||
if (IS_ERR(pevent)) {
|
if (IS_ERR(pevent)) {
|
||||||
ret = PTR_ERR(pevent);
|
ret = PTR_ERR(pevent);
|
||||||
} else if (pevent->state != PERF_EVENT_STATE_ACTIVE) {
|
} else if (pevent->state != PERF_EVENT_STATE_ACTIVE) {
|
||||||
|
perf_event_release_kernel(pevent);
|
||||||
pr_warning("oprofile: failed to enable event %d "
|
pr_warning("oprofile: failed to enable event %d "
|
||||||
"on CPU %d\n", event, cpu);
|
"on CPU %d\n", event, cpu);
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
@ -365,6 +366,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|||||||
ret = init_driverfs();
|
ret = init_driverfs();
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(counter_config);
|
kfree(counter_config);
|
||||||
|
counter_config = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,7 +404,6 @@ void oprofile_arch_exit(void)
|
|||||||
struct perf_event *event;
|
struct perf_event *event;
|
||||||
|
|
||||||
if (*perf_events) {
|
if (*perf_events) {
|
||||||
exit_driverfs();
|
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
for (id = 0; id < perf_num_counters; ++id) {
|
for (id = 0; id < perf_num_counters; ++id) {
|
||||||
event = perf_events[cpu][id];
|
event = perf_events[cpu][id];
|
||||||
@ -413,8 +414,10 @@ void oprofile_arch_exit(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (counter_config)
|
if (counter_config) {
|
||||||
kfree(counter_config);
|
kfree(counter_config);
|
||||||
|
exit_driverfs();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||||
|
@ -11,6 +11,8 @@ ifdef CONFIG_FUNCTION_TRACER
|
|||||||
CFLAGS_REMOVE_tsc.o = -pg
|
CFLAGS_REMOVE_tsc.o = -pg
|
||||||
CFLAGS_REMOVE_rtc.o = -pg
|
CFLAGS_REMOVE_rtc.o = -pg
|
||||||
CFLAGS_REMOVE_paravirt-spinlocks.o = -pg
|
CFLAGS_REMOVE_paravirt-spinlocks.o = -pg
|
||||||
|
CFLAGS_REMOVE_pvclock.o = -pg
|
||||||
|
CFLAGS_REMOVE_kvmclock.o = -pg
|
||||||
CFLAGS_REMOVE_ftrace.o = -pg
|
CFLAGS_REMOVE_ftrace.o = -pg
|
||||||
CFLAGS_REMOVE_early_printk.o = -pg
|
CFLAGS_REMOVE_early_printk.o = -pg
|
||||||
endif
|
endif
|
||||||
|
@ -102,6 +102,7 @@ struct cpu_hw_events {
|
|||||||
*/
|
*/
|
||||||
struct perf_event *events[X86_PMC_IDX_MAX]; /* in counter order */
|
struct perf_event *events[X86_PMC_IDX_MAX]; /* in counter order */
|
||||||
unsigned long active_mask[BITS_TO_LONGS(X86_PMC_IDX_MAX)];
|
unsigned long active_mask[BITS_TO_LONGS(X86_PMC_IDX_MAX)];
|
||||||
|
unsigned long running[BITS_TO_LONGS(X86_PMC_IDX_MAX)];
|
||||||
int enabled;
|
int enabled;
|
||||||
|
|
||||||
int n_events;
|
int n_events;
|
||||||
@ -1034,6 +1035,7 @@ static void x86_pmu_start(struct perf_event *event, int flags)
|
|||||||
|
|
||||||
cpuc->events[idx] = event;
|
cpuc->events[idx] = event;
|
||||||
__set_bit(idx, cpuc->active_mask);
|
__set_bit(idx, cpuc->active_mask);
|
||||||
|
__set_bit(idx, cpuc->running);
|
||||||
x86_pmu.enable(event);
|
x86_pmu.enable(event);
|
||||||
perf_event_update_userpage(event);
|
perf_event_update_userpage(event);
|
||||||
}
|
}
|
||||||
@ -1159,8 +1161,16 @@ static int x86_pmu_handle_irq(struct pt_regs *regs)
|
|||||||
cpuc = &__get_cpu_var(cpu_hw_events);
|
cpuc = &__get_cpu_var(cpu_hw_events);
|
||||||
|
|
||||||
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||||
if (!test_bit(idx, cpuc->active_mask))
|
if (!test_bit(idx, cpuc->active_mask)) {
|
||||||
|
/*
|
||||||
|
* Though we deactivated the counter some cpus
|
||||||
|
* might still deliver spurious interrupts still
|
||||||
|
* in flight. Catch them:
|
||||||
|
*/
|
||||||
|
if (__test_and_clear_bit(idx, cpuc->running))
|
||||||
|
handled++;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
event = cpuc->events[idx];
|
event = cpuc->events[idx];
|
||||||
hwc = &event->hw;
|
hwc = &event->hw;
|
||||||
|
@ -904,8 +904,12 @@ static int p4_pmu_handle_irq(struct pt_regs *regs)
|
|||||||
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||||
int overflow;
|
int overflow;
|
||||||
|
|
||||||
if (!test_bit(idx, cpuc->active_mask))
|
if (!test_bit(idx, cpuc->active_mask)) {
|
||||||
|
/* catch in-flight IRQs */
|
||||||
|
if (__test_and_clear_bit(idx, cpuc->running))
|
||||||
|
handled++;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
event = cpuc->events[idx];
|
event = cpuc->events[idx];
|
||||||
hwc = &event->hw;
|
hwc = &event->hw;
|
||||||
|
@ -674,6 +674,7 @@ static int __init ppro_init(char **cpu_type)
|
|||||||
case 0x0f:
|
case 0x0f:
|
||||||
case 0x16:
|
case 0x16:
|
||||||
case 0x17:
|
case 0x17:
|
||||||
|
case 0x1d:
|
||||||
*cpu_type = "i386/core_2";
|
*cpu_type = "i386/core_2";
|
||||||
break;
|
break;
|
||||||
case 0x1a:
|
case 0x1a:
|
||||||
|
@ -1035,7 +1035,7 @@ builtin-revert.o wt-status.o: wt-status.h
|
|||||||
# we compile into subdirectories. if the target directory is not the source directory, they might not exists. So
|
# we compile into subdirectories. if the target directory is not the source directory, they might not exists. So
|
||||||
# we depend the various files onto their directories.
|
# we depend the various files onto their directories.
|
||||||
DIRECTORY_DEPS = $(LIB_OBJS) $(BUILTIN_OBJS) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h
|
DIRECTORY_DEPS = $(LIB_OBJS) $(BUILTIN_OBJS) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h
|
||||||
$(DIRECTORY_DEPS): $(sort $(dir $(DIRECTORY_DEPS)))
|
$(DIRECTORY_DEPS): | $(sort $(dir $(DIRECTORY_DEPS)))
|
||||||
# In the second step, we make a rule to actually create these directories
|
# In the second step, we make a rule to actually create these directories
|
||||||
$(sort $(dir $(DIRECTORY_DEPS))):
|
$(sort $(dir $(DIRECTORY_DEPS))):
|
||||||
$(QUIET_MKDIR)$(MKDIR) -p $@ 2>/dev/null
|
$(QUIET_MKDIR)$(MKDIR) -p $@ 2>/dev/null
|
||||||
|
@ -97,7 +97,7 @@ void setup_python_scripting(void)
|
|||||||
register_python_scripting(&python_scripting_unsupported_ops);
|
register_python_scripting(&python_scripting_unsupported_ops);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
struct scripting_ops python_scripting_ops;
|
extern struct scripting_ops python_scripting_ops;
|
||||||
|
|
||||||
void setup_python_scripting(void)
|
void setup_python_scripting(void)
|
||||||
{
|
{
|
||||||
@ -158,7 +158,7 @@ void setup_perl_scripting(void)
|
|||||||
register_perl_scripting(&perl_scripting_unsupported_ops);
|
register_perl_scripting(&perl_scripting_unsupported_ops);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
struct scripting_ops perl_scripting_ops;
|
extern struct scripting_ops perl_scripting_ops;
|
||||||
|
|
||||||
void setup_perl_scripting(void)
|
void setup_perl_scripting(void)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user