Commit 8816ead9 authored by Linus Torvalds's avatar Linus Torvalds

Merge branches 'perf-urgent-for-linus', 'sched-urgent-for-linus',...

Merge branches 'perf-urgent-for-linus', 'sched-urgent-for-linus', 'timers-urgent-for-linus' and 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  tools/perf: Fix static build of perf tool
  tracing: Fix regression in printk_formats file

* 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  generic-ipi: Fix kexec boot crash by initializing call_single_queue before enabling interrupts

* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  clocksource: Make watchdog robust vs. interruption
  timerfd: Fix wakeup of processes when timer is cancelled on clock change

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, MAINTAINERS: Add x86 MCE people
  x86, efi: Do not reserve boot services regions within reserved areas
...@@ -7007,6 +7007,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86. ...@@ -7007,6 +7007,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.
S: Maintained S: Maintained
F: drivers/platform/x86 F: drivers/platform/x86
X86 MCE INFRASTRUCTURE
M: Tony Luck <tony.luck@intel.com>
M: Borislav Petkov <bp@amd64.org>
L: linux-edac@vger.kernel.org
S: Maintained
F: arch/x86/kernel/cpu/mcheck/*
XEN HYPERVISOR INTERFACE XEN HYPERVISOR INTERFACE
M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#define ARCH_DISCARD_MEMBLOCK #define ARCH_DISCARD_MEMBLOCK
u64 memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align); u64 memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align);
void memblock_x86_to_bootmem(u64 start, u64 end);
void memblock_x86_reserve_range(u64 start, u64 end, char *name); void memblock_x86_reserve_range(u64 start, u64 end, char *name);
void memblock_x86_free_range(u64 start, u64 end); void memblock_x86_free_range(u64 start, u64 end);
...@@ -19,5 +18,6 @@ u64 memblock_x86_hole_size(u64 start, u64 end); ...@@ -19,5 +18,6 @@ u64 memblock_x86_hole_size(u64 start, u64 end);
u64 memblock_x86_find_in_range_node(int nid, u64 start, u64 end, u64 size, u64 align); u64 memblock_x86_find_in_range_node(int nid, u64 start, u64 end, u64 size, u64 align);
u64 memblock_x86_free_memory_in_range(u64 addr, u64 limit); u64 memblock_x86_free_memory_in_range(u64 addr, u64 limit);
u64 memblock_x86_memory_in_range(u64 addr, u64 limit); u64 memblock_x86_memory_in_range(u64 addr, u64 limit);
bool memblock_x86_check_reserved_size(u64 *addrp, u64 *sizep, u64 align);
#endif #endif
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include <linux/range.h> #include <linux/range.h>
/* Check for already reserved areas */ /* Check for already reserved areas */
static bool __init check_with_memblock_reserved_size(u64 *addrp, u64 *sizep, u64 align) bool __init memblock_x86_check_reserved_size(u64 *addrp, u64 *sizep, u64 align)
{ {
struct memblock_region *r; struct memblock_region *r;
u64 addr = *addrp, last; u64 addr = *addrp, last;
...@@ -59,7 +59,7 @@ u64 __init memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align) ...@@ -59,7 +59,7 @@ u64 __init memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align)
if (addr >= ei_last) if (addr >= ei_last)
continue; continue;
*sizep = ei_last - addr; *sizep = ei_last - addr;
while (check_with_memblock_reserved_size(&addr, sizep, align)) while (memblock_x86_check_reserved_size(&addr, sizep, align))
; ;
if (*sizep) if (*sizep)
......
...@@ -310,14 +310,31 @@ void __init efi_reserve_boot_services(void) ...@@ -310,14 +310,31 @@ void __init efi_reserve_boot_services(void)
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
efi_memory_desc_t *md = p; efi_memory_desc_t *md = p;
unsigned long long start = md->phys_addr; u64 start = md->phys_addr;
unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; u64 size = md->num_pages << EFI_PAGE_SHIFT;
if (md->type != EFI_BOOT_SERVICES_CODE && if (md->type != EFI_BOOT_SERVICES_CODE &&
md->type != EFI_BOOT_SERVICES_DATA) md->type != EFI_BOOT_SERVICES_DATA)
continue; continue;
/* Only reserve where possible:
memblock_x86_reserve_range(start, start + size, "EFI Boot"); * - Not within any already allocated areas
* - Not over any memory area (really needed, if above?)
* - Not within any part of the kernel
* - Not the bios reserved area
*/
if ((start+size >= virt_to_phys(_text)
&& start <= virt_to_phys(_end)) ||
!e820_all_mapped(start, start+size, E820_RAM) ||
memblock_x86_check_reserved_size(&start, &size,
1<<EFI_PAGE_SHIFT)) {
/* Could not reserve, skip it */
md->num_pages = 0;
memblock_dbg(PFX "Could not reserve boot range "
"[0x%010llx-0x%010llx]\n",
start, start+size-1);
} else
memblock_x86_reserve_range(start, start+size,
"EFI Boot");
} }
} }
...@@ -334,6 +351,10 @@ static void __init efi_free_boot_services(void) ...@@ -334,6 +351,10 @@ static void __init efi_free_boot_services(void)
md->type != EFI_BOOT_SERVICES_DATA) md->type != EFI_BOOT_SERVICES_DATA)
continue; continue;
/* Could not reserve boot area */
if (!size)
continue;
free_bootmem_late(start, size); free_bootmem_late(start, size);
} }
} }
......
...@@ -61,7 +61,9 @@ static enum hrtimer_restart timerfd_tmrproc(struct hrtimer *htmr) ...@@ -61,7 +61,9 @@ static enum hrtimer_restart timerfd_tmrproc(struct hrtimer *htmr)
/* /*
* Called when the clock was set to cancel the timers in the cancel * Called when the clock was set to cancel the timers in the cancel
* list. * list. This will wake up processes waiting on these timers. The
* wake-up requires ctx->ticks to be non zero, therefore we increment
* it before calling wake_up_locked().
*/ */
void timerfd_clock_was_set(void) void timerfd_clock_was_set(void)
{ {
...@@ -76,6 +78,7 @@ void timerfd_clock_was_set(void) ...@@ -76,6 +78,7 @@ void timerfd_clock_was_set(void)
spin_lock_irqsave(&ctx->wqh.lock, flags); spin_lock_irqsave(&ctx->wqh.lock, flags);
if (ctx->moffs.tv64 != moffs.tv64) { if (ctx->moffs.tv64 != moffs.tv64) {
ctx->moffs.tv64 = KTIME_MAX; ctx->moffs.tv64 = KTIME_MAX;
ctx->ticks++;
wake_up_locked(&ctx->wqh); wake_up_locked(&ctx->wqh);
} }
spin_unlock_irqrestore(&ctx->wqh.lock, flags); spin_unlock_irqrestore(&ctx->wqh.lock, flags);
......
...@@ -188,6 +188,7 @@ struct clocksource { ...@@ -188,6 +188,7 @@ struct clocksource {
#ifdef CONFIG_CLOCKSOURCE_WATCHDOG #ifdef CONFIG_CLOCKSOURCE_WATCHDOG
/* Watchdog related data, used by the framework */ /* Watchdog related data, used by the framework */
struct list_head wd_list; struct list_head wd_list;
cycle_t cs_last;
cycle_t wd_last; cycle_t wd_last;
#endif #endif
} ____cacheline_aligned; } ____cacheline_aligned;
......
...@@ -85,12 +85,15 @@ int smp_call_function_any(const struct cpumask *mask, ...@@ -85,12 +85,15 @@ int smp_call_function_any(const struct cpumask *mask,
* Generic and arch helpers * Generic and arch helpers
*/ */
#ifdef CONFIG_USE_GENERIC_SMP_HELPERS #ifdef CONFIG_USE_GENERIC_SMP_HELPERS
void __init call_function_init(void);
void generic_smp_call_function_single_interrupt(void); void generic_smp_call_function_single_interrupt(void);
void generic_smp_call_function_interrupt(void); void generic_smp_call_function_interrupt(void);
void ipi_call_lock(void); void ipi_call_lock(void);
void ipi_call_unlock(void); void ipi_call_unlock(void);
void ipi_call_lock_irq(void); void ipi_call_lock_irq(void);
void ipi_call_unlock_irq(void); void ipi_call_unlock_irq(void);
#else
static inline void call_function_init(void) { }
#endif #endif
/* /*
...@@ -134,7 +137,7 @@ static inline void smp_send_reschedule(int cpu) { } ...@@ -134,7 +137,7 @@ static inline void smp_send_reschedule(int cpu) { }
#define smp_prepare_boot_cpu() do {} while (0) #define smp_prepare_boot_cpu() do {} while (0)
#define smp_call_function_many(mask, func, info, wait) \ #define smp_call_function_many(mask, func, info, wait) \
(up_smp_call_function(func, info)) (up_smp_call_function(func, info))
static inline void init_call_single_data(void) { } static inline void call_function_init(void) { }
static inline int static inline int
smp_call_function_any(const struct cpumask *mask, smp_call_func_t func, smp_call_function_any(const struct cpumask *mask, smp_call_func_t func,
......
...@@ -542,6 +542,7 @@ asmlinkage void __init start_kernel(void) ...@@ -542,6 +542,7 @@ asmlinkage void __init start_kernel(void)
timekeeping_init(); timekeeping_init();
time_init(); time_init();
profile_init(); profile_init();
call_function_init();
if (!irqs_disabled()) if (!irqs_disabled())
printk(KERN_CRIT "start_kernel(): bug: interrupts were " printk(KERN_CRIT "start_kernel(): bug: interrupts were "
"enabled early\n"); "enabled early\n");
......
...@@ -74,7 +74,7 @@ static struct notifier_block __cpuinitdata hotplug_cfd_notifier = { ...@@ -74,7 +74,7 @@ static struct notifier_block __cpuinitdata hotplug_cfd_notifier = {
.notifier_call = hotplug_cfd, .notifier_call = hotplug_cfd,
}; };
static int __cpuinit init_call_single_data(void) void __init call_function_init(void)
{ {
void *cpu = (void *)(long)smp_processor_id(); void *cpu = (void *)(long)smp_processor_id();
int i; int i;
...@@ -88,10 +88,7 @@ static int __cpuinit init_call_single_data(void) ...@@ -88,10 +88,7 @@ static int __cpuinit init_call_single_data(void)
hotplug_cfd(&hotplug_cfd_notifier, CPU_UP_PREPARE, cpu); hotplug_cfd(&hotplug_cfd_notifier, CPU_UP_PREPARE, cpu);
register_cpu_notifier(&hotplug_cfd_notifier); register_cpu_notifier(&hotplug_cfd_notifier);
return 0;
} }
early_initcall(init_call_single_data);
/* /*
* csd_lock/csd_unlock used to serialize access to per-cpu csd resources * csd_lock/csd_unlock used to serialize access to per-cpu csd resources
......
...@@ -185,7 +185,6 @@ static struct clocksource *watchdog; ...@@ -185,7 +185,6 @@ static struct clocksource *watchdog;
static struct timer_list watchdog_timer; static struct timer_list watchdog_timer;
static DECLARE_WORK(watchdog_work, clocksource_watchdog_work); static DECLARE_WORK(watchdog_work, clocksource_watchdog_work);
static DEFINE_SPINLOCK(watchdog_lock); static DEFINE_SPINLOCK(watchdog_lock);
static cycle_t watchdog_last;
static int watchdog_running; static int watchdog_running;
static int clocksource_watchdog_kthread(void *data); static int clocksource_watchdog_kthread(void *data);
...@@ -254,11 +253,6 @@ static void clocksource_watchdog(unsigned long data) ...@@ -254,11 +253,6 @@ static void clocksource_watchdog(unsigned long data)
if (!watchdog_running) if (!watchdog_running)
goto out; goto out;
wdnow = watchdog->read(watchdog);
wd_nsec = clocksource_cyc2ns((wdnow - watchdog_last) & watchdog->mask,
watchdog->mult, watchdog->shift);
watchdog_last = wdnow;
list_for_each_entry(cs, &watchdog_list, wd_list) { list_for_each_entry(cs, &watchdog_list, wd_list) {
/* Clocksource already marked unstable? */ /* Clocksource already marked unstable? */
...@@ -268,19 +262,28 @@ static void clocksource_watchdog(unsigned long data) ...@@ -268,19 +262,28 @@ static void clocksource_watchdog(unsigned long data)
continue; continue;
} }
local_irq_disable();
csnow = cs->read(cs); csnow = cs->read(cs);
wdnow = watchdog->read(watchdog);
local_irq_enable();
/* Clocksource initialized ? */ /* Clocksource initialized ? */
if (!(cs->flags & CLOCK_SOURCE_WATCHDOG)) { if (!(cs->flags & CLOCK_SOURCE_WATCHDOG)) {
cs->flags |= CLOCK_SOURCE_WATCHDOG; cs->flags |= CLOCK_SOURCE_WATCHDOG;
cs->wd_last = csnow; cs->wd_last = wdnow;
cs->cs_last = csnow;
continue; continue;
} }
/* Check the deviation from the watchdog clocksource. */ wd_nsec = clocksource_cyc2ns((wdnow - cs->wd_last) & watchdog->mask,
cs_nsec = clocksource_cyc2ns((csnow - cs->wd_last) & watchdog->mult, watchdog->shift);
cs_nsec = clocksource_cyc2ns((csnow - cs->cs_last) &
cs->mask, cs->mult, cs->shift); cs->mask, cs->mult, cs->shift);
cs->wd_last = csnow; cs->cs_last = csnow;
cs->wd_last = wdnow;
/* Check the deviation from the watchdog clocksource. */
if (abs(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD) { if (abs(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD) {
clocksource_unstable(cs, cs_nsec - wd_nsec); clocksource_unstable(cs, cs_nsec - wd_nsec);
continue; continue;
...@@ -318,7 +321,6 @@ static inline void clocksource_start_watchdog(void) ...@@ -318,7 +321,6 @@ static inline void clocksource_start_watchdog(void)
return; return;
init_timer(&watchdog_timer); init_timer(&watchdog_timer);
watchdog_timer.function = clocksource_watchdog; watchdog_timer.function = clocksource_watchdog;
watchdog_last = watchdog->read(watchdog);
watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL; watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL;
add_timer_on(&watchdog_timer, cpumask_first(cpu_online_mask)); add_timer_on(&watchdog_timer, cpumask_first(cpu_online_mask));
watchdog_running = 1; watchdog_running = 1;
......
...@@ -240,13 +240,10 @@ static const char **find_next(void *v, loff_t *pos) ...@@ -240,13 +240,10 @@ static const char **find_next(void *v, loff_t *pos)
const char **fmt = v; const char **fmt = v;
int start_index; int start_index;
if (!fmt)
fmt = __start___trace_bprintk_fmt + *pos;
start_index = __stop___trace_bprintk_fmt - __start___trace_bprintk_fmt; start_index = __stop___trace_bprintk_fmt - __start___trace_bprintk_fmt;
if (*pos < start_index) if (*pos < start_index)
return fmt; return __start___trace_bprintk_fmt + *pos;
return find_next_mod_format(start_index, v, fmt, pos); return find_next_mod_format(start_index, v, fmt, pos);
} }
......
...@@ -633,7 +633,7 @@ prefix_SQ = $(subst ','\'',$(prefix)) ...@@ -633,7 +633,7 @@ prefix_SQ = $(subst ','\'',$(prefix))
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive $(EXTLIBS) LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group
ALL_CFLAGS += $(BASIC_CFLAGS) ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_CFLAGS += $(ARCH_CFLAGS) ALL_CFLAGS += $(ARCH_CFLAGS)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment