From: Pekka Enberg <penberg@kernel.org>
To: Anton Vorontsov <anton.vorontsov@linaro.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, Minchan Kim <minchan@kernel.org>
Subject: Re: [PATCH 3/3] vmevent: Implement special low-memory attribute
Date: Thu, 3 May 2012 13:33:50 +0300 [thread overview]
Message-ID: <CAOJsxLGu3xqTry=Rf62Ly+jkCH16b+6gereoxDrg98E9TFvVfw@mail.gmail.com> (raw)
In-Reply-To: <20120501132620.GC24226@lizard>
On Tue, May 1, 2012 at 4:26 PM, Anton Vorontsov
<anton.vorontsov@linaro.org> wrote:
> 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>
I don't see why we couldn't add this. Minchan, thoughts?
> ---
> 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>
--
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-03 10:33 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 ` [PATCH 3/3] vmevent: Implement special low-memory attribute Anton Vorontsov
2012-05-03 10:33 ` Pekka Enberg [this message]
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='CAOJsxLGu3xqTry=Rf62Ly+jkCH16b+6gereoxDrg98E9TFvVfw@mail.gmail.com' \
--to=penberg@kernel.org \
--cc=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=minchan@kernel.org \
--cc=patches@linaro.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