Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1375596
| From | Mel Gorman <mgorman@techsingularity.net> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 18/22] mm, page_alloc: Shortcut watermark checks for order-0 pages |
| Date | 2016-04-11 10:30 +0200 |
| Message-ID | <rmFom-2Ng-9@gated-at.bofh.it> (permalink) |
| References | <rmFeF-2HC-1@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Watermarks have to be checked on every allocation including the number of
pages being allocated and whether reserves can be accessed. The reserves
only matter if memory is limited and the free_pages adjustment only applies
to high-order pages. This patch adds a shortcut for order-0 pages that avoids
numerous calculations if there is plenty of free memory yielding the following
performance difference in a page allocator microbenchmark;
4.6.0-rc2 4.6.0-rc2
optfair-v1r12 fastmark-v1r14
Min alloc-odr0-1 370.00 ( 0.00%) 359.00 ( 2.97%)
Min alloc-odr0-2 271.00 ( 0.00%) 259.00 ( 4.43%)
Min alloc-odr0-4 227.00 ( 0.00%) 219.00 ( 3.52%)
Min alloc-odr0-8 197.00 ( 0.00%) 190.00 ( 3.55%)
Min alloc-odr0-16 182.00 ( 0.00%) 176.00 ( 3.30%)
Min alloc-odr0-32 175.00 ( 0.00%) 169.00 ( 3.43%)
Min alloc-odr0-64 171.00 ( 0.00%) 166.00 ( 2.92%)
Min alloc-odr0-128 169.00 ( 0.00%) 164.00 ( 2.96%)
Min alloc-odr0-256 179.00 ( 0.00%) 174.00 ( 2.79%)
Min alloc-odr0-512 192.00 ( 0.00%) 186.00 ( 3.12%)
Min alloc-odr0-1024 201.00 ( 0.00%) 192.00 ( 4.48%)
Min alloc-odr0-2048 205.00 ( 0.00%) 197.00 ( 3.90%)
Min alloc-odr0-4096 211.00 ( 0.00%) 204.00 ( 3.32%)
Min alloc-odr0-8192 214.00 ( 0.00%) 206.00 ( 3.74%)
Min alloc-odr0-16384 214.00 ( 0.00%) 206.00 ( 3.74%)
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
---
mm/page_alloc.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 25a8ab07b287..c131218913e8 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2618,6 +2618,32 @@ bool zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,
zone_page_state(z, NR_FREE_PAGES));
}
+static inline bool zone_watermark_fast(struct zone *z, unsigned int order,
+ unsigned long mark, int classzone_idx, unsigned int alloc_flags)
+{
+ long free_pages = zone_page_state(z, NR_FREE_PAGES);
+ long cma_pages = 0;
+
+#ifdef CONFIG_CMA
+ /* If allocation can't use CMA areas don't use free CMA pages */
+ if (!(alloc_flags & ALLOC_CMA))
+ cma_pages = zone_page_state(z, NR_FREE_CMA_PAGES);
+#endif
+
+ /*
+ * Fast check for order-0 only. If this fails then the reserves
+ * need to be calculated. There is a corner case where the check
+ * passes but only the high-order atomic reserve are free. If
+ * the caller is !atomic then it'll uselessly search the free
+ * list. That corner case is then slower but it is harmless.
+ */
+ if (!order && (free_pages - cma_pages) > mark + z->lowmem_reserve[classzone_idx])
+ return true;
+
+ return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags,
+ free_pages);
+}
+
bool zone_watermark_ok_safe(struct zone *z, unsigned int order,
unsigned long mark, int classzone_idx)
{
@@ -2739,7 +2765,7 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
continue;
mark = zone->watermark[alloc_flags & ALLOC_WMARK_MASK];
- if (!zone_watermark_ok(zone, order, mark,
+ if (!zone_watermark_fast(zone, order, mark,
ac->classzone_idx, alloc_flags)) {
int ret;
--
2.6.4
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH 00/21] Optimise page alloc/free fast paths Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 08/22] mm, page_alloc: Convert alloc_flags to unsigned Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 04/22] mm, page_alloc: Inline zone_statistics Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 21/22] cpuset: use static key better and convert to new API Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 11/22] mm, page_alloc: Remove unnecessary initialisation in get_page_from_freelist Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 14/22] mm, page_alloc: Simplify last cpupid reset Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 13/22] mm, page_alloc: Remove redundant check for empty zonelist Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 09/22] mm, page_alloc: Convert nr_fair_skipped to bool Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 15/22] mm, page_alloc: Move might_sleep_if check to the allocator slowpath Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 20/22] mm, page_alloc: Check multiple page fields with a single branch Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 12/22] mm, page_alloc: Remove unnecessary initialisation from __alloc_pages_nodemask() Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 19/22] mm, page_alloc: Avoid looking up the first zone in a zonelist twice Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 05/22] mm, page_alloc: Inline the fast path of the zonelist iterator Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 02/22] mm, page_alloc: Use new PageAnonHead helper in the free page fast path Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 16/22] mm, page_alloc: Move __GFP_HARDWALL modifications out of the fastpath Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 17/22] mm, page_alloc: Reduce cost of fair zone allocation policy retry Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:20 +0200 [PATCH 18/22] mm, page_alloc: Shortcut watermark checks for order-0 pages Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:30 +0200 Re: [PATCH 00/21] Optimise page alloc/free fast paths Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:30 +0200 [PATCH 06/22] mm, page_alloc: Use __dec_zone_state for order-0 page allocation Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:30 +0200 [PATCH 10/22] mm, page_alloc: Remove unnecessary local variable in get_page_from_freelist Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:30 +0200 [PATCH 07/22] mm, page_alloc: Avoid unnecessary zone lookups during pageblock operations Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:30 +0200 [PATCH 01/22] mm, page_alloc: Only check PageCompound for high-order pages Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:40 +0200 [PATCH 03/22] mm, page_alloc: Reduce branches in zone_statistics Mel Gorman <mgorman@techsingularity.net> - 2016-04-11 10:40 +0200
csiph-web