From ee6c061eb9517d21067cab44eeadec08b91cbd7a Mon Sep 17 00:00:00 2001 From: Kyle McMartin Date: Jan 15 2011 05:56:55 +0000 Subject: snapshot 2.6.37-git12 --- diff --git a/0001-use-__devexit-not-__exit-in-n2_unregister_algs-fixes.patch b/0001-use-__devexit-not-__exit-in-n2_unregister_algs-fixes.patch deleted file mode 100644 index a5c4c12..0000000 --- a/0001-use-__devexit-not-__exit-in-n2_unregister_algs-fixes.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 56a2432f60ea0a0c85a93b0951ae8507e5b85270 Mon Sep 17 00:00:00 2001 -From: dennis -Date: Wed, 5 Jan 2011 19:43:25 +0000 -Subject: [PATCH] use __devexit not __exit in n2_unregister_algs fixes build failure on fedora - -thanks to kylem for helping with debugging ---- - drivers/crypto/n2_core.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/drivers/crypto/n2_core.c b/drivers/crypto/n2_core.c -index 88ee015..3372491 100644 ---- a/drivers/crypto/n2_core.c -+++ b/drivers/crypto/n2_core.c -@@ -1542,7 +1542,7 @@ out: - return err; - } - --static void __exit n2_unregister_algs(void) -+static void __devexit n2_unregister_algs(void) - { - mutex_lock(&spu_lock); - if (!--algs_registered) --- -1.6.6.1 - diff --git a/acpi-update-battery-information-on-notification-0x81.patch b/acpi-update-battery-information-on-notification-0x81.patch deleted file mode 100644 index 7f2c645..0000000 --- a/acpi-update-battery-information-on-notification-0x81.patch +++ /dev/null @@ -1,94 +0,0 @@ -From kyle@infradead.org Wed Sep 22 18:35:38 2010 -From: Matthew Garrett -To: linux-acpi@vger.kernel.org -Cc: linux-kernel@vger.kernel.org, Matthew Garrett -Subject: [PATCH] acpi: Update battery information on notification 0x81 -Date: Mon, 16 Aug 2010 16:32:19 -0400 - -A notification event 0x81 from an ACPI battery device requires us to -re-read the battery information structure. Do so, and if the battery's -reporting units have changed (as is the case on some Thinkpads) destroy -and recreate the battery in order to populate the fields correctly. - -Signed-off-by: Matthew Garrett ---- - - drivers/acpi/battery.c | 21 ++++++++++++++++----- - 1 files changed, 16 insertions(+), 5 deletions(-) - -diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c -index 95649d3..161e43a 100644 ---- a/drivers/acpi/battery.c -+++ b/drivers/acpi/battery.c -@@ -152,6 +152,7 @@ static int acpi_battery_technology(struct acpi_battery *battery) - return POWER_SUPPLY_TECHNOLOGY_UNKNOWN; - } - -+static int acpi_battery_update(struct acpi_battery *battery, bool get_info); - static int acpi_battery_get_state(struct acpi_battery *battery); - - static int acpi_battery_is_charged(struct acpi_battery *battery) -@@ -605,9 +606,11 @@ static void acpi_battery_quirks2(struct acpi_battery *battery) - } - } - --static int acpi_battery_update(struct acpi_battery *battery) -+static int acpi_battery_update(struct acpi_battery *battery, bool get_info) - { - int result, old_present = acpi_battery_present(battery); -+ int old_power_unit = battery->power_unit; -+ - result = acpi_battery_get_status(battery); - if (result) - return result; -@@ -626,6 +629,14 @@ static int acpi_battery_update(struct acpi_battery *battery) - } - if (!battery->bat.dev) - sysfs_add_battery(battery); -+ if (get_info) { -+ acpi_battery_get_info(battery); -+ if (old_power_unit != battery->power_unit) { -+ /* The battery has changed its reporting units */ -+ sysfs_remove_battery(battery); -+ sysfs_add_battery(battery); -+ } -+ } - result = acpi_battery_get_state(battery); - acpi_battery_quirks2(battery); - return result; -@@ -803,7 +814,7 @@ static print_func acpi_print_funcs[ACPI_BATTERY_NUMFILES] = { - static int acpi_battery_read(int fid, struct seq_file *seq) - { - struct acpi_battery *battery = seq->private; -- int result = acpi_battery_update(battery); -+ int result = acpi_battery_update(battery, false); - return acpi_print_funcs[fid](seq, result); - } - -@@ -914,7 +925,7 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) - if (!battery) - return; - old = battery->bat.dev; -- acpi_battery_update(battery); -+ acpi_battery_update(battery, (event == ACPI_BATTERY_NOTIFY_INFO)); - acpi_bus_generate_proc_event(device, event, - acpi_battery_present(battery)); - acpi_bus_generate_netlink_event(device->pnp.device_class, -@@ -943,7 +954,7 @@ static int acpi_battery_add(struct acpi_device *device) - if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, - "_BIX", &handle))) - set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); -- acpi_battery_update(battery); -+ acpi_battery_update(battery, false); - #ifdef CONFIG_ACPI_PROCFS_POWER - result = acpi_battery_add_fs(device); - #endif -@@ -984,7 +995,7 @@ static int acpi_battery_resume(struct acpi_device *device) - return -EINVAL; - battery = acpi_driver_data(device); - battery->update_time = 0; -- acpi_battery_update(battery); -+ acpi_battery_update(battery, true); - return 0; - } - diff --git a/config-generic b/config-generic index e885bca..67483c6 100644 --- a/config-generic +++ b/config-generic @@ -689,6 +689,7 @@ CONFIG_DM_ZERO=y CONFIG_DM_LOG_USERSPACE=m CONFIG_DM_MULTIPATH_QL=m CONFIG_DM_MULTIPATH_ST=m +CONFIG_DM_RAID=m # # Fusion MPT device support @@ -1925,6 +1926,7 @@ CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y CONFIG_JOYSTICK_ZHENHUA=m +# CONFIG_JOYSTICK_AS5011 is not set CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_TOUCHSCREEN_AD7879 is not set @@ -2082,6 +2084,7 @@ CONFIG_I2C_ALGOPCA=m # CONFIG_I2C_ISCH is not set # CONFIG_I2C_NFORCE2_S4985 is not set # CONFIG_I2C_INTEL_MID is not set +# CONFIG_I2C_EG20T is not set CONFIG_EEPROM_AT24=m CONFIG_EEPROM_LEGACY=m @@ -2236,6 +2239,8 @@ CONFIG_W1_SLAVE_DS2431=m CONFIG_W1_SLAVE_DS2433=m CONFIG_W1_SLAVE_DS2433_CRC=y CONFIG_W1_SLAVE_DS2760=m +CONFIG_W1_SLAVE_DS2423=m + # # Mice # @@ -3040,6 +3045,7 @@ CONFIG_HID_3M_PCT=y CONFIG_LOGIG940_FF=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MOSART=y +CONFIG_HID_MULTITOUCH=m CONFIG_HID_NTRIG=y CONFIG_HID_QUANTA=y CONFIG_HID_STANTUM=y @@ -3383,6 +3389,7 @@ CONFIG_MFD_WM8400=m # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_WM831X_I2C is not set +CONFIG_MFD_CS5535=m # # File systems @@ -3723,12 +3730,14 @@ CONFIG_AUDITSYSCALL=y # CONFIG_CRYPTO=y CONFIG_CRYPTO_FIPS=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_MANAGER_TESTS=y CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_MANAGER=m # CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_AUTHENC=m @@ -3736,14 +3745,14 @@ CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_CAMELLIA=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m -CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CCM=m CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CTR=m +CONFIG_CRYPTO_CTR=y CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_DES=m -CONFIG_CRYPTO_ECB=m +CONFIG_CRYPTO_ECB=y CONFIG_CRYPTO_FCRYPT=m CONFIG_CRYPTO_GCM=m CONFIG_CRYPTO_GF128MUL=m @@ -4107,15 +4116,17 @@ CONFIG_POWER_SUPPLY=m # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_TEST_POWER is not set CONFIG_APM_POWER=m -CONFIG_WM831X_POWER=m +# CONFIG_WM831X_POWER is not set # CONFIG_BATTERY_DS2760 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_BQ20Z75 is not set # CONFIG_CHARGER_ISP1704 is not set CONFIG_BATTERY_PMU=m -CONFIG_BATTERY_BQ27x00=m -CONFIG_BATTERY_MAX17040=m +# CONFIG_BATTERY_BQ27x00 is not set +# CONFIG_BATTERY_MAX17040 is not set # CONFIG_PDA_POWER is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_BATTERY_MAX17042 is not set CONFIG_AUXDISPLAY=y @@ -4375,6 +4386,9 @@ CONFIG_PPS=m # CONFIG_PPS_CLIENT_KTIMER is not set CONFIG_PPS_CLIENT_LDISC=m # CONFIG_PPS_DEBUG is not set +CONFIG_PPS_CLIENT_PARPORT=m +CONFIG_PPS_GENERATOR_PARPORT=m +CONFIG_NTP_PPS=y # CONFIG_USB_SERIAL_QUATECH2 is not set # CONFIG_VT6655 is not set @@ -4440,6 +4454,7 @@ CONFIG_GPIO_SYSFS=y # CONFIG_GPIO_BASIC_MMIO is not set # CONFIG_GPIO_VX855 is not set # CONFIG_GPIO_PCH is not set +# CONFIG_GPIO_ML_IOH is not set CONFIG_KSYM_TRACER=y CONFIG_PROFILE_KSYM_TRACER=y @@ -4465,3 +4480,8 @@ CONFIG_SPARSE_RCU_POINTER=y CONFIG_BKL=y CONFIG_EVENT_POWER_TRACING_DEPRECATED=y + +# CONFIG_XZ_DEC_TEST is not set + +CONFIG_NFC_DEVICES=y +CONFIG_PN544_NFC=m diff --git a/config-ia64-generic b/config-ia64-generic index a178b8a..5c864b3 100644 --- a/config-ia64-generic +++ b/config-ia64-generic @@ -139,6 +139,7 @@ CONFIG_ACPI_VIDEO=m # CONFIG_ACPI_PROC_EVENT is not set CONFIG_ACPI_HED=m CONFIG_ACPI_EC_DEBUGFS=m +CONFIG_ACPI_IPMI=m CONFIG_PM=y CONFIG_HOTPLUG_PCI=y diff --git a/config-x86-generic b/config-x86-generic index 21f51ce..e4b6690 100644 --- a/config-x86-generic +++ b/config-x86-generic @@ -154,6 +154,7 @@ CONFIG_ACPI_HED=m CONFIG_ACPI_APEI=y CONFIG_ACPI_APEI_GHES=m # CONFIG_ACPI_APEI_EINJ is not set +CONFIG_ACPI_IPMI=m # # CPUFreq processor drivers @@ -374,6 +375,9 @@ CONFIG_XEN_PCIDEV_FRONTEND=m CONFIG_XENFS=m CONFIG_XEN_COMPAT_XENFS=y CONFIG_XEN_BACKEND=y +CONFIG_XEN_DEBUG_FS=y +CONFIG_XEN_PLATFORM_PCI=m +CONFIG_XEN_GNTDEV=m CONFIG_MTD_ESB2ROM=m CONFIG_MTD_CK804XROM=m @@ -408,6 +412,8 @@ CONFIG_SENSORS_I5K_AMB=m # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set CONFIG_HP_WATCHDOG=m +CONFIG_NV_TCO=m +CONFIG_SP5100_TCO=m CONFIG_OLPC=y CONFIG_OLPC_OPENFIRMWARE=y @@ -445,7 +451,6 @@ CONFIG_X86_RESERVE_LOW_64K=y CONFIG_PANASONIC_LAPTOP=m -CONFIG_XEN_DEBUG_FS=y CONFIG_X86_PTRACE_BTS=y CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y @@ -509,7 +514,6 @@ CONFIG_HPWDT_NMI_DECODING=y # CONFIG_MFD_TPS6586X is not set # CONFIG_INTEL_MID_DMAC is not set CONFIG_PCH_DMA=m -CONFIG_XEN_PLATFORM_PCI=m # CONFIG_ACPI_QUICKSTART is not set CONFIG_IDEAPAD_ACPI=m CONFIG_INTEL_IPS=m @@ -529,3 +533,14 @@ CONFIG_PCH_PHUB=m CONFIG_JUMP_LABEL=y CONFIG_X86_32_IRIS=m + +CONFIG_TRANSPARENT_HUGEPAGE=y + +CONFIG_CRYPTO_AES_NI_INTEL=m + +CONFIG_MTD_OF_PARTS=m +CONFIG_MTD_PHYSMAP_OF=m +CONFIG_PROC_DEVICETREE=y +CONFIG_SERIAL_OF_PLATFORM=m +CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m +CONFIG_MMC_SDHCI_OF=m diff --git a/config-x86_64-generic b/config-x86_64-generic index 5ac06ca..39fdd3d 100644 --- a/config-x86_64-generic +++ b/config-x86_64-generic @@ -98,6 +98,7 @@ CONFIG_ACPI_HED=m CONFIG_ACPI_APEI=y CONFIG_ACPI_APEI_GHES=m # CONFIG_ACPI_APEI_EINJ is not set +CONFIG_ACPI_IPMI=m CONFIG_X86_PLATFORM_DEVICES=y CONFIG_ASUS_LAPTOP=m @@ -155,8 +156,8 @@ CONFIG_CRYPTO_DEV_PADLOCK=m CONFIG_CRYPTO_DEV_PADLOCK_AES=m CONFIG_CRYPTO_DEV_PADLOCK_SHA=m -CONFIG_CRYPTO_AES_X86_64=m -CONFIG_CRYPTO_AES_NI_INTEL=m +CONFIG_CRYPTO_AES_X86_64=y +CONFIG_CRYPTO_AES_NI_INTEL=y CONFIG_CRYPTO_TWOFISH_X86_64=m CONFIG_CRYPTO_SALSA20_X86_64=m @@ -306,6 +307,9 @@ CONFIG_XEN_COMPAT_XENFS=y CONFIG_XEN_DEV_EVTCHN=m CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_BACKEND=y +CONFIG_XEN_GNTDEV=m +CONFIG_XEN_DEBUG_FS=y +CONFIG_XEN_PLATFORM_PCI=m CONFIG_DMADEVICES=y CONFIG_INTEL_IOATDMA=m @@ -318,6 +322,8 @@ CONFIG_PROVIDE_OHCI1394_DMA_INIT=y # CONFIG_CPA_DEBUG is not set CONFIG_HP_WATCHDOG=m +CONFIG_NV_TCO=m +CONFIG_SP5100_TCO=m CONFIG_FRAME_WARN=2048 @@ -357,7 +363,6 @@ CONFIG_X86_RESERVE_LOW_64K=y CONFIG_PANASONIC_LAPTOP=m -CONFIG_XEN_DEBUG_FS=y CONFIG_X86_PTRACE_BTS=y CONFIG_I7300_IDLE=m @@ -422,7 +427,6 @@ CONFIG_HPWDT_NMI_DECODING=y # CONFIG_MFD_TPS6586X is not set # CONFIG_INTEL_MID_DMAC is not set CONFIG_PCH_DMA=m -CONFIG_XEN_PLATFORM_PCI=m # CONFIG_ACPI_QUICKSTART is not set CONFIG_IDEAPAD_ACPI=m CONFIG_INTEL_IPS=m @@ -441,3 +445,5 @@ CONFIG_VIDEO_VIA_CAMERA=m CONFIG_JUMP_LABEL=y CONFIG_HP_ILO=m + +CONFIG_TRANSPARENT_HUGEPAGE=y diff --git a/kernel.spec b/kernel.spec index 0c14d0d..5ffd321 100644 --- a/kernel.spec +++ b/kernel.spec @@ -84,7 +84,7 @@ Summary: The Linux kernel # The rc snapshot level %define rcrev 0 # The git snapshot level -%define gitrev 9 +%define gitrev 12 # Set rpm version accordingly %define rpmversion 2.6.%{upstream_sublevel} %endif @@ -620,7 +620,6 @@ Patch31: linux-2.6-utrace.patch Patch32: linux-2.6-utrace-ptrace.patch Patch150: linux-2.6.29-sparc-IOC_TYPECHECK.patch -Patch151: 0001-use-__devexit-not-__exit-in-n2_unregister_algs-fixes.patch Patch160: linux-2.6-32bit-mmap-exec-randomization.patch Patch161: linux-2.6-i386-nx-emulation.patch @@ -633,7 +632,6 @@ Patch204: linux-2.6-debug-always-inline-kzalloc.patch Patch380: linux-2.6-defaults-pci_no_msi.patch Patch381: linux-2.6-defaults-pci_use_crs.patch Patch383: linux-2.6-defaults-aspm.patch -Patch384: pci-disable-aspm-if-bios-asks-us-to.patch Patch386: pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch Patch385: ima-allow-it-to-be-completely-disabled-and-default-off.patch @@ -642,7 +640,6 @@ Patch390: linux-2.6-defaults-acpi-video.patch Patch391: linux-2.6-acpi-video-dos.patch Patch393: acpi-ec-add-delay-before-write.patch Patch394: linux-2.6-acpi-debug-infinite-loop.patch -Patch395: acpi-update-battery-information-on-notification-0x81.patch Patch450: linux-2.6-input-kill-stupid-messages.patch Patch452: linux-2.6.30-no-pcspkr-modalias.patch @@ -733,9 +730,6 @@ Patch12303: dmar-disable-when-ricoh-multifunction.patch Patch12401: debug-tty-print-dev-name.patch -Patch12410: mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch -Patch12411: mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch - Patch12421: fs-call-security_d_instantiate-in-d_obtain_alias.patch %endif @@ -1181,7 +1175,6 @@ ApplyPatch linux-2.6-utrace-ptrace.patch # SPARC64 # ApplyPatch linux-2.6.29-sparc-IOC_TYPECHECK.patch -ApplyPatch 0001-use-__devexit-not-__exit-in-n2_unregister_algs-fixes.patch # # Exec shield @@ -1213,7 +1206,6 @@ ApplyPatch linux-2.6-defaults-acpi-video.patch ApplyPatch linux-2.6-acpi-video-dos.patch ApplyPatch acpi-ec-add-delay-before-write.patch ApplyPatch linux-2.6-acpi-debug-infinite-loop.patch -ApplyPatch acpi-update-battery-information-on-notification-0x81.patch # Various low-impact patches to aid debugging. ApplyPatch linux-2.6-debug-sizeof-structs.patch @@ -1229,9 +1221,8 @@ ApplyPatch linux-2.6-defaults-pci_no_msi.patch ApplyPatch linux-2.6-defaults-pci_use_crs.patch # enable ASPM by default on hardware we expect to work ApplyPatch linux-2.6-defaults-aspm.patch -ApplyPatch pci-disable-aspm-if-bios-asks-us-to.patch # rhbz#638912 -ApplyPatch pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch +#ApplyPatch pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch #ApplyPatch ima-allow-it-to-be-completely-disabled-and-default-off.patch @@ -1341,8 +1332,8 @@ ApplyPatch efi_default_physical.patch # Runtime PM ApplyPatch linux-2.6-usb-pci-autosuspend.patch -ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch -ApplyPatch runtime_pm_fixups.patch +#ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch +#ApplyPatch runtime_pm_fixups.patch # rhbz#605888 ApplyPatch dmar-disable-when-ricoh-multifunction.patch @@ -1350,10 +1341,6 @@ ApplyPatch dmar-disable-when-ricoh-multifunction.patch # rhbz#630464 ApplyPatch debug-tty-print-dev-name.patch -# backport some fixes for kswapd from mmotm, rhbz#649694 -ApplyPatch mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch -ApplyPatch mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch - # rhbz#662344,600690 ApplyPatch fs-call-security_d_instantiate-in-d_obtain_alias.patch @@ -1969,6 +1956,18 @@ fi # ||----w | # || || %changelog +* Fri Jan 14 2011 Kyle McMartin 2.6.38-0.rc0.git12.1 +- Linux 2.6.37-git12 +- 0001-use-__devexit-not-__exit-in-n2_unregister_algs-fixes.patch: drop + upstream patch. +- acpi-update-battery-information-on-notification-0x81.patch: drop upstream + patch. +- mm-*.patch: drop upstream patches. +- important config changes: + ACPI_IPMI=m + CRYPTO_AES_NI_INTEL=m [i386] + TRANSPARENT_HUGEPAGE=y + * Wed Jan 12 2011 Kyle McMartin 2.6.38-0.rc0.git9.1 - Linux 2.6.37-git9 - Re-enable DEBUG_SET_MODULE_RONX since commit 94462ad3 fixed it. diff --git a/linux-2.6-32bit-mmap-exec-randomization.patch b/linux-2.6-32bit-mmap-exec-randomization.patch index d42638c..dd40b60 100644 --- a/linux-2.6-32bit-mmap-exec-randomization.patch +++ b/linux-2.6-32bit-mmap-exec-randomization.patch @@ -14,9 +14,9 @@ --- b/mm/mmap.c +++ b/mm/mmap.c @@ -28,6 +28,7 @@ - #include #include #include + #include +#include #include diff --git a/mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch b/mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch deleted file mode 100644 index 561c589..0000000 --- a/mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch +++ /dev/null @@ -1,389 +0,0 @@ -From df43fae25437d7bc7dfff72599c1e825038b67cf Mon Sep 17 00:00:00 2001 -From: Mel Gorman -Date: Wed, 24 Nov 2010 22:18:23 -0500 -Subject: [PATCH 1/2] mm: page allocator: Adjust the per-cpu counter threshold when memory is low - -Commit aa45484 ("calculate a better estimate of NR_FREE_PAGES when memory -is low") noted that watermarks were based on the vmstat NR_FREE_PAGES. To -avoid synchronization overhead, these counters are maintained on a per-cpu -basis and drained both periodically and when a threshold is above a -threshold. On large CPU systems, the difference between the estimate and -real value of NR_FREE_PAGES can be very high. The system can get into a -case where pages are allocated far below the min watermark potentially -causing livelock issues. The commit solved the problem by taking a better -reading of NR_FREE_PAGES when memory was low. - -Unfortately, as reported by Shaohua Li this accurate reading can consume a -large amount of CPU time on systems with many sockets due to cache line -bouncing. This patch takes a different approach. For large machines -where counter drift might be unsafe and while kswapd is awake, the per-cpu -thresholds for the target pgdat are reduced to limit the level of drift to -what should be a safe level. This incurs a performance penalty in heavy -memory pressure by a factor that depends on the workload and the machine -but the machine should function correctly without accidentally exhausting -all memory on a node. There is an additional cost when kswapd wakes and -sleeps but the event is not expected to be frequent - in Shaohua's test -case, there was one recorded sleep and wake event at least. - -To ensure that kswapd wakes up, a safe version of zone_watermark_ok() is -introduced that takes a more accurate reading of NR_FREE_PAGES when called -from wakeup_kswapd, when deciding whether it is really safe to go back to -sleep in sleeping_prematurely() and when deciding if a zone is really -balanced or not in balance_pgdat(). We are still using an expensive -function but limiting how often it is called. - -When the test case is reproduced, the time spent in the watermark -functions is reduced. The following report is on the percentage of time -spent cumulatively spent in the functions zone_nr_free_pages(), -zone_watermark_ok(), __zone_watermark_ok(), zone_watermark_ok_safe(), -zone_page_state_snapshot(), zone_page_state(). - -vanilla 11.6615% -disable-threshold 0.2584% - -Reported-by: Shaohua Li -Signed-off-by: Mel Gorman -Reviewed-by: Christoph Lameter -Signed-off-by: Andrew Morton -[[http://userweb.kernel.org/~akpm/mmotm/broken-out/mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch]] ---- - include/linux/mmzone.h | 10 ++----- - include/linux/vmstat.h | 5 +++ - mm/mmzone.c | 21 --------------- - mm/page_alloc.c | 35 +++++++++++++++++++----- - mm/vmscan.c | 23 +++++++++------- - mm/vmstat.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++- - 6 files changed, 115 insertions(+), 47 deletions(-) - -diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h -index 3984c4e..8d789d7 100644 ---- a/include/linux/mmzone.h -+++ b/include/linux/mmzone.h -@@ -448,12 +448,6 @@ static inline int zone_is_oom_locked(const struct zone *zone) - return test_bit(ZONE_OOM_LOCKED, &zone->flags); - } - --#ifdef CONFIG_SMP --unsigned long zone_nr_free_pages(struct zone *zone); --#else --#define zone_nr_free_pages(zone) zone_page_state(zone, NR_FREE_PAGES) --#endif /* CONFIG_SMP */ -- - /* - * The "priority" of VM scanning is how much of the queues we will scan in one - * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the -@@ -651,7 +645,9 @@ typedef struct pglist_data { - extern struct mutex zonelists_mutex; - void build_all_zonelists(void *data); - void wakeup_kswapd(struct zone *zone, int order); --int zone_watermark_ok(struct zone *z, int order, unsigned long mark, -+bool zone_watermark_ok(struct zone *z, int order, unsigned long mark, -+ int classzone_idx, int alloc_flags); -+bool zone_watermark_ok_safe(struct zone *z, int order, unsigned long mark, - int classzone_idx, int alloc_flags); - enum memmap_context { - MEMMAP_EARLY, -diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h -index eaaea37..e4cc21c 100644 ---- a/include/linux/vmstat.h -+++ b/include/linux/vmstat.h -@@ -254,6 +254,8 @@ extern void dec_zone_state(struct zone *, enum zone_stat_item); - extern void __dec_zone_state(struct zone *, enum zone_stat_item); - - void refresh_cpu_vm_stats(int); -+void reduce_pgdat_percpu_threshold(pg_data_t *pgdat); -+void restore_pgdat_percpu_threshold(pg_data_t *pgdat); - #else /* CONFIG_SMP */ - - /* -@@ -298,6 +300,9 @@ static inline void __dec_zone_page_state(struct page *page, - #define dec_zone_page_state __dec_zone_page_state - #define mod_zone_page_state __mod_zone_page_state - -+static inline void reduce_pgdat_percpu_threshold(pg_data_t *pgdat) { } -+static inline void restore_pgdat_percpu_threshold(pg_data_t *pgdat) { } -+ - static inline void refresh_cpu_vm_stats(int cpu) { } - #endif - -diff --git a/mm/mmzone.c b/mm/mmzone.c -index e35bfb8..f5b7d17 100644 ---- a/mm/mmzone.c -+++ b/mm/mmzone.c -@@ -87,24 +87,3 @@ int memmap_valid_within(unsigned long pfn, - return 1; - } - #endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */ -- --#ifdef CONFIG_SMP --/* Called when a more accurate view of NR_FREE_PAGES is needed */ --unsigned long zone_nr_free_pages(struct zone *zone) --{ -- unsigned long nr_free_pages = zone_page_state(zone, NR_FREE_PAGES); -- -- /* -- * While kswapd is awake, it is considered the zone is under some -- * memory pressure. Under pressure, there is a risk that -- * per-cpu-counter-drift will allow the min watermark to be breached -- * potentially causing a live-lock. While kswapd is awake and -- * free pages are low, get a better estimate for free pages -- */ -- if (nr_free_pages < zone->percpu_drift_mark && -- !waitqueue_active(&zone->zone_pgdat->kswapd_wait)) -- return zone_page_state_snapshot(zone, NR_FREE_PAGES); -- -- return nr_free_pages; --} --#endif /* CONFIG_SMP */ -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index f12ad18..0286150 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -1454,24 +1454,24 @@ static inline int should_fail_alloc_page(gfp_t gfp_mask, unsigned int order) - #endif /* CONFIG_FAIL_PAGE_ALLOC */ - - /* -- * Return 1 if free pages are above 'mark'. This takes into account the order -+ * Return true if free pages are above 'mark'. This takes into account the order - * of the allocation. - */ --int zone_watermark_ok(struct zone *z, int order, unsigned long mark, -- int classzone_idx, int alloc_flags) -+static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark, -+ int classzone_idx, int alloc_flags, long free_pages) - { - /* free_pages my go negative - that's OK */ - long min = mark; -- long free_pages = zone_nr_free_pages(z) - (1 << order) + 1; - int o; - -+ free_pages -= (1 << order) + 1; - if (alloc_flags & ALLOC_HIGH) - min -= min / 2; - if (alloc_flags & ALLOC_HARDER) - min -= min / 4; - - if (free_pages <= min + z->lowmem_reserve[classzone_idx]) -- return 0; -+ return false; - for (o = 0; o < order; o++) { - /* At the next order, this order's pages become unavailable */ - free_pages -= z->free_area[o].nr_free << o; -@@ -1480,9 +1480,28 @@ int zone_watermark_ok(struct zone *z, int order, unsigned long mark, - min >>= 1; - - if (free_pages <= min) -- return 0; -+ return false; - } -- return 1; -+ return true; -+} -+ -+bool zone_watermark_ok(struct zone *z, int order, unsigned long mark, -+ int classzone_idx, int alloc_flags) -+{ -+ return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags, -+ zone_page_state(z, NR_FREE_PAGES)); -+} -+ -+bool zone_watermark_ok_safe(struct zone *z, int order, unsigned long mark, -+ int classzone_idx, int alloc_flags) -+{ -+ long free_pages = zone_page_state(z, NR_FREE_PAGES); -+ -+ if (z->percpu_drift_mark && free_pages < z->percpu_drift_mark) -+ free_pages = zone_page_state_snapshot(z, NR_FREE_PAGES); -+ -+ return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags, -+ free_pages); - } - - #ifdef CONFIG_NUMA -@@ -2436,7 +2455,7 @@ void show_free_areas(void) - " all_unreclaimable? %s" - "\n", - zone->name, -- K(zone_nr_free_pages(zone)), -+ K(zone_page_state(zone, NR_FREE_PAGES)), - K(min_wmark_pages(zone)), - K(low_wmark_pages(zone)), - K(high_wmark_pages(zone)), -diff --git a/mm/vmscan.c b/mm/vmscan.c -index c5dfabf..3e71cb1 100644 ---- a/mm/vmscan.c -+++ b/mm/vmscan.c -@@ -2082,7 +2082,7 @@ static int sleeping_prematurely(pg_data_t *pgdat, int order, long remaining) - if (zone->all_unreclaimable) - continue; - -- if (!zone_watermark_ok(zone, order, high_wmark_pages(zone), -+ if (!zone_watermark_ok_safe(zone, order, high_wmark_pages(zone), - 0, 0)) - return 1; - } -@@ -2169,7 +2169,7 @@ loop_again: - shrink_active_list(SWAP_CLUSTER_MAX, zone, - &sc, priority, 0); - -- if (!zone_watermark_ok(zone, order, -+ if (!zone_watermark_ok_safe(zone, order, - high_wmark_pages(zone), 0, 0)) { - end_zone = i; - break; -@@ -2215,7 +2215,7 @@ loop_again: - * We put equal pressure on every zone, unless one - * zone has way too many pages free already. - */ -- if (!zone_watermark_ok(zone, order, -+ if (!zone_watermark_ok_safe(zone, order, - 8*high_wmark_pages(zone), end_zone, 0)) - shrink_zone(priority, zone, &sc); - reclaim_state->reclaimed_slab = 0; -@@ -2236,7 +2236,7 @@ loop_again: - total_scanned > sc.nr_reclaimed + sc.nr_reclaimed / 2) - sc.may_writepage = 1; - -- if (!zone_watermark_ok(zone, order, -+ if (!zone_watermark_ok_safe(zone, order, - high_wmark_pages(zone), end_zone, 0)) { - all_zones_ok = 0; - /* -@@ -2244,7 +2244,7 @@ loop_again: - * means that we have a GFP_ATOMIC allocation - * failure risk. Hurry up! - */ -- if (!zone_watermark_ok(zone, order, -+ if (!zone_watermark_ok_safe(zone, order, - min_wmark_pages(zone), end_zone, 0)) - has_under_min_watermark_zone = 1; - } -@@ -2378,7 +2378,9 @@ static int kswapd(void *p) - */ - if (!sleeping_prematurely(pgdat, order, remaining)) { - trace_mm_vmscan_kswapd_sleep(pgdat->node_id); -+ restore_pgdat_percpu_threshold(pgdat); - schedule(); -+ reduce_pgdat_percpu_threshold(pgdat); - } else { - if (remaining) - count_vm_event(KSWAPD_LOW_WMARK_HIT_QUICKLY); -@@ -2417,16 +2419,17 @@ void wakeup_kswapd(struct zone *zone, int order) - if (!populated_zone(zone)) - return; - -- pgdat = zone->zone_pgdat; -- if (zone_watermark_ok(zone, order, low_wmark_pages(zone), 0, 0)) -+ if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL)) - return; -+ pgdat = zone->zone_pgdat; - if (pgdat->kswapd_max_order < order) - pgdat->kswapd_max_order = order; -- trace_mm_vmscan_wakeup_kswapd(pgdat->node_id, zone_idx(zone), order); -- if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL)) -- return; - if (!waitqueue_active(&pgdat->kswapd_wait)) - return; -+ if (zone_watermark_ok_safe(zone, order, low_wmark_pages(zone), 0, 0)) -+ return; -+ -+ trace_mm_vmscan_wakeup_kswapd(pgdat->node_id, zone_idx(zone), order); - wake_up_interruptible(&pgdat->kswapd_wait); - } - -diff --git a/mm/vmstat.c b/mm/vmstat.c -index 355a9e6..4d7faeb 100644 ---- a/mm/vmstat.c -+++ b/mm/vmstat.c -@@ -81,6 +81,30 @@ EXPORT_SYMBOL(vm_stat); - - #ifdef CONFIG_SMP - -+static int calculate_pressure_threshold(struct zone *zone) -+{ -+ int threshold; -+ int watermark_distance; -+ -+ /* -+ * As vmstats are not up to date, there is drift between the estimated -+ * and real values. For high thresholds and a high number of CPUs, it -+ * is possible for the min watermark to be breached while the estimated -+ * value looks fine. The pressure threshold is a reduced value such -+ * that even the maximum amount of drift will not accidentally breach -+ * the min watermark -+ */ -+ watermark_distance = low_wmark_pages(zone) - min_wmark_pages(zone); -+ threshold = max(1, (int)(watermark_distance / num_online_cpus())); -+ -+ /* -+ * Maximum threshold is 125 -+ */ -+ threshold = min(125, threshold); -+ -+ return threshold; -+} -+ - static int calculate_threshold(struct zone *zone) - { - int threshold; -@@ -159,6 +183,48 @@ static void refresh_zone_stat_thresholds(void) - } - } - -+void reduce_pgdat_percpu_threshold(pg_data_t *pgdat) -+{ -+ struct zone *zone; -+ int cpu; -+ int threshold; -+ int i; -+ -+ get_online_cpus(); -+ for (i = 0; i < pgdat->nr_zones; i++) { -+ zone = &pgdat->node_zones[i]; -+ if (!zone->percpu_drift_mark) -+ continue; -+ -+ threshold = calculate_pressure_threshold(zone); -+ for_each_online_cpu(cpu) -+ per_cpu_ptr(zone->pageset, cpu)->stat_threshold -+ = threshold; -+ } -+ put_online_cpus(); -+} -+ -+void restore_pgdat_percpu_threshold(pg_data_t *pgdat) -+{ -+ struct zone *zone; -+ int cpu; -+ int threshold; -+ int i; -+ -+ get_online_cpus(); -+ for (i = 0; i < pgdat->nr_zones; i++) { -+ zone = &pgdat->node_zones[i]; -+ if (!zone->percpu_drift_mark) -+ continue; -+ -+ threshold = calculate_threshold(zone); -+ for_each_online_cpu(cpu) -+ per_cpu_ptr(zone->pageset, cpu)->stat_threshold -+ = threshold; -+ } -+ put_online_cpus(); -+} -+ - /* - * For use when we know that interrupts are disabled. - */ -@@ -826,7 +892,7 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat, - "\n scanned %lu" - "\n spanned %lu" - "\n present %lu", -- zone_nr_free_pages(zone), -+ zone_page_state(zone, NR_FREE_PAGES), - min_wmark_pages(zone), - low_wmark_pages(zone), - high_wmark_pages(zone), --- -1.7.3.2 - diff --git a/mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch b/mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch deleted file mode 100644 index 058b139..0000000 --- a/mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch +++ /dev/null @@ -1,167 +0,0 @@ -From 82e3d4969144377d13da97d511e849e8cf3e6dcc Mon Sep 17 00:00:00 2001 -From: Mel Gorman -Date: Wed, 24 Nov 2010 22:24:24 -0500 -Subject: [PATCH 2/2] mm: vmstat: Use a single setter function and callback for adjusting percpu thresholds - -reduce_pgdat_percpu_threshold() and restore_pgdat_percpu_threshold() exist -to adjust the per-cpu vmstat thresholds while kswapd is awake to avoid -errors due to counter drift. The functions duplicate some code so this -patch replaces them with a single set_pgdat_percpu_threshold() that takes -a callback function to calculate the desired threshold as a parameter. - -Signed-off-by: Mel Gorman -Reviewed-by: Christoph Lameter -Reviewed-by: KAMEZAWA Hiroyuki -Signed-off-by: Andrew Morton -[the various mmotm patches updating this were rolled up. --kyle] -[[http://userweb.kernel.org/~akpm/mmotm/broken-out/mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds-fix-set_pgdat_percpu_threshold-dont-use-for_each_online_cpu.patch]] ---- - include/linux/vmstat.h | 10 ++++++---- - mm/vmscan.c | 19 +++++++++++++++++-- - mm/vmstat.c | 36 +++++++----------------------------- - 3 files changed, 30 insertions(+), 35 deletions(-) - -diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h -index e4cc21c..833e676 100644 ---- a/include/linux/vmstat.h -+++ b/include/linux/vmstat.h -@@ -254,8 +254,11 @@ extern void dec_zone_state(struct zone *, enum zone_stat_item); - extern void __dec_zone_state(struct zone *, enum zone_stat_item); - - void refresh_cpu_vm_stats(int); --void reduce_pgdat_percpu_threshold(pg_data_t *pgdat); --void restore_pgdat_percpu_threshold(pg_data_t *pgdat); -+ -+int calculate_pressure_threshold(struct zone *zone); -+int calculate_normal_threshold(struct zone *zone); -+void set_pgdat_percpu_threshold(pg_data_t *pgdat, -+ int (*calculate_pressure)(struct zone *)); - #else /* CONFIG_SMP */ - - /* -@@ -300,8 +303,7 @@ static inline void __dec_zone_page_state(struct page *page, - #define dec_zone_page_state __dec_zone_page_state - #define mod_zone_page_state __mod_zone_page_state - --static inline void reduce_pgdat_percpu_threshold(pg_data_t *pgdat) { } --static inline void restore_pgdat_percpu_threshold(pg_data_t *pgdat) { } -+#define set_pgdat_percpu_threshold(pgdat, callback) { } - - static inline void refresh_cpu_vm_stats(int cpu) { } - #endif -diff --git a/mm/vmscan.c b/mm/vmscan.c -index 3e71cb1..ba39948 100644 ---- a/mm/vmscan.c -+++ b/mm/vmscan.c -@@ -2378,9 +2378,24 @@ static int kswapd(void *p) - */ - if (!sleeping_prematurely(pgdat, order, remaining)) { - trace_mm_vmscan_kswapd_sleep(pgdat->node_id); -- restore_pgdat_percpu_threshold(pgdat); -+ -+ /* -+ * vmstat counters are not perfectly -+ * accurate and the estimated value -+ * for counters such as NR_FREE_PAGES -+ * can deviate from the true value by -+ * nr_online_cpus * threshold. To -+ * avoid the zone watermarks being -+ * breached while under pressure, we -+ * reduce the per-cpu vmstat threshold -+ * while kswapd is awake and restore -+ * them before going back to sleep. -+ */ -+ set_pgdat_percpu_threshold(pgdat, -+ calculate_normal_threshold); - schedule(); -- reduce_pgdat_percpu_threshold(pgdat); -+ set_pgdat_percpu_threshold(pgdat, -+ calculate_pressure_threshold); - } else { - if (remaining) - count_vm_event(KSWAPD_LOW_WMARK_HIT_QUICKLY); -diff --git a/mm/vmstat.c b/mm/vmstat.c -index 4d7faeb..511c2c0 100644 ---- a/mm/vmstat.c -+++ b/mm/vmstat.c -@@ -81,7 +81,7 @@ EXPORT_SYMBOL(vm_stat); - - #ifdef CONFIG_SMP - --static int calculate_pressure_threshold(struct zone *zone) -+int calculate_pressure_threshold(struct zone *zone) - { - int threshold; - int watermark_distance; -@@ -105,7 +105,7 @@ static int calculate_pressure_threshold(struct zone *zone) - return threshold; - } - --static int calculate_threshold(struct zone *zone) -+int calculate_normal_threshold(struct zone *zone) - { - int threshold; - int mem; /* memory in 128 MB units */ -@@ -164,7 +164,7 @@ static void refresh_zone_stat_thresholds(void) - for_each_populated_zone(zone) { - unsigned long max_drift, tolerate_drift; - -- threshold = calculate_threshold(zone); -+ threshold = calculate_normal_threshold(zone); - - for_each_online_cpu(cpu) - per_cpu_ptr(zone->pageset, cpu)->stat_threshold -@@ -183,46 +183,24 @@ static void refresh_zone_stat_thresholds(void) - } - } - --void reduce_pgdat_percpu_threshold(pg_data_t *pgdat) -+void set_pgdat_percpu_threshold(pg_data_t *pgdat, -+ int (*calculate_pressure)(struct zone *)) - { - struct zone *zone; - int cpu; - int threshold; - int i; - -- get_online_cpus(); -- for (i = 0; i < pgdat->nr_zones; i++) { -- zone = &pgdat->node_zones[i]; -- if (!zone->percpu_drift_mark) -- continue; -- -- threshold = calculate_pressure_threshold(zone); -- for_each_online_cpu(cpu) -- per_cpu_ptr(zone->pageset, cpu)->stat_threshold -- = threshold; -- } -- put_online_cpus(); --} -- --void restore_pgdat_percpu_threshold(pg_data_t *pgdat) --{ -- struct zone *zone; -- int cpu; -- int threshold; -- int i; -- -- get_online_cpus(); - for (i = 0; i < pgdat->nr_zones; i++) { - zone = &pgdat->node_zones[i]; - if (!zone->percpu_drift_mark) - continue; - -- threshold = calculate_threshold(zone); -- for_each_online_cpu(cpu) -+ threshold = (*calculate_pressure)(zone); -+ for_each_possible_cpu(cpu) - per_cpu_ptr(zone->pageset, cpu)->stat_threshold - = threshold; - } -- put_online_cpus(); - } - - /* --- -1.7.3.2 - diff --git a/pci-disable-aspm-if-bios-asks-us-to.patch b/pci-disable-aspm-if-bios-asks-us-to.patch deleted file mode 100644 index d67dda4..0000000 --- a/pci-disable-aspm-if-bios-asks-us-to.patch +++ /dev/null @@ -1,144 +0,0 @@ -From linux-kernel-owner@vger.kernel.org Mon Dec 6 14:01:17 2010 -From: Matthew Garrett -To: linux-pci@vger.kernel.org -Cc: linux-kernel@vger.kernel.org, jbarnes@virtuousgeek.org, - Matthew Garrett -Subject: [PATCH v2] PCI: Disable ASPM if BIOS asks us to -Date: Mon, 6 Dec 2010 14:00:56 -0500 -Message-Id: <1291662056-6055-1-git-send-email-mjg@redhat.com> - -We currently refuse to touch the ASPM registers if the BIOS tells us that -ASPM isn't supported. This can cause problems if the BIOS has (for any -reason) enabled ASPM on some devices anyway. Change the code such that we -explicitly clear ASPM if the FADT indicates that ASPM isn't supported, -and make sure we tidy up appropriately on device removal in order to deal -with the hotplug case. If ASPM is disabled because the BIOS doesn't hand -over control then we won't touch the registers. - -Signed-off-by: Matthew Garrett ---- - -Implement Rafael's suggestion to use two separate functions, and also -ensure that we clear the clkpm bit as well as the ASPM bits. - - drivers/pci/pci-acpi.c | 1 + - drivers/pci/pcie/aspm.c | 21 +++++++++++++++++---- - include/linux/pci-aspm.h | 5 ++++- - 3 files changed, 22 insertions(+), 5 deletions(-) - -diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c -index 24e19c5..d7ea699 100644 ---- a/drivers/pci/pci-acpi.c -+++ b/drivers/pci/pci-acpi.c -@@ -399,6 +399,7 @@ static int __init acpi_pci_init(void) - - if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) { - printk(KERN_INFO"ACPI FADT declares the system doesn't support PCIe ASPM, so disable it\n"); -+ pcie_clear_aspm(); - pcie_no_aspm(); - } - -diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c -index 7122281..8112415 100644 ---- a/drivers/pci/pcie/aspm.c -+++ b/drivers/pci/pcie/aspm.c -@@ -68,7 +68,7 @@ struct pcie_link_state { - struct aspm_latency acceptable[8]; - }; - --static int aspm_disabled, aspm_force; -+static int aspm_disabled, aspm_force, aspm_clear_state; - static DEFINE_MUTEX(aspm_lock); - static LIST_HEAD(link_list); - -@@ -139,7 +139,7 @@ static void pcie_set_clkpm(struct pcie_link_state *link, int enable) - { - /* Don't enable Clock PM if the link is not Clock PM capable */ - if (!link->clkpm_capable && enable) -- return; -+ enable = 0; - /* Need nothing if the specified equals to current state */ - if (link->clkpm_enabled == enable) - return; -@@ -498,6 +498,10 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev) - struct pci_dev *child; - int pos; - u32 reg32; -+ -+ if (aspm_clear_state) -+ return -EINVAL; -+ - /* - * Some functions in a slot might not all be PCIe functions, - * very strange. Disable ASPM for the whole slot -@@ -563,12 +567,15 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev) - struct pcie_link_state *link; - int blacklist = !!pcie_aspm_sanity_check(pdev); - -- if (aspm_disabled || !pci_is_pcie(pdev) || pdev->link_state) -+ if (!pci_is_pcie(pdev) || pdev->link_state) - return; - if (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT && - pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM) - return; - -+ if (aspm_disabled && !aspm_clear_state) -+ return; -+ - /* VIA has a strange chipset, root port is under a bridge */ - if (pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT && - pdev->bus->self) -@@ -641,7 +648,7 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev) - struct pci_dev *parent = pdev->bus->self; - struct pcie_link_state *link, *root, *parent_link; - -- if (aspm_disabled || !pci_is_pcie(pdev) || -+ if ((aspm_disabled && !aspm_clear_state) || !pci_is_pcie(pdev) || - !parent || !parent->link_state) - return; - if ((parent->pcie_type != PCI_EXP_TYPE_ROOT_PORT) && -@@ -899,6 +906,12 @@ static int __init pcie_aspm_disable(char *str) - - __setup("pcie_aspm=", pcie_aspm_disable); - -+void pcie_clear_aspm(void) -+{ -+ if (!aspm_force) -+ aspm_clear_state = 1; -+} -+ - void pcie_no_aspm(void) - { - if (!aspm_force) -diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h -index 91ba0b3..ce68105 100644 ---- a/include/linux/pci-aspm.h -+++ b/include/linux/pci-aspm.h -@@ -27,6 +27,7 @@ extern void pcie_aspm_init_link_state(struct pci_dev *pdev); - extern void pcie_aspm_exit_link_state(struct pci_dev *pdev); - extern void pcie_aspm_pm_state_change(struct pci_dev *pdev); - extern void pci_disable_link_state(struct pci_dev *pdev, int state); -+extern void pcie_clear_aspm(void); - extern void pcie_no_aspm(void); - #else - static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) -@@ -41,7 +42,9 @@ static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) - static inline void pci_disable_link_state(struct pci_dev *pdev, int state) - { - } -- -+static inline void pcie_clear_aspm(void) -+{ -+} - static inline void pcie_no_aspm(void) - { - } --- -1.7.3.2 - --- -To unsubscribe from this list: send the line "unsubscribe linux-kernel" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html -Please read the FAQ at http://www.tux.org/lkml/ - diff --git a/sources b/sources index deaf3c7..9bfdb36 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ c8ee37b4fdccdb651e0603d35350b434 linux-2.6.37.tar.bz2 -58ad5016a3b3e12b6364b7cceed44a12 patch-2.6.37-git9.bz2 +2aa8806680f37b62479cead4c7034b90 patch-2.6.37-git12.bz2