linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Daniel Jordan <daniel.m.jordan@oracle.com>
To: Huang Ying <ying.huang@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	Andrea Arcangeli <aarcange@redhat.com>,
	Michal Hocko <mhocko@kernel.org>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Shaohua Li <shli@kernel.org>, Hugh Dickins <hughd@google.com>,
	Minchan Kim <minchan@kernel.org>, Rik van Riel <riel@redhat.com>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>,
	Zi Yan <zi.yan@cs.rutgers.edu>,
	Daniel Jordan <daniel.m.jordan@oracle.com>
Subject: Re: [PATCH -V7 RESEND 08/21] swap: Support to read a huge swap cluster for swapin a THP
Date: Fri, 30 Nov 2018 15:32:01 -0800	[thread overview]
Message-ID: <20181130233201.6yuzbhymtjddvf3u@ca-dmjordan1.us.oracle.com> (raw)
In-Reply-To: <20181120085449.5542-9-ying.huang@intel.com>

Hi Ying,

On Tue, Nov 20, 2018 at 04:54:36PM +0800, Huang Ying wrote:
> diff --git a/mm/swap_state.c b/mm/swap_state.c
> index 97831166994a..1eedbc0aede2 100644
> --- a/mm/swap_state.c
> +++ b/mm/swap_state.c
> @@ -387,14 +389,42 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
>  		 * as SWAP_HAS_CACHE.  That's done in later part of code or
>  		 * else swap_off will be aborted if we return NULL.
>  		 */
> -		if (!__swp_swapcount(entry) && swap_slot_cache_enabled)
> +		if (!__swp_swapcount(entry, &entry_size) &&
> +		    swap_slot_cache_enabled)
>  			break;
>  
>  		/*
>  		 * Get a new page to read into from swap.
>  		 */
> -		if (!new_page) {
> -			new_page = alloc_page_vma(gfp_mask, vma, addr);
> +		if (!new_page ||
> +		    (IS_ENABLED(CONFIG_THP_SWAP) &&
> +		     hpage_nr_pages(new_page) != entry_size)) {
> +			if (new_page)
> +				put_page(new_page);
> +			if (IS_ENABLED(CONFIG_THP_SWAP) &&
> +			    entry_size == HPAGE_PMD_NR) {
> +				gfp_t gfp;
> +
> +				gfp = alloc_hugepage_direct_gfpmask(vma, addr);

vma is NULL when we get here from try_to_unuse, so the kernel will die on
vma->flags inside alloc_hugepage_direct_gfpmask.

try_to_unuse swaps in before it finds vma's, but even if those were reversed,
it seems try_to_unuse wouldn't always have a single vma to pass into this path
since it's walking the swap_map and multiple processes mapping the same huge
page can have different huge page advice (and maybe mempolicies?), affecting
the result of alloc_hugepage_direct_gfpmask.  And yet
alloc_hugepage_direct_gfpmask needs a vma to do its job.  So, I'm not sure how
to fix this.

If the entry's usage count were 1, we could find the vma in that common case to
give read_swap_cache_async, and otherwise allocate small pages.  We'd have THPs
some of the time and be exactly following alloc_hugepage_direct_gfpmask, but
would also be conservative when it's uncertain.

Or, if the system-wide THP settings allow it then go for it, but otherwise
ignore vma hints and always fall back to small pages.  This requires another
way of controlling THP allocations besides alloc_hugepage_direct_gfpmask.

Or maybe try_to_unuse shouldn't allocate hugepages at all, but then no perf
improvement for try_to_unuse.

What do you think?

  reply	other threads:[~2018-11-30 23:32 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-20  8:54 [PATCH -V7 00/21] swap: Swapout/swapin THP in one piece Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 01/21] swap: Enable PMD swap operations for CONFIG_THP_SWAP Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 02/21] swap: Add __swap_duplicate_locked() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 03/21] swap: Support PMD swap mapping in swap_duplicate() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 04/21] swap: Support PMD swap mapping in put_swap_page() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 05/21] swap: Support PMD swap mapping in free_swap_and_cache()/swap_free() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 06/21] swap: Support PMD swap mapping when splitting huge PMD Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 07/21] swap: Support PMD swap mapping in split_swap_cluster() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 08/21] swap: Support to read a huge swap cluster for swapin a THP Huang Ying
2018-11-30 23:32   ` Daniel Jordan [this message]
2018-12-01  0:34     ` Huang, Ying
2018-12-03 16:15       ` Daniel Jordan
2018-12-04  2:30         ` Huang, Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 09/21] swap: Swapin a THP in one piece Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 10/21] swap: Support to count THP swapin and its fallback Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 11/21] swap: Add sysfs interface to configure THP swapin Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 12/21] swap: Support PMD swap mapping in swapoff Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 13/21] swap: Support PMD swap mapping in madvise_free() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 14/21] swap: Support to move swap account for PMD swap mapping Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 15/21] swap: Support to copy PMD swap mapping when fork() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 16/21] swap: Free PMD swap mapping when zap_huge_pmd() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 17/21] swap: Support PMD swap mapping for MADV_WILLNEED Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 18/21] swap: Support PMD swap mapping in mincore() Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 19/21] swap: Support PMD swap mapping in common path Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 20/21] swap: create PMD swap mapping when unmap the THP Huang Ying
2018-11-20  8:54 ` [PATCH -V7 RESEND 21/21] swap: Update help of CONFIG_THP_SWAP Huang Ying

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=20181130233201.6yuzbhymtjddvf3u@ca-dmjordan1.us.oracle.com \
    --to=daniel.m.jordan@oracle.com \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=dave.hansen@linux.intel.com \
    --cc=hannes@cmpxchg.org \
    --cc=hughd@google.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --cc=minchan@kernel.org \
    --cc=n-horiguchi@ah.jp.nec.com \
    --cc=riel@redhat.com \
    --cc=shli@kernel.org \
    --cc=ying.huang@intel.com \
    --cc=zi.yan@cs.rutgers.edu \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox