From: Minchan Kim <minchan@kernel.org>
To: Anshuman Khandual <khandual@linux.vnet.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
kernel-team@lge.com, linux-mm@kvack.org,
linux-kernel@vger.kernel.org,
Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@suse.com>, Vlastimil Babka <vbabka@suse.cz>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [RFC 05/11] mm: make the try_to_munlock void function
Date: Tue, 7 Mar 2017 15:50:48 +0900 [thread overview]
Message-ID: <20170307065048.GD29458@bbox> (raw)
In-Reply-To: <12618e8d-9eaf-322a-4334-e1416dc95b8b@linux.vnet.ibm.com>
Hi Anshuman,
On Mon, Mar 06, 2017 at 03:10:17PM +0530, Anshuman Khandual wrote:
> On 03/06/2017 07:39 AM, Minchan Kim wrote:
> > On Fri, Mar 03, 2017 at 05:13:54PM +0530, Anshuman Khandual wrote:
> >> On 03/02/2017 12:09 PM, Minchan Kim wrote:
> >>> try_to_munlock returns SWAP_MLOCK if the one of VMAs mapped
> >>> the page has VM_LOCKED flag. In that time, VM set PG_mlocked to
> >>> the page if the page is not pte-mapped THP which cannot be
> >>> mlocked, either.
> >>
> >> Right.
> >>
> >>>
> >>> With that, __munlock_isolated_page can use PageMlocked to check
> >>> whether try_to_munlock is successful or not without relying on
> >>> try_to_munlock's retval. It helps to make ttu/ttuo simple with
> >>> upcoming patches.
> >>
> >> Right.
> >>
> >>>
> >>> Cc: Vlastimil Babka <vbabka@suse.cz>
> >>> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> >>> Signed-off-by: Minchan Kim <minchan@kernel.org>
> >>> ---
> >>> include/linux/rmap.h | 2 +-
> >>> mm/mlock.c | 6 ++----
> >>> mm/rmap.c | 16 ++++------------
> >>> 3 files changed, 7 insertions(+), 17 deletions(-)
> >>>
> >>> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> >>> index b556eef..1b0cd4c 100644
> >>> --- a/include/linux/rmap.h
> >>> +++ b/include/linux/rmap.h
> >>> @@ -235,7 +235,7 @@ int page_mkclean(struct page *);
> >>> * called in munlock()/munmap() path to check for other vmas holding
> >>> * the page mlocked.
> >>> */
> >>> -int try_to_munlock(struct page *);
> >>> +void try_to_munlock(struct page *);
> >>>
> >>> void remove_migration_ptes(struct page *old, struct page *new, bool locked);
> >>>
> >>> diff --git a/mm/mlock.c b/mm/mlock.c
> >>> index cdbed8a..d34a540 100644
> >>> --- a/mm/mlock.c
> >>> +++ b/mm/mlock.c
> >>> @@ -122,17 +122,15 @@ static bool __munlock_isolate_lru_page(struct page *page, bool getpage)
> >>> */
> >>> static void __munlock_isolated_page(struct page *page)
> >>> {
> >>> - int ret = SWAP_AGAIN;
> >>> -
> >>> /*
> >>> * Optimization: if the page was mapped just once, that's our mapping
> >>> * and we don't need to check all the other vmas.
> >>> */
> >>> if (page_mapcount(page) > 1)
> >>> - ret = try_to_munlock(page);
> >>> + try_to_munlock(page);
> >>>
> >>> /* Did try_to_unlock() succeed or punt? */
> >>> - if (ret != SWAP_MLOCK)
> >>> + if (!PageMlocked(page))
> >>
> >> Checks if the page is still mlocked or not.
> >>
> >>> count_vm_event(UNEVICTABLE_PGMUNLOCKED);
> >>>
> >>> putback_lru_page(page);
> >>> diff --git a/mm/rmap.c b/mm/rmap.c
> >>> index 0a48958..61ae694 100644
> >>> --- a/mm/rmap.c
> >>> +++ b/mm/rmap.c
> >>> @@ -1540,18 +1540,10 @@ static int page_not_mapped(struct page *page)
> >>> * Called from munlock code. Checks all of the VMAs mapping the page
> >>> * to make sure nobody else has this page mlocked. The page will be
> >>> * returned with PG_mlocked cleared if no other vmas have it mlocked.
> >>> - *
> >>> - * Return values are:
> >>> - *
> >>> - * SWAP_AGAIN - no vma is holding page mlocked, or,
> >>> - * SWAP_AGAIN - page mapped in mlocked vma -- couldn't acquire mmap sem
> >>> - * SWAP_FAIL - page cannot be located at present
> >>> - * SWAP_MLOCK - page is now mlocked.
> >>> */
> >>> -int try_to_munlock(struct page *page)
> >>> -{
> >>> - int ret;
> >>>
> >>> +void try_to_munlock(struct page *page)
> >>> +{
> >>> struct rmap_walk_control rwc = {
> >>> .rmap_one = try_to_unmap_one,
> >>> .arg = (void *)TTU_MUNLOCK,
> >>> @@ -1561,9 +1553,9 @@ int try_to_munlock(struct page *page)
> >>> };
> >>>
> >>> VM_BUG_ON_PAGE(!PageLocked(page) || PageLRU(page), page);
> >>> + VM_BUG_ON_PAGE(PageMlocked(page), page);
> >>
> >> We are calling on the page to see if its mlocked from any of it's
> >> mapping VMAs. Then it is a possibility that the page is mlocked
> >> and the above condition is true and we print VM BUG report there.
> >> The point is if its a valid possibility why we have added the
> >> above check ?
> >
> > If I read code properly, __munlock_isolated_page calls try_to_munlock
> > always pass the TestClearPageMlocked page to try_to_munlock.
>
> Right.
>
> > (e.g., munlock_vma_page and __munlock_pagevec) so I thought
> > try_to_munlock should be called non-PG_mlocked page and try_to_unmap_one
> > returns PG_mlocked page once it found a VM_LOCKED VMA for a page.
> > IOW, non-PG_mlocked page is precondition for try_to_munlock.
>
> Okay, I have missed that part. Nonetheless this is a separate issue,
> should be part of a different patch ? Not inside these cleanups.
If that precondition is not true, this patch changes the behavior
slightly.
UNEVICTABLE_PGMUNLOCKED count mistmatch compared to old.
I wanted to catch it up. If you still think it's separate issue,
I will do. Please tell me. However, I still think it's no problem
to merge it in this clean up patch.
Thanks.
--
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: Anshuman Khandual <khandual@linux.vnet.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
kernel-team@lge.com, linux-mm@kvack.org,
linux-kernel@vger.kernel.org,
Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@suse.com>, Vlastimil Babka <vbabka@suse.cz>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [RFC 05/11] mm: make the try_to_munlock void function
Date: Tue, 7 Mar 2017 15:50:48 +0900 [thread overview]
Message-ID: <20170307065048.GD29458@bbox> (raw)
In-Reply-To: <12618e8d-9eaf-322a-4334-e1416dc95b8b@linux.vnet.ibm.com>
Hi Anshuman,
On Mon, Mar 06, 2017 at 03:10:17PM +0530, Anshuman Khandual wrote:
> On 03/06/2017 07:39 AM, Minchan Kim wrote:
> > On Fri, Mar 03, 2017 at 05:13:54PM +0530, Anshuman Khandual wrote:
> >> On 03/02/2017 12:09 PM, Minchan Kim wrote:
> >>> try_to_munlock returns SWAP_MLOCK if the one of VMAs mapped
> >>> the page has VM_LOCKED flag. In that time, VM set PG_mlocked to
> >>> the page if the page is not pte-mapped THP which cannot be
> >>> mlocked, either.
> >>
> >> Right.
> >>
> >>>
> >>> With that, __munlock_isolated_page can use PageMlocked to check
> >>> whether try_to_munlock is successful or not without relying on
> >>> try_to_munlock's retval. It helps to make ttu/ttuo simple with
> >>> upcoming patches.
> >>
> >> Right.
> >>
> >>>
> >>> Cc: Vlastimil Babka <vbabka@suse.cz>
> >>> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> >>> Signed-off-by: Minchan Kim <minchan@kernel.org>
> >>> ---
> >>> include/linux/rmap.h | 2 +-
> >>> mm/mlock.c | 6 ++----
> >>> mm/rmap.c | 16 ++++------------
> >>> 3 files changed, 7 insertions(+), 17 deletions(-)
> >>>
> >>> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> >>> index b556eef..1b0cd4c 100644
> >>> --- a/include/linux/rmap.h
> >>> +++ b/include/linux/rmap.h
> >>> @@ -235,7 +235,7 @@ int page_mkclean(struct page *);
> >>> * called in munlock()/munmap() path to check for other vmas holding
> >>> * the page mlocked.
> >>> */
> >>> -int try_to_munlock(struct page *);
> >>> +void try_to_munlock(struct page *);
> >>>
> >>> void remove_migration_ptes(struct page *old, struct page *new, bool locked);
> >>>
> >>> diff --git a/mm/mlock.c b/mm/mlock.c
> >>> index cdbed8a..d34a540 100644
> >>> --- a/mm/mlock.c
> >>> +++ b/mm/mlock.c
> >>> @@ -122,17 +122,15 @@ static bool __munlock_isolate_lru_page(struct page *page, bool getpage)
> >>> */
> >>> static void __munlock_isolated_page(struct page *page)
> >>> {
> >>> - int ret = SWAP_AGAIN;
> >>> -
> >>> /*
> >>> * Optimization: if the page was mapped just once, that's our mapping
> >>> * and we don't need to check all the other vmas.
> >>> */
> >>> if (page_mapcount(page) > 1)
> >>> - ret = try_to_munlock(page);
> >>> + try_to_munlock(page);
> >>>
> >>> /* Did try_to_unlock() succeed or punt? */
> >>> - if (ret != SWAP_MLOCK)
> >>> + if (!PageMlocked(page))
> >>
> >> Checks if the page is still mlocked or not.
> >>
> >>> count_vm_event(UNEVICTABLE_PGMUNLOCKED);
> >>>
> >>> putback_lru_page(page);
> >>> diff --git a/mm/rmap.c b/mm/rmap.c
> >>> index 0a48958..61ae694 100644
> >>> --- a/mm/rmap.c
> >>> +++ b/mm/rmap.c
> >>> @@ -1540,18 +1540,10 @@ static int page_not_mapped(struct page *page)
> >>> * Called from munlock code. Checks all of the VMAs mapping the page
> >>> * to make sure nobody else has this page mlocked. The page will be
> >>> * returned with PG_mlocked cleared if no other vmas have it mlocked.
> >>> - *
> >>> - * Return values are:
> >>> - *
> >>> - * SWAP_AGAIN - no vma is holding page mlocked, or,
> >>> - * SWAP_AGAIN - page mapped in mlocked vma -- couldn't acquire mmap sem
> >>> - * SWAP_FAIL - page cannot be located at present
> >>> - * SWAP_MLOCK - page is now mlocked.
> >>> */
> >>> -int try_to_munlock(struct page *page)
> >>> -{
> >>> - int ret;
> >>>
> >>> +void try_to_munlock(struct page *page)
> >>> +{
> >>> struct rmap_walk_control rwc = {
> >>> .rmap_one = try_to_unmap_one,
> >>> .arg = (void *)TTU_MUNLOCK,
> >>> @@ -1561,9 +1553,9 @@ int try_to_munlock(struct page *page)
> >>> };
> >>>
> >>> VM_BUG_ON_PAGE(!PageLocked(page) || PageLRU(page), page);
> >>> + VM_BUG_ON_PAGE(PageMlocked(page), page);
> >>
> >> We are calling on the page to see if its mlocked from any of it's
> >> mapping VMAs. Then it is a possibility that the page is mlocked
> >> and the above condition is true and we print VM BUG report there.
> >> The point is if its a valid possibility why we have added the
> >> above check ?
> >
> > If I read code properly, __munlock_isolated_page calls try_to_munlock
> > always pass the TestClearPageMlocked page to try_to_munlock.
>
> Right.
>
> > (e.g., munlock_vma_page and __munlock_pagevec) so I thought
> > try_to_munlock should be called non-PG_mlocked page and try_to_unmap_one
> > returns PG_mlocked page once it found a VM_LOCKED VMA for a page.
> > IOW, non-PG_mlocked page is precondition for try_to_munlock.
>
> Okay, I have missed that part. Nonetheless this is a separate issue,
> should be part of a different patch ? Not inside these cleanups.
If that precondition is not true, this patch changes the behavior
slightly.
UNEVICTABLE_PGMUNLOCKED count mistmatch compared to old.
I wanted to catch it up. If you still think it's separate issue,
I will do. Please tell me. However, I still think it's no problem
to merge it in this clean up patch.
Thanks.
next prev parent reply other threads:[~2017-03-07 6:50 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-02 6:39 [RFC 00/11] make try_to_unmap simple Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-02 6:39 ` [RFC 01/11] mm: use SWAP_SUCCESS instead of 0 Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-02 14:27 ` Anshuman Khandual
2017-03-02 14:27 ` Anshuman Khandual
2017-03-03 3:01 ` Minchan Kim
2017-03-03 3:01 ` Minchan Kim
2017-03-06 9:07 ` Anshuman Khandual
2017-03-06 9:07 ` Anshuman Khandual
2017-03-07 14:19 ` Kirill A. Shutemov
2017-03-07 14:19 ` Kirill A. Shutemov
2017-03-08 6:25 ` Minchan Kim
2017-03-08 6:25 ` Minchan Kim
2017-03-02 6:39 ` [RFC 02/11] mm: remove unncessary ret in page_referenced Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-02 14:33 ` Anshuman Khandual
2017-03-02 14:33 ` Anshuman Khandual
2017-03-03 3:03 ` Minchan Kim
2017-03-03 3:03 ` Minchan Kim
2017-03-07 14:20 ` Kirill A. Shutemov
2017-03-07 14:20 ` Kirill A. Shutemov
2017-03-02 6:39 ` [RFC 03/11] mm: remove SWAP_DIRTY in ttu Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-02 7:34 ` Hillf Danton
2017-03-02 7:34 ` Hillf Danton
2017-03-03 2:57 ` Minchan Kim
2017-03-03 2:57 ` Minchan Kim
2017-03-02 14:42 ` Anshuman Khandual
2017-03-02 14:42 ` Anshuman Khandual
2017-03-07 14:20 ` Kirill A. Shutemov
2017-03-07 14:20 ` Kirill A. Shutemov
2017-03-02 6:39 ` [RFC 04/11] mm: remove SWAP_MLOCK check for SWAP_SUCCESS " Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-02 14:51 ` Anshuman Khandual
2017-03-02 14:51 ` Anshuman Khandual
2017-03-03 3:04 ` Minchan Kim
2017-03-03 3:04 ` Minchan Kim
2017-03-07 14:26 ` Kirill A. Shutemov
2017-03-07 14:26 ` Kirill A. Shutemov
2017-03-08 6:40 ` Minchan Kim
2017-03-08 6:40 ` Minchan Kim
2017-03-02 6:39 ` [RFC 05/11] mm: make the try_to_munlock void function Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-03 11:43 ` Anshuman Khandual
2017-03-03 11:43 ` Anshuman Khandual
2017-03-06 2:09 ` Minchan Kim
2017-03-06 2:09 ` Minchan Kim
2017-03-06 9:40 ` Anshuman Khandual
2017-03-06 9:40 ` Anshuman Khandual
2017-03-07 6:50 ` Minchan Kim [this message]
2017-03-07 6:50 ` Minchan Kim
2017-03-07 8:55 ` Anshuman Khandual
2017-03-07 8:55 ` Anshuman Khandual
2017-03-07 15:17 ` Kirill A. Shutemov
2017-03-07 15:17 ` Kirill A. Shutemov
2017-03-08 6:41 ` Minchan Kim
2017-03-08 6:41 ` Minchan Kim
2017-03-02 6:39 ` [RFC 06/11] mm: remove SWAP_MLOCK in ttu Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-03 12:36 ` Anshuman Khandual
2017-03-03 12:36 ` Anshuman Khandual
2017-03-06 2:15 ` Minchan Kim
2017-03-06 2:15 ` Minchan Kim
2017-03-07 15:24 ` Kirill A. Shutemov
2017-03-07 15:24 ` Kirill A. Shutemov
2017-03-08 6:42 ` Minchan Kim
2017-03-08 6:42 ` Minchan Kim
2017-03-02 6:39 ` [RFC 07/11] mm: remove SWAP_AGAIN " Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-03 12:54 ` Anshuman Khandual
2017-03-03 12:54 ` Anshuman Khandual
2017-03-06 2:16 ` Minchan Kim
2017-03-06 2:16 ` Minchan Kim
2017-03-02 6:39 ` [RFC 08/11] mm: make ttu's return boolean Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-08 7:13 ` John Hubbard
2017-03-08 7:13 ` John Hubbard
2017-03-09 6:37 ` Minchan Kim
2017-03-09 6:37 ` Minchan Kim
2017-03-09 6:46 ` John Hubbard
2017-03-09 6:46 ` John Hubbard
2017-03-02 6:39 ` [RFC 09/11] mm: make rmap_walk void function Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-02 6:39 ` [RFC 10/11] mm: make rmap_one boolean function Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-02 6:39 ` [RFC 11/11] mm: remove SWAP_[SUCCESS|AGAIN|FAIL] Minchan Kim
2017-03-02 6:39 ` Minchan Kim
2017-03-03 13:04 ` Anshuman Khandual
2017-03-03 13:04 ` Anshuman Khandual
2017-03-06 2:18 ` Minchan Kim
2017-03-06 2:18 ` Minchan Kim
2017-03-02 14:22 ` [RFC 00/11] make try_to_unmap simple Anshuman Khandual
2017-03-02 14:22 ` Anshuman Khandual
2017-03-03 2:11 ` Minchan Kim
2017-03-03 2:11 ` Minchan Kim
2017-03-03 5:39 ` Anshuman Khandual
2017-03-03 5:39 ` Anshuman Khandual
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=20170307065048.GD29458@bbox \
--to=minchan@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=kernel-team@lge.com \
--cc=khandual@linux.vnet.ibm.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=vbabka@suse.cz \
/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.