Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1262328 > unrolled thread
| Started by | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| First post | 2015-11-04 16:10 +0100 |
| Last post | 2015-11-08 22:30 +0100 |
| Articles | 7 — 4 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 3/5] mm, page_owner: copy page owner info during migration Vlastimil Babka <vbabka@suse.cz> - 2015-11-04 16:10 +0100
checkpatch false warning. was: [PATCH 3/5] mm, page_owner: copy page owner info during migration Vlastimil Babka <vbabka@suse.cz> - 2015-11-04 16:20 +0100
Re: checkpatch false warning. was: [PATCH 3/5] mm, page_owner: copy page owner info during migration Joe Perches <joe@perches.com> - 2015-11-04 16:40 +0100
Re: [PATCH 3/5] mm, page_owner: copy page owner info during migration Joonsoo Kim <iamjoonsoo.kim@lge.com> - 2015-11-05 09:20 +0100
Re: [PATCH 3/5] mm, page_owner: copy page owner info during migration Vlastimil Babka <vbabka@suse.cz> - 2015-11-05 09:20 +0100
Re: [PATCH 3/5] mm, page_owner: copy page owner info during migration Joonsoo Kim <iamjoonsoo.kim@lge.com> - 2015-11-05 09:30 +0100
Re: [PATCH 3/5] mm, page_owner: copy page owner info during migration Hugh Dickins <hughd@google.com> - 2015-11-08 22:30 +0100
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2015-11-04 16:10 +0100 |
| Subject | [PATCH 3/5] mm, page_owner: copy page owner info during migration |
| Message-ID | <qr7Rf-24F-1@gated-at.bofh.it> |
The page_owner mechanism stores gfp_flags of an allocation and stack trace
that lead to it. During page migration, the original information is
essentially replaced by the allocation of free page as the migration target.
Arguably this is less useful and might lead to all the page_owner info for
migratable pages gradually converge towards compaction or numa balancing
migrations. It has also lead to inaccuracies such as one fixed by commit
e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner").
This patch thus introduces copying the page_owner info during migration.
However, since the fact that the page has been migrated from its original
place might be useful for debugging, the next patch will introduce a way to
track that information as well.
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
---
include/linux/page_owner.h | 10 +++++++++-
mm/migrate.c | 2 ++
mm/page_owner.c | 16 ++++++++++++++++
3 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/include/linux/page_owner.h b/include/linux/page_owner.h
index 8e2eb15..6440daa 100644
--- a/include/linux/page_owner.h
+++ b/include/linux/page_owner.h
@@ -11,6 +11,7 @@ extern void __reset_page_owner(struct page *page, unsigned int order);
extern void __set_page_owner(struct page *page,
unsigned int order, gfp_t gfp_mask);
extern gfp_t __get_page_owner_gfp(struct page *page);
+extern void __copy_page_owner(struct page *oldpage, struct page *newpage);
static inline void reset_page_owner(struct page *page, unsigned int order)
{
@@ -32,6 +33,11 @@ static inline gfp_t get_page_owner_gfp(struct page *page)
else
return 0;
}
+static inline void copy_page_owner(struct page *oldpage, struct page *newpage)
+{
+ if (static_branch_unlikely(&page_owner_inited))
+ __copy_page_owner(oldpage, newpage);
+}
#else
static inline void reset_page_owner(struct page *page, unsigned int order)
{
@@ -44,6 +50,8 @@ static inline gfp_t get_page_owner_gfp(struct page *page)
{
return 0;
}
-
+static inline void copy_page_owner(struct page *oldpage, struct page *newpage)
+{
+}
#endif /* CONFIG_PAGE_OWNER */
#endif /* __LINUX_PAGE_OWNER_H */
diff --git a/mm/migrate.c b/mm/migrate.c
index 1ae0113..9f82e03 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -38,6 +38,7 @@
#include <linux/balloon_compaction.h>
#include <linux/mmu_notifier.h>
#include <linux/page_idle.h>
+#include <linux/page_owner.h>
#include <asm/tlbflush.h>
@@ -775,6 +776,7 @@ static int move_to_new_page(struct page *newpage, struct page *page,
set_page_memcg(page, NULL);
if (!PageAnon(page))
page->mapping = NULL;
+ copy_page_owner(page, newpage);
}
return rc;
}
diff --git a/mm/page_owner.c b/mm/page_owner.c
index 7664b85..7ebd3d0 100644
--- a/mm/page_owner.c
+++ b/mm/page_owner.c
@@ -84,6 +84,22 @@ gfp_t __get_page_owner_gfp(struct page *page)
return page_ext->gfp_mask;
}
+void __copy_page_owner(struct page *oldpage, struct page *newpage)
+{
+ struct page_ext *old_ext = lookup_page_ext(oldpage);
+ struct page_ext *new_ext = lookup_page_ext(newpage);
+ int i;
+
+ new_ext->order = old_ext->order;
+ new_ext->gfp_mask = old_ext->gfp_mask;
+ new_ext->nr_entries = old_ext->nr_entries;
+
+ for (i = 0; i < ARRAY_SIZE(new_ext->trace_entries); i++)
+ new_ext->trace_entries[i] = old_ext->trace_entries[i];
+
+ __set_bit(PAGE_EXT_OWNER, &new_ext->flags);
+}
+
static ssize_t
print_page_owner(char __user *buf, size_t count, unsigned long pfn,
struct page *page, struct page_ext *page_ext)
--
2.6.2
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2015-11-04 16:20 +0100 |
| Subject | checkpatch false warning. was: [PATCH 3/5] mm, page_owner: copy page owner info during migration |
| Message-ID | <qr80V-28m-15@gated-at.bofh.it> |
| In reply to | #1262328 |
On 11/04/2015 04:00 PM, Vlastimil Babka wrote:
> The page_owner mechanism stores gfp_flags of an allocation and stack trace
> that lead to it. During page migration, the original information is
> essentially replaced by the allocation of free page as the migration target.
> Arguably this is less useful and might lead to all the page_owner info for
> migratable pages gradually converge towards compaction or numa balancing
> migrations. It has also lead to inaccuracies such as one fixed by commit
> e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner").
Hi,
This patch gives me the following checkpatch warning:
ERROR: Please use git commit description style 'commit <12+ chars of sha1> ("<title line>")' - ie: 'commit e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner")'
#12:
e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner").
Some fuzzing showed that it's complaining about the missing word "commit"
which is however on the end of the previous line. Can that be fixed please?
I can't speak perl myself.
Thanks,
Vlastimil
> This patch thus introduces copying the page_owner info during migration.
> However, since the fact that the page has been migrated from its original
> place might be useful for debugging, the next patch will introduce a way to
> track that information as well.
>
> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
> ---
> include/linux/page_owner.h | 10 +++++++++-
> mm/migrate.c | 2 ++
> mm/page_owner.c | 16 ++++++++++++++++
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/page_owner.h b/include/linux/page_owner.h
> index 8e2eb15..6440daa 100644
> --- a/include/linux/page_owner.h
> +++ b/include/linux/page_owner.h
> @@ -11,6 +11,7 @@ extern void __reset_page_owner(struct page *page, unsigned int order);
> extern void __set_page_owner(struct page *page,
> unsigned int order, gfp_t gfp_mask);
> extern gfp_t __get_page_owner_gfp(struct page *page);
> +extern void __copy_page_owner(struct page *oldpage, struct page *newpage);
>
> static inline void reset_page_owner(struct page *page, unsigned int order)
> {
> @@ -32,6 +33,11 @@ static inline gfp_t get_page_owner_gfp(struct page *page)
> else
> return 0;
> }
> +static inline void copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> + if (static_branch_unlikely(&page_owner_inited))
> + __copy_page_owner(oldpage, newpage);
> +}
> #else
> static inline void reset_page_owner(struct page *page, unsigned int order)
> {
> @@ -44,6 +50,8 @@ static inline gfp_t get_page_owner_gfp(struct page *page)
> {
> return 0;
> }
> -
> +static inline void copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> +}
> #endif /* CONFIG_PAGE_OWNER */
> #endif /* __LINUX_PAGE_OWNER_H */
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 1ae0113..9f82e03 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -38,6 +38,7 @@
> #include <linux/balloon_compaction.h>
> #include <linux/mmu_notifier.h>
> #include <linux/page_idle.h>
> +#include <linux/page_owner.h>
>
> #include <asm/tlbflush.h>
>
> @@ -775,6 +776,7 @@ static int move_to_new_page(struct page *newpage, struct page *page,
> set_page_memcg(page, NULL);
> if (!PageAnon(page))
> page->mapping = NULL;
> + copy_page_owner(page, newpage);
> }
> return rc;
> }
> diff --git a/mm/page_owner.c b/mm/page_owner.c
> index 7664b85..7ebd3d0 100644
> --- a/mm/page_owner.c
> +++ b/mm/page_owner.c
> @@ -84,6 +84,22 @@ gfp_t __get_page_owner_gfp(struct page *page)
> return page_ext->gfp_mask;
> }
>
> +void __copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> + struct page_ext *old_ext = lookup_page_ext(oldpage);
> + struct page_ext *new_ext = lookup_page_ext(newpage);
> + int i;
> +
> + new_ext->order = old_ext->order;
> + new_ext->gfp_mask = old_ext->gfp_mask;
> + new_ext->nr_entries = old_ext->nr_entries;
> +
> + for (i = 0; i < ARRAY_SIZE(new_ext->trace_entries); i++)
> + new_ext->trace_entries[i] = old_ext->trace_entries[i];
> +
> + __set_bit(PAGE_EXT_OWNER, &new_ext->flags);
> +}
> +
> static ssize_t
> print_page_owner(char __user *buf, size_t count, unsigned long pfn,
> struct page *page, struct page_ext *page_ext)
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Joe Perches <joe@perches.com> |
|---|---|
| Date | 2015-11-04 16:40 +0100 |
| Subject | Re: checkpatch false warning. was: [PATCH 3/5] mm, page_owner: copy page owner info during migration |
| Message-ID | <qr8ki-2go-41@gated-at.bofh.it> |
| In reply to | #1262343 |
On Wed, 2015-11-04 at 16:10 +0100, Vlastimil Babka wrote:
> On 11/04/2015 04:00 PM, Vlastimil Babka wrote:
> > The page_owner mechanism stores gfp_flags of an allocation and stack trace
> > that lead to it. During page migration, the original information is
> > essentially replaced by the allocation of free page as the migration target.
> > Arguably this is less useful and might lead to all the page_owner info for
> > migratable pages gradually converge towards compaction or numa balancing
> > migrations. It has also lead to inaccuracies such as one fixed by commit
> > e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner").
>
> Hi,
>
> This patch gives me the following checkpatch warning:
>
> ERROR: Please use git commit description style 'commit <12+ chars of sha1> ("")' - ie: 'commit e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner")'
> #12:
> e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner").
>
> Some fuzzing showed that it's complaining about the missing word "commit"
> which is however on the end of the previous line. Can that be fixed please?
Not trivially, no.
> I can't speak perl myself.
No one speaks perl fluently.
checkpatch is not perfect. It never will be, it's just
a brainless script. Please ignore messages from it that
are obviously incorrect.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Joonsoo Kim <iamjoonsoo.kim@lge.com> |
|---|---|
| Date | 2015-11-05 09:20 +0100 |
| Message-ID | <qrnW2-44c-3@gated-at.bofh.it> |
| In reply to | #1262328 |
On Wed, Nov 04, 2015 at 04:00:59PM +0100, Vlastimil Babka wrote:
> The page_owner mechanism stores gfp_flags of an allocation and stack trace
> that lead to it. During page migration, the original information is
> essentially replaced by the allocation of free page as the migration target.
> Arguably this is less useful and might lead to all the page_owner info for
> migratable pages gradually converge towards compaction or numa balancing
> migrations. It has also lead to inaccuracies such as one fixed by commit
> e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner").
>
> This patch thus introduces copying the page_owner info during migration.
> However, since the fact that the page has been migrated from its original
> place might be useful for debugging, the next patch will introduce a way to
> track that information as well.
>
> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
> ---
> include/linux/page_owner.h | 10 +++++++++-
> mm/migrate.c | 2 ++
> mm/page_owner.c | 16 ++++++++++++++++
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/page_owner.h b/include/linux/page_owner.h
> index 8e2eb15..6440daa 100644
> --- a/include/linux/page_owner.h
> +++ b/include/linux/page_owner.h
> @@ -11,6 +11,7 @@ extern void __reset_page_owner(struct page *page, unsigned int order);
> extern void __set_page_owner(struct page *page,
> unsigned int order, gfp_t gfp_mask);
> extern gfp_t __get_page_owner_gfp(struct page *page);
> +extern void __copy_page_owner(struct page *oldpage, struct page *newpage);
>
> static inline void reset_page_owner(struct page *page, unsigned int order)
> {
> @@ -32,6 +33,11 @@ static inline gfp_t get_page_owner_gfp(struct page *page)
> else
> return 0;
> }
> +static inline void copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> + if (static_branch_unlikely(&page_owner_inited))
> + __copy_page_owner(oldpage, newpage);
> +}
> #else
> static inline void reset_page_owner(struct page *page, unsigned int order)
> {
> @@ -44,6 +50,8 @@ static inline gfp_t get_page_owner_gfp(struct page *page)
> {
> return 0;
> }
> -
> +static inline void copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> +}
> #endif /* CONFIG_PAGE_OWNER */
> #endif /* __LINUX_PAGE_OWNER_H */
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 1ae0113..9f82e03 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -38,6 +38,7 @@
> #include <linux/balloon_compaction.h>
> #include <linux/mmu_notifier.h>
> #include <linux/page_idle.h>
> +#include <linux/page_owner.h>
>
> #include <asm/tlbflush.h>
>
> @@ -775,6 +776,7 @@ static int move_to_new_page(struct page *newpage, struct page *page,
> set_page_memcg(page, NULL);
> if (!PageAnon(page))
> page->mapping = NULL;
> + copy_page_owner(page, newpage);
> }
> return rc;
> }
> diff --git a/mm/page_owner.c b/mm/page_owner.c
> index 7664b85..7ebd3d0 100644
> --- a/mm/page_owner.c
> +++ b/mm/page_owner.c
> @@ -84,6 +84,22 @@ gfp_t __get_page_owner_gfp(struct page *page)
> return page_ext->gfp_mask;
> }
>
> +void __copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> + struct page_ext *old_ext = lookup_page_ext(oldpage);
> + struct page_ext *new_ext = lookup_page_ext(newpage);
> + int i;
> +
> + new_ext->order = old_ext->order;
> + new_ext->gfp_mask = old_ext->gfp_mask;
> + new_ext->nr_entries = old_ext->nr_entries;
> +
> + for (i = 0; i < ARRAY_SIZE(new_ext->trace_entries); i++)
> + new_ext->trace_entries[i] = old_ext->trace_entries[i];
> +
> + __set_bit(PAGE_EXT_OWNER, &new_ext->flags);
> +}
> +
Need to clear PAGE_EXT_OWNER bit in oldppage.
Thanks.
> static ssize_t
> print_page_owner(char __user *buf, size_t count, unsigned long pfn,
> struct page *page, struct page_ext *page_ext)
> --
> 2.6.2
>
> --
> 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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2015-11-05 09:20 +0100 |
| Message-ID | <qrnW2-44c-11@gated-at.bofh.it> |
| In reply to | #1262991 |
On 11/05/2015 09:10 AM, Joonsoo Kim wrote:
> On Wed, Nov 04, 2015 at 04:00:59PM +0100, Vlastimil Babka wrote:
>> +void __copy_page_owner(struct page *oldpage, struct page *newpage)
>> +{
>> + struct page_ext *old_ext = lookup_page_ext(oldpage);
>> + struct page_ext *new_ext = lookup_page_ext(newpage);
>> + int i;
>> +
>> + new_ext->order = old_ext->order;
>> + new_ext->gfp_mask = old_ext->gfp_mask;
>> + new_ext->nr_entries = old_ext->nr_entries;
>> +
>> + for (i = 0; i < ARRAY_SIZE(new_ext->trace_entries); i++)
>> + new_ext->trace_entries[i] = old_ext->trace_entries[i];
>> +
>> + __set_bit(PAGE_EXT_OWNER, &new_ext->flags);
>> +}
>> +
>
> Need to clear PAGE_EXT_OWNER bit in oldppage.
Hm, I thought that the freeing of the oldpage, which follows the migration,
would take care of that. And if it hit some bug and dump_page before being
freed, we would still have some info to print?
Thanks
> Thanks.
>
>> static ssize_t
>> print_page_owner(char __user *buf, size_t count, unsigned long pfn,
>> struct page *page, struct page_ext *page_ext)
>> --
>> 2.6.2
>>
>> --
>> 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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Joonsoo Kim <iamjoonsoo.kim@lge.com> |
|---|---|
| Date | 2015-11-05 09:30 +0100 |
| Message-ID | <qro5I-48n-29@gated-at.bofh.it> |
| In reply to | #1262994 |
On Thu, Nov 05, 2015 at 09:17:33AM +0100, Vlastimil Babka wrote:
> On 11/05/2015 09:10 AM, Joonsoo Kim wrote:
> > On Wed, Nov 04, 2015 at 04:00:59PM +0100, Vlastimil Babka wrote:
> >> +void __copy_page_owner(struct page *oldpage, struct page *newpage)
> >> +{
> >> + struct page_ext *old_ext = lookup_page_ext(oldpage);
> >> + struct page_ext *new_ext = lookup_page_ext(newpage);
> >> + int i;
> >> +
> >> + new_ext->order = old_ext->order;
> >> + new_ext->gfp_mask = old_ext->gfp_mask;
> >> + new_ext->nr_entries = old_ext->nr_entries;
> >> +
> >> + for (i = 0; i < ARRAY_SIZE(new_ext->trace_entries); i++)
> >> + new_ext->trace_entries[i] = old_ext->trace_entries[i];
> >> +
> >> + __set_bit(PAGE_EXT_OWNER, &new_ext->flags);
> >> +}
> >> +
> >
> > Need to clear PAGE_EXT_OWNER bit in oldppage.
>
> Hm, I thought that the freeing of the oldpage, which follows the migration,
> would take care of that. And if it hit some bug and dump_page before being
> freed, we would still have some info to print?
Okay. I missed that.
Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Hugh Dickins <hughd@google.com> |
|---|---|
| Date | 2015-11-08 22:30 +0100 |
| Subject | Re: [PATCH 3/5] mm, page_owner: copy page owner info during migration |
| Message-ID | <qsFHc-5tw-19@gated-at.bofh.it> |
| In reply to | #1262328 |
On Wed, 4 Nov 2015, Vlastimil Babka wrote:
> The page_owner mechanism stores gfp_flags of an allocation and stack trace
> that lead to it. During page migration, the original information is
> essentially replaced by the allocation of free page as the migration target.
> Arguably this is less useful and might lead to all the page_owner info for
> migratable pages gradually converge towards compaction or numa balancing
> migrations. It has also lead to inaccuracies such as one fixed by commit
> e2cfc91120fa ("mm/page_owner: set correct gfp_mask on page_owner").
>
> This patch thus introduces copying the page_owner info during migration.
> However, since the fact that the page has been migrated from its original
> place might be useful for debugging, the next patch will introduce a way to
> track that information as well.
>
> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
> ---
> include/linux/page_owner.h | 10 +++++++++-
> mm/migrate.c | 2 ++
> mm/page_owner.c | 16 ++++++++++++++++
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/page_owner.h b/include/linux/page_owner.h
> index 8e2eb15..6440daa 100644
> --- a/include/linux/page_owner.h
> +++ b/include/linux/page_owner.h
> @@ -11,6 +11,7 @@ extern void __reset_page_owner(struct page *page, unsigned int order);
> extern void __set_page_owner(struct page *page,
> unsigned int order, gfp_t gfp_mask);
> extern gfp_t __get_page_owner_gfp(struct page *page);
> +extern void __copy_page_owner(struct page *oldpage, struct page *newpage);
>
> static inline void reset_page_owner(struct page *page, unsigned int order)
> {
> @@ -32,6 +33,11 @@ static inline gfp_t get_page_owner_gfp(struct page *page)
> else
> return 0;
> }
> +static inline void copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> + if (static_branch_unlikely(&page_owner_inited))
> + __copy_page_owner(oldpage, newpage);
> +}
> #else
> static inline void reset_page_owner(struct page *page, unsigned int order)
> {
> @@ -44,6 +50,8 @@ static inline gfp_t get_page_owner_gfp(struct page *page)
> {
> return 0;
> }
> -
> +static inline void copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> +}
> #endif /* CONFIG_PAGE_OWNER */
> #endif /* __LINUX_PAGE_OWNER_H */
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 1ae0113..9f82e03 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -38,6 +38,7 @@
> #include <linux/balloon_compaction.h>
> #include <linux/mmu_notifier.h>
> #include <linux/page_idle.h>
> +#include <linux/page_owner.h>
>
> #include <asm/tlbflush.h>
>
> @@ -775,6 +776,7 @@ static int move_to_new_page(struct page *newpage, struct page *page,
> set_page_memcg(page, NULL);
> if (!PageAnon(page))
> page->mapping = NULL;
> + copy_page_owner(page, newpage);
Would it be possible to move that line into migrate_page_copy()?
I don't think it's wrong where you placed it, but that block is really
about resetting the old page ready for freeing, and I'd prefer to keep
all the transference of properties from old to new in migrate_page_copy()
if we can.
But check how that behaves in the migrate_misplaced_transhuge_page()
case: I haven't studied long enough, but I think you may have been missing
to copy_page_owner in that case; but beware of its "fail_putback", which
for some things nastily entails undoing what's already been done.
Hugh
> }
> return rc;
> }
> diff --git a/mm/page_owner.c b/mm/page_owner.c
> index 7664b85..7ebd3d0 100644
> --- a/mm/page_owner.c
> +++ b/mm/page_owner.c
> @@ -84,6 +84,22 @@ gfp_t __get_page_owner_gfp(struct page *page)
> return page_ext->gfp_mask;
> }
>
> +void __copy_page_owner(struct page *oldpage, struct page *newpage)
> +{
> + struct page_ext *old_ext = lookup_page_ext(oldpage);
> + struct page_ext *new_ext = lookup_page_ext(newpage);
> + int i;
> +
> + new_ext->order = old_ext->order;
> + new_ext->gfp_mask = old_ext->gfp_mask;
> + new_ext->nr_entries = old_ext->nr_entries;
> +
> + for (i = 0; i < ARRAY_SIZE(new_ext->trace_entries); i++)
> + new_ext->trace_entries[i] = old_ext->trace_entries[i];
> +
> + __set_bit(PAGE_EXT_OWNER, &new_ext->flags);
> +}
> +
> static ssize_t
> print_page_owner(char __user *buf, size_t count, unsigned long pfn,
> struct page *page, struct page_ext *page_ext)
> --
> 2.6.2
>
> --
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web