From 15aa09b0c259a63075bad06ecb98e00106fa771c Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Thu, 21 Sep 2017 13:07:52 -0700 Subject: [PATCH] scoutfs: add shrink exit trace points Add trace points that show the incoming nr_to_scan and resulting object count for shrinker calls. Signed-off-by: Zach Brown --- kmod/src/item.c | 5 ++++- kmod/src/lock.c | 5 ++++- kmod/src/scoutfs_trace.h | 32 ++++++++++++++++++++++++++++++++ kmod/src/seg.c | 5 ++++- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/kmod/src/item.c b/kmod/src/item.c index b0920e2f..cb3fee9a 100644 --- a/kmod/src/item.c +++ b/kmod/src/item.c @@ -1748,6 +1748,7 @@ static int item_lru_shrink(struct shrinker *shrink, struct shrink_control *sc) struct cached_item *end; unsigned long flags; unsigned long nr; + int ret; nr = sc->nr_to_scan; if (nr == 0) @@ -1848,7 +1849,9 @@ abort: spin_unlock_irqrestore(&cac->lock, flags); out: - return min_t(unsigned long, cac->lru_nr, INT_MAX); + ret = min_t(unsigned long, cac->lru_nr, INT_MAX); + trace_scoutfs_item_shrink_exit(sb, sc->nr_to_scan, ret); + return ret; } static void *copy_key_with_len(void *data, struct scoutfs_key_buf *key) diff --git a/kmod/src/lock.c b/kmod/src/lock.c index 12e4669d..994121a5 100644 --- a/kmod/src/lock.c +++ b/kmod/src/lock.c @@ -345,6 +345,7 @@ static int shrink_lock_tree(struct shrinker *shrink, struct shrink_control *sc) struct scoutfs_lock *tmp; unsigned long flags; unsigned long nr; + int ret; nr = sc->nr_to_scan; if (!nr) @@ -368,7 +369,9 @@ static int shrink_lock_tree(struct shrinker *shrink, struct shrink_control *sc) spin_unlock_irqrestore(&linfo->lock, flags); out: - return min_t(unsigned long, linfo->lru_nr, INT_MAX); + ret = min_t(unsigned long, linfo->lru_nr, INT_MAX); + trace_scoutfs_lock_shrink_exit(linfo->sb, sc->nr_to_scan, ret); + return ret; } static void free_lock_tree(struct super_block *sb) diff --git a/kmod/src/scoutfs_trace.h b/kmod/src/scoutfs_trace.h index 50140d25..461475e1 100644 --- a/kmod/src/scoutfs_trace.h +++ b/kmod/src/scoutfs_trace.h @@ -1650,6 +1650,38 @@ TRACE_EVENT(scoutfs_item_next_range_check, __get_str(last), __get_str(end), __get_str(range_end)) ); +DECLARE_EVENT_CLASS(scoutfs_shrink_exit_class, + TP_PROTO(struct super_block *sb, unsigned long nr_to_scan, int ret), + TP_ARGS(sb, nr_to_scan, ret), + TP_STRUCT__entry( + __field(void *, sb) + __field(unsigned long, nr_to_scan) + __field(int, ret) + ), + TP_fast_assign( + __entry->sb = sb; + __entry->nr_to_scan = nr_to_scan; + __entry->ret = ret; + ), + TP_printk("sb %p nr_to_scan %lu ret %d", + __entry->sb, __entry->nr_to_scan, __entry->ret) +); + +DEFINE_EVENT(scoutfs_shrink_exit_class, scoutfs_lock_shrink_exit, + TP_PROTO(struct super_block *sb, unsigned long nr_to_scan, int ret), + TP_ARGS(sb, nr_to_scan, ret) +); + +DEFINE_EVENT(scoutfs_shrink_exit_class, scoutfs_seg_shrink_exit, + TP_PROTO(struct super_block *sb, unsigned long nr_to_scan, int ret), + TP_ARGS(sb, nr_to_scan, ret) +); + +DEFINE_EVENT(scoutfs_shrink_exit_class, scoutfs_item_shrink_exit, + TP_PROTO(struct super_block *sb, unsigned long nr_to_scan, int ret), + TP_ARGS(sb, nr_to_scan, ret) +); + #endif /* _TRACE_SCOUTFS_H */ /* This part must be outside protection */ diff --git a/kmod/src/seg.c b/kmod/src/seg.c index 039530d4..e7d9d1d0 100644 --- a/kmod/src/seg.c +++ b/kmod/src/seg.c @@ -716,6 +716,7 @@ static int seg_lru_shrink(struct shrinker *shrink, struct shrink_control *sc) unsigned long flags; unsigned long nr; LIST_HEAD(list); + int ret; nr = sc->nr_to_scan; if (!nr) @@ -746,7 +747,9 @@ static int seg_lru_shrink(struct shrinker *shrink, struct shrink_control *sc) } out: - return min_t(unsigned long, cac->lru_nr, INT_MAX); + ret = min_t(unsigned long, cac->lru_nr, INT_MAX); + trace_scoutfs_seg_shrink_exit(sb, sc->nr_to_scan, ret); + return ret; } int scoutfs_seg_setup(struct super_block *sb)