Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9d05fda authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'x86-fixes-for-linus' of...

Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86: MCE: make cmci_discover_lock irq-safe
  x86: xen, i386: reserve Xen pagetables
  x86, kexec: fix crashdump panic with CONFIG_KEXEC_JUMP
  x86-64: finish cleanup_highmaps()'s job wrt. _brk_end
  x86: fix boot hang in early_reserve_e820()
  x86: Fix a typo in a printk message
  x86, srat: do not register nodes beyond e820 map
parents 825118d1 e5299926
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -151,10 +151,11 @@ static void print_update(char *type, int *hdr, int num)
static void cmci_discover(int banks, int boot)
{
	unsigned long *owned = (void *)&__get_cpu_var(mce_banks_owned);
	unsigned long flags;
	int hdr = 0;
	int i;

	spin_lock(&cmci_discover_lock);
	spin_lock_irqsave(&cmci_discover_lock, flags);
	for (i = 0; i < banks; i++) {
		u64 val;

@@ -184,7 +185,7 @@ static void cmci_discover(int banks, int boot)
			WARN_ON(!test_bit(i, __get_cpu_var(mce_poll_banks)));
		}
	}
	spin_unlock(&cmci_discover_lock);
	spin_unlock_irqrestore(&cmci_discover_lock, flags);
	if (hdr)
		printk(KERN_CONT "\n");
}
@@ -211,13 +212,14 @@ void cmci_recheck(void)
 */
void cmci_clear(void)
{
	unsigned long flags;
	int i;
	int banks;
	u64 val;

	if (!cmci_supported(&banks))
		return;
	spin_lock(&cmci_discover_lock);
	spin_lock_irqsave(&cmci_discover_lock, flags);
	for (i = 0; i < banks; i++) {
		if (!test_bit(i, __get_cpu_var(mce_banks_owned)))
			continue;
@@ -227,7 +229,7 @@ void cmci_clear(void)
		wrmsrl(MSR_IA32_MC0_CTL2 + i, val);
		__clear_bit(i, __get_cpu_var(mce_banks_owned));
	}
	spin_unlock(&cmci_discover_lock);
	spin_unlock_irqrestore(&cmci_discover_lock, flags);
}

/*
+6 −5
Original line number Diff line number Diff line
@@ -1074,12 +1074,13 @@ u64 __init early_reserve_e820(u64 startt, u64 sizet, u64 align)
	u64 addr;
	u64 start;

	start = startt;
	while (size < sizet && (start + 1))
	for (start = startt; ; start += size) {
		start = find_e820_area_size(start, &size, align);

	if (size < sizet)
		if (!(start + 1))
			return 0;
		if (size >= sizet)
			break;
	}

#ifdef CONFIG_X86_32
	if (start >= MAXMEM)
+2 −2
Original line number Diff line number Diff line
@@ -194,7 +194,7 @@ void machine_kexec(struct kimage *image)
				       unsigned int preserve_context);

#ifdef CONFIG_KEXEC_JUMP
	if (kexec_image->preserve_context)
	if (image->preserve_context)
		save_processor_state();
#endif

@@ -253,7 +253,7 @@ void machine_kexec(struct kimage *image)
					   image->preserve_context);

#ifdef CONFIG_KEXEC_JUMP
	if (kexec_image->preserve_context)
	if (image->preserve_context)
		restore_processor_state();
#endif

+2 −2
Original line number Diff line number Diff line
@@ -274,7 +274,7 @@ void machine_kexec(struct kimage *image)
	int save_ftrace_enabled;

#ifdef CONFIG_KEXEC_JUMP
	if (kexec_image->preserve_context)
	if (image->preserve_context)
		save_processor_state();
#endif

@@ -333,7 +333,7 @@ void machine_kexec(struct kimage *image)
				       image->preserve_context);

#ifdef CONFIG_KEXEC_JUMP
	if (kexec_image->preserve_context)
	if (image->preserve_context)
		restore_processor_state();
#endif

+17 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <asm/page.h>
#include <asm/page_types.h>
#include <asm/sections.h>
#include <asm/setup.h>
#include <asm/system.h>
#include <asm/tlbflush.h>

@@ -304,8 +305,23 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
#endif

#ifdef CONFIG_X86_64
	if (!after_bootmem)
	if (!after_bootmem && !start) {
		pud_t *pud;
		pmd_t *pmd;

		mmu_cr4_features = read_cr4();

		/*
		 * _brk_end cannot change anymore, but it and _end may be
		 * located on different 2M pages. cleanup_highmap(), however,
		 * can only consider _end when it runs, so destroy any
		 * mappings beyond _brk_end here.
		 */
		pud = pud_offset(pgd_offset_k(_brk_end), _brk_end);
		pmd = pmd_offset(pud, _brk_end - 1);
		while (++pmd <= pmd_offset(pud, (unsigned long)_end - 1))
			pmd_clear(pmd);
	}
#endif
	__flush_tlb_all();

Loading