From: Anton Vorontsov <anton.vorontsov@linaro.org>
To: Pekka Enberg <penberg@kernel.org>
Cc: Leonid Moiseichuk <leonid.moiseichuk@nokia.com>,
John Stultz <john.stultz@linaro.org>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
linaro-kernel@lists.linaro.org, patches@linaro.org,
kernel-team@android.com
Subject: [PATCH 3/3] vmevent: Implement special low-memory attribute
Date: Tue, 1 May 2012 06:26:21 -0700 [thread overview]
Message-ID: <20120501132620.GC24226@lizard> (raw)
In-Reply-To: <20120501132409.GA22894@lizard>
This is specially "blended" attribute, the event triggers when kernel
decides that we're close to the low memory threshold. Userspace should
not expect very precise meaning of low memory situation, mostly, it's
just a guess on the kernel's side.
Well, this is the same as userland should not know or care how exactly
kernel manages the memory, or assume that memory management behaviour
is a part of the "ABI". So, all the 'low memory' is just guessing, but
we're trying to do our best. It might be that we will end up with two
or three variations of 'low memory' thresholds, and all of them would
be useful for different use cases.
For this implementation, we assume that there's a low memory situation
for the N pages threshold when we have neither N pages of completely
free pages, nor we have N reclaimable pages in the cache. This
effectively means, that if userland expects to allocate N pages, it
would consume all the free pages, and any further allocations (above
N) would start draining caches.
In the worst case, prior to hitting the threshold, we might have only
N pages in cache, and nearly no memory as free pages.
The same 'low memory' meaning is used in the current Android Low
Memory Killer driver.
Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
---
include/linux/vmevent.h | 7 ++++++
mm/vmevent.c | 40 ++++++++++++++++++++++++++++++++++
tools/testing/vmevent/vmevent-test.c | 12 +++++++++-
3 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/include/linux/vmevent.h b/include/linux/vmevent.h
index aae0d24..9bfa244 100644
--- a/include/linux/vmevent.h
+++ b/include/linux/vmevent.h
@@ -10,6 +10,13 @@ enum {
VMEVENT_ATTR_NR_AVAIL_PAGES = 1UL,
VMEVENT_ATTR_NR_FREE_PAGES = 2UL,
VMEVENT_ATTR_NR_SWAP_PAGES = 3UL,
+ /*
+ * This is specially blended attribute, the event triggers
+ * when kernel decides that we're close to the low memory threshold.
+ * Don't expect very precise meaning of low memory situation, mostly,
+ * it's just a guess on the kernel's side.
+ */
+ VMEVENT_ATTR_LOWMEM_PAGES = 4UL,
VMEVENT_ATTR_MAX /* non-ABI */
};
diff --git a/mm/vmevent.c b/mm/vmevent.c
index b312236..d278a25 100644
--- a/mm/vmevent.c
+++ b/mm/vmevent.c
@@ -68,10 +68,50 @@ static u64 vmevent_attr_avail_pages(struct vmevent_watch *watch,
return totalram_pages;
}
+/*
+ * Here's some implementation details for the "low memory" meaning.
+ *
+ * (The explanation is not in the header file as userland should not
+ * know these details, nor it should assume that the meaning will
+ * always be the same. As well as it should not know how exactly kernel
+ * manages the memory, or assume that memory management behaviour is a
+ * part of the "ABI". So, all the 'low memory' is just guessing, but
+ * we're trying to do our best.)
+ *
+ * For this implementation, we assume that there's a low memory situation
+ * for the N pages threshold when we have neither N pages of completely
+ * free pages, nor we have N reclaimable pages in the cache. This
+ * effectively means, that if userland expects to allocate N pages, it
+ * would consume all the free pages, and any further allocations (above
+ * N) would start draining caches.
+ *
+ * In the worst case, prior hitting the threshold, we might have only
+ * N pages in cache, and nearly no memory as free pages.
+ */
+static u64 vmevent_attr_lowmem_pages(struct vmevent_watch *watch,
+ struct vmevent_attr *attr)
+{
+ int free = global_page_state(NR_FREE_PAGES);
+ int file = global_page_state(NR_FILE_PAGES) -
+ global_page_state(NR_SHMEM); /* TODO: account locked pages */
+ int val = attr->value;
+
+ /*
+ * For convenience we return 0 or attr value (instead of 0/1), it
+ * makes it easier for vmevent_match() to cope with blended
+ * attributes, plus userland might use the value to find out which
+ * threshold triggered.
+ */
+ if (free < val && file < val)
+ return val;
+ return 0;
+}
+
static vmevent_attr_sample_fn attr_samplers[] = {
[VMEVENT_ATTR_NR_AVAIL_PAGES] = vmevent_attr_avail_pages,
[VMEVENT_ATTR_NR_FREE_PAGES] = vmevent_attr_free_pages,
[VMEVENT_ATTR_NR_SWAP_PAGES] = vmevent_attr_swap_pages,
+ [VMEVENT_ATTR_LOWMEM_PAGES] = vmevent_attr_lowmem_pages,
};
static u64 vmevent_sample_attr(struct vmevent_watch *watch, struct vmevent_attr *attr)
diff --git a/tools/testing/vmevent/vmevent-test.c b/tools/testing/vmevent/vmevent-test.c
index fd9a174..c61aed7 100644
--- a/tools/testing/vmevent/vmevent-test.c
+++ b/tools/testing/vmevent/vmevent-test.c
@@ -33,7 +33,7 @@ int main(int argc, char *argv[])
config = (struct vmevent_config) {
.sample_period_ns = 1000000000L,
- .counter = 6,
+ .counter = 7,
.attrs = {
{
.type = VMEVENT_ATTR_NR_FREE_PAGES,
@@ -59,6 +59,13 @@ int main(int argc, char *argv[])
.type = VMEVENT_ATTR_NR_SWAP_PAGES,
},
{
+ .type = VMEVENT_ATTR_LOWMEM_PAGES,
+ .state = VMEVENT_ATTR_STATE_VALUE_LT |
+ VMEVENT_ATTR_STATE_VALUE_EQ |
+ VMEVENT_ATTR_STATE_ONE_SHOT,
+ .value = phys_pages / 2,
+ },
+ {
.type = 0xffff, /* invalid */
},
},
@@ -108,6 +115,9 @@ int main(int argc, char *argv[])
case VMEVENT_ATTR_NR_SWAP_PAGES:
printf(" VMEVENT_ATTR_NR_SWAP_PAGES: %Lu\n", attr->value);
break;
+ case VMEVENT_ATTR_LOWMEM_PAGES:
+ printf(" VMEVENT_ATTR_LOWMEM_PAGES: %Lu\n", attr->value);
+ break;
default:
printf(" Unknown attribute: %Lu\n", attr->value);
}
--
1.7.9.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/ .
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:[~2012-05-01 13:27 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-01 13:24 [PATCH 0/3] vmevent: Implement 'low memory' attribute Anton Vorontsov
2012-05-01 13:25 ` [PATCH 1/3] vmevent: Implement equal-to attribute state Anton Vorontsov
2012-05-01 13:25 ` [PATCH 2/3] vmevent: Pass attr argument to sampling functions Anton Vorontsov
2012-05-01 13:26 ` Anton Vorontsov [this message]
2012-05-03 10:33 ` [PATCH 3/3] vmevent: Implement special low-memory attribute Pekka Enberg
2012-05-04 4:26 ` Minchan Kim
2012-05-04 7:38 ` Anton Vorontsov
2012-05-07 7:14 ` Pekka Enberg
2012-05-07 8:26 ` KOSAKI Motohiro
2012-05-07 12:15 ` Anton Vorontsov
2012-05-07 19:19 ` KOSAKI Motohiro
2012-05-08 0:31 ` Anton Vorontsov
2012-05-08 5:20 ` Pekka Enberg
2012-05-08 5:42 ` KOSAKI Motohiro
2012-05-08 5:53 ` Pekka Enberg
2012-05-08 7:11 ` KOSAKI Motohiro
2012-05-08 7:36 ` Pekka Enberg
2012-05-08 7:50 ` KOSAKI Motohiro
2012-05-08 8:03 ` Pekka Enberg
2012-05-08 9:15 ` leonid.moiseichuk
2012-05-08 9:19 ` Pekka Enberg
2012-05-08 10:38 ` leonid.moiseichuk
2012-06-01 12:21 ` [PATCH 0/5] Some vmevent fixes Anton Vorontsov
2012-06-01 12:24 ` [PATCH 1/5] vmstat: Implement refresh_vm_stats() Anton Vorontsov
2012-06-05 14:30 ` Christoph Lameter
2012-06-08 3:17 ` KOSAKI Motohiro
2012-06-01 12:24 ` [PATCH 2/5] vmevent: Convert from deferred timer to deferred work Anton Vorontsov
2012-06-08 3:25 ` KOSAKI Motohiro
2012-06-08 6:58 ` Anton Vorontsov
2012-06-08 7:03 ` Pekka Enberg
2012-06-08 8:07 ` Anton Vorontsov
2012-06-08 7:05 ` leonid.moiseichuk
2012-06-08 7:10 ` KOSAKI Motohiro
2012-06-08 7:18 ` leonid.moiseichuk
2012-06-08 7:23 ` KOSAKI Motohiro
2012-06-08 7:28 ` leonid.moiseichuk
2012-06-08 7:33 ` KOSAKI Motohiro
2012-06-08 7:49 ` leonid.moiseichuk
2012-06-08 7:58 ` Anton Vorontsov
2012-06-08 8:16 ` leonid.moiseichuk
2012-06-08 8:41 ` Anton Vorontsov
2012-06-08 8:57 ` leonid.moiseichuk
2012-06-08 10:35 ` Anton Vorontsov
2012-06-08 11:03 ` leonid.moiseichuk
2012-06-08 12:13 ` Anton Vorontsov
2012-06-08 12:25 ` leonid.moiseichuk
2012-06-01 12:24 ` [PATCH 3/5] vmevent: Refresh vmstats before sampling Anton Vorontsov
2012-06-05 14:36 ` Christoph Lameter
2012-06-01 12:24 ` [PATCH 4/5] vmevent: Hide meaningful names from the user-visible header Anton Vorontsov
2012-06-01 12:24 ` [PATCH 5/5] vmevent: Rename one-shot mode to edge trigger mode Anton Vorontsov
2012-06-03 18:26 ` [PATCH 0/5] Some vmevent fixes Pekka Enberg
2012-06-04 8:45 ` Minchan Kim
2012-06-04 9:20 ` Pekka Enberg
2012-06-04 12:23 ` Minchan Kim
2012-06-04 11:38 ` Anton Vorontsov
2012-06-04 12:17 ` Minchan Kim
2012-06-04 13:35 ` Anton Vorontsov
2012-06-05 7:53 ` Pekka Enberg
2012-06-05 8:00 ` Minchan Kim
2012-06-05 8:01 ` Pekka Enberg
2012-06-05 8:16 ` leonid.moiseichuk
2012-06-05 8:27 ` Minchan Kim
2012-06-08 3:35 ` KOSAKI Motohiro
2012-06-04 20:05 ` KOSAKI Motohiro
2012-06-04 22:39 ` Anton Vorontsov
2012-06-08 3:45 ` KOSAKI Motohiro
2012-06-08 6:57 ` Pekka Enberg
2012-06-05 7:47 ` Pekka Enberg
2012-06-05 8:39 ` Anton Vorontsov
2012-06-07 2:41 ` Minchan Kim
2012-06-08 7:49 ` Anton Vorontsov
2012-06-08 8:43 ` Minchan Kim
2012-06-08 8:48 ` Pekka Enberg
2012-06-08 9:12 ` leonid.moiseichuk
2012-06-08 9:45 ` Anton Vorontsov
2012-06-08 10:42 ` Minchan Kim
2012-06-08 11:14 ` Anton Vorontsov
2012-06-11 4:50 ` Minchan Kim
2012-06-05 7:52 ` Pekka Enberg
2012-06-08 3:55 ` KOSAKI Motohiro
2012-06-08 6:54 ` Pekka Enberg
2012-06-08 6:57 ` KOSAKI Motohiro
2012-06-08 6:59 ` Pekka Enberg
2012-06-04 19:50 ` KOSAKI Motohiro
2012-05-08 8:32 ` [PATCH 3/3] vmevent: Implement special low-memory attribute Minchan Kim
2012-05-08 9:27 ` Pekka Enberg
2012-06-05 14:40 ` Christoph Lameter
2012-05-08 6:58 ` Anton Vorontsov
2012-05-08 7:16 ` KOSAKI Motohiro
2012-05-08 8:13 ` Anton Vorontsov
2012-05-08 8:21 ` Anton Vorontsov
2012-05-03 8:10 ` [PATCH 0/3] vmevent: Implement 'low memory' attribute Pekka Enberg
2012-05-03 9:44 ` Anton Vorontsov
2012-05-03 10:54 ` Pekka Enberg
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=20120501132620.GC24226@lizard \
--to=anton.vorontsov@linaro.org \
--cc=john.stultz@linaro.org \
--cc=kernel-team@android.com \
--cc=leonid.moiseichuk@nokia.com \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=patches@linaro.org \
--cc=penberg@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).