Compare commits
1 Commits
master
...
f14-user-k
Author | SHA1 | Date |
---|---|---|
Kyle McMartin | 01c454921a |
File diff suppressed because it is too large
Load Diff
|
@ -1,33 +0,0 @@
|
||||||
From patchwork Tue Jan 4 18:46:49 2011
|
|
||||||
Content-Type: text/plain; charset="utf-8"
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Transfer-Encoding: 7bit
|
|
||||||
Subject: drm/i915: check eDP encoder correctly when setting modes
|
|
||||||
Date: Tue, 04 Jan 2011 18:46:49 -0000
|
|
||||||
From: Jesse Barnes <jbarnes@virtuousgeek.org>
|
|
||||||
X-Patchwork-Id: 451441
|
|
||||||
Message-Id: <1294166809-3316-1-git-send-email-jbarnes@virtuousgeek.org>
|
|
||||||
To: intel-gfx@lists.freedesktop.org
|
|
||||||
|
|
||||||
We were using a stale pointer in the check which caused us to use CPU
|
|
||||||
attached DP params when we should have been using PCH attached params.
|
|
||||||
|
|
||||||
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
|
|
||||||
|
|
||||||
---
|
|
||||||
drivers/gpu/drm/i915/intel_display.c | 2 +-
|
|
||||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
|
||||||
index fe56cb3..28d58ef 100644
|
|
||||||
--- a/drivers/gpu/drm/i915/intel_display.c
|
|
||||||
+++ b/drivers/gpu/drm/i915/intel_display.c
|
|
||||||
@@ -3949,7 +3949,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
|
|
||||||
int lane = 0, link_bw, bpp;
|
|
||||||
/* CPU eDP doesn't require FDI link, so just set DP M/N
|
|
||||||
according to current link config */
|
|
||||||
- if (has_edp_encoder && !intel_encoder_is_pch_edp(&encoder->base)) {
|
|
||||||
+ if (has_edp_encoder && !intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
|
|
||||||
target_clock = mode->clock;
|
|
||||||
intel_edp_link_config(has_edp_encoder,
|
|
||||||
&lane, &link_bw);
|
|
17
kernel.spec
17
kernel.spec
|
@ -51,7 +51,7 @@ Summary: The Linux kernel
|
||||||
# For non-released -rc kernels, this will be prepended with "0.", so
|
# For non-released -rc kernels, this will be prepended with "0.", so
|
||||||
# for example a 3 here will become 0.3
|
# for example a 3 here will become 0.3
|
||||||
#
|
#
|
||||||
%global baserelease 2
|
%global baserelease 1
|
||||||
%global fedora_build %{baserelease}
|
%global fedora_build %{baserelease}
|
||||||
|
|
||||||
# base_sublevel is the kernel version we're starting with and patching
|
# base_sublevel is the kernel version we're starting with and patching
|
||||||
|
@ -63,7 +63,7 @@ Summary: The Linux kernel
|
||||||
%if 0%{?released_kernel}
|
%if 0%{?released_kernel}
|
||||||
|
|
||||||
# Do we have a -stable update to apply?
|
# Do we have a -stable update to apply?
|
||||||
%define stable_update 0
|
%define stable_update 2
|
||||||
# Is it a -stable RC?
|
# Is it a -stable RC?
|
||||||
%define stable_rc 0
|
%define stable_rc 0
|
||||||
# Set rpm version accordingly
|
# Set rpm version accordingly
|
||||||
|
@ -679,7 +679,6 @@ Patch1824: drm-intel-next.patch
|
||||||
# make sure the lvds comes back on lid open
|
# make sure the lvds comes back on lid open
|
||||||
Patch1825: drm-intel-make-lvds-work.patch
|
Patch1825: drm-intel-make-lvds-work.patch
|
||||||
Patch1826: drm-intel-edp-fixes.patch
|
Patch1826: drm-intel-edp-fixes.patch
|
||||||
Patch1827: drm_i915-check-eDP-encoder-correctly-when-setting-modes.patch
|
|
||||||
|
|
||||||
Patch1900: linux-2.6-intel-iommu-igfx.patch
|
Patch1900: linux-2.6-intel-iommu-igfx.patch
|
||||||
|
|
||||||
|
@ -719,8 +718,6 @@ Patch12017: prevent-runtime-conntrack-changes.patch
|
||||||
|
|
||||||
Patch12018: neuter_intel_microcode_load.patch
|
Patch12018: neuter_intel_microcode_load.patch
|
||||||
|
|
||||||
Patch12030: tpm-fix-stall-on-boot.patch
|
|
||||||
|
|
||||||
Patch12100: applesmc_update.patch
|
Patch12100: applesmc_update.patch
|
||||||
Patch12101: apple_backlight.patch
|
Patch12101: apple_backlight.patch
|
||||||
Patch12102: efifb_update.patch
|
Patch12102: efifb_update.patch
|
||||||
|
@ -738,7 +735,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
|
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
|
||||||
|
@ -1305,7 +1301,6 @@ ApplyPatch drm-intel-big-hammer.patch
|
||||||
ApplyPatch drm-intel-make-lvds-work.patch
|
ApplyPatch drm-intel-make-lvds-work.patch
|
||||||
ApplyPatch linux-2.6-intel-iommu-igfx.patch
|
ApplyPatch linux-2.6-intel-iommu-igfx.patch
|
||||||
ApplyPatch drm-intel-edp-fixes.patch
|
ApplyPatch drm-intel-edp-fixes.patch
|
||||||
ApplyPatch drm_i915-check-eDP-encoder-correctly-when-setting-modes.patch
|
|
||||||
|
|
||||||
# linux1394 git patches
|
# linux1394 git patches
|
||||||
#ApplyPatch linux-2.6-firewire-git-update.patch
|
#ApplyPatch linux-2.6-firewire-git-update.patch
|
||||||
|
@ -1339,9 +1334,6 @@ ApplyPatch add-appleir-usb-driver.patch
|
||||||
|
|
||||||
ApplyPatch neuter_intel_microcode_load.patch
|
ApplyPatch neuter_intel_microcode_load.patch
|
||||||
|
|
||||||
# try to fix stalls during boot (#530393)
|
|
||||||
ApplyPatch tpm-fix-stall-on-boot.patch
|
|
||||||
|
|
||||||
# various fixes for Apple and EFI
|
# various fixes for Apple and EFI
|
||||||
ApplyPatch applesmc_update.patch
|
ApplyPatch applesmc_update.patch
|
||||||
ApplyPatch apple_backlight.patch
|
ApplyPatch apple_backlight.patch
|
||||||
|
@ -1363,7 +1355,6 @@ ApplyPatch dmar-disable-when-ricoh-multifunction.patch
|
||||||
ApplyPatch debug-tty-print-dev-name.patch
|
ApplyPatch debug-tty-print-dev-name.patch
|
||||||
|
|
||||||
# backport some fixes for kswapd from mmotm, rhbz#649694
|
# 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
|
ApplyPatch mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch
|
||||||
|
|
||||||
# rhbz#662344,600690
|
# rhbz#662344,600690
|
||||||
|
@ -1984,6 +1975,10 @@ fi
|
||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Mar 04 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.37.2-1
|
||||||
|
- Linux 2.6.37.2 for Fedora 14 and 13
|
||||||
|
- Drop/fixup conflicting and merged patches.
|
||||||
|
|
||||||
* Wed Jan 19 2011 Roland McGrath <roland@redhat.com>
|
* Wed Jan 19 2011 Roland McGrath <roland@redhat.com>
|
||||||
- utrace update
|
- utrace update
|
||||||
|
|
||||||
|
|
|
@ -50,5 +50,5 @@ index 796ea0c..d9c0748 100644
|
||||||
- if (!suspending && (ehci_readl(ehci, &ehci->regs->status) & STS_PCD))
|
- if (!suspending && (ehci_readl(ehci, &ehci->regs->status) & STS_PCD))
|
||||||
+ if (!suspending && ehci_port_change(ehci))
|
+ if (!suspending && ehci_port_change(ehci))
|
||||||
usb_hcd_resume_root_hub(ehci_to_hcd(ehci));
|
usb_hcd_resume_root_hub(ehci_to_hcd(ehci));
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -119,67 +119,3 @@ index 68114db..104b9f9 100644
|
||||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
|
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
|
||||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
||||||
|
|
||||||
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c
|
|
||||||
index b952317..ee82851 100644
|
|
||||||
--- a/drivers/input/mouse/bcm5974.c
|
|
||||||
+++ b/drivers/input/mouse/bcm5974.c
|
|
||||||
@@ -55,6 +55,14 @@
|
|
||||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
|
|
||||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
|
|
||||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
|
||||||
+/* MacbookAir3,2 (unibody), aka wellspring5 */
|
|
||||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f
|
|
||||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240
|
|
||||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241
|
|
||||||
+/* MacbookAir3,1 (unibody), aka wellspring4 */
|
|
||||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242
|
|
||||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243
|
|
||||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244
|
|
||||||
|
|
||||||
#define BCM5974_DEVICE(prod) { \
|
|
||||||
.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \
|
|
||||||
@@ -80,6 +88,14 @@ static const struct usb_device_id bcm5974_table[] = {
|
|
||||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI),
|
|
||||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ISO),
|
|
||||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
|
|
||||||
+ /* MacbookAir3,2 */
|
|
||||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI),
|
|
||||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ISO),
|
|
||||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_JIS),
|
|
||||||
+ /* MacbookAir3,1 */
|
|
||||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI),
|
|
||||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO),
|
|
||||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS),
|
|
||||||
/* Terminating entry */
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
@@ -234,6 +250,30 @@ static const struct bcm5974_config bcm5974_config_table[] = {
|
|
||||||
{ DIM_X, DIM_X / SN_COORD, -4460, 5166 },
|
|
||||||
{ DIM_Y, DIM_Y / SN_COORD, -75, 6700 }
|
|
||||||
},
|
|
||||||
+ {
|
|
||||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI,
|
|
||||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4_ISO,
|
|
||||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4_JIS,
|
|
||||||
+ HAS_INTEGRATED_BUTTON,
|
|
||||||
+ 0x84, sizeof(struct bt_data),
|
|
||||||
+ 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
|
||||||
+ { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
|
||||||
+ { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
|
||||||
+ { DIM_X, DIM_X / SN_COORD, -4620, 5140 },
|
|
||||||
+ { DIM_Y, DIM_Y / SN_COORD, -150, 6600 }
|
|
||||||
+ },
|
|
||||||
+ {
|
|
||||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI,
|
|
||||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO,
|
|
||||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS,
|
|
||||||
+ HAS_INTEGRATED_BUTTON,
|
|
||||||
+ 0x84, sizeof(struct bt_data),
|
|
||||||
+ 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
|
||||||
+ { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
|
||||||
+ { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
|
||||||
+ { DIM_X, DIM_X / SN_COORD, -4616, 5112 },
|
|
||||||
+ { DIM_Y, DIM_Y / SN_COORD, -142, 5234 }
|
|
||||||
+ },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
|
@ -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
sources
1
sources
|
@ -1 +1,2 @@
|
||||||
c8ee37b4fdccdb651e0603d35350b434 linux-2.6.37.tar.bz2
|
c8ee37b4fdccdb651e0603d35350b434 linux-2.6.37.tar.bz2
|
||||||
|
bb5798f2a2a5af13219d1a250c4dad11 patch-2.6.37.2.bz2
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
Fix TPM timeouts on boot (#530393)
|
|
||||||
|
|
||||||
--- a/drivers/char/tpm/tpm.c
|
|
||||||
+++ a/drivers/char/tpm/tpm.c
|
|
||||||
@@ -354,12 +354,14 @@ unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
|
|
||||||
tpm_protected_ordinal_duration[ordinal &
|
|
||||||
TPM_PROTECTED_ORDINAL_MASK];
|
|
||||||
|
|
||||||
- if (duration_idx != TPM_UNDEFINED)
|
|
||||||
+ if (duration_idx != TPM_UNDEFINED) {
|
|
||||||
duration = chip->vendor.duration[duration_idx];
|
|
||||||
- if (duration <= 0)
|
|
||||||
+ /* if duration is 0, it's because chip->vendor.duration wasn't */
|
|
||||||
+ /* filled yet, so we set the lowest timeout just to give enough */
|
|
||||||
+ /* time to tpm_get_timeouts() succeed */
|
|
||||||
+ return (duration <= 0 ? HZ : duration);
|
|
||||||
+ } else
|
|
||||||
return 2 * 60 * HZ;
|
|
||||||
- else
|
|
||||||
- return duration;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(tpm_calc_ordinal_duration);
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue