]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 6 Nov 2008 23:57:24 +0000 (15:57 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 6 Nov 2008 23:57:24 +0000 (15:57 -0800)
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  Revert "x86: default to reboot via ACPI"
  x86: align DirectMap in /proc/meminfo
  AMD IOMMU: fix lazy IO/TLB flushing in unmap path
  x86: add smp_mb() before sending INVALIDATE_TLB_VECTOR
  x86: remove VISWS and PARAVIRT around NR_IRQS puzzle
  x86: mention ACPI in top-level Kconfig menu
  x86: size NR_IRQS on 32-bit systems the same way as 64-bit
  x86: don't allow nr_irqs > NR_IRQS
  x86/docs: remove noirqbalance param docs
  x86: don't use tsc_khz to calculate lpj if notsc is passed
  x86, voyager: fix smp_intr_init() compile breakage
  AMD IOMMU: fix detection of NP capable IOMMUs

13 files changed:
Documentation/kernel-parameters.txt
arch/x86/Kconfig
arch/x86/include/asm/irq_vectors.h
arch/x86/include/asm/voyager.h
arch/x86/kernel/amd_iommu.c
arch/x86/kernel/io_apic.c
arch/x86/kernel/reboot.c
arch/x86/kernel/tlb_32.c
arch/x86/kernel/tlb_64.c
arch/x86/kernel/tsc.c
arch/x86/mach-voyager/setup.c
arch/x86/mach-voyager/voyager_smp.c
arch/x86/mm/pageattr.c

index 8a8cb0ccc5f4e2c7515a00cb861882f88771c85a..c86c074597129a5b4434b0e35c432a0a28636b11 100644 (file)
@@ -1472,8 +1472,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        Valid arguments: on, off
                        Default: on
 
-       noirqbalance    [X86-32,SMP,KNL] Disable kernel irq balancing
-
        noirqdebug      [X86-32] Disables the code which attempts to detect and
                        disable unhandled interrupt sources.
 
index e60c59b81bdd78b2f29607d0ceb5b8ecc48c86b6..4cf0ab13d187a943f88afc1d9761c739fee41008 100644 (file)
@@ -1494,7 +1494,7 @@ config HAVE_ARCH_EARLY_PFN_TO_NID
        def_bool X86_64
        depends on NUMA
 
-menu "Power management options"
+menu "Power management and ACPI options"
        depends on !X86_VOYAGER
 
 config ARCH_HIBERNATION_HEADER
index d843ed0e9b2ee49b2cc6bd8843cefe545bd0f0ce..0005adb0f941f5f564cbad634538db8b149f0f46 100644 (file)
 #define LAST_VM86_IRQ          15
 #define invalid_vm86_irq(irq)  ((irq) < 3 || (irq) > 15)
 
-#ifdef CONFIG_X86_64
+#if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER)
 # if NR_CPUS < MAX_IO_APICS
 #  define NR_IRQS (NR_VECTORS + (32 * NR_CPUS))
 # else
 #  define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS))
 # endif
 
-#elif !defined(CONFIG_X86_VOYAGER)
+#elif defined(CONFIG_X86_VOYAGER)
 
-# if defined(CONFIG_X86_IO_APIC) || defined(CONFIG_PARAVIRT) || defined(CONFIG_X86_VISWS)
-
-#  define NR_IRQS              224
-
-# else /* IO_APIC || PARAVIRT */
-
-#  define NR_IRQS              16
-
-# endif
+# define NR_IRQS               224
 
-#else /* !VISWS && !VOYAGER */
+#else /* IO_APIC || VOYAGER */
 
-# define NR_IRQS               224
+# define NR_IRQS               16
 
-#endif /* VISWS */
+#endif
 
 /* Voyager specific defines */
 /* These define the CPIs we use in linux */
index 9c811d2e6f91bf1398c21173876177b9f0520eff..b3e647307625d5c035b92f5c1da4641f6d9f3fad 100644 (file)
@@ -520,6 +520,7 @@ extern void voyager_restart(void);
 extern void voyager_cat_power_off(void);
 extern void voyager_cat_do_common_interrupt(void);
 extern void voyager_handle_nmi(void);
+extern void voyager_smp_intr_init(void);
 /* Commands for the following are */
 #define        VOYAGER_PSI_READ        0
 #define VOYAGER_PSI_WRITE      1
index a8fd9ebdc8e25232e66b4d28a10edc0a70b8b151..331b318304eb180d5e4f022253360d2c4efc49e6 100644 (file)
@@ -50,7 +50,7 @@ static int dma_ops_unity_map(struct dma_ops_domain *dma_dom,
 /* returns !0 if the IOMMU is caching non-present entries in its TLB */
 static int iommu_has_npcache(struct amd_iommu *iommu)
 {
-       return iommu->cap & IOMMU_CAP_NPCACHE;
+       return iommu->cap & (1UL << IOMMU_CAP_NPCACHE);
 }
 
 /****************************************************************************
@@ -536,6 +536,9 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom,
 {
        address >>= PAGE_SHIFT;
        iommu_area_free(dom->bitmap, address, pages);
+
+       if (address + pages >= dom->next_bit)
+               dom->need_flush = true;
 }
 
 /****************************************************************************
@@ -992,8 +995,10 @@ static void __unmap_single(struct amd_iommu *iommu,
 
        dma_ops_free_addresses(dma_dom, dma_addr, pages);
 
-       if (amd_iommu_unmap_flush)
+       if (amd_iommu_unmap_flush || dma_dom->need_flush) {
                iommu_flush_pages(iommu, dma_dom->domain.id, dma_addr, size);
+               dma_dom->need_flush = false;
+       }
 }
 
 /*
index b764d7429c6168a4eb70b151dc3b07cd553f8afd..7a3f2028e2eb9e01a757a93b0de5b2e4f77f3634 100644 (file)
@@ -3611,6 +3611,8 @@ int __init probe_nr_irqs(void)
        /* something wrong ? */
        if (nr < nr_min)
                nr = nr_min;
+       if (WARN_ON(nr > NR_IRQS))
+               nr = NR_IRQS;
 
        return nr;
 }
index f4c93f1cfc194767285bec90047c5db7ed13b758..724adfc63cb9a7b60d6ee5c82efd919fe237f69c 100644 (file)
@@ -29,11 +29,7 @@ EXPORT_SYMBOL(pm_power_off);
 
 static const struct desc_ptr no_idt = {};
 static int reboot_mode;
-/*
- * Keyboard reset and triple fault may result in INIT, not RESET, which
- * doesn't work when we're in vmx root mode.  Try ACPI first.
- */
-enum reboot_type reboot_type = BOOT_ACPI;
+enum reboot_type reboot_type = BOOT_KBD;
 int reboot_force;
 
 #if defined(CONFIG_X86_32) && defined(CONFIG_SMP)
index e00534b3353483dc67bc8282b839c5257a16ca72..f4049f3513b6b5e01e71523a5490fbedd5db9992 100644 (file)
@@ -154,6 +154,12 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm,
        flush_mm = mm;
        flush_va = va;
        cpus_or(flush_cpumask, cpumask, flush_cpumask);
+
+       /*
+        * Make the above memory operations globally visible before
+        * sending the IPI.
+        */
+       smp_mb();
        /*
         * We have to send the IPI only to
         * CPUs affected.
index dcbf7a1159eaf25713b83f6eaf83b1d9379a1fe7..8f919ca69494d62541453202b27f4ec13903d2f8 100644 (file)
@@ -182,6 +182,11 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm,
        f->flush_va = va;
        cpus_or(f->flush_cpumask, cpumask, f->flush_cpumask);
 
+       /*
+        * Make the above memory operations globally visible before
+        * sending the IPI.
+        */
+       smp_mb();
        /*
         * We have to send the IPI only to
         * CPUs affected.
index 62348e4fd8d1e6af29d04726499b13794a78949e..2ef80e30192571a633f8fb3fb858c20207b9d4d7 100644 (file)
@@ -813,10 +813,6 @@ void __init tsc_init(void)
                cpu_khz = calibrate_cpu();
 #endif
 
-       lpj = ((u64)tsc_khz * 1000);
-       do_div(lpj, HZ);
-       lpj_fine = lpj;
-
        printk("Detected %lu.%03lu MHz processor.\n",
                        (unsigned long)cpu_khz / 1000,
                        (unsigned long)cpu_khz % 1000);
@@ -836,6 +832,10 @@ void __init tsc_init(void)
        /* now allow native_sched_clock() to use rdtsc */
        tsc_disabled = 0;
 
+       lpj = ((u64)tsc_khz * 1000);
+       do_div(lpj, HZ);
+       lpj_fine = lpj;
+
        use_tsc_delay();
        /* Check and install the TSC clocksource */
        dmi_check_system(bad_tsc_dmi_table);
index 6bbdd633864cc34f8ded68bc37d9bdde0d7e8a1f..a580b9562e76cc078ab3fd0b2b90c722d10fdf01 100644 (file)
@@ -27,7 +27,7 @@ static struct irqaction irq2 = {
 void __init intr_init_hook(void)
 {
 #ifdef CONFIG_SMP
-       smp_intr_init();
+       voyager_smp_intr_init();
 #endif
 
        setup_irq(2, &irq2);
index 7f4c6af143515af7633e79ddfbe65d6ab6dc98fb..0e331652681e4a247122f2381861b0403f88b93c 100644 (file)
@@ -1258,7 +1258,7 @@ static void handle_vic_irq(unsigned int irq, struct irq_desc *desc)
 #define QIC_SET_GATE(cpi, vector) \
        set_intr_gate((cpi) + QIC_DEFAULT_CPI_BASE, (vector))
 
-void __init smp_intr_init(void)
+void __init voyager_smp_intr_init(void)
 {
        int i;
 
index f1dc1b75d166696628a02ea473a5bdbc0dcaabe5..e89d24815f26760370a17616e7f0ed4e1d57cfd2 100644 (file)
@@ -67,18 +67,18 @@ static void split_page_count(int level)
 
 void arch_report_meminfo(struct seq_file *m)
 {
-       seq_printf(m, "DirectMap4k:  %8lu kB\n",
+       seq_printf(m, "DirectMap4k:    %8lu kB\n",
                        direct_pages_count[PG_LEVEL_4K] << 2);
 #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
-       seq_printf(m, "DirectMap2M:  %8lu kB\n",
+       seq_printf(m, "DirectMap2M:    %8lu kB\n",
                        direct_pages_count[PG_LEVEL_2M] << 11);
 #else
-       seq_printf(m, "DirectMap4M:  %8lu kB\n",
+       seq_printf(m, "DirectMap4M:    %8lu kB\n",
                        direct_pages_count[PG_LEVEL_2M] << 12);
 #endif
 #ifdef CONFIG_X86_64
        if (direct_gbpages)
-               seq_printf(m, "DirectMap1G:  %8lu kB\n",
+               seq_printf(m, "DirectMap1G:    %8lu kB\n",
                        direct_pages_count[PG_LEVEL_1G] << 20);
 #endif
 }