From: Andrea Arcangeli <aarcange@redhat.com>
To: Andi Kleen <andi@firstfloor.org>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH 8/8] Add VM counters for transparent hugepages
Date: Fri, 25 Feb 2011 02:34:13 +0100 [thread overview]
Message-ID: <20110225013413.GI23252@random.random> (raw)
In-Reply-To: <20110225011205.GK5818@one.firstfloor.org>
On Fri, Feb 25, 2011 at 02:12:05AM +0100, Andi Kleen wrote:
> On Fri, Feb 25, 2011 at 01:51:55AM +0100, Andrea Arcangeli wrote:
> > On Tue, Feb 22, 2011 at 05:52:02PM -0800, Andi Kleen wrote:
> > > + "thp_direct_alloc",
> > > + "thp_daemon_alloc",
> > > + "thp_direct_fallback",
> > > + "thp_daemon_alloc_failed",
> >
> > I've been wondering if we should do s/daemon/khugepaged/ or
>
> Fine by me.
>
> > s/daemon/collapse/.
> >
> > And s/direct/fault/.
>
> Fine for me too.
So this would be it. (incremental with previous patch I sent that
adjusts the location of THP_SPLIT)
===
Subject: thp: make vmstat more accurate
From: Andrea Arcangeli <aarcange@redhat.com>
s/direct/fault/g s/daemon/collapse/g
It's better to account even if memcg fails if the allocation succeeded so
it gives a bit more accurate ratios on the effectiveness of the VM in
creating hugepages. This adds coverage to the not NUMA case and it actually
uses THP_COLLAPSE_ALLOC. The thp_collapse_alloc is closely related to the
/sys/kernel/mm/transparent_hugepage/khugepaged/pages_collapsed but just like
for memcg this also accounts when the strict _allocation_ succeed but the
collapse can't go through after releasing the mmap_sem for a little
(pages_collapsed only accounts when the collapse really went through in
addition to the strict THP allocation).
Output under heavy swap load with khugepaged scan_sleep_millisecs=0
(and new kswapd compaction logic) follows.
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
5 10 3390416 147772 2108 8476 0 42196 0 42196 6908 610 0 1 88 11
1 12 3493968 153624 2104 8968 0 103552 0 103552 2664 901 0 6 41 52
1 13 3598636 158336 2104 8404 0 104668 0 104668 778 431 0 5 60 34
1 12 3377120 130148 2104 7576 184 42120 184 42120 998 399 0 5 38 57
0 11 2419352 149360 2104 8844 232 19936 232 19936 9028 718 3 4 83 11
0 13 2488964 139476 2104 8036 0 76184 0 76184 3340 1133 0 1 89 11
$ grep thp /proc/vmstat
thp_fault_alloc 44725
thp_fault_fallback 364
thp_collapse_alloc 59
thp_collapse_alloc_failed 3
thp_split 14223
Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
---
include/linux/vmstat.h | 8 ++++----
mm/huge_memory.c | 27 +++++++++++++++++++--------
mm/vmstat.c | 8 ++++----
3 files changed, 27 insertions(+), 16 deletions(-)
--- a/include/linux/vmstat.h
+++ b/include/linux/vmstat.h
@@ -59,10 +59,10 @@ enum vm_event_item { PGPGIN, PGPGOUT, PS
UNEVICTABLE_PGSTRANDED, /* unable to isolate on unlock */
UNEVICTABLE_MLOCKFREED,
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
- THP_DIRECT_ALLOC,
- THP_DAEMON_ALLOC,
- THP_DIRECT_FALLBACK,
- THP_DAEMON_ALLOC_FAILED,
+ THP_FAULT_ALLOC,
+ THP_FAULT_FALLBACK,
+ THP_COLLAPSE_ALLOC,
+ THP_COLLAPSE_ALLOC_FAILED,
THP_SPLIT,
#endif
NR_VM_EVENT_ITEMS
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -681,14 +681,14 @@ int do_huge_pmd_anonymous_page(struct mm
page = alloc_hugepage_vma(transparent_hugepage_defrag(vma),
vma, haddr, numa_node_id(), 0);
if (unlikely(!page)) {
- count_vm_event(THP_DIRECT_FALLBACK);
+ count_vm_event(THP_FAULT_FALLBACK);
goto out;
}
+ count_vm_event(THP_FAULT_ALLOC);
if (unlikely(mem_cgroup_newpage_charge(page, mm, GFP_KERNEL))) {
put_page(page);
goto out;
}
- count_vm_event(THP_DIRECT_ALLOC);
return __do_huge_pmd_anonymous_page(mm, vma, haddr, pmd, page);
}
out:
@@ -911,12 +911,13 @@ int do_huge_pmd_wp_page(struct mm_struct
new_page = NULL;
if (unlikely(!new_page)) {
- count_vm_event(THP_DIRECT_FALLBACK);
+ count_vm_event(THP_FAULT_FALLBACK);
ret = do_huge_pmd_wp_page_fallback(mm, vma, address,
pmd, orig_pmd, page, haddr);
put_page(page);
goto out;
}
+ count_vm_event(THP_FAULT_ALLOC);
if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) {
put_page(new_page);
@@ -924,7 +925,7 @@ int do_huge_pmd_wp_page(struct mm_struct
ret |= VM_FAULT_OOM;
goto out;
}
- count_vm_event(THP_DIRECT_ALLOC);
+
copy_user_huge_page(new_page, page, haddr, vma, HPAGE_PMD_NR);
__SetPageUptodate(new_page);
@@ -1784,10 +1785,11 @@ static void collapse_huge_page(struct mm
node, __GFP_OTHER_NODE);
if (unlikely(!new_page)) {
up_read(&mm->mmap_sem);
- count_vm_event(THP_DAEMON_ALLOC_FAILED);
+ count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
*hpage = ERR_PTR(-ENOMEM);
return;
}
+ count_vm_event(THP_COLLAPSE_ALLOC);
#endif
if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) {
up_read(&mm->mmap_sem);
@@ -2152,8 +2154,11 @@ static void khugepaged_do_scan(struct pa
#ifndef CONFIG_NUMA
if (!*hpage) {
*hpage = alloc_hugepage(khugepaged_defrag());
- if (unlikely(!*hpage))
+ if (unlikely(!*hpage)) {
+ count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
break;
+ }
+ count_vm_event(THP_COLLAPSE_ALLOC);
}
#else
if (IS_ERR(*hpage))
@@ -2193,8 +2198,11 @@ static struct page *khugepaged_alloc_hug
do {
hpage = alloc_hugepage(khugepaged_defrag());
- if (!hpage)
+ if (!hpage) {
+ count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
khugepaged_alloc_sleep();
+ } else
+ count_vm_event(THP_COLLAPSE_ALLOC);
} while (unlikely(!hpage) &&
likely(khugepaged_enabled()));
return hpage;
@@ -2211,8 +2219,11 @@ static void khugepaged_loop(void)
while (likely(khugepaged_enabled())) {
#ifndef CONFIG_NUMA
hpage = khugepaged_alloc_hugepage();
- if (unlikely(!hpage))
+ if (unlikely(!hpage)) {
+ count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
break;
+ }
+ count_vm_event(THP_COLLAPSE_ALLOC);
#else
if (IS_ERR(hpage)) {
khugepaged_alloc_sleep();
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -948,10 +948,10 @@ static const char * const vmstat_text[]
#endif
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
- "thp_direct_alloc",
- "thp_daemon_alloc",
- "thp_direct_fallback",
- "thp_daemon_alloc_failed",
+ "thp_fault_alloc",
+ "thp_fault_fallback",
+ "thp_collapse_alloc",
+ "thp_collapse_alloc_failure",
"thp_split",
#endif
};
WARNING: multiple messages have this Message-ID (diff)
From: Andrea Arcangeli <aarcange@redhat.com>
To: Andi Kleen <andi@firstfloor.org>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH 8/8] Add VM counters for transparent hugepages
Date: Fri, 25 Feb 2011 02:34:13 +0100 [thread overview]
Message-ID: <20110225013413.GI23252@random.random> (raw)
In-Reply-To: <20110225011205.GK5818@one.firstfloor.org>
On Fri, Feb 25, 2011 at 02:12:05AM +0100, Andi Kleen wrote:
> On Fri, Feb 25, 2011 at 01:51:55AM +0100, Andrea Arcangeli wrote:
> > On Tue, Feb 22, 2011 at 05:52:02PM -0800, Andi Kleen wrote:
> > > + "thp_direct_alloc",
> > > + "thp_daemon_alloc",
> > > + "thp_direct_fallback",
> > > + "thp_daemon_alloc_failed",
> >
> > I've been wondering if we should do s/daemon/khugepaged/ or
>
> Fine by me.
>
> > s/daemon/collapse/.
> >
> > And s/direct/fault/.
>
> Fine for me too.
So this would be it. (incremental with previous patch I sent that
adjusts the location of THP_SPLIT)
===
Subject: thp: make vmstat more accurate
From: Andrea Arcangeli <aarcange@redhat.com>
s/direct/fault/g s/daemon/collapse/g
It's better to account even if memcg fails if the allocation succeeded so
it gives a bit more accurate ratios on the effectiveness of the VM in
creating hugepages. This adds coverage to the not NUMA case and it actually
uses THP_COLLAPSE_ALLOC. The thp_collapse_alloc is closely related to the
/sys/kernel/mm/transparent_hugepage/khugepaged/pages_collapsed but just like
for memcg this also accounts when the strict _allocation_ succeed but the
collapse can't go through after releasing the mmap_sem for a little
(pages_collapsed only accounts when the collapse really went through in
addition to the strict THP allocation).
Output under heavy swap load with khugepaged scan_sleep_millisecs=0
(and new kswapd compaction logic) follows.
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
5 10 3390416 147772 2108 8476 0 42196 0 42196 6908 610 0 1 88 11
1 12 3493968 153624 2104 8968 0 103552 0 103552 2664 901 0 6 41 52
1 13 3598636 158336 2104 8404 0 104668 0 104668 778 431 0 5 60 34
1 12 3377120 130148 2104 7576 184 42120 184 42120 998 399 0 5 38 57
0 11 2419352 149360 2104 8844 232 19936 232 19936 9028 718 3 4 83 11
0 13 2488964 139476 2104 8036 0 76184 0 76184 3340 1133 0 1 89 11
$ grep thp /proc/vmstat
thp_fault_alloc 44725
thp_fault_fallback 364
thp_collapse_alloc 59
thp_collapse_alloc_failed 3
thp_split 14223
Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
---
include/linux/vmstat.h | 8 ++++----
mm/huge_memory.c | 27 +++++++++++++++++++--------
mm/vmstat.c | 8 ++++----
3 files changed, 27 insertions(+), 16 deletions(-)
--- a/include/linux/vmstat.h
+++ b/include/linux/vmstat.h
@@ -59,10 +59,10 @@ enum vm_event_item { PGPGIN, PGPGOUT, PS
UNEVICTABLE_PGSTRANDED, /* unable to isolate on unlock */
UNEVICTABLE_MLOCKFREED,
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
- THP_DIRECT_ALLOC,
- THP_DAEMON_ALLOC,
- THP_DIRECT_FALLBACK,
- THP_DAEMON_ALLOC_FAILED,
+ THP_FAULT_ALLOC,
+ THP_FAULT_FALLBACK,
+ THP_COLLAPSE_ALLOC,
+ THP_COLLAPSE_ALLOC_FAILED,
THP_SPLIT,
#endif
NR_VM_EVENT_ITEMS
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -681,14 +681,14 @@ int do_huge_pmd_anonymous_page(struct mm
page = alloc_hugepage_vma(transparent_hugepage_defrag(vma),
vma, haddr, numa_node_id(), 0);
if (unlikely(!page)) {
- count_vm_event(THP_DIRECT_FALLBACK);
+ count_vm_event(THP_FAULT_FALLBACK);
goto out;
}
+ count_vm_event(THP_FAULT_ALLOC);
if (unlikely(mem_cgroup_newpage_charge(page, mm, GFP_KERNEL))) {
put_page(page);
goto out;
}
- count_vm_event(THP_DIRECT_ALLOC);
return __do_huge_pmd_anonymous_page(mm, vma, haddr, pmd, page);
}
out:
@@ -911,12 +911,13 @@ int do_huge_pmd_wp_page(struct mm_struct
new_page = NULL;
if (unlikely(!new_page)) {
- count_vm_event(THP_DIRECT_FALLBACK);
+ count_vm_event(THP_FAULT_FALLBACK);
ret = do_huge_pmd_wp_page_fallback(mm, vma, address,
pmd, orig_pmd, page, haddr);
put_page(page);
goto out;
}
+ count_vm_event(THP_FAULT_ALLOC);
if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) {
put_page(new_page);
@@ -924,7 +925,7 @@ int do_huge_pmd_wp_page(struct mm_struct
ret |= VM_FAULT_OOM;
goto out;
}
- count_vm_event(THP_DIRECT_ALLOC);
+
copy_user_huge_page(new_page, page, haddr, vma, HPAGE_PMD_NR);
__SetPageUptodate(new_page);
@@ -1784,10 +1785,11 @@ static void collapse_huge_page(struct mm
node, __GFP_OTHER_NODE);
if (unlikely(!new_page)) {
up_read(&mm->mmap_sem);
- count_vm_event(THP_DAEMON_ALLOC_FAILED);
+ count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
*hpage = ERR_PTR(-ENOMEM);
return;
}
+ count_vm_event(THP_COLLAPSE_ALLOC);
#endif
if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) {
up_read(&mm->mmap_sem);
@@ -2152,8 +2154,11 @@ static void khugepaged_do_scan(struct pa
#ifndef CONFIG_NUMA
if (!*hpage) {
*hpage = alloc_hugepage(khugepaged_defrag());
- if (unlikely(!*hpage))
+ if (unlikely(!*hpage)) {
+ count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
break;
+ }
+ count_vm_event(THP_COLLAPSE_ALLOC);
}
#else
if (IS_ERR(*hpage))
@@ -2193,8 +2198,11 @@ static struct page *khugepaged_alloc_hug
do {
hpage = alloc_hugepage(khugepaged_defrag());
- if (!hpage)
+ if (!hpage) {
+ count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
khugepaged_alloc_sleep();
+ } else
+ count_vm_event(THP_COLLAPSE_ALLOC);
} while (unlikely(!hpage) &&
likely(khugepaged_enabled()));
return hpage;
@@ -2211,8 +2219,11 @@ static void khugepaged_loop(void)
while (likely(khugepaged_enabled())) {
#ifndef CONFIG_NUMA
hpage = khugepaged_alloc_hugepage();
- if (unlikely(!hpage))
+ if (unlikely(!hpage)) {
+ count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
break;
+ }
+ count_vm_event(THP_COLLAPSE_ALLOC);
#else
if (IS_ERR(hpage)) {
khugepaged_alloc_sleep();
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -948,10 +948,10 @@ static const char * const vmstat_text[]
#endif
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
- "thp_direct_alloc",
- "thp_daemon_alloc",
- "thp_direct_fallback",
- "thp_daemon_alloc_failed",
+ "thp_fault_alloc",
+ "thp_fault_fallback",
+ "thp_collapse_alloc",
+ "thp_collapse_alloc_failure",
"thp_split",
#endif
};
--
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/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2011-02-25 1:34 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-23 1:51 Fix NUMA problems in transparent hugepages v2 Andi Kleen
2011-02-23 1:51 ` Andi Kleen
2011-02-23 1:51 ` [PATCH 1/8] Fix interleaving for " Andi Kleen
2011-02-23 1:51 ` Andi Kleen
2011-02-23 19:26 ` Christoph Lameter
2011-02-23 19:26 ` Christoph Lameter
2011-02-24 23:23 ` Andrea Arcangeli
2011-02-24 23:23 ` Andrea Arcangeli
2011-02-23 1:51 ` [PATCH 2/8] Change alloc_pages_vma to pass down the policy node for local policy Andi Kleen
2011-02-23 1:51 ` Andi Kleen
2011-02-23 1:51 ` [PATCH 3/8] Add alloc_page_vma_node Andi Kleen
2011-02-23 1:51 ` Andi Kleen
2011-02-23 1:51 ` [PATCH 4/8] Preserve original node for transparent huge page copies Andi Kleen
2011-02-23 1:51 ` Andi Kleen
2011-02-23 1:51 ` [PATCH 5/8] Use correct numa policy node for transparent hugepages Andi Kleen
2011-02-23 1:51 ` Andi Kleen
2011-02-23 1:52 ` [PATCH 6/8] Add __GFP_OTHER_NODE flag Andi Kleen
2011-02-23 1:52 ` Andi Kleen
2011-02-23 1:52 ` [PATCH 7/8] Use GFP_OTHER_NODE for transparent huge pages Andi Kleen
2011-02-23 1:52 ` Andi Kleen
2011-02-24 4:56 ` Andrea Arcangeli
2011-02-24 4:56 ` Andrea Arcangeli
2011-02-23 1:52 ` [PATCH 8/8] Add VM counters for transparent hugepages Andi Kleen
2011-02-23 1:52 ` Andi Kleen
2011-02-24 4:18 ` Andrea Arcangeli
2011-02-24 4:18 ` Andrea Arcangeli
2011-02-24 22:43 ` Dave Hansen
2011-02-24 22:43 ` Dave Hansen
2011-02-24 23:15 ` Andrea Arcangeli
2011-02-24 23:15 ` Andrea Arcangeli
2011-02-24 22:43 ` Dave Hansen
2011-02-24 22:43 ` Dave Hansen
2011-02-24 23:14 ` Andrea Arcangeli
2011-02-24 23:14 ` Andrea Arcangeli
2011-02-25 1:36 ` Andi Kleen
2011-02-25 1:36 ` Andi Kleen
2011-02-25 0:51 ` Andrea Arcangeli
2011-02-25 0:51 ` Andrea Arcangeli
2011-02-25 1:12 ` Andi Kleen
2011-02-25 1:12 ` Andi Kleen
2011-02-25 1:34 ` Andrea Arcangeli [this message]
2011-02-25 1:34 ` Andrea Arcangeli
-- strict thread matches above, loose matches on Subject: below --
2011-03-03 19:59 Fix NUMA problems in transparent hugepages and KSM Andi Kleen
2011-03-03 19:59 ` [PATCH 8/8] Add VM counters for transparent hugepages Andi Kleen
2011-03-03 19:59 ` Andi Kleen
2011-03-07 8:28 ` KOSAKI Motohiro
2011-03-07 8:28 ` KOSAKI Motohiro
2011-03-07 16:35 ` Andi Kleen
2011-03-07 16:35 ` Andi Kleen
2011-03-08 2:43 ` KOSAKI Motohiro
2011-03-08 2:43 ` KOSAKI Motohiro
2011-03-30 21:45 ` Andrew Morton
2011-03-30 21:45 ` Andrew Morton
2011-03-30 23:30 ` Andi Kleen
2011-03-30 23:30 ` Andi Kleen
2011-03-31 0:52 ` KOSAKI Motohiro
2011-03-31 0:52 ` KOSAKI Motohiro
2011-03-31 0:56 ` Andi Kleen
2011-03-31 0:56 ` Andi Kleen
2011-03-03 0:45 Fix NUMA problems in transparent hugepages and KSM Andi Kleen
2011-03-03 0:45 ` [PATCH 8/8] Add VM counters for transparent hugepages Andi Kleen
2011-03-03 0:45 ` Andi Kleen
2011-03-03 9:18 ` Johannes Weiner
2011-03-03 9:18 ` Johannes Weiner
2011-03-03 18:09 ` Andi Kleen
2011-03-03 18:09 ` Andi Kleen
2011-02-21 19:07 Fix NUMA problems in transparent hugepages and KSM Andi Kleen
2011-02-21 19:07 ` [PATCH 8/8] Add VM counters for transparent hugepages Andi Kleen
2011-02-21 19:07 ` Andi Kleen
2011-02-22 16:36 ` Dave Hansen
2011-02-22 16:36 ` Dave Hansen
2011-02-22 16:43 ` Andrea Arcangeli
2011-02-22 16:43 ` Andrea Arcangeli
2011-02-22 18:02 ` Andi Kleen
2011-02-22 18:02 ` Andi Kleen
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=20110225013413.GI23252@random.random \
--to=aarcange@redhat.com \
--cc=ak@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
/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.