Browse Source

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

* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-tip:
  x86, irq: Check move_in_progress before freeing the vector mapping
  x86: copy_from_user() should not return -EFAULT
  Revert "x86: Side-step lguest problem by only building cmpxchg8b_emu for pre-Pentium"
  x86/pci: Intel ioh bus num reg accessing fix
  x86: Fix size for ex trampoline with 32bit
Linus Torvalds 15 years ago
parent
commit
80e23b7cea

+ 2 - 3
arch/x86/include/asm/uaccess_32.h

@@ -205,14 +205,13 @@ static inline unsigned long __must_check copy_from_user(void *to,
 					  unsigned long n)
 					  unsigned long n)
 {
 {
 	int sz = __compiletime_object_size(to);
 	int sz = __compiletime_object_size(to);
-	int ret = -EFAULT;
 
 
 	if (likely(sz == -1 || sz >= n))
 	if (likely(sz == -1 || sz >= n))
-		ret = _copy_from_user(to, from, n);
+		n = _copy_from_user(to, from, n);
 	else
 	else
 		copy_from_user_overflow();
 		copy_from_user_overflow();
 
 
-	return ret;
+	return n;
 }
 }
 
 
 long __must_check strncpy_from_user(char *dst, const char __user *src,
 long __must_check strncpy_from_user(char *dst, const char __user *src,

+ 2 - 3
arch/x86/include/asm/uaccess_64.h

@@ -30,16 +30,15 @@ static inline unsigned long __must_check copy_from_user(void *to,
 					  unsigned long n)
 					  unsigned long n)
 {
 {
 	int sz = __compiletime_object_size(to);
 	int sz = __compiletime_object_size(to);
-	int ret = -EFAULT;
 
 
 	might_fault();
 	might_fault();
 	if (likely(sz == -1 || sz >= n))
 	if (likely(sz == -1 || sz >= n))
-		ret = _copy_from_user(to, from, n);
+		n = _copy_from_user(to, from, n);
 #ifdef CONFIG_DEBUG_VM
 #ifdef CONFIG_DEBUG_VM
 	else
 	else
 		WARN(1, "Buffer overflow detected!\n");
 		WARN(1, "Buffer overflow detected!\n");
 #endif
 #endif
-	return ret;
+	return n;
 }
 }
 
 
 static __always_inline __must_check
 static __always_inline __must_check

+ 7 - 0
arch/x86/kernel/apic/io_apic.c

@@ -2434,6 +2434,13 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void)
 		cfg = irq_cfg(irq);
 		cfg = irq_cfg(irq);
 		raw_spin_lock(&desc->lock);
 		raw_spin_lock(&desc->lock);
 
 
+		/*
+		 * Check if the irq migration is in progress. If so, we
+		 * haven't received the cleanup request yet for this irq.
+		 */
+		if (cfg->move_in_progress)
+			goto unlock;
+
 		if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
 		if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
 			goto unlock;
 			goto unlock;
 
 

+ 2 - 2
arch/x86/kernel/e820.c

@@ -733,13 +733,13 @@ struct early_res {
 };
 };
 static struct early_res early_res[MAX_EARLY_RES] __initdata = {
 static struct early_res early_res[MAX_EARLY_RES] __initdata = {
 	{ 0, PAGE_SIZE, "BIOS data page", 1 },	/* BIOS data page */
 	{ 0, PAGE_SIZE, "BIOS data page", 1 },	/* BIOS data page */
-#ifdef CONFIG_X86_32
+#if defined(CONFIG_X86_32) && defined(CONFIG_X86_TRAMPOLINE)
 	/*
 	/*
 	 * But first pinch a few for the stack/trampoline stuff
 	 * But first pinch a few for the stack/trampoline stuff
 	 * FIXME: Don't need the extra page at 4K, but need to fix
 	 * FIXME: Don't need the extra page at 4K, but need to fix
 	 * trampoline before removing it. (see the GDT stuff)
 	 * trampoline before removing it. (see the GDT stuff)
 	 */
 	 */
-	{ PAGE_SIZE, PAGE_SIZE, "EX TRAMPOLINE", 1 },
+	{ PAGE_SIZE, PAGE_SIZE + PAGE_SIZE, "EX TRAMPOLINE", 1 },
 #endif
 #endif
 
 
 	{}
 	{}

+ 4 - 0
arch/x86/pci/intel_bus.c

@@ -49,6 +49,10 @@ static void __devinit pci_root_bus_res(struct pci_dev *dev)
 	u64 mmioh_base, mmioh_end;
 	u64 mmioh_base, mmioh_end;
 	int bus_base, bus_end;
 	int bus_base, bus_end;
 
 
+	/* some sys doesn't get mmconf enabled */
+	if (dev->cfg_size < 0x120)
+		return;
+
 	if (pci_root_num >= PCI_ROOT_NR) {
 	if (pci_root_num >= PCI_ROOT_NR) {
 		printk(KERN_DEBUG "intel_bus.c: PCI_ROOT_NR is too small\n");
 		printk(KERN_DEBUG "intel_bus.c: PCI_ROOT_NR is too small\n");
 		return;
 		return;