All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: Mel Gorman <mgorman@techsingularity.net>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Jesper Dangaard Brouer <brouer@redhat.com>,
	Linux-MM <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 05/28] mm, page_alloc: Inline the fast path of the zonelist iterator
Date: Mon, 25 Apr 2016 16:50:18 +0200	[thread overview]
Message-ID: <571E2EAA.2050206@suse.cz> (raw)
In-Reply-To: <1460710760-32601-6-git-send-email-mgorman@techsingularity.net>

On 04/15/2016 10:58 AM, Mel Gorman wrote:
> The page allocator iterates through a zonelist for zones that match
> the addressing limitations and nodemask of the caller but many allocations
> will not be restricted. Despite this, there is always functional call
> overhead which builds up.
> 
> This patch inlines the optimistic basic case and only calls the
> iterator function for the complex case. A hindrance was the fact that
> cpuset_current_mems_allowed is used in the fastpath as the allowed nodemask
> even though all nodes are allowed on most systems. The patch handles this
> by only considering cpuset_current_mems_allowed if a cpuset exists. As well
> as being faster in the fast-path, this removes some junk in the slowpath.

I don't think this part is entirely correct (or at least argued as being
correct above), see below.
 
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -3193,17 +3193,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
>   	 */
>   	alloc_flags = gfp_to_alloc_flags(gfp_mask);
>   
> -	/*
> -	 * Find the true preferred zone if the allocation is unconstrained by
> -	 * cpusets.
> -	 */
> -	if (!(alloc_flags & ALLOC_CPUSET) && !ac->nodemask) {
> -		struct zoneref *preferred_zoneref;
> -		preferred_zoneref = first_zones_zonelist(ac->zonelist,
> -				ac->high_zoneidx, NULL, &ac->preferred_zone);
> -		ac->classzone_idx = zonelist_zone_idx(preferred_zoneref);
> -	}
> -
>   	/* This is the last chance, in general, before the goto nopage. */
>   	page = get_page_from_freelist(gfp_mask, order,
>   				alloc_flags & ~ALLOC_NO_WATERMARKS, ac);
> @@ -3359,14 +3348,21 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
>   	struct zoneref *preferred_zoneref;
>   	struct page *page = NULL;
>   	unsigned int cpuset_mems_cookie;
> -	int alloc_flags = ALLOC_WMARK_LOW|ALLOC_CPUSET|ALLOC_FAIR;
> +	int alloc_flags = ALLOC_WMARK_LOW|ALLOC_FAIR;
>   	gfp_t alloc_mask; /* The gfp_t that was actually used for allocation */
>   	struct alloc_context ac = {
>   		.high_zoneidx = gfp_zone(gfp_mask),
> +		.zonelist = zonelist,
>   		.nodemask = nodemask,
>   		.migratetype = gfpflags_to_migratetype(gfp_mask),
>   	};
>   
> +	if (cpusets_enabled()) {
> +		alloc_flags |= ALLOC_CPUSET;
> +		if (!ac.nodemask)
> +			ac.nodemask = &cpuset_current_mems_allowed;
> +	}

My initial reaction is that this is setting ac.nodemask in stone outside
of cpuset_mems_cookie, but I guess it's ok since we're taking a pointer
into current's task_struct, not the contents of the current's nodemask.
It's however setting a non-NULL nodemask into stone, which means no
zonelist iterator fasthpaths... but only in the slowpath. I guess it's
not an issue then.

> +
>   	gfp_mask &= gfp_allowed_mask;
>   
>   	lockdep_trace_alloc(gfp_mask);
> @@ -3390,16 +3386,12 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
>   retry_cpuset:
>   	cpuset_mems_cookie = read_mems_allowed_begin();
>   
> -	/* We set it here, as __alloc_pages_slowpath might have changed it */
> -	ac.zonelist = zonelist;

This doesn't seem relevant to the preferred_zoneref changes in
__alloc_pages_slowpath, so why it became ok? Maybe it is, but it's not
clear from the changelog.

Anyway, thinking about it made me realize that maybe we could move the
whole mems_cookie thing into slowpath? As soon as the optimistic
fastpath succeeds, we don't check the cookie anyway, so what about
something like this on top?

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index d18061535c8b..07bf1065e7c9 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3183,6 +3183,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 	bool can_direct_reclaim = gfp_mask & __GFP_DIRECT_RECLAIM;
 	struct page *page = NULL;
 	int alloc_flags;
+	unsigned int cpuset_mems_cookie;
 	unsigned long pages_reclaimed = 0;
 	unsigned long did_some_progress;
 	enum migrate_mode migration_mode = MIGRATE_ASYNC;
@@ -3209,6 +3210,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 		gfp_mask &= ~__GFP_ATOMIC;
 
 retry:
+	cpuset_mems_cookie = read_mems_allowed_begin();
+
 	if (gfp_mask & __GFP_KSWAPD_RECLAIM)
 		wake_all_kswapds(order, ac);
 
@@ -3219,17 +3222,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 	 */
 	alloc_flags = gfp_to_alloc_flags(gfp_mask);
 
-	/*
-	 * Find the true preferred zone if the allocation is unconstrained by
-	 * cpusets.
-	 */
-	if (!(alloc_flags & ALLOC_CPUSET) && !ac->nodemask) {
-		struct zoneref *preferred_zoneref;
-		preferred_zoneref = first_zones_zonelist(ac->zonelist,
-				ac->high_zoneidx, NULL, &ac->preferred_zone);
-		ac->classzone_idx = zonelist_zone_idx(preferred_zoneref);
-	}
-
 	/* This is the last chance, in general, before the goto nopage. */
 	page = get_page_from_freelist(gfp_mask, order,
 				alloc_flags & ~ALLOC_NO_WATERMARKS, ac);
@@ -3370,7 +3362,17 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 	if (page)
 		goto got_pg;
 nopage:
+	/*
+	 * When updating a task's mems_allowed, it is possible to race with
+	 * parallel threads in such a way that an allocation can fail while
+	 * the mask is being updated. If a page allocation is about to fail,
+	 * check if the cpuset changed during allocation and if so, retry.
+	 */
+	if (read_mems_allowed_retry(cpuset_mems_cookie))
+		goto retry;
+
 	warn_alloc_failed(gfp_mask, order, NULL);
+
 got_pg:
 	return page;
 }
@@ -3384,7 +3386,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
 {
 	struct zoneref *preferred_zoneref;
 	struct page *page = NULL;
-	unsigned int cpuset_mems_cookie;
 	int alloc_flags = ALLOC_WMARK_LOW|ALLOC_FAIR;
 	gfp_t alloc_mask; /* The gfp_t that was actually used for allocation */
 	struct alloc_context ac = {
@@ -3420,9 +3421,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
 	if (IS_ENABLED(CONFIG_CMA) && ac.migratetype == MIGRATE_MOVABLE)
 		alloc_flags |= ALLOC_CMA;
 
-retry_cpuset:
-	cpuset_mems_cookie = read_mems_allowed_begin();
-
 	/* Dirty zone balancing only done in the fast path */
 	ac.spread_dirty_pages = (gfp_mask & __GFP_WRITE);
 
@@ -3430,13 +3428,15 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
 	preferred_zoneref = first_zones_zonelist(ac.zonelist, ac.high_zoneidx,
 				ac.nodemask, &ac.preferred_zone);
 	if (!ac.preferred_zone)
-		goto out;
+		goto slowpath;
 	ac.classzone_idx = zonelist_zone_idx(preferred_zoneref);
 
 	/* First allocation attempt */
 	alloc_mask = gfp_mask|__GFP_HARDWALL;
 	page = get_page_from_freelist(alloc_mask, order, alloc_flags, &ac);
+
 	if (unlikely(!page)) {
+slowpath:
 		/*
 		 * Runtime PM, block IO and its error handling path
 		 * can deadlock because I/O on the device might not
@@ -3453,16 +3453,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
 
 	trace_mm_page_alloc(page, order, alloc_mask, ac.migratetype);
 
-out:
-	/*
-	 * When updating a task's mems_allowed, it is possible to race with
-	 * parallel threads in such a way that an allocation can fail while
-	 * the mask is being updated. If a page allocation is about to fail,
-	 * check if the cpuset changed during allocation and if so, retry.
-	 */
-	if (unlikely(!page && read_mems_allowed_retry(cpuset_mems_cookie)))
-		goto retry_cpuset;
-
 	return page;
 }
 EXPORT_SYMBOL(__alloc_pages_nodemask);

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Vlastimil Babka <vbabka@suse.cz>
To: Mel Gorman <mgorman@techsingularity.net>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Jesper Dangaard Brouer <brouer@redhat.com>,
	Linux-MM <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 05/28] mm, page_alloc: Inline the fast path of the zonelist iterator
Date: Mon, 25 Apr 2016 16:50:18 +0200	[thread overview]
Message-ID: <571E2EAA.2050206@suse.cz> (raw)
In-Reply-To: <1460710760-32601-6-git-send-email-mgorman@techsingularity.net>

On 04/15/2016 10:58 AM, Mel Gorman wrote:
> The page allocator iterates through a zonelist for zones that match
> the addressing limitations and nodemask of the caller but many allocations
> will not be restricted. Despite this, there is always functional call
> overhead which builds up.
> 
> This patch inlines the optimistic basic case and only calls the
> iterator function for the complex case. A hindrance was the fact that
> cpuset_current_mems_allowed is used in the fastpath as the allowed nodemask
> even though all nodes are allowed on most systems. The patch handles this
> by only considering cpuset_current_mems_allowed if a cpuset exists. As well
> as being faster in the fast-path, this removes some junk in the slowpath.

I don't think this part is entirely correct (or at least argued as being
correct above), see below.
 
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -3193,17 +3193,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
>   	 */
>   	alloc_flags = gfp_to_alloc_flags(gfp_mask);
>   
> -	/*
> -	 * Find the true preferred zone if the allocation is unconstrained by
> -	 * cpusets.
> -	 */
> -	if (!(alloc_flags & ALLOC_CPUSET) && !ac->nodemask) {
> -		struct zoneref *preferred_zoneref;
> -		preferred_zoneref = first_zones_zonelist(ac->zonelist,
> -				ac->high_zoneidx, NULL, &ac->preferred_zone);
> -		ac->classzone_idx = zonelist_zone_idx(preferred_zoneref);
> -	}
> -
>   	/* This is the last chance, in general, before the goto nopage. */
>   	page = get_page_from_freelist(gfp_mask, order,
>   				alloc_flags & ~ALLOC_NO_WATERMARKS, ac);
> @@ -3359,14 +3348,21 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
>   	struct zoneref *preferred_zoneref;
>   	struct page *page = NULL;
>   	unsigned int cpuset_mems_cookie;
> -	int alloc_flags = ALLOC_WMARK_LOW|ALLOC_CPUSET|ALLOC_FAIR;
> +	int alloc_flags = ALLOC_WMARK_LOW|ALLOC_FAIR;
>   	gfp_t alloc_mask; /* The gfp_t that was actually used for allocation */
>   	struct alloc_context ac = {
>   		.high_zoneidx = gfp_zone(gfp_mask),
> +		.zonelist = zonelist,
>   		.nodemask = nodemask,
>   		.migratetype = gfpflags_to_migratetype(gfp_mask),
>   	};
>   
> +	if (cpusets_enabled()) {
> +		alloc_flags |= ALLOC_CPUSET;
> +		if (!ac.nodemask)
> +			ac.nodemask = &cpuset_current_mems_allowed;
> +	}

My initial reaction is that this is setting ac.nodemask in stone outside
of cpuset_mems_cookie, but I guess it's ok since we're taking a pointer
into current's task_struct, not the contents of the current's nodemask.
It's however setting a non-NULL nodemask into stone, which means no
zonelist iterator fasthpaths... but only in the slowpath. I guess it's
not an issue then.

> +
>   	gfp_mask &= gfp_allowed_mask;
>   
>   	lockdep_trace_alloc(gfp_mask);
> @@ -3390,16 +3386,12 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
>   retry_cpuset:
>   	cpuset_mems_cookie = read_mems_allowed_begin();
>   
> -	/* We set it here, as __alloc_pages_slowpath might have changed it */
> -	ac.zonelist = zonelist;

This doesn't seem relevant to the preferred_zoneref changes in
__alloc_pages_slowpath, so why it became ok? Maybe it is, but it's not
clear from the changelog.

Anyway, thinking about it made me realize that maybe we could move the
whole mems_cookie thing into slowpath? As soon as the optimistic
fastpath succeeds, we don't check the cookie anyway, so what about
something like this on top?

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index d18061535c8b..07bf1065e7c9 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3183,6 +3183,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 	bool can_direct_reclaim = gfp_mask & __GFP_DIRECT_RECLAIM;
 	struct page *page = NULL;
 	int alloc_flags;
+	unsigned int cpuset_mems_cookie;
 	unsigned long pages_reclaimed = 0;
 	unsigned long did_some_progress;
 	enum migrate_mode migration_mode = MIGRATE_ASYNC;
@@ -3209,6 +3210,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 		gfp_mask &= ~__GFP_ATOMIC;
 
 retry:
+	cpuset_mems_cookie = read_mems_allowed_begin();
+
 	if (gfp_mask & __GFP_KSWAPD_RECLAIM)
 		wake_all_kswapds(order, ac);
 
@@ -3219,17 +3222,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 	 */
 	alloc_flags = gfp_to_alloc_flags(gfp_mask);
 
-	/*
-	 * Find the true preferred zone if the allocation is unconstrained by
-	 * cpusets.
-	 */
-	if (!(alloc_flags & ALLOC_CPUSET) && !ac->nodemask) {
-		struct zoneref *preferred_zoneref;
-		preferred_zoneref = first_zones_zonelist(ac->zonelist,
-				ac->high_zoneidx, NULL, &ac->preferred_zone);
-		ac->classzone_idx = zonelist_zone_idx(preferred_zoneref);
-	}
-
 	/* This is the last chance, in general, before the goto nopage. */
 	page = get_page_from_freelist(gfp_mask, order,
 				alloc_flags & ~ALLOC_NO_WATERMARKS, ac);
@@ -3370,7 +3362,17 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 	if (page)
 		goto got_pg;
 nopage:
+	/*
+	 * When updating a task's mems_allowed, it is possible to race with
+	 * parallel threads in such a way that an allocation can fail while
+	 * the mask is being updated. If a page allocation is about to fail,
+	 * check if the cpuset changed during allocation and if so, retry.
+	 */
+	if (read_mems_allowed_retry(cpuset_mems_cookie))
+		goto retry;
+
 	warn_alloc_failed(gfp_mask, order, NULL);
+
 got_pg:
 	return page;
 }
@@ -3384,7 +3386,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
 {
 	struct zoneref *preferred_zoneref;
 	struct page *page = NULL;
-	unsigned int cpuset_mems_cookie;
 	int alloc_flags = ALLOC_WMARK_LOW|ALLOC_FAIR;
 	gfp_t alloc_mask; /* The gfp_t that was actually used for allocation */
 	struct alloc_context ac = {
@@ -3420,9 +3421,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
 	if (IS_ENABLED(CONFIG_CMA) && ac.migratetype == MIGRATE_MOVABLE)
 		alloc_flags |= ALLOC_CMA;
 
-retry_cpuset:
-	cpuset_mems_cookie = read_mems_allowed_begin();
-
 	/* Dirty zone balancing only done in the fast path */
 	ac.spread_dirty_pages = (gfp_mask & __GFP_WRITE);
 
@@ -3430,13 +3428,15 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
 	preferred_zoneref = first_zones_zonelist(ac.zonelist, ac.high_zoneidx,
 				ac.nodemask, &ac.preferred_zone);
 	if (!ac.preferred_zone)
-		goto out;
+		goto slowpath;
 	ac.classzone_idx = zonelist_zone_idx(preferred_zoneref);
 
 	/* First allocation attempt */
 	alloc_mask = gfp_mask|__GFP_HARDWALL;
 	page = get_page_from_freelist(alloc_mask, order, alloc_flags, &ac);
+
 	if (unlikely(!page)) {
+slowpath:
 		/*
 		 * Runtime PM, block IO and its error handling path
 		 * can deadlock because I/O on the device might not
@@ -3453,16 +3453,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
 
 	trace_mm_page_alloc(page, order, alloc_mask, ac.migratetype);
 
-out:
-	/*
-	 * When updating a task's mems_allowed, it is possible to race with
-	 * parallel threads in such a way that an allocation can fail while
-	 * the mask is being updated. If a page allocation is about to fail,
-	 * check if the cpuset changed during allocation and if so, retry.
-	 */
-	if (unlikely(!page && read_mems_allowed_retry(cpuset_mems_cookie)))
-		goto retry_cpuset;
-
 	return page;
 }
 EXPORT_SYMBOL(__alloc_pages_nodemask);

  reply	other threads:[~2016-04-25 14:50 UTC|newest]

Thread overview: 160+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-15  8:58 [PATCH 00/28] Optimise page alloc/free fast paths v3 Mel Gorman
2016-04-15  8:58 ` Mel Gorman
2016-04-15  8:58 ` [PATCH 01/28] mm, page_alloc: Only check PageCompound for high-order pages Mel Gorman
2016-04-15  8:58   ` Mel Gorman
2016-04-25  9:33   ` Vlastimil Babka
2016-04-25  9:33     ` Vlastimil Babka
2016-04-26 10:33     ` Mel Gorman
2016-04-26 10:33       ` Mel Gorman
2016-04-26 11:20       ` Vlastimil Babka
2016-04-26 11:20         ` Vlastimil Babka
2016-04-15  8:58 ` [PATCH 02/28] mm, page_alloc: Use new PageAnonHead helper in the free page fast path Mel Gorman
2016-04-15  8:58   ` Mel Gorman
2016-04-25  9:56   ` Vlastimil Babka
2016-04-25  9:56     ` Vlastimil Babka
2016-04-15  8:58 ` [PATCH 03/28] mm, page_alloc: Reduce branches in zone_statistics Mel Gorman
2016-04-15  8:58   ` Mel Gorman
2016-04-25 11:15   ` Vlastimil Babka
2016-04-25 11:15     ` Vlastimil Babka
2016-04-15  8:58 ` [PATCH 04/28] mm, page_alloc: Inline zone_statistics Mel Gorman
2016-04-15  8:58   ` Mel Gorman
2016-04-25 11:17   ` Vlastimil Babka
2016-04-25 11:17     ` Vlastimil Babka
2016-04-15  8:58 ` [PATCH 05/28] mm, page_alloc: Inline the fast path of the zonelist iterator Mel Gorman
2016-04-15  8:58   ` Mel Gorman
2016-04-25 14:50   ` Vlastimil Babka [this message]
2016-04-25 14:50     ` Vlastimil Babka
2016-04-26 10:30     ` Mel Gorman
2016-04-26 10:30       ` Mel Gorman
2016-04-26 11:05       ` Vlastimil Babka
2016-04-26 11:05         ` Vlastimil Babka
2016-04-15  8:58 ` [PATCH 06/28] mm, page_alloc: Use __dec_zone_state for order-0 page allocation Mel Gorman
2016-04-15  8:58   ` Mel Gorman
2016-04-26 11:25   ` Vlastimil Babka
2016-04-26 11:25     ` Vlastimil Babka
2016-04-15  8:58 ` [PATCH 07/28] mm, page_alloc: Avoid unnecessary zone lookups during pageblock operations Mel Gorman
2016-04-15  8:58   ` Mel Gorman
2016-04-26 11:29   ` Vlastimil Babka
2016-04-26 11:29     ` Vlastimil Babka
2016-04-15  8:59 ` [PATCH 08/28] mm, page_alloc: Convert alloc_flags to unsigned Mel Gorman
2016-04-15  8:59   ` Mel Gorman
2016-04-26 11:31   ` Vlastimil Babka
2016-04-26 11:31     ` Vlastimil Babka
2016-04-15  8:59 ` [PATCH 09/28] mm, page_alloc: Convert nr_fair_skipped to bool Mel Gorman
2016-04-15  8:59   ` Mel Gorman
2016-04-26 11:37   ` Vlastimil Babka
2016-04-26 11:37     ` Vlastimil Babka
2016-04-15  8:59 ` [PATCH 10/28] mm, page_alloc: Remove unnecessary local variable in get_page_from_freelist Mel Gorman
2016-04-15  8:59   ` Mel Gorman
2016-04-26 11:38   ` Vlastimil Babka
2016-04-26 11:38     ` Vlastimil Babka
2016-04-15  8:59 ` [PATCH 11/28] mm, page_alloc: Remove unnecessary initialisation " Mel Gorman
2016-04-15  8:59   ` Mel Gorman
2016-04-26 11:39   ` Vlastimil Babka
2016-04-26 11:39     ` Vlastimil Babka
2016-04-15  9:07 ` [PATCH 13/28] mm, page_alloc: Remove redundant check for empty zonelist Mel Gorman
2016-04-15  9:07   ` Mel Gorman
2016-04-15  9:07   ` [PATCH 14/28] mm, page_alloc: Simplify last cpupid reset Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 13:30     ` Vlastimil Babka
2016-04-26 13:30       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 15/28] mm, page_alloc: Move might_sleep_if check to the allocator slowpath Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 13:41     ` Vlastimil Babka
2016-04-26 13:41       ` Vlastimil Babka
2016-04-26 14:50       ` Mel Gorman
2016-04-26 14:50         ` Mel Gorman
2016-04-26 15:16         ` Vlastimil Babka
2016-04-26 15:16           ` Vlastimil Babka
2016-04-26 16:29           ` Mel Gorman
2016-04-26 16:29             ` Mel Gorman
2016-04-15  9:07   ` [PATCH 16/28] mm, page_alloc: Move __GFP_HARDWALL modifications out of the fastpath Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 14:13     ` Vlastimil Babka
2016-04-26 14:13       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 17/28] mm, page_alloc: Check once if a zone has isolated pageblocks Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 14:27     ` Vlastimil Babka
2016-04-26 14:27       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 18/28] mm, page_alloc: Shorten the page allocator fast path Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 15:23     ` Vlastimil Babka
2016-04-26 15:23       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 19/28] mm, page_alloc: Reduce cost of fair zone allocation policy retry Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 17:24     ` Vlastimil Babka
2016-04-26 17:24       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 20/28] mm, page_alloc: Shortcut watermark checks for order-0 pages Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 17:32     ` Vlastimil Babka
2016-04-26 17:32       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 21/28] mm, page_alloc: Avoid looking up the first zone in a zonelist twice Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 17:46     ` Vlastimil Babka
2016-04-26 17:46       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 22/28] mm, page_alloc: Remove field from alloc_context Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-15  9:07   ` [PATCH 23/28] mm, page_alloc: Check multiple page fields with a single branch Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 18:41     ` Vlastimil Babka
2016-04-26 18:41       ` Vlastimil Babka
2016-04-27 10:07       ` Mel Gorman
2016-04-27 10:07         ` Mel Gorman
2016-04-15  9:07   ` [PATCH 24/28] mm, page_alloc: Remove unnecessary variable from free_pcppages_bulk Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 18:43     ` Vlastimil Babka
2016-04-26 18:43       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 25/28] mm, page_alloc: Inline pageblock lookup in page free fast paths Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 19:10     ` Vlastimil Babka
2016-04-26 19:10       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 26/28] cpuset: use static key better and convert to new API Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-26 19:49     ` Vlastimil Babka
2016-04-26 19:49       ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 27/28] mm, page_alloc: Defer debugging checks of freed pages until a PCP drain Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-27 11:59     ` Vlastimil Babka
2016-04-27 11:59       ` Vlastimil Babka
2016-04-27 12:01       ` [PATCH 1/3] mm, page_alloc: un-inline the bad part of free_pages_check Vlastimil Babka
2016-04-27 12:01         ` Vlastimil Babka
2016-04-27 12:01         ` [PATCH 2/3] mm, page_alloc: pull out side effects from free_pages_check Vlastimil Babka
2016-04-27 12:01           ` Vlastimil Babka
2016-04-27 12:41           ` Mel Gorman
2016-04-27 12:41             ` Mel Gorman
2016-04-27 13:00             ` Vlastimil Babka
2016-04-27 13:00               ` Vlastimil Babka
2016-04-27 12:01         ` [PATCH 3/3] mm, page_alloc: don't duplicate code in free_pcp_prepare Vlastimil Babka
2016-04-27 12:01           ` Vlastimil Babka
2016-04-27 12:37         ` [PATCH 1/3] mm, page_alloc: un-inline the bad part of free_pages_check Mel Gorman
2016-04-27 12:37           ` Mel Gorman
2016-04-27 12:53           ` Vlastimil Babka
2016-04-27 12:53             ` Vlastimil Babka
2016-04-15  9:07   ` [PATCH 28/28] mm, page_alloc: Defer debugging checks of pages allocated from the PCP Mel Gorman
2016-04-15  9:07     ` Mel Gorman
2016-04-27 14:06     ` Vlastimil Babka
2016-04-27 14:06       ` Vlastimil Babka
2016-04-27 15:31       ` Mel Gorman
2016-04-27 15:31         ` Mel Gorman
2016-05-17  6:41     ` Naoya Horiguchi
2016-05-17  6:41       ` Naoya Horiguchi
2016-05-18  7:51       ` Vlastimil Babka
2016-05-18  7:51         ` Vlastimil Babka
2016-05-18  7:55         ` Vlastimil Babka
2016-05-18  7:55           ` Vlastimil Babka
2016-05-18  8:49         ` Mel Gorman
2016-05-18  8:49           ` Mel Gorman
2016-04-26 12:04   ` [PATCH 13/28] mm, page_alloc: Remove redundant check for empty zonelist Vlastimil Babka
2016-04-26 12:04     ` Vlastimil Babka
2016-04-26 13:00     ` Mel Gorman
2016-04-26 13:00       ` Mel Gorman
2016-04-26 19:11       ` Andrew Morton
2016-04-26 19:11         ` Andrew Morton
2016-04-15 12:44 ` [PATCH 00/28] Optimise page alloc/free fast paths v3 Jesper Dangaard Brouer
2016-04-15 12:44   ` Jesper Dangaard Brouer
2016-04-15 13:08   ` Mel Gorman
2016-04-15 13:08     ` Mel Gorman
2016-04-16  7:21 ` [PATCH 12/28] mm, page_alloc: Remove unnecessary initialisation from __alloc_pages_nodemask() Mel Gorman
2016-04-16  7:21   ` Mel Gorman
2016-04-26 11:41   ` Vlastimil Babka
2016-04-26 11:41     ` Vlastimil Babka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=571E2EAA.2050206@suse.cz \
    --to=vbabka@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=brouer@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@techsingularity.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.