From: Johannes Weiner <hannes@cmpxchg.org>
To: Vladimir Davydov <vdavydov@parallels.com>
Cc: akpm@linux-foundation.org, mhocko@suse.cz, glommer@openvz.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
cgroups@vger.kernel.org, devel@openvz.org
Subject: Re: [PATCH v11 03/15] vmscan: also shrink slab in memcg pressure
Date: Mon, 25 Nov 2013 11:27:14 -0500 [thread overview]
Message-ID: <20131125162714.GA22729@cmpxchg.org> (raw)
In-Reply-To: <f9fd0a25d8caa1416c5f54201259aa8021185746.1385377616.git.vdavydov@parallels.com>
On Mon, Nov 25, 2013 at 04:07:36PM +0400, Vladimir Davydov wrote:
> From: Glauber Costa <glommer@openvz.org>
>
> Without the surrounding infrastructure, this patch is a bit of a hammer:
> it will basically shrink objects from all memcgs under memcg pressure.
> At least, however, we will keep the scan limited to the shrinkers marked
> as per-memcg.
>
> Future patches will implement the in-shrinker logic to filter objects
> based on its memcg association.
>
> Signed-off-by: Glauber Costa <glommer@openvz.org>
> Cc: Dave Chinner <dchinner@redhat.com>
> Cc: Mel Gorman <mgorman@suse.de>
> Cc: Rik van Riel <riel@redhat.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: Michal Hocko <mhocko@suse.cz>
> Cc: Hugh Dickins <hughd@google.com>
> Cc: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> ---
> include/linux/memcontrol.h | 17 +++++++++++++++
> include/linux/shrinker.h | 6 +++++-
> mm/memcontrol.c | 16 +++++++++++++-
> mm/vmscan.c | 50 +++++++++++++++++++++++++++++++++++++++-----
> 4 files changed, 82 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index b3e7a66..d16ba51 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -231,6 +231,9 @@ void mem_cgroup_split_huge_fixup(struct page *head);
> bool mem_cgroup_bad_page_check(struct page *page);
> void mem_cgroup_print_bad_page(struct page *page);
> #endif
> +
> +unsigned long
> +memcg_zone_reclaimable_pages(struct mem_cgroup *memcg, struct zone *zone);
> #else /* CONFIG_MEMCG */
> struct mem_cgroup;
>
> @@ -427,6 +430,12 @@ static inline void mem_cgroup_replace_page_cache(struct page *oldpage,
> struct page *newpage)
> {
> }
> +
> +static inline unsigned long
> +memcg_zone_reclaimable_pages(struct mem_cgroup *memcg, struct zone *zone)
> +{
> + return 0;
> +}
> #endif /* CONFIG_MEMCG */
>
> #if !defined(CONFIG_MEMCG) || !defined(CONFIG_DEBUG_VM)
> @@ -479,6 +488,8 @@ static inline bool memcg_kmem_enabled(void)
> return static_key_false(&memcg_kmem_enabled_key);
> }
>
> +bool memcg_kmem_is_active(struct mem_cgroup *memcg);
> +
> /*
> * In general, we'll do everything in our power to not incur in any overhead
> * for non-memcg users for the kmem functions. Not even a function call, if we
> @@ -612,6 +623,12 @@ memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp)
> return __memcg_kmem_get_cache(cachep, gfp);
> }
> #else
> +
> +static inline bool memcg_kmem_is_active(struct mem_cgroup *memcg)
> +{
> + return false;
> +}
> +
> #define for_each_memcg_cache_index(_idx) \
> for (; NULL; )
>
> diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h
> index 68c0970..7d462b1 100644
> --- a/include/linux/shrinker.h
> +++ b/include/linux/shrinker.h
> @@ -22,6 +22,9 @@ struct shrink_control {
> nodemask_t nodes_to_scan;
> /* current node being shrunk (for NUMA aware shrinkers) */
> int nid;
> +
> + /* reclaim from this memcg only (if not NULL) */
> + struct mem_cgroup *target_mem_cgroup;
> };
>
> #define SHRINK_STOP (~0UL)
> @@ -63,7 +66,8 @@ struct shrinker {
> #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */
>
> /* Flags */
> -#define SHRINKER_NUMA_AWARE (1 << 0)
> +#define SHRINKER_NUMA_AWARE (1 << 0)
> +#define SHRINKER_MEMCG_AWARE (1 << 1)
>
> extern int register_shrinker(struct shrinker *);
> extern void unregister_shrinker(struct shrinker *);
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 144cb4c..8924ff1 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -358,7 +358,7 @@ static inline void memcg_kmem_set_active(struct mem_cgroup *memcg)
> set_bit(KMEM_ACCOUNTED_ACTIVE, &memcg->kmem_account_flags);
> }
>
> -static bool memcg_kmem_is_active(struct mem_cgroup *memcg)
> +bool memcg_kmem_is_active(struct mem_cgroup *memcg)
> {
> return test_bit(KMEM_ACCOUNTED_ACTIVE, &memcg->kmem_account_flags);
> }
> @@ -958,6 +958,20 @@ mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *memcg, int nid, int zid,
> return ret;
> }
>
> +unsigned long
> +memcg_zone_reclaimable_pages(struct mem_cgroup *memcg, struct zone *zone)
If the prototype does not fit, please wrap the argument list, not the
return value. We are not consistent, but most functions are like this
in memcontrol.c and vmscan.c.
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index eea668d..652dfa3 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -140,11 +140,41 @@ static bool global_reclaim(struct scan_control *sc)
> {
> return !sc->target_mem_cgroup;
> }
> +
> +/*
> + * kmem reclaim should usually not be triggered when we are doing targetted
> + * reclaim. It is only valid when global reclaim is triggered, or when the
> + * underlying memcg has kmem objects.
> + */
> +static bool has_kmem_reclaim(struct scan_control *sc)
> +{
> + return !sc->target_mem_cgroup ||
> + memcg_kmem_is_active(sc->target_mem_cgroup);
> +}
Please opencode these checks in the callsite, they are more
descriptive than the name of this function.
> +static unsigned long
> +zone_nr_reclaimable_pages(struct scan_control *sc, struct zone *zone)
> +{
> + if (global_reclaim(sc))
> + return zone_reclaimable_pages(zone);
> + return memcg_zone_reclaimable_pages(sc->target_mem_cgroup, zone);
> +}
So we have zone_reclaimable_pages() and zone_nr_reclaimable_pages()
with completely different signatures and usecases. Not good.
The intersection between a zone and a memcg is called an lruvec,
please use that. Look up an lruvec as early as possible, then
implement lruvec_reclaimable_pages() etc. for use during reclaim.
> @@ -352,6 +382,15 @@ unsigned long shrink_slab(struct shrink_control *shrinkctl,
> }
>
> list_for_each_entry(shrinker, &shrinker_list, list) {
> + /*
> + * If we don't have a target mem cgroup, we scan them all.
> + * Otherwise we will limit our scan to shrinkers marked as
> + * memcg aware
> + */
> + if (shrinkctl->target_mem_cgroup &&
> + !(shrinker->flags & SHRINKER_MEMCG_AWARE))
> + continue;
> +
> for_each_node_mask(shrinkctl->nid, shrinkctl->nodes_to_scan) {
> if (!node_online(shrinkctl->nid))
> continue;
> @@ -2399,11 +2438,11 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
>
> /*
> * Don't shrink slabs when reclaiming memory from over limit
> - * cgroups but do shrink slab at least once when aborting
> - * reclaim for compaction to avoid unevenly scanning file/anon
> - * LRU pages over slab pages.
> + * cgroups unless we know they have kmem objects. But do shrink
> + * slab at least once when aborting reclaim for compaction to
> + * avoid unevenly scanning file/anon LRU pages over slab pages.
> */
> - if (global_reclaim(sc)) {
> + if (has_kmem_reclaim(sc)) {
> unsigned long lru_pages = 0;
>
> nodes_clear(shrink->nodes_to_scan);
> @@ -2412,7 +2451,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
> if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL))
> continue;
>
> - lru_pages += zone_reclaimable_pages(zone);
> + lru_pages += zone_nr_reclaimable_pages(sc, zone);
> node_set(zone_to_nid(zone),
> shrink->nodes_to_scan);
> }
> @@ -2669,6 +2708,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
> };
> struct shrink_control shrink = {
> .gfp_mask = sc.gfp_mask,
> + .target_mem_cgroup = memcg,
> };
>
> /*
--
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: Johannes Weiner <hannes@cmpxchg.org>
To: Vladimir Davydov <vdavydov@parallels.com>
Cc: akpm@linux-foundation.org, mhocko@suse.cz, glommer@openvz.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
cgroups@vger.kernel.org, devel@openvz.org
Subject: Re: [PATCH v11 03/15] vmscan: also shrink slab in memcg pressure
Date: Mon, 25 Nov 2013 11:27:14 -0500 [thread overview]
Message-ID: <20131125162714.GA22729@cmpxchg.org> (raw)
In-Reply-To: <f9fd0a25d8caa1416c5f54201259aa8021185746.1385377616.git.vdavydov@parallels.com>
On Mon, Nov 25, 2013 at 04:07:36PM +0400, Vladimir Davydov wrote:
> From: Glauber Costa <glommer@openvz.org>
>
> Without the surrounding infrastructure, this patch is a bit of a hammer:
> it will basically shrink objects from all memcgs under memcg pressure.
> At least, however, we will keep the scan limited to the shrinkers marked
> as per-memcg.
>
> Future patches will implement the in-shrinker logic to filter objects
> based on its memcg association.
>
> Signed-off-by: Glauber Costa <glommer@openvz.org>
> Cc: Dave Chinner <dchinner@redhat.com>
> Cc: Mel Gorman <mgorman@suse.de>
> Cc: Rik van Riel <riel@redhat.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: Michal Hocko <mhocko@suse.cz>
> Cc: Hugh Dickins <hughd@google.com>
> Cc: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> ---
> include/linux/memcontrol.h | 17 +++++++++++++++
> include/linux/shrinker.h | 6 +++++-
> mm/memcontrol.c | 16 +++++++++++++-
> mm/vmscan.c | 50 +++++++++++++++++++++++++++++++++++++++-----
> 4 files changed, 82 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index b3e7a66..d16ba51 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -231,6 +231,9 @@ void mem_cgroup_split_huge_fixup(struct page *head);
> bool mem_cgroup_bad_page_check(struct page *page);
> void mem_cgroup_print_bad_page(struct page *page);
> #endif
> +
> +unsigned long
> +memcg_zone_reclaimable_pages(struct mem_cgroup *memcg, struct zone *zone);
> #else /* CONFIG_MEMCG */
> struct mem_cgroup;
>
> @@ -427,6 +430,12 @@ static inline void mem_cgroup_replace_page_cache(struct page *oldpage,
> struct page *newpage)
> {
> }
> +
> +static inline unsigned long
> +memcg_zone_reclaimable_pages(struct mem_cgroup *memcg, struct zone *zone)
> +{
> + return 0;
> +}
> #endif /* CONFIG_MEMCG */
>
> #if !defined(CONFIG_MEMCG) || !defined(CONFIG_DEBUG_VM)
> @@ -479,6 +488,8 @@ static inline bool memcg_kmem_enabled(void)
> return static_key_false(&memcg_kmem_enabled_key);
> }
>
> +bool memcg_kmem_is_active(struct mem_cgroup *memcg);
> +
> /*
> * In general, we'll do everything in our power to not incur in any overhead
> * for non-memcg users for the kmem functions. Not even a function call, if we
> @@ -612,6 +623,12 @@ memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp)
> return __memcg_kmem_get_cache(cachep, gfp);
> }
> #else
> +
> +static inline bool memcg_kmem_is_active(struct mem_cgroup *memcg)
> +{
> + return false;
> +}
> +
> #define for_each_memcg_cache_index(_idx) \
> for (; NULL; )
>
> diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h
> index 68c0970..7d462b1 100644
> --- a/include/linux/shrinker.h
> +++ b/include/linux/shrinker.h
> @@ -22,6 +22,9 @@ struct shrink_control {
> nodemask_t nodes_to_scan;
> /* current node being shrunk (for NUMA aware shrinkers) */
> int nid;
> +
> + /* reclaim from this memcg only (if not NULL) */
> + struct mem_cgroup *target_mem_cgroup;
> };
>
> #define SHRINK_STOP (~0UL)
> @@ -63,7 +66,8 @@ struct shrinker {
> #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */
>
> /* Flags */
> -#define SHRINKER_NUMA_AWARE (1 << 0)
> +#define SHRINKER_NUMA_AWARE (1 << 0)
> +#define SHRINKER_MEMCG_AWARE (1 << 1)
>
> extern int register_shrinker(struct shrinker *);
> extern void unregister_shrinker(struct shrinker *);
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 144cb4c..8924ff1 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -358,7 +358,7 @@ static inline void memcg_kmem_set_active(struct mem_cgroup *memcg)
> set_bit(KMEM_ACCOUNTED_ACTIVE, &memcg->kmem_account_flags);
> }
>
> -static bool memcg_kmem_is_active(struct mem_cgroup *memcg)
> +bool memcg_kmem_is_active(struct mem_cgroup *memcg)
> {
> return test_bit(KMEM_ACCOUNTED_ACTIVE, &memcg->kmem_account_flags);
> }
> @@ -958,6 +958,20 @@ mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *memcg, int nid, int zid,
> return ret;
> }
>
> +unsigned long
> +memcg_zone_reclaimable_pages(struct mem_cgroup *memcg, struct zone *zone)
If the prototype does not fit, please wrap the argument list, not the
return value. We are not consistent, but most functions are like this
in memcontrol.c and vmscan.c.
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index eea668d..652dfa3 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -140,11 +140,41 @@ static bool global_reclaim(struct scan_control *sc)
> {
> return !sc->target_mem_cgroup;
> }
> +
> +/*
> + * kmem reclaim should usually not be triggered when we are doing targetted
> + * reclaim. It is only valid when global reclaim is triggered, or when the
> + * underlying memcg has kmem objects.
> + */
> +static bool has_kmem_reclaim(struct scan_control *sc)
> +{
> + return !sc->target_mem_cgroup ||
> + memcg_kmem_is_active(sc->target_mem_cgroup);
> +}
Please opencode these checks in the callsite, they are more
descriptive than the name of this function.
> +static unsigned long
> +zone_nr_reclaimable_pages(struct scan_control *sc, struct zone *zone)
> +{
> + if (global_reclaim(sc))
> + return zone_reclaimable_pages(zone);
> + return memcg_zone_reclaimable_pages(sc->target_mem_cgroup, zone);
> +}
So we have zone_reclaimable_pages() and zone_nr_reclaimable_pages()
with completely different signatures and usecases. Not good.
The intersection between a zone and a memcg is called an lruvec,
please use that. Look up an lruvec as early as possible, then
implement lruvec_reclaimable_pages() etc. for use during reclaim.
> @@ -352,6 +382,15 @@ unsigned long shrink_slab(struct shrink_control *shrinkctl,
> }
>
> list_for_each_entry(shrinker, &shrinker_list, list) {
> + /*
> + * If we don't have a target mem cgroup, we scan them all.
> + * Otherwise we will limit our scan to shrinkers marked as
> + * memcg aware
> + */
> + if (shrinkctl->target_mem_cgroup &&
> + !(shrinker->flags & SHRINKER_MEMCG_AWARE))
> + continue;
> +
> for_each_node_mask(shrinkctl->nid, shrinkctl->nodes_to_scan) {
> if (!node_online(shrinkctl->nid))
> continue;
> @@ -2399,11 +2438,11 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
>
> /*
> * Don't shrink slabs when reclaiming memory from over limit
> - * cgroups but do shrink slab at least once when aborting
> - * reclaim for compaction to avoid unevenly scanning file/anon
> - * LRU pages over slab pages.
> + * cgroups unless we know they have kmem objects. But do shrink
> + * slab at least once when aborting reclaim for compaction to
> + * avoid unevenly scanning file/anon LRU pages over slab pages.
> */
> - if (global_reclaim(sc)) {
> + if (has_kmem_reclaim(sc)) {
> unsigned long lru_pages = 0;
>
> nodes_clear(shrink->nodes_to_scan);
> @@ -2412,7 +2451,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
> if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL))
> continue;
>
> - lru_pages += zone_reclaimable_pages(zone);
> + lru_pages += zone_nr_reclaimable_pages(sc, zone);
> node_set(zone_to_nid(zone),
> shrink->nodes_to_scan);
> }
> @@ -2669,6 +2708,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
> };
> struct shrink_control shrink = {
> .gfp_mask = sc.gfp_mask,
> + .target_mem_cgroup = memcg,
> };
>
> /*
next prev parent reply other threads:[~2013-11-25 16:27 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-25 12:07 [PATCH v11 00/15] kmemcg shrinkers Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 01/15] memcg: make cache index determination more robust Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 02/15] memcg: consolidate callers of memcg_cache_id Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 03/15] vmscan: also shrink slab in memcg pressure Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 16:27 ` Johannes Weiner [this message]
2013-11-25 16:27 ` Johannes Weiner
2013-11-25 12:07 ` [PATCH v11 04/15] memcg: move initialization to memcg creation Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 06/15] memcg: per-memcg kmem shrinking Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
[not found] ` <4e0f1ff9bd02fb3614e98aa76a8c23a7f21a25d4.1385377616.git.vdavydov-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-11-25 16:44 ` Johannes Weiner
2013-11-25 16:44 ` Johannes Weiner
2013-11-25 16:44 ` Johannes Weiner
2013-11-25 12:07 ` [PATCH v11 07/15] memcg: scan cache objects hierarchically Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 16:51 ` Johannes Weiner
2013-11-25 16:51 ` Johannes Weiner
2013-11-25 12:07 ` [PATCH v11 08/15] vmscan: take at least one pass with shrinkers Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 09/15] memcg,list_lru: add per-memcg LRU list infrastructure Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
[not found] ` <e7f905d1cb6af578b8e6e872da909cfbf85030ad.1385377616.git.vdavydov-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-11-25 16:56 ` Johannes Weiner
2013-11-25 16:56 ` Johannes Weiner
2013-11-25 16:56 ` Johannes Weiner
2013-11-25 12:07 ` [PATCH v11 10/15] memcg,list_lru: add function walking over all lists of a per-memcg LRU Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 11/15] super: make icache, dcache shrinkers memcg-aware Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 12/15] memcg: allow kmem limit to be resized down Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 13/15] vmpressure: in-kernel notifications Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 14/15] memcg: reap dead memcgs upon global memory pressure Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` [PATCH v11 15/15] memcg: flush memcg items upon memcg destruction Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
[not found] ` <cover.1385377616.git.vdavydov-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-11-25 12:07 ` [PATCH v11 05/15] memcg: move stop and resume accounting functions Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 12:07 ` Vladimir Davydov
2013-11-25 17:41 ` [PATCH v11 00/15] kmemcg shrinkers Johannes Weiner
2013-11-25 17:41 ` Johannes Weiner
2013-11-25 17:41 ` Johannes Weiner
2013-11-26 6:47 ` Vladimir Davydov
2013-11-26 6:47 ` Vladimir Davydov
[not found] ` <529443E4.7080602-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-11-26 12:55 ` [Devel] " Vladimir Davydov
2013-11-26 12:55 ` Vladimir Davydov
2013-11-26 12:55 ` Vladimir Davydov
2013-11-26 16:46 ` Andrew Morton
2013-11-26 16:46 ` Andrew Morton
2013-11-26 22:47 ` Dave Chinner
2013-11-26 22:47 ` Dave Chinner
2013-11-27 6:26 ` Vladimir Davydov
2013-11-27 6:26 ` Vladimir Davydov
2013-11-27 6:26 ` Vladimir Davydov
-- strict thread matches above, loose matches on Subject: below --
2013-10-24 12:04 Vladimir Davydov
2013-10-24 12:04 ` [PATCH v11 03/15] vmscan: also shrink slab in memcg pressure Vladimir Davydov
2013-10-24 12:04 ` Vladimir Davydov
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=20131125162714.GA22729@cmpxchg.org \
--to=hannes@cmpxchg.org \
--cc=akpm@linux-foundation.org \
--cc=cgroups@vger.kernel.org \
--cc=devel@openvz.org \
--cc=glommer@openvz.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.cz \
--cc=vdavydov@parallels.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.