All of lore.kernel.org
 help / color / mirror / Atom feed
From: Minchan Kim <minchan@kernel.org>
To: John Stultz <john.stultz@linaro.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Android Kernel Team <kernel-team@android.com>,
	Robert Love <rlove@google.com>, Mel Gorman <mel@csn.ul.ie>,
	Hugh Dickins <hughd@google.com>,
	Dave Hansen <dave@linux.vnet.ibm.com>,
	Rik van Riel <riel@redhat.com>,
	Dmitry Adamushko <dmitry.adamushko@gmail.com>,
	Dave Chinner <david@fromorbit.com>, Neil Brown <neilb@suse.de>,
	Andrea Righi <andrea@betterlinux.com>,
	Andrea Arcangeli <aarcange@redhat.com>,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	Mike Hommey <mh@glandium.org>, Taras Glek <tglek@mozilla.com>,
	Dhaval Giani <dgiani@mozilla.com>, Jan Kara <jack@suse.cz>,
	KOSAKI Motohiro <kosaki.motohiro@gmail.com>,
	Michel Lespinasse <walken@google.com>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>
Subject: Re: [PATCH 7/8] vrange: Add method to purge volatile ranges
Date: Mon, 17 Jun 2013 16:13:31 +0900	[thread overview]
Message-ID: <20130617071331.GA3251@bbox> (raw)
In-Reply-To: <1371010971-15647-8-git-send-email-john.stultz@linaro.org>

Hello John,

I am rewriting purging path and found a bug from this patch.
I might forget it so I will send this comment for recording.

On Tue, Jun 11, 2013 at 09:22:50PM -0700, John Stultz wrote:
> From: Minchan Kim <minchan@kernel.org>
> 
> This patch adds discarding function to purge volatile ranges under
> memory pressure. Logic is as following:
> 
> 1. Memory pressure happens
> 2. VM start to reclaim pages
> 3. Check the page is in volatile range.
> 4. If so, zap the page from the process's page table.
>    (By semantic vrange(2), we should mark it with another one to
>     make page fault when you try to access the address. It will
>     be introduced later patch)
> 5. If page is unmapped from all processes, discard it instead of swapping.
> 
> This patch does not address the case where there is no swap, which
> keeps anonymous pages from being aged off the LRUs. Minchan has
> additional patches that add support for purging anonymous pages
> 
> XXX: First pass at file purging. Seems to work, but is likely broken
> and needs close review.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Android Kernel Team <kernel-team@android.com>
> Cc: Robert Love <rlove@google.com>
> Cc: Mel Gorman <mel@csn.ul.ie>
> Cc: Hugh Dickins <hughd@google.com>
> Cc: Dave Hansen <dave@linux.vnet.ibm.com>
> Cc: Rik van Riel <riel@redhat.com>
> Cc: Dmitry Adamushko <dmitry.adamushko@gmail.com>
> Cc: Dave Chinner <david@fromorbit.com>
> Cc: Neil Brown <neilb@suse.de>
> Cc: Andrea Righi <andrea@betterlinux.com>
> Cc: Andrea Arcangeli <aarcange@redhat.com>
> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> Cc: Mike Hommey <mh@glandium.org>
> Cc: Taras Glek <tglek@mozilla.com>
> Cc: Dhaval Giani <dgiani@mozilla.com>
> Cc: Jan Kara <jack@suse.cz>
> Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
> Cc: Michel Lespinasse <walken@google.com>
> Cc: Minchan Kim <minchan@kernel.org>
> Cc: linux-mm@kvack.org <linux-mm@kvack.org>
> Signed-off-by: Minchan Kim <minchan@kernel.org>
> [jstultz: Reworked to add purging of file pages, commit log tweaks]
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> ---
>  include/linux/rmap.h   |  12 +-
>  include/linux/swap.h   |   1 +
>  include/linux/vrange.h |   7 ++
>  mm/ksm.c               |   2 +-
>  mm/rmap.c              |  30 +++--
>  mm/swapfile.c          |  36 ++++++
>  mm/vmscan.c            |  16 ++-
>  mm/vrange.c            | 332 +++++++++++++++++++++++++++++++++++++++++++++++++
>  8 files changed, 420 insertions(+), 16 deletions(-)
> 
> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> index 6dacb93..6432dfb 100644
> --- a/include/linux/rmap.h
> +++ b/include/linux/rmap.h
> @@ -83,6 +83,8 @@ enum ttu_flags {
>  };
>  

< snip >

> @@ -662,7 +663,7 @@ int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma)
>   */
>  int page_referenced_one(struct page *page, struct vm_area_struct *vma,
>  			unsigned long address, unsigned int *mapcount,
> -			unsigned long *vm_flags)
> +			unsigned long *vm_flags, int *is_vrange)
>  {
>  	struct mm_struct *mm = vma->vm_mm;
>  	int referenced = 0;
> @@ -724,6 +725,9 @@ int page_referenced_one(struct page *page, struct vm_area_struct *vma,
>  				referenced++;
>  		}
>  		pte_unmap_unlock(pte, ptl);
> +		if (is_vrange &&
> +			vrange_address(mm, address, address + PAGE_SIZE - 1))
> +			*is_vrange = 1;

< snip >

> +static bool __vrange_address(struct vrange_root *vroot,
> +			unsigned long start, unsigned long end)
> +{
> +	struct interval_tree_node *node;
> +
> +	node = interval_tree_iter_first(&vroot->v_rb, start, end);
> +	return node ? true : false;
> +}
> +
> +bool vrange_address(struct mm_struct *mm,
> +			unsigned long start, unsigned long end)
> +{
> +	struct vrange_root *vroot;
> +	unsigned long vstart_idx, vend_idx;
> +	struct vm_area_struct *vma;
> +	bool ret;
> +
> +	vma = find_vma(mm, start);

It seems to be tweaked by you while you are refactoring with file-vrange
The problem of the code is that you couldn't use vma without holding
the lock of mmap_sem and you couldn't use the lock in purging path
because you couldn't know other tasks's state so it might be a dealock
if you try to hold a lock.

> +	if (vma->vm_file && (vma->vm_flags & VM_SHARED)) {
> +		vroot = &vma->vm_file->f_mapping->vroot;
> +		vstart_idx = vma->vm_pgoff + start - vma->vm_start;
> +		vend_idx = vma->vm_pgoff + end - vma->vm_start;
> +	} else {
> +		vroot = &mm->vroot;
> +		vstart_idx = start;
> +		vend_idx = end;
> +	}
> +
> +	vrange_lock(vroot);
> +	ret = __vrange_address(vroot, vstart_idx, vend_idx);
> +	vrange_unlock(vroot);
> +	return ret;
> +}
> +
-- 
Kind regards,
Minchan Kim

--
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: Minchan Kim <minchan@kernel.org>
To: John Stultz <john.stultz@linaro.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Android Kernel Team <kernel-team@android.com>,
	Robert Love <rlove@google.com>, Mel Gorman <mel@csn.ul.ie>,
	Hugh Dickins <hughd@google.com>,
	Dave Hansen <dave@linux.vnet.ibm.com>,
	Rik van Riel <riel@redhat.com>,
	Dmitry Adamushko <dmitry.adamushko@gmail.com>,
	Dave Chinner <david@fromorbit.com>, Neil Brown <neilb@suse.de>,
	Andrea Righi <andrea@betterlinux.com>,
	Andrea Arcangeli <aarcange@redhat.com>,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	Mike Hommey <mh@glandium.org>, Taras Glek <tglek@mozilla.com>,
	Dhaval Giani <dgiani@mozilla.com>, Jan Kara <jack@suse.cz>,
	KOSAKI Motohiro <kosaki.motohiro@gmail.com>,
	Michel Lespinasse <walken@google.com>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>
Subject: Re: [PATCH 7/8] vrange: Add method to purge volatile ranges
Date: Mon, 17 Jun 2013 16:13:31 +0900	[thread overview]
Message-ID: <20130617071331.GA3251@bbox> (raw)
In-Reply-To: <1371010971-15647-8-git-send-email-john.stultz@linaro.org>

Hello John,

I am rewriting purging path and found a bug from this patch.
I might forget it so I will send this comment for recording.

On Tue, Jun 11, 2013 at 09:22:50PM -0700, John Stultz wrote:
> From: Minchan Kim <minchan@kernel.org>
> 
> This patch adds discarding function to purge volatile ranges under
> memory pressure. Logic is as following:
> 
> 1. Memory pressure happens
> 2. VM start to reclaim pages
> 3. Check the page is in volatile range.
> 4. If so, zap the page from the process's page table.
>    (By semantic vrange(2), we should mark it with another one to
>     make page fault when you try to access the address. It will
>     be introduced later patch)
> 5. If page is unmapped from all processes, discard it instead of swapping.
> 
> This patch does not address the case where there is no swap, which
> keeps anonymous pages from being aged off the LRUs. Minchan has
> additional patches that add support for purging anonymous pages
> 
> XXX: First pass at file purging. Seems to work, but is likely broken
> and needs close review.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Android Kernel Team <kernel-team@android.com>
> Cc: Robert Love <rlove@google.com>
> Cc: Mel Gorman <mel@csn.ul.ie>
> Cc: Hugh Dickins <hughd@google.com>
> Cc: Dave Hansen <dave@linux.vnet.ibm.com>
> Cc: Rik van Riel <riel@redhat.com>
> Cc: Dmitry Adamushko <dmitry.adamushko@gmail.com>
> Cc: Dave Chinner <david@fromorbit.com>
> Cc: Neil Brown <neilb@suse.de>
> Cc: Andrea Righi <andrea@betterlinux.com>
> Cc: Andrea Arcangeli <aarcange@redhat.com>
> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> Cc: Mike Hommey <mh@glandium.org>
> Cc: Taras Glek <tglek@mozilla.com>
> Cc: Dhaval Giani <dgiani@mozilla.com>
> Cc: Jan Kara <jack@suse.cz>
> Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
> Cc: Michel Lespinasse <walken@google.com>
> Cc: Minchan Kim <minchan@kernel.org>
> Cc: linux-mm@kvack.org <linux-mm@kvack.org>
> Signed-off-by: Minchan Kim <minchan@kernel.org>
> [jstultz: Reworked to add purging of file pages, commit log tweaks]
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> ---
>  include/linux/rmap.h   |  12 +-
>  include/linux/swap.h   |   1 +
>  include/linux/vrange.h |   7 ++
>  mm/ksm.c               |   2 +-
>  mm/rmap.c              |  30 +++--
>  mm/swapfile.c          |  36 ++++++
>  mm/vmscan.c            |  16 ++-
>  mm/vrange.c            | 332 +++++++++++++++++++++++++++++++++++++++++++++++++
>  8 files changed, 420 insertions(+), 16 deletions(-)
> 
> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> index 6dacb93..6432dfb 100644
> --- a/include/linux/rmap.h
> +++ b/include/linux/rmap.h
> @@ -83,6 +83,8 @@ enum ttu_flags {
>  };
>  

< snip >

> @@ -662,7 +663,7 @@ int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma)
>   */
>  int page_referenced_one(struct page *page, struct vm_area_struct *vma,
>  			unsigned long address, unsigned int *mapcount,
> -			unsigned long *vm_flags)
> +			unsigned long *vm_flags, int *is_vrange)
>  {
>  	struct mm_struct *mm = vma->vm_mm;
>  	int referenced = 0;
> @@ -724,6 +725,9 @@ int page_referenced_one(struct page *page, struct vm_area_struct *vma,
>  				referenced++;
>  		}
>  		pte_unmap_unlock(pte, ptl);
> +		if (is_vrange &&
> +			vrange_address(mm, address, address + PAGE_SIZE - 1))
> +			*is_vrange = 1;

< snip >

> +static bool __vrange_address(struct vrange_root *vroot,
> +			unsigned long start, unsigned long end)
> +{
> +	struct interval_tree_node *node;
> +
> +	node = interval_tree_iter_first(&vroot->v_rb, start, end);
> +	return node ? true : false;
> +}
> +
> +bool vrange_address(struct mm_struct *mm,
> +			unsigned long start, unsigned long end)
> +{
> +	struct vrange_root *vroot;
> +	unsigned long vstart_idx, vend_idx;
> +	struct vm_area_struct *vma;
> +	bool ret;
> +
> +	vma = find_vma(mm, start);

It seems to be tweaked by you while you are refactoring with file-vrange
The problem of the code is that you couldn't use vma without holding
the lock of mmap_sem and you couldn't use the lock in purging path
because you couldn't know other tasks's state so it might be a dealock
if you try to hold a lock.

> +	if (vma->vm_file && (vma->vm_flags & VM_SHARED)) {
> +		vroot = &vma->vm_file->f_mapping->vroot;
> +		vstart_idx = vma->vm_pgoff + start - vma->vm_start;
> +		vend_idx = vma->vm_pgoff + end - vma->vm_start;
> +	} else {
> +		vroot = &mm->vroot;
> +		vstart_idx = start;
> +		vend_idx = end;
> +	}
> +
> +	vrange_lock(vroot);
> +	ret = __vrange_address(vroot, vstart_idx, vend_idx);
> +	vrange_unlock(vroot);
> +	return ret;
> +}
> +
-- 
Kind regards,
Minchan Kim

  reply	other threads:[~2013-06-17  7:13 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-12  4:22 [PATCH 0/8] Volatile Ranges (v8?) John Stultz
2013-06-12  4:22 ` John Stultz
2013-06-12  4:22 ` [PATCH 1/8] vrange: Add basic data structure and functions John Stultz
2013-06-12  4:22   ` John Stultz
2013-06-12  4:22 ` [PATCH 2/8] vrange: Add vrange support for file address_spaces John Stultz
2013-06-12  4:22   ` John Stultz
2013-06-12  4:22 ` [PATCH 3/8] vrange: Add vrange support to mm_structs John Stultz
2013-06-12  4:22   ` John Stultz
2013-06-12  4:22 ` [PATCH 4/8] vrange: Clear volatility on new mmaps John Stultz
2013-06-12  4:22   ` John Stultz
2013-06-13  6:28   ` Minchan Kim
2013-06-13  6:28     ` Minchan Kim
2013-06-13 23:43     ` John Stultz
2013-06-13 23:43       ` John Stultz
2013-06-14  0:21       ` Minchan Kim
2013-06-14  0:21         ` Minchan Kim
2013-06-12  4:22 ` [PATCH 5/8] vrange: Add new vrange(2) system call John Stultz
2013-06-12  4:22   ` John Stultz
2013-06-12  6:48   ` NeilBrown
2013-06-12 18:47     ` John Stultz
2013-06-12 18:47       ` John Stultz
2013-06-20 21:05   ` Dhaval Giani
2013-06-20 21:05     ` Dhaval Giani
2013-06-12  4:22 ` [PATCH 6/8] vrange: Add GFP_NO_VRANGE allocation flag John Stultz
2013-06-12  4:22   ` John Stultz
2013-06-12  4:22 ` [PATCH 7/8] vrange: Add method to purge volatile ranges John Stultz
2013-06-12  4:22   ` John Stultz
2013-06-17  7:13   ` Minchan Kim [this message]
2013-06-17  7:13     ` Minchan Kim
2013-06-17  7:24     ` Minchan Kim
2013-06-17  7:24       ` Minchan Kim
2013-06-19  4:34   ` Minchan Kim
2013-06-19  4:34     ` Minchan Kim
2013-10-01 14:00     ` Krzysztof Kozlowski
2013-10-02  1:32       ` Minchan Kim
2013-06-12  4:22 ` [PATCH 8/8] vrange: Send SIGBUS when user try to access purged page John Stultz
2013-06-12  4:22   ` John Stultz
2013-06-19  4:36   ` Minchan Kim
2013-06-19  4:36     ` Minchan Kim
2013-06-17 16:24 ` [PATCH 0/8] Volatile Ranges (v8?) Dhaval Giani
2013-06-18  4:11   ` Minchan Kim
2013-06-18  4:11     ` Minchan Kim
2013-06-18 16:59     ` Dhaval Giani
2013-06-18 16:59       ` Dhaval Giani
2013-06-19  4:41       ` Minchan Kim
2013-06-19  4:41         ` Minchan Kim
2013-06-19 18:36         ` Dhaval Giani
2013-06-19 18:36           ` Dhaval Giani

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=20130617071331.GA3251@bbox \
    --to=minchan@kernel.org \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=andrea@betterlinux.com \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=dave@linux.vnet.ibm.com \
    --cc=david@fromorbit.com \
    --cc=dgiani@mozilla.com \
    --cc=dmitry.adamushko@gmail.com \
    --cc=hughd@google.com \
    --cc=jack@suse.cz \
    --cc=john.stultz@linaro.org \
    --cc=kernel-team@android.com \
    --cc=kosaki.motohiro@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mel@csn.ul.ie \
    --cc=mh@glandium.org \
    --cc=neilb@suse.de \
    --cc=riel@redhat.com \
    --cc=rlove@google.com \
    --cc=tglek@mozilla.com \
    --cc=walken@google.com \
    /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.