Merge branches 'perf-fixes-for-linus', 'x86-fixes-for-linus' and 'timers-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 timechart: Fix max number of cpus perf timechart: Fix black idle boxes in the title perf hists: Print number of samples, not the period sum * 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: Use u32 instead of long to set reset vector back to 0 * 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: clockevents: Prevent oneshot mode when broadcast device is periodic
This commit is contained in:
commit
7f233dee21
|
@ -34,7 +34,7 @@ static inline void smpboot_restore_warm_reset_vector(void)
|
||||||
*/
|
*/
|
||||||
CMOS_WRITE(0, 0xf);
|
CMOS_WRITE(0, 0xf);
|
||||||
|
|
||||||
*((volatile long *)phys_to_virt(apic->trampoline_phys_low)) = 0;
|
*((volatile u32 *)phys_to_virt(apic->trampoline_phys_low)) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __init smpboot_setup_io_apic(void)
|
static inline void __init smpboot_setup_io_apic(void)
|
||||||
|
|
|
@ -600,4 +600,14 @@ int tick_broadcast_oneshot_active(void)
|
||||||
return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT;
|
return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check whether the broadcast device supports oneshot.
|
||||||
|
*/
|
||||||
|
bool tick_broadcast_oneshot_available(void)
|
||||||
|
{
|
||||||
|
struct clock_event_device *bc = tick_broadcast_device.evtdev;
|
||||||
|
|
||||||
|
return bc ? bc->features & CLOCK_EVT_FEAT_ONESHOT : false;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -51,7 +51,11 @@ int tick_is_oneshot_available(void)
|
||||||
{
|
{
|
||||||
struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev);
|
struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev);
|
||||||
|
|
||||||
return dev && (dev->features & CLOCK_EVT_FEAT_ONESHOT);
|
if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT))
|
||||||
|
return 0;
|
||||||
|
if (!(dev->features & CLOCK_EVT_FEAT_C3STOP))
|
||||||
|
return 1;
|
||||||
|
return tick_broadcast_oneshot_available();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -36,6 +36,7 @@ extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup);
|
||||||
extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc);
|
extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc);
|
||||||
extern int tick_broadcast_oneshot_active(void);
|
extern int tick_broadcast_oneshot_active(void);
|
||||||
extern void tick_check_oneshot_broadcast(int cpu);
|
extern void tick_check_oneshot_broadcast(int cpu);
|
||||||
|
bool tick_broadcast_oneshot_available(void);
|
||||||
# else /* BROADCAST */
|
# else /* BROADCAST */
|
||||||
static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
|
static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
|
||||||
{
|
{
|
||||||
|
@ -46,6 +47,7 @@ static inline void tick_broadcast_switch_to_oneshot(void) { }
|
||||||
static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
|
static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
|
||||||
static inline int tick_broadcast_oneshot_active(void) { return 0; }
|
static inline int tick_broadcast_oneshot_active(void) { return 0; }
|
||||||
static inline void tick_check_oneshot_broadcast(int cpu) { }
|
static inline void tick_check_oneshot_broadcast(int cpu) { }
|
||||||
|
static inline bool tick_broadcast_oneshot_available(void) { return true; }
|
||||||
# endif /* !BROADCAST */
|
# endif /* !BROADCAST */
|
||||||
|
|
||||||
#else /* !ONESHOT */
|
#else /* !ONESHOT */
|
||||||
|
@ -76,6 +78,7 @@ static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static inline int tick_broadcast_oneshot_active(void) { return 0; }
|
static inline int tick_broadcast_oneshot_active(void) { return 0; }
|
||||||
|
static inline bool tick_broadcast_oneshot_available(void) { return false; }
|
||||||
#endif /* !TICK_ONESHOT */
|
#endif /* !TICK_ONESHOT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -264,9 +264,6 @@ pid_put_sample(int pid, int type, unsigned int cpu, u64 start, u64 end)
|
||||||
c->start_time = start;
|
c->start_time = start;
|
||||||
if (p->start_time == 0 || p->start_time > start)
|
if (p->start_time == 0 || p->start_time > start)
|
||||||
p->start_time = start;
|
p->start_time = start;
|
||||||
|
|
||||||
if (cpu > numcpus)
|
|
||||||
numcpus = cpu;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_CPUS 4096
|
#define MAX_CPUS 4096
|
||||||
|
@ -511,6 +508,9 @@ static int process_sample_event(event_t *event __used,
|
||||||
if (!event_str)
|
if (!event_str)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (sample->cpu > numcpus)
|
||||||
|
numcpus = sample->cpu;
|
||||||
|
|
||||||
if (strcmp(event_str, "power:cpu_idle") == 0) {
|
if (strcmp(event_str, "power:cpu_idle") == 0) {
|
||||||
struct power_processor_entry *ppe = (void *)te;
|
struct power_processor_entry *ppe = (void *)te;
|
||||||
if (ppe->state == (u32)PWR_EVENT_EXIT)
|
if (ppe->state == (u32)PWR_EVENT_EXIT)
|
||||||
|
|
|
@ -585,6 +585,7 @@ int hist_entry__snprintf(struct hist_entry *self, char *s, size_t size,
|
||||||
{
|
{
|
||||||
struct sort_entry *se;
|
struct sort_entry *se;
|
||||||
u64 period, total, period_sys, period_us, period_guest_sys, period_guest_us;
|
u64 period, total, period_sys, period_us, period_guest_sys, period_guest_us;
|
||||||
|
u64 nr_events;
|
||||||
const char *sep = symbol_conf.field_sep;
|
const char *sep = symbol_conf.field_sep;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -593,6 +594,7 @@ int hist_entry__snprintf(struct hist_entry *self, char *s, size_t size,
|
||||||
|
|
||||||
if (pair_hists) {
|
if (pair_hists) {
|
||||||
period = self->pair ? self->pair->period : 0;
|
period = self->pair ? self->pair->period : 0;
|
||||||
|
nr_events = self->pair ? self->pair->nr_events : 0;
|
||||||
total = pair_hists->stats.total_period;
|
total = pair_hists->stats.total_period;
|
||||||
period_sys = self->pair ? self->pair->period_sys : 0;
|
period_sys = self->pair ? self->pair->period_sys : 0;
|
||||||
period_us = self->pair ? self->pair->period_us : 0;
|
period_us = self->pair ? self->pair->period_us : 0;
|
||||||
|
@ -600,6 +602,7 @@ int hist_entry__snprintf(struct hist_entry *self, char *s, size_t size,
|
||||||
period_guest_us = self->pair ? self->pair->period_guest_us : 0;
|
period_guest_us = self->pair ? self->pair->period_guest_us : 0;
|
||||||
} else {
|
} else {
|
||||||
period = self->period;
|
period = self->period;
|
||||||
|
nr_events = self->nr_events;
|
||||||
total = session_total;
|
total = session_total;
|
||||||
period_sys = self->period_sys;
|
period_sys = self->period_sys;
|
||||||
period_us = self->period_us;
|
period_us = self->period_us;
|
||||||
|
@ -640,9 +643,9 @@ int hist_entry__snprintf(struct hist_entry *self, char *s, size_t size,
|
||||||
|
|
||||||
if (symbol_conf.show_nr_samples) {
|
if (symbol_conf.show_nr_samples) {
|
||||||
if (sep)
|
if (sep)
|
||||||
ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period);
|
ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, nr_events);
|
||||||
else
|
else
|
||||||
ret += snprintf(s + ret, size - ret, "%11" PRIu64, period);
|
ret += snprintf(s + ret, size - ret, "%11" PRIu64, nr_events);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pair_hists) {
|
if (pair_hists) {
|
||||||
|
|
|
@ -456,9 +456,9 @@ void svg_legenda(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
svg_legenda_box(0, "Running", "sample");
|
svg_legenda_box(0, "Running", "sample");
|
||||||
svg_legenda_box(100, "Idle","rect.c1");
|
svg_legenda_box(100, "Idle","c1");
|
||||||
svg_legenda_box(200, "Deeper Idle", "rect.c3");
|
svg_legenda_box(200, "Deeper Idle", "c3");
|
||||||
svg_legenda_box(350, "Deepest Idle", "rect.c6");
|
svg_legenda_box(350, "Deepest Idle", "c6");
|
||||||
svg_legenda_box(550, "Sleeping", "process2");
|
svg_legenda_box(550, "Sleeping", "process2");
|
||||||
svg_legenda_box(650, "Waiting for cpu", "waiting");
|
svg_legenda_box(650, "Waiting for cpu", "waiting");
|
||||||
svg_legenda_box(800, "Blocked on IO", "blocked");
|
svg_legenda_box(800, "Blocked on IO", "blocked");
|
||||||
|
|
Loading…
Reference in New Issue