forked from rpms/kernel
		
	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_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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										33
									
								
								kernel.spec
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								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 <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 | ||||
| - Linux 2.6.37-git9 | ||||
| - Re-enable DEBUG_SET_MODULE_RONX since commit 94462ad3 fixed it. | ||||
|  | ||||
| @ -14,9 +14,9 @@ | ||||
| --- b/mm/mmap.c
 | ||||
| +++ b/mm/mmap.c
 | ||||
| @@ -28,6 +28,7 @@
 | ||||
|  #include <linux/mmu_notifier.h> | ||||
|  #include <linux/perf_event.h> | ||||
|  #include <linux/audit.h> | ||||
|  #include <linux/khugepaged.h> | ||||
| +#include <linux/random.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