mirror of https://gitee.com/openkylin/linux.git
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);
|
||||
|
||||
*((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)
|
||||
|
|
|
@ -600,4 +600,14 @@ int tick_broadcast_oneshot_active(void)
|
|||
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
|
||||
|
|
|
@ -51,7 +51,11 @@ int tick_is_oneshot_available(void)
|
|||
{
|
||||
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_broadcast_oneshot_active(void);
|
||||
extern void tick_check_oneshot_broadcast(int cpu);
|
||||
bool tick_broadcast_oneshot_available(void);
|
||||
# else /* BROADCAST */
|
||||
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 int tick_broadcast_oneshot_active(void) { return 0; }
|
||||
static inline void tick_check_oneshot_broadcast(int cpu) { }
|
||||
static inline bool tick_broadcast_oneshot_available(void) { return true; }
|
||||
# endif /* !BROADCAST */
|
||||
|
||||
#else /* !ONESHOT */
|
||||
|
@ -76,6 +78,7 @@ static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
|
|||
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 */
|
||||
|
||||
/*
|
||||
|
|
|
@ -264,9 +264,6 @@ pid_put_sample(int pid, int type, unsigned int cpu, u64 start, u64 end)
|
|||
c->start_time = start;
|
||||
if (p->start_time == 0 || p->start_time > start)
|
||||
p->start_time = start;
|
||||
|
||||
if (cpu > numcpus)
|
||||
numcpus = cpu;
|
||||
}
|
||||
|
||||
#define MAX_CPUS 4096
|
||||
|
@ -511,6 +508,9 @@ static int process_sample_event(event_t *event __used,
|
|||
if (!event_str)
|
||||
return 0;
|
||||
|
||||
if (sample->cpu > numcpus)
|
||||
numcpus = sample->cpu;
|
||||
|
||||
if (strcmp(event_str, "power:cpu_idle") == 0) {
|
||||
struct power_processor_entry *ppe = (void *)te;
|
||||
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;
|
||||
u64 period, total, period_sys, period_us, period_guest_sys, period_guest_us;
|
||||
u64 nr_events;
|
||||
const char *sep = symbol_conf.field_sep;
|
||||
int ret;
|
||||
|
||||
|
@ -593,6 +594,7 @@ int hist_entry__snprintf(struct hist_entry *self, char *s, size_t size,
|
|||
|
||||
if (pair_hists) {
|
||||
period = self->pair ? self->pair->period : 0;
|
||||
nr_events = self->pair ? self->pair->nr_events : 0;
|
||||
total = pair_hists->stats.total_period;
|
||||
period_sys = self->pair ? self->pair->period_sys : 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;
|
||||
} else {
|
||||
period = self->period;
|
||||
nr_events = self->nr_events;
|
||||
total = session_total;
|
||||
period_sys = self->period_sys;
|
||||
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 (sep)
|
||||
ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period);
|
||||
ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, nr_events);
|
||||
else
|
||||
ret += snprintf(s + ret, size - ret, "%11" PRIu64, period);
|
||||
ret += snprintf(s + ret, size - ret, "%11" PRIu64, nr_events);
|
||||
}
|
||||
|
||||
if (pair_hists) {
|
||||
|
|
|
@ -456,9 +456,9 @@ void svg_legenda(void)
|
|||
return;
|
||||
|
||||
svg_legenda_box(0, "Running", "sample");
|
||||
svg_legenda_box(100, "Idle","rect.c1");
|
||||
svg_legenda_box(200, "Deeper Idle", "rect.c3");
|
||||
svg_legenda_box(350, "Deepest Idle", "rect.c6");
|
||||
svg_legenda_box(100, "Idle","c1");
|
||||
svg_legenda_box(200, "Deeper Idle", "c3");
|
||||
svg_legenda_box(350, "Deepest Idle", "c6");
|
||||
svg_legenda_box(550, "Sleeping", "process2");
|
||||
svg_legenda_box(650, "Waiting for cpu", "waiting");
|
||||
svg_legenda_box(800, "Blocked on IO", "blocked");
|
||||
|
|
Loading…
Reference in New Issue