The patch titled genapic: optimize & fix APIC mode setup has been added to the -mm tree. Its filename is genapic-optimize-fix-apic-mode-setup-2.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: genapic: optimize & fix APIC mode setup From: Ingo Molnar <mingo@xxxxxxx> Fix a couple of inconsistencies/problems I found while reviewing the x86_64 genapic code (when I was chasing mysterious eth0 timeouts that would only trigger if CPU_HOTPLUG is enabled): - AMD systems defaulted to the slower flat-physical mode instead of the flat-logical mode. The only restriction on AMD systems is that they should not use clustered APIC mode. - removed the CPU hotplug hacks, switching the default for small systems back from phys-flat to logical-flat. The switching to logical flat mode on small systems fixed sporadic ethernet driver timeouts i was getting on a dual-core Athlon64 system: NETDEV WATCHDOG: eth0: transmit timed out eth0: Transmit timeout, status 0c 0005 c07f media 80. eth0: Tx queue start entry 32 dirty entry 28. eth0: Tx descriptor 0 is 0008a04a. (queue head) eth0: Tx descriptor 1 is 0008a04a. eth0: Tx descriptor 2 is 0008a04a. eth0: Tx descriptor 3 is 0008a04a. eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1 - The use of '<= 8' was a bug by itself (the valid APIC ids for logical flat mode go from 0 to 7, not 0 to 8). The new logic is to use logical flat mode on both AMD and Intel systems, and to only switch to physical mode when logical mode cannot be used. If CPU hotplug is racy wrt. APIC shutdown then CPU hotplug needs fixing, not the whole IRQ system be made inconsistent and slowed down. - minor cleanups: simplified some code constructs build & booted on a couple of AMD and Intel SMP systems. Signed-off-by: Ingo Molnar <mingo@xxxxxxx> Cc: Suresh Siddha <suresh.b.siddha@xxxxxxxxx> Cc: Andi Kleen <ak@xxxxxxx> Cc: "Li, Shaohua" <shaohua.li@xxxxxxxxx> Cc: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- arch/x86_64/kernel/genapic.c | 54 ++++++++++++--------------------- 1 files changed, 21 insertions(+), 33 deletions(-) diff -puN arch/x86_64/kernel/genapic.c~genapic-optimize-fix-apic-mode-setup-2 arch/x86_64/kernel/genapic.c --- a/arch/x86_64/kernel/genapic.c~genapic-optimize-fix-apic-mode-setup-2 +++ a/arch/x86_64/kernel/genapic.c @@ -32,30 +32,26 @@ extern struct genapic apic_cluster; extern struct genapic apic_flat; extern struct genapic apic_physflat; -struct genapic *genapic = &apic_flat; - +struct genapic __read_mostly *genapic = &apic_flat; /* * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. */ void __init clustered_apic_check(void) { - long i; - u8 clusters, max_cluster; - u8 id; - u8 cluster_cnt[NUM_APIC_CLUSTERS]; - int max_apic = 0; + u8 id, clusters, max_cluster, cluster_cnt[NUM_APIC_CLUSTERS]; + int i, max_apic = 0; -#if defined(CONFIG_ACPI) +#ifdef CONFIG_ACPI /* * Some x86_64 machines use physical APIC mode regardless of how many * procs/clusters are present (x86_64 ES7000 is an example). */ - if (acpi_fadt.revision > FADT2_REVISION_ID) - if (acpi_fadt.force_apic_physical_destination_mode) { - genapic = &apic_cluster; - goto print; - } + if (acpi_fadt.revision > FADT2_REVISION_ID && + acpi_fadt.force_apic_physical_destination_mode) { + genapic = &apic_cluster; + goto print; + } #endif memset(cluster_cnt, 0, sizeof(cluster_cnt)); @@ -68,20 +64,17 @@ void __init clustered_apic_check(void) cluster_cnt[APIC_CLUSTERID(id)]++; } - /* Don't use clustered mode on AMD platforms. */ + /* + * Don't use clustered mode on AMD platforms, default + * to flat logical mode. + */ if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) { - genapic = &apic_physflat; -#ifndef CONFIG_HOTPLUG_CPU - /* In the CPU hotplug case we cannot use broadcast mode - because that opens a race when a CPU is removed. - Stay at physflat mode in this case. - It is bad to do this unconditionally though. Once - we have ACPI platform support for CPU hotplug - we should detect hotplug capablity from ACPI tables and - only do this when really needed. -AK */ - if (max_apic <= 8) - genapic = &apic_flat; -#endif + /* + * Switch to physical flat mode if more than 8 APICs + * (In the case of 8 CPUs APIC ID goes from 0 to 7): + */ + if (max_apic >= 8) + genapic = &apic_physflat; goto print; } @@ -103,14 +96,9 @@ void __init clustered_apic_check(void) * (We don't use lowest priority delivery + HW APIC IRQ steering, so * can ignore the clustered logical case and go straight to physical.) */ - if (clusters <= 1 && max_cluster <= 8 && cluster_cnt[0] == max_cluster) { -#ifdef CONFIG_HOTPLUG_CPU - /* Don't use APIC shortcuts in CPU hotplug to avoid races */ - genapic = &apic_physflat; -#else + if (clusters <= 1 && max_cluster <= 8 && cluster_cnt[0] == max_cluster) genapic = &apic_flat; -#endif - } else + else genapic = &apic_cluster; print: _ Patches currently in -mm which might be from mingo@xxxxxxx are add-bottom_half.h.patch git-scsi-misc.patch revert-x86_64-mm-add-genapic_force.patch fix-x86_64-mm-fix-the-irqbalance-quirk-for-e7320-e7520-e7525.patch cleanup-arch-i386-kernel-smpbootcsmp_tune_scheduling.patch convert-i386-pda-code-to-use-%fs.patch x86_64-check-vector-in-setup_ioapic_dest-to-verify-if-need-setup_io_apic_irq.patch i386-kernel-smpc-dont-use-set_irq_regs.patch genapic-optimize-fix-apic-mode-setup-2.patch genapic-always-use-physical-delivery-mode-on-8-cpus.patch genapic-remove-es7000-workaround.patch genapic-remove-clustered-apic-mode.patch genapic-default-to-physical-mode-on-hotplug-cpu-kernels.patch convert-pm_sem-to-a-mutex.patch convert-pm_sem-to-a-mutex-fix.patch lockdep-annotate-nfs-nfsd-in-kernel-sockets.patch lockdep-annotate-nfs-nfsd-in-kernel-sockets-tidy.patch sysrq-x-show-blocked-tasks.patch lockdep-internal-locking-fixes.patch lockdep-misc-fixes-in-lockdepc.patch cpuset-remove-sched-domain-hooks-from-cpusets.patch binfmt_elf-randomize-pie-binaries.patch disable-clone_child_cleartid-for-abnormal-exit.patch lockdep-annotate-bcsp-driver.patch lockdep-print-current-locks-on-in_atomic-warnings.patch lockdep-name-some-old-style-locks.patch sleep-profiling.patch sleep-profiling-fixes.patch sleep-profiling-fix.patch debug-workqueue-locking-sanity.patch debug-workqueue-locking-sanity-fix.patch retries-in-ext3_prepare_write-violate-ordering-requirements.patch ktime-fix-signed--unsigned-mismatch-in-ktime_to_ns.patch kprobes-enable-booster-on-the-preemptible-kernel.patch declare-smp_call_function_single-in-generic-code.patch up-smp_call_function_single-should-disable-interrupts.patch up-smp_call_function_single-should-disable-interrupts-fix.patch smp_call_function_single-check-that-local-interrupts-are-enabled.patch hotplug-cpu-clean-up-hotcpu_notifier-use.patch remove-kernel-lockdepclockdep_internal.patch lockdep-more-chains.patch lockdep-show-more-details-about-self-test-failures.patch softirq-remove-bug_ons-which-can-incorrectly-trigger.patch futex-remove-unneeded-barrier.patch remove-the-old-bd_mutex-lockdep-annotation.patch new-bd_mutex-lockdep-annotation.patch remove-lock_key-approach-to-managing-nested-bd_mutex-locks.patch simplify-some-aspects-of-bd_mutex-nesting.patch use-mutex_lock_nested-for-bd_mutex-to-avoid-lockdep-warning.patch avoid-lockdep-warning-in-md.patch fix-generic-warn_on-message.patch schedc-correct-comment-for-this_rq_lock-routine.patch sched-fix-migration-cost-estimator.patch sched-domain-move-sched-group-allocations-to-percpu-area.patch move_task_off_dead_cpu-should-be-called-with-disabled-ints.patch sched-domain-increase-the-smt-busy-rebalance-interval.patch sched-avoid-taking-rq-lock-in-wake_priority_sleeper.patch sched-remove-staggering-of-load-balancing.patch sched-disable-interrupts-for-locking-in-load_balance.patch sched-extract-load-calculation-from-rebalance_tick.patch sched-move-idle-status-calculation-into-rebalance_tick.patch sched-use-softirq-for-load-balancing.patch sched-call-tasklet-less-frequently.patch sched-add-option-to-serialize-load-balancing.patch sched-add-option-to-serialize-load-balancing-fix.patch sched-improve-migration-accuracy.patch sched-improve-migration-accuracy-tidy.patch sched-decrease-number-of-load-balances.patch mm-only-sched-add-a-few-scheduler-event-counters.patch sched-optimize-activate_task-for-rt-task.patch kernel-schedc-whitespace-cleanups.patch kernel-schedc-whitespace-cleanups-more.patch sched-add-above-background-load-function.patch mm-implement-swap-prefetching.patch mm-implement-swap-prefetching-use-ctl_unnumbered.patch sched-cleanup-remove-task_t-convert-to-struct-task_struct-prefetch.patch gtod-exponential-update_wall_time.patch gtod-persistent-clock-support-core.patch gtod-persistent-clock-support-i386.patch time-uninline-jiffiesh.patch time-uninline-jiffiesh-fix.patch time-fix-msecs_to_jiffies-bug.patch time-fix-timeout-overflow.patch cleanup-uninline-irq_enter-and-move-it-into-a-function.patch dynticks-extend-next_timer_interrupt-to-use-a-reference-jiffie.patch dynticks-extend-next_timer_interrupt-to-use-a-reference-jiffie-remove-incorrect-warning-in-kernel-timerc.patch hrtimers-namespace-and-enum-cleanup.patch hrtimers-clean-up-locking.patch hrtimers-clean-up-locking-fix.patch updated-hrtimers-state-tracking.patch updated-hrtimers-clean-up-callback-tracking.patch updated-hrtimers-move-and-add-documentation.patch updated-add-a-framework-to-manage-clock-event-devices.patch updated-acpi-include-apich.patch updated-acpi-keep-track-of-timer-broadcast.patch updated-acpi-add-state-propagation-for-dynamic-broadcasting.patch updated-i386-cleanup-apic-code.patch updated-i386-convert-to-clock-event-devices.patch updated-pm_timer-allow-early-access-and-move-externs-to-a-header-file.patch updated-i386-rework-local-apic-calibration.patch updated-high-res-timers-core.patch updated-high-res-timers-core-high-res-timers-do-itimer-rearming-in-process-context.patch updated-gtod-mark-tsc-unusable-for-highres-timers.patch high-res-timers-utilize-tsc-clocksource-again.patch high-res-timers-utilize-tsc-clocksource-again-fix.patch updated-dynticks-core-code.patch updated-dynticks-core-code-fix-resume-bug.patch updated-dyntick-add-nohz-stats-to-proc-stat.patch updated-dynticks-i386-arch-code.patch updated-dynticks-fix-nmi-watchdog.patch updated-high-res-timers-dynticks-enable-i386-support.patch updated-debugging-feature-timer-stats.patch clockevents-core-check-for-clock-event-device-handler-being-non-null-before-calling-it.patch round_jiffies-infrastructure.patch round_jiffies-infrastructure-fix.patch clocksource-add-usage-of-config_sysfs.patch clocksource-small-cleanup-2.patch clocksource-small-cleanup-2-fix.patch clocksource-small-acpi_pm-cleanup.patch kvm-amd-svm-implementation-more-i386-fixes.patch detect-atomic-counter-underflows.patch debug-shared-irqs.patch make-frame_pointer-default=y.patch mutex-subsystem-synchro-test-module.patch vdso-print-fatal-signals.patch vdso-improve-print_fatal_signals-support-by-adding-memory-maps.patch vdso-print-fatal-signals-use-ctl_unnumbered.patch lockdep-show-held-locks-when-showing-a-stackdump.patch lockdep-show-held-locks-when-showing-a-stackdump-fix.patch lockdep-show-held-locks-when-showing-a-stackdump-fix-2.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html