From: Simon Jeons <simon.jeons@gmail.com>
To: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Michal Hocko <mhocko@suse.cz>,
linux-mm@kvack.org, Andrew Morton <akpm@linux-foundation.org>,
Mel Gorman <mel@csn.ul.ie>, Hugh Dickins <hughd@google.com>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Andi Kleen <andi@firstfloor.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 5/9] migrate: enable migrate_pages() to migrate hugepage
Date: Wed, 20 Mar 2013 08:31:06 +0800 [thread overview]
Message-ID: <5149034A.5050907@gmail.com> (raw)
In-Reply-To: <1363651636-3lsf20se-mutt-n-horiguchi@ah.jp.nec.com>
Hi Naoya,
On 03/19/2013 08:07 AM, Naoya Horiguchi wrote:
> On Mon, Mar 18, 2013 at 04:40:57PM +0100, Michal Hocko wrote:
>> On Thu 21-02-13 14:41:44, Naoya Horiguchi wrote:
>>> This patch extends check_range() to handle vma with VM_HUGETLB set.
>>> With this changes, we can migrate hugepage with migrate_pages(2).
>>> Note that for larger hugepages (covered by pud entries, 1GB for
>>> x86_64 for example), we simply skip it now.
>>>
>>> Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
>>> ---
>>> include/linux/hugetlb.h | 6 ++++--
>>> mm/hugetlb.c | 10 ++++++++++
>>> mm/mempolicy.c | 46 ++++++++++++++++++++++++++++++++++------------
>>> 3 files changed, 48 insertions(+), 14 deletions(-)
>>>
>>> diff --git v3.8.orig/include/linux/hugetlb.h v3.8/include/linux/hugetlb.h
>>> index 8f87115..eb33df5 100644
>>> --- v3.8.orig/include/linux/hugetlb.h
>>> +++ v3.8/include/linux/hugetlb.h
>>> @@ -69,6 +69,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed);
>>> int dequeue_hwpoisoned_huge_page(struct page *page);
>>> void putback_active_hugepage(struct page *page);
>>> void putback_active_hugepages(struct list_head *l);
>>> +void migrate_hugepage_add(struct page *page, struct list_head *list);
>>> void copy_huge_page(struct page *dst, struct page *src);
>>>
>>> extern unsigned long hugepages_treat_as_movable;
>>> @@ -88,8 +89,8 @@ struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
>>> pmd_t *pmd, int write);
>>> struct page *follow_huge_pud(struct mm_struct *mm, unsigned long address,
>>> pud_t *pud, int write);
>>> -int pmd_huge(pmd_t pmd);
>>> -int pud_huge(pud_t pmd);
>>> +extern int pmd_huge(pmd_t pmd);
>>> +extern int pud_huge(pud_t pmd);
>> extern is not needed here.
> OK.
>
>>> unsigned long hugetlb_change_protection(struct vm_area_struct *vma,
>>> unsigned long address, unsigned long end, pgprot_t newprot);
>>>
>>> @@ -134,6 +135,7 @@ static inline int dequeue_hwpoisoned_huge_page(struct page *page)
>>>
>>> #define putback_active_hugepage(p) 0
>>> #define putback_active_hugepages(l) 0
>>> +#define migrate_hugepage_add(p, l) 0
>>> static inline void copy_huge_page(struct page *dst, struct page *src)
>>> {
>>> }
>>> diff --git v3.8.orig/mm/hugetlb.c v3.8/mm/hugetlb.c
>>> index cb9d43b8..86ffcb7 100644
>>> --- v3.8.orig/mm/hugetlb.c
>>> +++ v3.8/mm/hugetlb.c
>>> @@ -3202,3 +3202,13 @@ void putback_active_hugepages(struct list_head *l)
>>> list_for_each_entry_safe(page, page2, l, lru)
>>> putback_active_hugepage(page);
>>> }
>>> +
>>> +void migrate_hugepage_add(struct page *page, struct list_head *list)
>>> +{
>>> + VM_BUG_ON(!PageHuge(page));
>>> + get_page(page);
>>> + spin_lock(&hugetlb_lock);
>> Why hugetlb_lock? Comment for this lock says that it protects
>> hugepage_freelists, nr_huge_pages, and free_huge_pages.
> I think that this comment is out of date and hugepage_activelists,
> which was introduced recently, should be protected because this
> patchset adds is_hugepage_movable() which runs through the list.
> So I'll update the comment in the next post.
>
>>> + list_move_tail(&page->lru, list);
>>> + spin_unlock(&hugetlb_lock);
>>> + return;
>>> +}
>>> diff --git v3.8.orig/mm/mempolicy.c v3.8/mm/mempolicy.c
>>> index e2df1c1..8627135 100644
>>> --- v3.8.orig/mm/mempolicy.c
>>> +++ v3.8/mm/mempolicy.c
>>> @@ -525,6 +525,27 @@ static int check_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
>>> return addr != end;
>>> }
>>>
>>> +static void check_hugetlb_pmd_range(struct vm_area_struct *vma, pmd_t *pmd,
>>> + const nodemask_t *nodes, unsigned long flags,
>>> + void *private)
>>> +{
>>> +#ifdef CONFIG_HUGETLB_PAGE
>>> + int nid;
>>> + struct page *page;
>>> +
>>> + spin_lock(&vma->vm_mm->page_table_lock);
>>> + page = pte_page(huge_ptep_get((pte_t *)pmd));
>>> + spin_unlock(&vma->vm_mm->page_table_lock);
>> I am a bit confused why page_table_lock is used here and why it doesn't
>> cover the page usage.
> I expected this function to do the same for pmd as check_pte_range() does
> for pte, but the above code didn't do it. I should've put spin_unlock
> below migrate_hugepage_add(). Sorry for the confusion.
I still confuse! Could you explain more in details?
>
>>> + nid = page_to_nid(page);
>>> + if (node_isset(nid, *nodes) != !!(flags & MPOL_MF_INVERT)
>>> + && ((flags & MPOL_MF_MOVE && page_mapcount(page) == 1)
>>> + || flags & MPOL_MF_MOVE_ALL))
>>> + migrate_hugepage_add(page, private);
>>> +#else
>>> + BUG();
>>> +#endif
>>> +}
>>> +
>>> static inline int check_pmd_range(struct vm_area_struct *vma, pud_t *pud,
>>> unsigned long addr, unsigned long end,
>>> const nodemask_t *nodes, unsigned long flags,
>>> @@ -536,6 +557,11 @@ static inline int check_pmd_range(struct vm_area_struct *vma, pud_t *pud,
>>> pmd = pmd_offset(pud, addr);
>>> do {
>>> next = pmd_addr_end(addr, end);
>>> + if (pmd_huge(*pmd) && is_vm_hugetlb_page(vma)) {
>> Why an explicit check for is_vm_hugetlb_page here? Isn't pmd_huge()
>> sufficient?
> I think we need both check here because if we use only pmd_huge(),
> pmd for thp goes into this branch wrongly.
>
> Thanks,
> Naoya
>
>>> + check_hugetlb_pmd_range(vma, pmd, nodes,
>>> + flags, private);
>>> + continue;
>>> + }
>>> split_huge_page_pmd(vma, addr, pmd);
>>> if (pmd_none_or_trans_huge_or_clear_bad(pmd))
>>> continue;
>> [...]
>> --
>> Michal Hocko
>> SUSE Labs
> --
> 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>
--
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: Simon Jeons <simon.jeons@gmail.com>
To: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Michal Hocko <mhocko@suse.cz>,
linux-mm@kvack.org, Andrew Morton <akpm@linux-foundation.org>,
Mel Gorman <mel@csn.ul.ie>, Hugh Dickins <hughd@google.com>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Andi Kleen <andi@firstfloor.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 5/9] migrate: enable migrate_pages() to migrate hugepage
Date: Wed, 20 Mar 2013 08:31:06 +0800 [thread overview]
Message-ID: <5149034A.5050907@gmail.com> (raw)
In-Reply-To: <1363651636-3lsf20se-mutt-n-horiguchi@ah.jp.nec.com>
Hi Naoya,
On 03/19/2013 08:07 AM, Naoya Horiguchi wrote:
> On Mon, Mar 18, 2013 at 04:40:57PM +0100, Michal Hocko wrote:
>> On Thu 21-02-13 14:41:44, Naoya Horiguchi wrote:
>>> This patch extends check_range() to handle vma with VM_HUGETLB set.
>>> With this changes, we can migrate hugepage with migrate_pages(2).
>>> Note that for larger hugepages (covered by pud entries, 1GB for
>>> x86_64 for example), we simply skip it now.
>>>
>>> Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
>>> ---
>>> include/linux/hugetlb.h | 6 ++++--
>>> mm/hugetlb.c | 10 ++++++++++
>>> mm/mempolicy.c | 46 ++++++++++++++++++++++++++++++++++------------
>>> 3 files changed, 48 insertions(+), 14 deletions(-)
>>>
>>> diff --git v3.8.orig/include/linux/hugetlb.h v3.8/include/linux/hugetlb.h
>>> index 8f87115..eb33df5 100644
>>> --- v3.8.orig/include/linux/hugetlb.h
>>> +++ v3.8/include/linux/hugetlb.h
>>> @@ -69,6 +69,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed);
>>> int dequeue_hwpoisoned_huge_page(struct page *page);
>>> void putback_active_hugepage(struct page *page);
>>> void putback_active_hugepages(struct list_head *l);
>>> +void migrate_hugepage_add(struct page *page, struct list_head *list);
>>> void copy_huge_page(struct page *dst, struct page *src);
>>>
>>> extern unsigned long hugepages_treat_as_movable;
>>> @@ -88,8 +89,8 @@ struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
>>> pmd_t *pmd, int write);
>>> struct page *follow_huge_pud(struct mm_struct *mm, unsigned long address,
>>> pud_t *pud, int write);
>>> -int pmd_huge(pmd_t pmd);
>>> -int pud_huge(pud_t pmd);
>>> +extern int pmd_huge(pmd_t pmd);
>>> +extern int pud_huge(pud_t pmd);
>> extern is not needed here.
> OK.
>
>>> unsigned long hugetlb_change_protection(struct vm_area_struct *vma,
>>> unsigned long address, unsigned long end, pgprot_t newprot);
>>>
>>> @@ -134,6 +135,7 @@ static inline int dequeue_hwpoisoned_huge_page(struct page *page)
>>>
>>> #define putback_active_hugepage(p) 0
>>> #define putback_active_hugepages(l) 0
>>> +#define migrate_hugepage_add(p, l) 0
>>> static inline void copy_huge_page(struct page *dst, struct page *src)
>>> {
>>> }
>>> diff --git v3.8.orig/mm/hugetlb.c v3.8/mm/hugetlb.c
>>> index cb9d43b8..86ffcb7 100644
>>> --- v3.8.orig/mm/hugetlb.c
>>> +++ v3.8/mm/hugetlb.c
>>> @@ -3202,3 +3202,13 @@ void putback_active_hugepages(struct list_head *l)
>>> list_for_each_entry_safe(page, page2, l, lru)
>>> putback_active_hugepage(page);
>>> }
>>> +
>>> +void migrate_hugepage_add(struct page *page, struct list_head *list)
>>> +{
>>> + VM_BUG_ON(!PageHuge(page));
>>> + get_page(page);
>>> + spin_lock(&hugetlb_lock);
>> Why hugetlb_lock? Comment for this lock says that it protects
>> hugepage_freelists, nr_huge_pages, and free_huge_pages.
> I think that this comment is out of date and hugepage_activelists,
> which was introduced recently, should be protected because this
> patchset adds is_hugepage_movable() which runs through the list.
> So I'll update the comment in the next post.
>
>>> + list_move_tail(&page->lru, list);
>>> + spin_unlock(&hugetlb_lock);
>>> + return;
>>> +}
>>> diff --git v3.8.orig/mm/mempolicy.c v3.8/mm/mempolicy.c
>>> index e2df1c1..8627135 100644
>>> --- v3.8.orig/mm/mempolicy.c
>>> +++ v3.8/mm/mempolicy.c
>>> @@ -525,6 +525,27 @@ static int check_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
>>> return addr != end;
>>> }
>>>
>>> +static void check_hugetlb_pmd_range(struct vm_area_struct *vma, pmd_t *pmd,
>>> + const nodemask_t *nodes, unsigned long flags,
>>> + void *private)
>>> +{
>>> +#ifdef CONFIG_HUGETLB_PAGE
>>> + int nid;
>>> + struct page *page;
>>> +
>>> + spin_lock(&vma->vm_mm->page_table_lock);
>>> + page = pte_page(huge_ptep_get((pte_t *)pmd));
>>> + spin_unlock(&vma->vm_mm->page_table_lock);
>> I am a bit confused why page_table_lock is used here and why it doesn't
>> cover the page usage.
> I expected this function to do the same for pmd as check_pte_range() does
> for pte, but the above code didn't do it. I should've put spin_unlock
> below migrate_hugepage_add(). Sorry for the confusion.
I still confuse! Could you explain more in details?
>
>>> + nid = page_to_nid(page);
>>> + if (node_isset(nid, *nodes) != !!(flags & MPOL_MF_INVERT)
>>> + && ((flags & MPOL_MF_MOVE && page_mapcount(page) == 1)
>>> + || flags & MPOL_MF_MOVE_ALL))
>>> + migrate_hugepage_add(page, private);
>>> +#else
>>> + BUG();
>>> +#endif
>>> +}
>>> +
>>> static inline int check_pmd_range(struct vm_area_struct *vma, pud_t *pud,
>>> unsigned long addr, unsigned long end,
>>> const nodemask_t *nodes, unsigned long flags,
>>> @@ -536,6 +557,11 @@ static inline int check_pmd_range(struct vm_area_struct *vma, pud_t *pud,
>>> pmd = pmd_offset(pud, addr);
>>> do {
>>> next = pmd_addr_end(addr, end);
>>> + if (pmd_huge(*pmd) && is_vm_hugetlb_page(vma)) {
>> Why an explicit check for is_vm_hugetlb_page here? Isn't pmd_huge()
>> sufficient?
> I think we need both check here because if we use only pmd_huge(),
> pmd for thp goes into this branch wrongly.
>
> Thanks,
> Naoya
>
>>> + check_hugetlb_pmd_range(vma, pmd, nodes,
>>> + flags, private);
>>> + continue;
>>> + }
>>> split_huge_page_pmd(vma, addr, pmd);
>>> if (pmd_none_or_trans_huge_or_clear_bad(pmd))
>>> continue;
>> [...]
>> --
>> Michal Hocko
>> SUSE Labs
> --
> 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>
next prev parent reply other threads:[~2013-03-20 0:31 UTC|newest]
Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-21 19:41 [RFC][PATCH 0/9] extend hugepage migration Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-02-21 19:41 ` [PATCH 1/9] migrate: add migrate_entry_wait_huge() Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-03-18 14:51 ` Michal Hocko
2013-03-18 14:51 ` Michal Hocko
2013-03-19 0:06 ` Naoya Horiguchi
2013-03-19 0:06 ` Naoya Horiguchi
2013-03-19 23:57 ` Simon Jeons
2013-03-19 23:57 ` Simon Jeons
2013-03-20 21:53 ` Naoya Horiguchi
2013-03-20 21:53 ` Naoya Horiguchi
2013-03-20 23:36 ` Simon Jeons
2013-03-20 23:36 ` Simon Jeons
2013-04-04 4:57 ` Simon Jeons
2013-04-04 4:57 ` Simon Jeons
2013-02-21 19:41 ` [PATCH 2/9] migrate: make core migration code aware of hugepage Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-03-18 15:22 ` Michal Hocko
2013-03-18 15:22 ` Michal Hocko
2013-03-18 15:33 ` Michal Hocko
2013-03-18 15:33 ` Michal Hocko
2013-03-19 0:06 ` Naoya Horiguchi
2013-03-19 0:06 ` Naoya Horiguchi
2013-02-21 19:41 ` [PATCH 3/9] soft-offline: use migrate_pages() instead of migrate_huge_page() Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-02-27 7:25 ` Chen Gong
2013-02-27 17:06 ` Naoya Horiguchi
2013-02-27 17:06 ` Naoya Horiguchi
2013-02-27 17:57 ` Naoya Horiguchi
2013-02-27 17:57 ` Naoya Horiguchi
2013-02-21 19:41 ` [PATCH 4/9] migrate: clean up migrate_huge_page() Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-02-21 19:41 ` [PATCH 5/9] migrate: enable migrate_pages() to migrate hugepage Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-03-18 15:40 ` Michal Hocko
2013-03-18 15:40 ` Michal Hocko
2013-03-19 0:07 ` Naoya Horiguchi
2013-03-19 0:07 ` Naoya Horiguchi
2013-03-19 7:11 ` Michal Hocko
2013-03-19 7:11 ` Michal Hocko
2013-03-20 6:12 ` Naoya Horiguchi
2013-03-20 6:12 ` Naoya Horiguchi
2013-03-20 7:41 ` Michal Hocko
2013-03-20 7:41 ` Michal Hocko
2013-03-20 0:31 ` Simon Jeons [this message]
2013-03-20 0:31 ` Simon Jeons
2013-03-20 21:59 ` Naoya Horiguchi
2013-03-20 21:59 ` Naoya Horiguchi
2013-03-21 0:06 ` Simon Jeons
2013-03-21 0:06 ` Simon Jeons
2013-02-21 19:41 ` [PATCH 6/9] migrate: enable move_pages() " Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-02-21 19:41 ` [PATCH 7/9] mbind: enable mbind() " Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-02-21 19:41 ` [PATCH 8/9] memory-hotplug: enable memory hotplug to handle hugepage Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-02-23 7:05 ` Hillf Danton
2013-02-23 7:05 ` Hillf Danton
2013-02-25 16:57 ` Naoya Horiguchi
2013-02-25 16:57 ` Naoya Horiguchi
2013-02-27 7:36 ` Chen Gong
2013-02-27 17:16 ` Naoya Horiguchi
2013-02-27 17:16 ` Naoya Horiguchi
2013-03-18 16:07 ` Michal Hocko
2013-03-18 16:07 ` Michal Hocko
2013-03-20 3:55 ` Naoya Horiguchi
2013-03-20 3:55 ` Naoya Horiguchi
2013-03-20 7:57 ` Michal Hocko
2013-03-20 7:57 ` Michal Hocko
2013-03-20 1:03 ` Simon Jeons
2013-03-20 1:03 ` Simon Jeons
2013-03-20 22:05 ` Naoya Horiguchi
2013-03-20 22:05 ` Naoya Horiguchi
2013-03-20 23:55 ` Simon Jeons
2013-03-20 23:55 ` Simon Jeons
2013-02-21 19:41 ` [PATCH 9/9] remove /proc/sys/vm/hugepages_treat_as_movable Naoya Horiguchi
2013-02-21 19:41 ` Naoya Horiguchi
2013-02-28 6:02 ` KOSAKI Motohiro
2013-02-28 6:02 ` KOSAKI Motohiro
2013-02-28 18:16 ` Naoya Horiguchi
2013-02-28 18:16 ` Naoya Horiguchi
2013-03-18 15:51 ` Michal Hocko
2013-03-18 15:51 ` Michal Hocko
2013-03-19 0:07 ` Naoya Horiguchi
2013-03-19 0:07 ` Naoya Horiguchi
2013-03-19 23:43 ` [RFC][PATCH 0/9] extend hugepage migration Simon Jeons
2013-03-19 23:43 ` Simon Jeons
2013-03-20 21:35 ` Naoya Horiguchi
2013-03-20 21:35 ` Naoya Horiguchi
2013-03-20 23:49 ` Simon Jeons
2013-03-20 23:49 ` Simon Jeons
2013-03-21 12:56 ` Michal Hocko
2013-03-21 12:56 ` Michal Hocko
2013-03-21 23:46 ` Simon Jeons
2013-03-21 23:46 ` Simon Jeons
[not found] ` <20130322081532.GC31457@dhcp22.suse.cz>
2013-04-05 1:14 ` Simon Jeons
2013-04-05 1:14 ` Simon Jeons
2013-04-05 8:08 ` Michal Hocko
2013-04-05 8:08 ` Michal Hocko
2013-04-05 9:00 ` Simon Jeons
2013-04-05 9:00 ` Simon Jeons
2013-04-05 9:30 ` Michal Hocko
2013-04-05 9:30 ` Michal Hocko
2013-04-07 0:32 ` Simon Jeons
2013-04-07 0:32 ` Simon Jeons
2013-04-07 14:05 ` KOSAKI Motohiro
2013-04-07 14:05 ` KOSAKI Motohiro
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=5149034A.5050907@gmail.com \
--to=simon.jeons@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=hughd@google.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mel@csn.ul.ie \
--cc=mhocko@suse.cz \
--cc=n-horiguchi@ah.jp.nec.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.