snapshot 2.6.37-git12
This commit is contained in:
parent
685274a508
commit
ee6c061eb9
@ -1,26 +0,0 @@
|
|||||||
From 56a2432f60ea0a0c85a93b0951ae8507e5b85270 Mon Sep 17 00:00:00 2001
|
|
||||||
From: dennis <dennis@daedalus.ausil.us>
|
|
||||||
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
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
|||||||
From kyle@infradead.org Wed Sep 22 18:35:38 2010
|
|
||||||
From: Matthew Garrett <mjg@redhat.com>
|
|
||||||
To: linux-acpi@vger.kernel.org
|
|
||||||
Cc: linux-kernel@vger.kernel.org, Matthew Garrett <mjg@redhat.com>
|
|
||||||
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 <mjg@redhat.com>
|
|
||||||
---
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
@ -689,6 +689,7 @@ CONFIG_DM_ZERO=y
|
|||||||
CONFIG_DM_LOG_USERSPACE=m
|
CONFIG_DM_LOG_USERSPACE=m
|
||||||
CONFIG_DM_MULTIPATH_QL=m
|
CONFIG_DM_MULTIPATH_QL=m
|
||||||
CONFIG_DM_MULTIPATH_ST=m
|
CONFIG_DM_MULTIPATH_ST=m
|
||||||
|
CONFIG_DM_RAID=m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Fusion MPT device support
|
# Fusion MPT device support
|
||||||
@ -1925,6 +1926,7 @@ CONFIG_JOYSTICK_XPAD=m
|
|||||||
CONFIG_JOYSTICK_XPAD_FF=y
|
CONFIG_JOYSTICK_XPAD_FF=y
|
||||||
CONFIG_JOYSTICK_XPAD_LEDS=y
|
CONFIG_JOYSTICK_XPAD_LEDS=y
|
||||||
CONFIG_JOYSTICK_ZHENHUA=m
|
CONFIG_JOYSTICK_ZHENHUA=m
|
||||||
|
# CONFIG_JOYSTICK_AS5011 is not set
|
||||||
|
|
||||||
CONFIG_INPUT_TOUCHSCREEN=y
|
CONFIG_INPUT_TOUCHSCREEN=y
|
||||||
# CONFIG_TOUCHSCREEN_AD7879 is not set
|
# CONFIG_TOUCHSCREEN_AD7879 is not set
|
||||||
@ -2082,6 +2084,7 @@ CONFIG_I2C_ALGOPCA=m
|
|||||||
# CONFIG_I2C_ISCH is not set
|
# CONFIG_I2C_ISCH is not set
|
||||||
# CONFIG_I2C_NFORCE2_S4985 is not set
|
# CONFIG_I2C_NFORCE2_S4985 is not set
|
||||||
# CONFIG_I2C_INTEL_MID is not set
|
# CONFIG_I2C_INTEL_MID is not set
|
||||||
|
# CONFIG_I2C_EG20T is not set
|
||||||
|
|
||||||
CONFIG_EEPROM_AT24=m
|
CONFIG_EEPROM_AT24=m
|
||||||
CONFIG_EEPROM_LEGACY=m
|
CONFIG_EEPROM_LEGACY=m
|
||||||
@ -2236,6 +2239,8 @@ CONFIG_W1_SLAVE_DS2431=m
|
|||||||
CONFIG_W1_SLAVE_DS2433=m
|
CONFIG_W1_SLAVE_DS2433=m
|
||||||
CONFIG_W1_SLAVE_DS2433_CRC=y
|
CONFIG_W1_SLAVE_DS2433_CRC=y
|
||||||
CONFIG_W1_SLAVE_DS2760=m
|
CONFIG_W1_SLAVE_DS2760=m
|
||||||
|
CONFIG_W1_SLAVE_DS2423=m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Mice
|
# Mice
|
||||||
#
|
#
|
||||||
@ -3040,6 +3045,7 @@ CONFIG_HID_3M_PCT=y
|
|||||||
CONFIG_LOGIG940_FF=y
|
CONFIG_LOGIG940_FF=y
|
||||||
CONFIG_HID_MAGICMOUSE=y
|
CONFIG_HID_MAGICMOUSE=y
|
||||||
CONFIG_HID_MOSART=y
|
CONFIG_HID_MOSART=y
|
||||||
|
CONFIG_HID_MULTITOUCH=m
|
||||||
CONFIG_HID_NTRIG=y
|
CONFIG_HID_NTRIG=y
|
||||||
CONFIG_HID_QUANTA=y
|
CONFIG_HID_QUANTA=y
|
||||||
CONFIG_HID_STANTUM=y
|
CONFIG_HID_STANTUM=y
|
||||||
@ -3383,6 +3389,7 @@ CONFIG_MFD_WM8400=m
|
|||||||
# CONFIG_MFD_RDC321X is not set
|
# CONFIG_MFD_RDC321X is not set
|
||||||
# CONFIG_MFD_JANZ_CMODIO is not set
|
# CONFIG_MFD_JANZ_CMODIO is not set
|
||||||
# CONFIG_MFD_WM831X_I2C is not set
|
# CONFIG_MFD_WM831X_I2C is not set
|
||||||
|
CONFIG_MFD_CS5535=m
|
||||||
|
|
||||||
#
|
#
|
||||||
# File systems
|
# File systems
|
||||||
@ -3723,12 +3730,14 @@ CONFIG_AUDITSYSCALL=y
|
|||||||
#
|
#
|
||||||
CONFIG_CRYPTO=y
|
CONFIG_CRYPTO=y
|
||||||
CONFIG_CRYPTO_FIPS=y
|
CONFIG_CRYPTO_FIPS=y
|
||||||
|
CONFIG_CRYPTO_USER_API_HASH=y
|
||||||
|
CONFIG_CRYPTO_USER_API_SKCIPHER=y
|
||||||
CONFIG_CRYPTO_MANAGER_TESTS=y
|
CONFIG_CRYPTO_MANAGER_TESTS=y
|
||||||
CONFIG_CRYPTO_HW=y
|
CONFIG_CRYPTO_HW=y
|
||||||
CONFIG_CRYPTO_BLKCIPHER=y
|
CONFIG_CRYPTO_BLKCIPHER=y
|
||||||
CONFIG_CRYPTO_MANAGER=m
|
CONFIG_CRYPTO_MANAGER=m
|
||||||
# CONFIG_CRYPTO_CRYPTD is not set
|
# CONFIG_CRYPTO_CRYPTD is not set
|
||||||
CONFIG_CRYPTO_AES=m
|
CONFIG_CRYPTO_AES=y
|
||||||
CONFIG_CRYPTO_ARC4=m
|
CONFIG_CRYPTO_ARC4=m
|
||||||
CONFIG_CRYPTO_ANUBIS=m
|
CONFIG_CRYPTO_ANUBIS=m
|
||||||
CONFIG_CRYPTO_AUTHENC=m
|
CONFIG_CRYPTO_AUTHENC=m
|
||||||
@ -3736,14 +3745,14 @@ CONFIG_CRYPTO_BLOWFISH=m
|
|||||||
CONFIG_CRYPTO_CAMELLIA=m
|
CONFIG_CRYPTO_CAMELLIA=m
|
||||||
CONFIG_CRYPTO_CAST5=m
|
CONFIG_CRYPTO_CAST5=m
|
||||||
CONFIG_CRYPTO_CAST6=m
|
CONFIG_CRYPTO_CAST6=m
|
||||||
CONFIG_CRYPTO_CBC=m
|
CONFIG_CRYPTO_CBC=y
|
||||||
CONFIG_CRYPTO_CCM=m
|
CONFIG_CRYPTO_CCM=m
|
||||||
CONFIG_CRYPTO_CRC32C=y
|
CONFIG_CRYPTO_CRC32C=y
|
||||||
CONFIG_CRYPTO_CTR=m
|
CONFIG_CRYPTO_CTR=y
|
||||||
CONFIG_CRYPTO_CTS=m
|
CONFIG_CRYPTO_CTS=m
|
||||||
CONFIG_CRYPTO_DEFLATE=m
|
CONFIG_CRYPTO_DEFLATE=m
|
||||||
CONFIG_CRYPTO_DES=m
|
CONFIG_CRYPTO_DES=m
|
||||||
CONFIG_CRYPTO_ECB=m
|
CONFIG_CRYPTO_ECB=y
|
||||||
CONFIG_CRYPTO_FCRYPT=m
|
CONFIG_CRYPTO_FCRYPT=m
|
||||||
CONFIG_CRYPTO_GCM=m
|
CONFIG_CRYPTO_GCM=m
|
||||||
CONFIG_CRYPTO_GF128MUL=m
|
CONFIG_CRYPTO_GF128MUL=m
|
||||||
@ -4107,15 +4116,17 @@ CONFIG_POWER_SUPPLY=m
|
|||||||
# CONFIG_POWER_SUPPLY_DEBUG is not set
|
# CONFIG_POWER_SUPPLY_DEBUG is not set
|
||||||
# CONFIG_TEST_POWER is not set
|
# CONFIG_TEST_POWER is not set
|
||||||
CONFIG_APM_POWER=m
|
CONFIG_APM_POWER=m
|
||||||
CONFIG_WM831X_POWER=m
|
# CONFIG_WM831X_POWER is not set
|
||||||
# CONFIG_BATTERY_DS2760 is not set
|
# CONFIG_BATTERY_DS2760 is not set
|
||||||
# CONFIG_BATTERY_DS2782 is not set
|
# CONFIG_BATTERY_DS2782 is not set
|
||||||
# CONFIG_BATTERY_BQ20Z75 is not set
|
# CONFIG_BATTERY_BQ20Z75 is not set
|
||||||
# CONFIG_CHARGER_ISP1704 is not set
|
# CONFIG_CHARGER_ISP1704 is not set
|
||||||
CONFIG_BATTERY_PMU=m
|
CONFIG_BATTERY_PMU=m
|
||||||
CONFIG_BATTERY_BQ27x00=m
|
# CONFIG_BATTERY_BQ27x00 is not set
|
||||||
CONFIG_BATTERY_MAX17040=m
|
# CONFIG_BATTERY_MAX17040 is not set
|
||||||
# CONFIG_PDA_POWER is not set
|
# CONFIG_PDA_POWER is not set
|
||||||
|
# CONFIG_CHARGER_GPIO is not set
|
||||||
|
# CONFIG_BATTERY_MAX17042 is not set
|
||||||
|
|
||||||
CONFIG_AUXDISPLAY=y
|
CONFIG_AUXDISPLAY=y
|
||||||
|
|
||||||
@ -4375,6 +4386,9 @@ CONFIG_PPS=m
|
|||||||
# CONFIG_PPS_CLIENT_KTIMER is not set
|
# CONFIG_PPS_CLIENT_KTIMER is not set
|
||||||
CONFIG_PPS_CLIENT_LDISC=m
|
CONFIG_PPS_CLIENT_LDISC=m
|
||||||
# CONFIG_PPS_DEBUG is not set
|
# 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_USB_SERIAL_QUATECH2 is not set
|
||||||
# CONFIG_VT6655 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_BASIC_MMIO is not set
|
||||||
# CONFIG_GPIO_VX855 is not set
|
# CONFIG_GPIO_VX855 is not set
|
||||||
# CONFIG_GPIO_PCH is not set
|
# CONFIG_GPIO_PCH is not set
|
||||||
|
# CONFIG_GPIO_ML_IOH is not set
|
||||||
|
|
||||||
CONFIG_KSYM_TRACER=y
|
CONFIG_KSYM_TRACER=y
|
||||||
CONFIG_PROFILE_KSYM_TRACER=y
|
CONFIG_PROFILE_KSYM_TRACER=y
|
||||||
@ -4465,3 +4480,8 @@ CONFIG_SPARSE_RCU_POINTER=y
|
|||||||
CONFIG_BKL=y
|
CONFIG_BKL=y
|
||||||
|
|
||||||
CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
|
CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
|
||||||
|
|
||||||
|
# CONFIG_XZ_DEC_TEST is not set
|
||||||
|
|
||||||
|
CONFIG_NFC_DEVICES=y
|
||||||
|
CONFIG_PN544_NFC=m
|
||||||
|
@ -139,6 +139,7 @@ CONFIG_ACPI_VIDEO=m
|
|||||||
# CONFIG_ACPI_PROC_EVENT is not set
|
# CONFIG_ACPI_PROC_EVENT is not set
|
||||||
CONFIG_ACPI_HED=m
|
CONFIG_ACPI_HED=m
|
||||||
CONFIG_ACPI_EC_DEBUGFS=m
|
CONFIG_ACPI_EC_DEBUGFS=m
|
||||||
|
CONFIG_ACPI_IPMI=m
|
||||||
|
|
||||||
CONFIG_PM=y
|
CONFIG_PM=y
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
@ -154,6 +154,7 @@ CONFIG_ACPI_HED=m
|
|||||||
CONFIG_ACPI_APEI=y
|
CONFIG_ACPI_APEI=y
|
||||||
CONFIG_ACPI_APEI_GHES=m
|
CONFIG_ACPI_APEI_GHES=m
|
||||||
# CONFIG_ACPI_APEI_EINJ is not set
|
# CONFIG_ACPI_APEI_EINJ is not set
|
||||||
|
CONFIG_ACPI_IPMI=m
|
||||||
|
|
||||||
#
|
#
|
||||||
# CPUFreq processor drivers
|
# CPUFreq processor drivers
|
||||||
@ -374,6 +375,9 @@ CONFIG_XEN_PCIDEV_FRONTEND=m
|
|||||||
CONFIG_XENFS=m
|
CONFIG_XENFS=m
|
||||||
CONFIG_XEN_COMPAT_XENFS=y
|
CONFIG_XEN_COMPAT_XENFS=y
|
||||||
CONFIG_XEN_BACKEND=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_ESB2ROM=m
|
||||||
CONFIG_MTD_CK804XROM=m
|
CONFIG_MTD_CK804XROM=m
|
||||||
@ -408,6 +412,8 @@ CONFIG_SENSORS_I5K_AMB=m
|
|||||||
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
|
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
|
||||||
|
|
||||||
CONFIG_HP_WATCHDOG=m
|
CONFIG_HP_WATCHDOG=m
|
||||||
|
CONFIG_NV_TCO=m
|
||||||
|
CONFIG_SP5100_TCO=m
|
||||||
|
|
||||||
CONFIG_OLPC=y
|
CONFIG_OLPC=y
|
||||||
CONFIG_OLPC_OPENFIRMWARE=y
|
CONFIG_OLPC_OPENFIRMWARE=y
|
||||||
@ -445,7 +451,6 @@ CONFIG_X86_RESERVE_LOW_64K=y
|
|||||||
|
|
||||||
CONFIG_PANASONIC_LAPTOP=m
|
CONFIG_PANASONIC_LAPTOP=m
|
||||||
|
|
||||||
CONFIG_XEN_DEBUG_FS=y
|
|
||||||
CONFIG_X86_PTRACE_BTS=y
|
CONFIG_X86_PTRACE_BTS=y
|
||||||
|
|
||||||
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=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_MFD_TPS6586X is not set
|
||||||
# CONFIG_INTEL_MID_DMAC is not set
|
# CONFIG_INTEL_MID_DMAC is not set
|
||||||
CONFIG_PCH_DMA=m
|
CONFIG_PCH_DMA=m
|
||||||
CONFIG_XEN_PLATFORM_PCI=m
|
|
||||||
# CONFIG_ACPI_QUICKSTART is not set
|
# CONFIG_ACPI_QUICKSTART is not set
|
||||||
CONFIG_IDEAPAD_ACPI=m
|
CONFIG_IDEAPAD_ACPI=m
|
||||||
CONFIG_INTEL_IPS=m
|
CONFIG_INTEL_IPS=m
|
||||||
@ -529,3 +533,14 @@ CONFIG_PCH_PHUB=m
|
|||||||
CONFIG_JUMP_LABEL=y
|
CONFIG_JUMP_LABEL=y
|
||||||
|
|
||||||
CONFIG_X86_32_IRIS=m
|
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
|
||||||
|
@ -98,6 +98,7 @@ CONFIG_ACPI_HED=m
|
|||||||
CONFIG_ACPI_APEI=y
|
CONFIG_ACPI_APEI=y
|
||||||
CONFIG_ACPI_APEI_GHES=m
|
CONFIG_ACPI_APEI_GHES=m
|
||||||
# CONFIG_ACPI_APEI_EINJ is not set
|
# CONFIG_ACPI_APEI_EINJ is not set
|
||||||
|
CONFIG_ACPI_IPMI=m
|
||||||
|
|
||||||
CONFIG_X86_PLATFORM_DEVICES=y
|
CONFIG_X86_PLATFORM_DEVICES=y
|
||||||
CONFIG_ASUS_LAPTOP=m
|
CONFIG_ASUS_LAPTOP=m
|
||||||
@ -155,8 +156,8 @@ CONFIG_CRYPTO_DEV_PADLOCK=m
|
|||||||
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
|
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
|
||||||
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
|
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
|
||||||
|
|
||||||
CONFIG_CRYPTO_AES_X86_64=m
|
CONFIG_CRYPTO_AES_X86_64=y
|
||||||
CONFIG_CRYPTO_AES_NI_INTEL=m
|
CONFIG_CRYPTO_AES_NI_INTEL=y
|
||||||
CONFIG_CRYPTO_TWOFISH_X86_64=m
|
CONFIG_CRYPTO_TWOFISH_X86_64=m
|
||||||
CONFIG_CRYPTO_SALSA20_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_DEV_EVTCHN=m
|
||||||
CONFIG_XEN_SYS_HYPERVISOR=y
|
CONFIG_XEN_SYS_HYPERVISOR=y
|
||||||
CONFIG_XEN_BACKEND=y
|
CONFIG_XEN_BACKEND=y
|
||||||
|
CONFIG_XEN_GNTDEV=m
|
||||||
|
CONFIG_XEN_DEBUG_FS=y
|
||||||
|
CONFIG_XEN_PLATFORM_PCI=m
|
||||||
|
|
||||||
CONFIG_DMADEVICES=y
|
CONFIG_DMADEVICES=y
|
||||||
CONFIG_INTEL_IOATDMA=m
|
CONFIG_INTEL_IOATDMA=m
|
||||||
@ -318,6 +322,8 @@ CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
|
|||||||
# CONFIG_CPA_DEBUG is not set
|
# CONFIG_CPA_DEBUG is not set
|
||||||
|
|
||||||
CONFIG_HP_WATCHDOG=m
|
CONFIG_HP_WATCHDOG=m
|
||||||
|
CONFIG_NV_TCO=m
|
||||||
|
CONFIG_SP5100_TCO=m
|
||||||
|
|
||||||
CONFIG_FRAME_WARN=2048
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
@ -357,7 +363,6 @@ CONFIG_X86_RESERVE_LOW_64K=y
|
|||||||
|
|
||||||
CONFIG_PANASONIC_LAPTOP=m
|
CONFIG_PANASONIC_LAPTOP=m
|
||||||
|
|
||||||
CONFIG_XEN_DEBUG_FS=y
|
|
||||||
CONFIG_X86_PTRACE_BTS=y
|
CONFIG_X86_PTRACE_BTS=y
|
||||||
|
|
||||||
CONFIG_I7300_IDLE=m
|
CONFIG_I7300_IDLE=m
|
||||||
@ -422,7 +427,6 @@ CONFIG_HPWDT_NMI_DECODING=y
|
|||||||
# CONFIG_MFD_TPS6586X is not set
|
# CONFIG_MFD_TPS6586X is not set
|
||||||
# CONFIG_INTEL_MID_DMAC is not set
|
# CONFIG_INTEL_MID_DMAC is not set
|
||||||
CONFIG_PCH_DMA=m
|
CONFIG_PCH_DMA=m
|
||||||
CONFIG_XEN_PLATFORM_PCI=m
|
|
||||||
# CONFIG_ACPI_QUICKSTART is not set
|
# CONFIG_ACPI_QUICKSTART is not set
|
||||||
CONFIG_IDEAPAD_ACPI=m
|
CONFIG_IDEAPAD_ACPI=m
|
||||||
CONFIG_INTEL_IPS=m
|
CONFIG_INTEL_IPS=m
|
||||||
@ -441,3 +445,5 @@ CONFIG_VIDEO_VIA_CAMERA=m
|
|||||||
CONFIG_JUMP_LABEL=y
|
CONFIG_JUMP_LABEL=y
|
||||||
|
|
||||||
CONFIG_HP_ILO=m
|
CONFIG_HP_ILO=m
|
||||||
|
|
||||||
|
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||||
|
33
kernel.spec
33
kernel.spec
@ -84,7 +84,7 @@ Summary: The Linux kernel
|
|||||||
# The rc snapshot level
|
# The rc snapshot level
|
||||||
%define rcrev 0
|
%define rcrev 0
|
||||||
# The git snapshot level
|
# The git snapshot level
|
||||||
%define gitrev 9
|
%define gitrev 12
|
||||||
# Set rpm version accordingly
|
# Set rpm version accordingly
|
||||||
%define rpmversion 2.6.%{upstream_sublevel}
|
%define rpmversion 2.6.%{upstream_sublevel}
|
||||||
%endif
|
%endif
|
||||||
@ -620,7 +620,6 @@ Patch31: linux-2.6-utrace.patch
|
|||||||
Patch32: linux-2.6-utrace-ptrace.patch
|
Patch32: linux-2.6-utrace-ptrace.patch
|
||||||
|
|
||||||
Patch150: linux-2.6.29-sparc-IOC_TYPECHECK.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
|
Patch160: linux-2.6-32bit-mmap-exec-randomization.patch
|
||||||
Patch161: linux-2.6-i386-nx-emulation.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
|
Patch380: linux-2.6-defaults-pci_no_msi.patch
|
||||||
Patch381: linux-2.6-defaults-pci_use_crs.patch
|
Patch381: linux-2.6-defaults-pci_use_crs.patch
|
||||||
Patch383: linux-2.6-defaults-aspm.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
|
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
|
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
|
Patch391: linux-2.6-acpi-video-dos.patch
|
||||||
Patch393: acpi-ec-add-delay-before-write.patch
|
Patch393: acpi-ec-add-delay-before-write.patch
|
||||||
Patch394: linux-2.6-acpi-debug-infinite-loop.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
|
Patch450: linux-2.6-input-kill-stupid-messages.patch
|
||||||
Patch452: linux-2.6.30-no-pcspkr-modalias.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
|
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
|
Patch12421: fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -1181,7 +1175,6 @@ ApplyPatch linux-2.6-utrace-ptrace.patch
|
|||||||
# SPARC64
|
# SPARC64
|
||||||
#
|
#
|
||||||
ApplyPatch linux-2.6.29-sparc-IOC_TYPECHECK.patch
|
ApplyPatch linux-2.6.29-sparc-IOC_TYPECHECK.patch
|
||||||
ApplyPatch 0001-use-__devexit-not-__exit-in-n2_unregister_algs-fixes.patch
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Exec shield
|
# Exec shield
|
||||||
@ -1213,7 +1206,6 @@ ApplyPatch linux-2.6-defaults-acpi-video.patch
|
|||||||
ApplyPatch linux-2.6-acpi-video-dos.patch
|
ApplyPatch linux-2.6-acpi-video-dos.patch
|
||||||
ApplyPatch acpi-ec-add-delay-before-write.patch
|
ApplyPatch acpi-ec-add-delay-before-write.patch
|
||||||
ApplyPatch linux-2.6-acpi-debug-infinite-loop.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.
|
# Various low-impact patches to aid debugging.
|
||||||
ApplyPatch linux-2.6-debug-sizeof-structs.patch
|
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
|
ApplyPatch linux-2.6-defaults-pci_use_crs.patch
|
||||||
# enable ASPM by default on hardware we expect to work
|
# enable ASPM by default on hardware we expect to work
|
||||||
ApplyPatch linux-2.6-defaults-aspm.patch
|
ApplyPatch linux-2.6-defaults-aspm.patch
|
||||||
ApplyPatch pci-disable-aspm-if-bios-asks-us-to.patch
|
|
||||||
# rhbz#638912
|
# 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
|
#ApplyPatch ima-allow-it-to-be-completely-disabled-and-default-off.patch
|
||||||
|
|
||||||
@ -1341,8 +1332,8 @@ ApplyPatch efi_default_physical.patch
|
|||||||
|
|
||||||
# Runtime PM
|
# Runtime PM
|
||||||
ApplyPatch linux-2.6-usb-pci-autosuspend.patch
|
ApplyPatch linux-2.6-usb-pci-autosuspend.patch
|
||||||
ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch
|
#ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch
|
||||||
ApplyPatch runtime_pm_fixups.patch
|
#ApplyPatch runtime_pm_fixups.patch
|
||||||
|
|
||||||
# rhbz#605888
|
# rhbz#605888
|
||||||
ApplyPatch dmar-disable-when-ricoh-multifunction.patch
|
ApplyPatch dmar-disable-when-ricoh-multifunction.patch
|
||||||
@ -1350,10 +1341,6 @@ ApplyPatch dmar-disable-when-ricoh-multifunction.patch
|
|||||||
# rhbz#630464
|
# rhbz#630464
|
||||||
ApplyPatch debug-tty-print-dev-name.patch
|
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
|
# rhbz#662344,600690
|
||||||
ApplyPatch fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
ApplyPatch fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||||
|
|
||||||
@ -1969,6 +1956,18 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Jan 14 2011 Kyle McMartin <kmcmartin@redhat.com> 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 <kmcmartin@redhat.com> 2.6.38-0.rc0.git9.1
|
* Wed Jan 12 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc0.git9.1
|
||||||
- Linux 2.6.37-git9
|
- Linux 2.6.37-git9
|
||||||
- Re-enable DEBUG_SET_MODULE_RONX since commit 94462ad3 fixed it.
|
- Re-enable DEBUG_SET_MODULE_RONX since commit 94462ad3 fixed it.
|
||||||
|
@ -14,9 +14,9 @@
|
|||||||
--- b/mm/mmap.c
|
--- b/mm/mmap.c
|
||||||
+++ b/mm/mmap.c
|
+++ b/mm/mmap.c
|
||||||
@@ -28,6 +28,7 @@
|
@@ -28,6 +28,7 @@
|
||||||
#include <linux/mmu_notifier.h>
|
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
#include <linux/audit.h>
|
#include <linux/audit.h>
|
||||||
|
#include <linux/khugepaged.h>
|
||||||
+#include <linux/random.h>
|
+#include <linux/random.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
@ -1,389 +0,0 @@
|
|||||||
From df43fae25437d7bc7dfff72599c1e825038b67cf Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mel Gorman <mel@csn.ul.ie>
|
|
||||||
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 <shaohua.li@intel.com>
|
|
||||||
Signed-off-by: Mel Gorman <mel@csn.ul.ie>
|
|
||||||
Reviewed-by: Christoph Lameter <cl@linux.com>
|
|
||||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
||||||
[[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
|
|
||||||
|
|
@ -1,167 +0,0 @@
|
|||||||
From 82e3d4969144377d13da97d511e849e8cf3e6dcc Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mel Gorman <mel@csn.ul.ie>
|
|
||||||
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 <mel@csn.ul.ie>
|
|
||||||
Reviewed-by: Christoph Lameter <cl@linux.com>
|
|
||||||
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
|
|
||||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
||||||
[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
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
|||||||
From linux-kernel-owner@vger.kernel.org Mon Dec 6 14:01:17 2010
|
|
||||||
From: Matthew Garrett <mjg@redhat.com>
|
|
||||||
To: linux-pci@vger.kernel.org
|
|
||||||
Cc: linux-kernel@vger.kernel.org, jbarnes@virtuousgeek.org,
|
|
||||||
Matthew Garrett <mjg@redhat.com>
|
|
||||||
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 <mjg@redhat.com>
|
|
||||||
---
|
|
||||||
|
|
||||||
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/
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user