* [PATCH v2 1/2] include: trace: Display names of shrinker callbacks
2016-08-18 5:33 [PATCH v2 0/2] Get callbacks/names of shrinkers from tracepoints Janani Ravichandran
@ 2016-08-18 5:38 ` Janani Ravichandran
2016-08-18 6:09 ` [PATCH v2 2/2] fs: super.c: Add tracepoint to get name of superblock shrinker Janani Ravichandran
1 sibling, 0 replies; 6+ messages in thread
From: Janani Ravichandran @ 2016-08-18 5:38 UTC (permalink / raw)
To: linux-mm, linux-kernel
Cc: riel, akpm, vdavydov, mhocko, vbabka, mgorman, kirill.shutemov,
bywxiaobai
This patch enables the names of callbacks in mm_shrink_slab_start and
mm_shrink_slab_end to be seen by userspace tools.
This should give some information regarding the identity of the
shrinkers being run.
Signed-off-by: Janani Ravichandran <janani.rvchndrn@gmail.com>
---
include/trace/events/vmscan.h | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h
index c88fd09..7091c29 100644
--- a/include/trace/events/vmscan.h
+++ b/include/trace/events/vmscan.h
@@ -16,6 +16,8 @@
#define RECLAIM_WB_SYNC 0x0004u /* Unused, all reclaim async */
#define RECLAIM_WB_ASYNC 0x0008u
+#define SHRINKER_NAME_LEN (size_t)32
+
#define show_reclaim_flags(flags) \
(flags) ? __print_flags(flags, "|", \
{RECLAIM_WB_ANON, "RECLAIM_WB_ANON"}, \
@@ -196,6 +198,7 @@ TRACE_EVENT(mm_shrink_slab_start,
TP_STRUCT__entry(
__field(struct shrinker *, shr)
__field(void *, shrink)
+ __array(char, shrinker_name, SHRINKER_NAME_LEN)
__field(int, nid)
__field(long, nr_objects_to_shrink)
__field(gfp_t, gfp_flags)
@@ -207,8 +210,12 @@ TRACE_EVENT(mm_shrink_slab_start,
),
TP_fast_assign(
+ char sym[KSYM_SYMBOL_LEN];
+
__entry->shr = shr;
__entry->shrink = shr->scan_objects;
+ sprint_symbol(sym, (unsigned long)__entry->shrink);
+ strlcpy(__entry->shrinker_name, sym, SHRINKER_NAME_LEN);
__entry->nid = sc->nid;
__entry->nr_objects_to_shrink = nr_objects_to_shrink;
__entry->gfp_flags = sc->gfp_mask;
@@ -219,9 +226,10 @@ TRACE_EVENT(mm_shrink_slab_start,
__entry->total_scan = total_scan;
),
- TP_printk("%pF %p: nid: %d objects to shrink %ld gfp_flags %s pgs_scanned %ld lru_pgs %ld cache items %ld delta %lld total_scan %ld",
+ TP_printk("%pF %p name:%s nid: %d objects to shrink %ld gfp_flags %s pgs_scanned %ld lru_pgs %ld cache items %ld delta %lld total_scan %ld",
__entry->shrink,
__entry->shr,
+ __entry->shrinker_name,
__entry->nid,
__entry->nr_objects_to_shrink,
show_gfp_flags(__entry->gfp_flags),
@@ -242,6 +250,7 @@ TRACE_EVENT(mm_shrink_slab_end,
TP_STRUCT__entry(
__field(struct shrinker *, shr)
__field(int, nid)
+ __array(char, shrinker_name, SHRINKER_NAME_LEN)
__field(void *, shrink)
__field(long, unused_scan)
__field(long, new_scan)
@@ -250,18 +259,23 @@ TRACE_EVENT(mm_shrink_slab_end,
),
TP_fast_assign(
+ char sym[KSYM_SYMBOL_LEN];
+
__entry->shr = shr;
__entry->nid = nid;
__entry->shrink = shr->scan_objects;
+ sprint_symbol(sym, (unsigned long)__entry->shrink);
+ strlcpy(__entry->shrinker_name, sym, SHRINKER_NAME_LEN);
__entry->unused_scan = unused_scan_cnt;
__entry->new_scan = new_scan_cnt;
__entry->retval = shrinker_retval;
__entry->total_scan = total_scan;
),
- TP_printk("%pF %p: nid: %d unused scan count %ld new scan count %ld total_scan %ld last shrinker return val %d",
+ TP_printk("%pF %p name:%s nid: %d unused scan count %ld new scan count %ld total_scan %ld last shrinker return val %d",
__entry->shrink,
__entry->shr,
+ __entry->shrinker_name,
__entry->nid,
__entry->unused_scan,
__entry->new_scan,
--
2.7.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v2 2/2] fs: super.c: Add tracepoint to get name of superblock shrinker
2016-08-18 5:33 [PATCH v2 0/2] Get callbacks/names of shrinkers from tracepoints Janani Ravichandran
2016-08-18 5:38 ` [PATCH v2 1/2] include: trace: Display names of shrinker callbacks Janani Ravichandran
@ 2016-08-18 6:09 ` Janani Ravichandran
2016-08-18 6:32 ` Al Viro
1 sibling, 1 reply; 6+ messages in thread
From: Janani Ravichandran @ 2016-08-18 6:09 UTC (permalink / raw)
To: linux-mm, linux-kernel
Cc: riel, akpm, vdavydov, mhocko, vbabka, mgorman, kirill.shutemov,
bywxiaobai
This patch adds a new tracepoint to gather specific name information
of the superblock types.
This tracepoint can be used in conjunction with mm_shrink_slab_start and
mm_shrink_slab_end to get information like latency, number of
objects scanned by that particular shrinker, etc. The shrinker struct
address printed by mm_shrink_slab_start, mm_shrink_slab_end
and the new tracepoint can help tie information together.
However, the specific superblock type can only be identified if the
while condition in do_shrink_slab() of vmscan.c is true and the
callback for the superblock shrinker is invoked.
Here's a sample output of a postprocessing script to observe how long
the shrinkers took. In this case, the while condition was true each time
and the superblock callback was invoked. The names cgroup, ext4, proc,
etc were obtained from the new tracepoint in the callback.
name:ext4_es_scan 518582ns
name:super_cache_scan/cgroup 1319939ns
name:super_cache_scan/ext4 16954600ns
name:super_cache_scan/proc 27466703ns
name:super_cache_scan/sysfs 11412903ns
name:super_cache_scan/tmpfs 71323ns
However, in cases where the callback is not invoked, it is not possible
to obtain name information from the new tracepoint. In such cases, the
output would be something like:
name:deferred_split_scan 345972ns
name:ext4_es_scan 2719002ns
name:i915_gem_shrinker_scan 10915266ns
name:scan_shadow_nodes 3349303ns
name:super_cache_scan 18970732ns
name:super_cache_scan/ext4 1293938ns
name:super_cache_scan/tmpfs 21588ns
On line 5,we can see that there were times when the super_cache_scan
callback wasn't invoked and therefore no name information was obtained.
Signed-off-by: Janani Ravichandran <janani.rvchndrn@gmail.com>
---
Changes since v1:
v1 did not have any mechanism to print names of specific superblock
types . This version introduces that.
fs/super.c | 2 ++
include/trace/events/vmscan.h | 21 +++++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/fs/super.c b/fs/super.c
index c2ff475..be7b493 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -35,6 +35,7 @@
#include <linux/lockdep.h>
#include <linux/user_namespace.h>
#include "internal.h"
+#include <trace/events/vmscan.h>
static LIST_HEAD(super_blocks);
@@ -64,6 +65,7 @@ static unsigned long super_cache_scan(struct shrinker *shrink,
long inodes;
sb = container_of(shrink, struct super_block, s_shrink);
+ trace_mm_shrinker_callback(shrink, sb->s_type->name);
/*
* Deadlock avoidance. We may hold various FS locks, and we don't want
diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h
index 7091c29..5c8703e 100644
--- a/include/trace/events/vmscan.h
+++ b/include/trace/events/vmscan.h
@@ -283,6 +283,27 @@ TRACE_EVENT(mm_shrink_slab_end,
__entry->retval)
);
+TRACE_EVENT(mm_shrinker_callback,
+ TP_PROTO(struct shrinker *shr, const char *shrinker_name),
+
+ TP_ARGS(shr, shrinker_name),
+
+ TP_STRUCT__entry(
+ __field(struct shrinker *, shr)
+ __array(char, shrinker_name, SHRINKER_NAME_LEN)
+ ),
+
+ TP_fast_assign(
+ __entry->shr = shr;
+ strlcpy(__entry->shrinker_name, shrinker_name,
+ SHRINKER_NAME_LEN);
+ ),
+
+ TP_printk("shrinker:%p shrinker_name:%s",
+ __entry->shr,
+ __entry->shrinker_name)
+);
+
DECLARE_EVENT_CLASS(mm_vmscan_lru_isolate_template,
TP_PROTO(int classzone_idx,
--
2.7.0
^ permalink raw reply related [flat|nested] 6+ messages in thread