From 7767a8a48e2ef80cb795cb75a4fdf696d09e4e88 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Thu, 9 Nov 2017 18:26:09 -0800 Subject: [PATCH] scoutfs: add item cache range tracing Add some tracepoints to track operations on our allocated item cache range structs. Signed-off-by: Zach Brown --- kmod/src/item.c | 11 ++++++ kmod/src/scoutfs_trace.h | 74 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/kmod/src/item.c b/kmod/src/item.c index 8f9f17c7..e9e7bc65 100644 --- a/kmod/src/item.c +++ b/kmod/src/item.c @@ -95,6 +95,9 @@ struct cached_range { struct scoutfs_key_buf *end; }; +#define trace_range(which, sb, rng) \ + trace_scoutfs_item_range_##which(sb, (rng), (rng)->start, (rng)->end) + static u8 item_flags(struct cached_item *item) { return item->deletion ? SCOUTFS_ITEM_FLAG_DELETION : 0; @@ -575,6 +578,7 @@ static void free_range(struct super_block *sb, struct cached_range *rng) { if (!IS_ERR_OR_NULL(rng)) { scoutfs_inc_counter(sb, item_range_free); + trace_range(free, sb, rng); scoutfs_key_free(sb, rng->start); scoutfs_key_free(sb, rng->end); kfree(rng); @@ -640,6 +644,7 @@ restart: goto restart; } + trace_range(ins_rb_insert, sb, ins); rb_link_node(&ins->node, parent, node); rb_insert_color(&ins->node, root); } @@ -696,6 +701,7 @@ restart: if (start_cmp > 0 && end_cmp < 0) { swap(rng->end, rem->start); scoutfs_key_dec(rng->end); + trace_range(remove_mid_left, sb, rng); swap(rem->start, rem->end); scoutfs_key_inc(rem->start); @@ -707,12 +713,14 @@ restart: if (start_cmp < 0 && end_cmp < 0) { swap(rem->end, rng->start); scoutfs_key_inc(rng->start); + trace_range(remove_start, sb, rng); continue; } if (start_cmp > 0 && end_cmp > 0) { swap(rem->start, rng->end); scoutfs_key_dec(rng->end); + trace_range(remove_end, sb, rng); continue; } @@ -723,6 +731,7 @@ restart: } if (insert) { + trace_range(rem_rb_insert, sb, rem); rb_link_node(&rem->node, parent, node); rb_insert_color(&rem->node, root); } else { @@ -2014,6 +2023,7 @@ static int shrink_around(struct super_block *sb, struct cached_range *rng, rng->end = first->key; first->key = NULL; scoutfs_key_dec_cur_len(rng->end); + trace_range(shrink_end, sb, rng); } /* set start of remaining existing range */ @@ -2022,6 +2032,7 @@ static int shrink_around(struct super_block *sb, struct cached_range *rng, rng->start = last->key; last->key = NULL; scoutfs_key_inc_cur_len(rng->start); + trace_range(shrink_start, sb, rng); } /* add new range, stealing existing end */ diff --git a/kmod/src/scoutfs_trace.h b/kmod/src/scoutfs_trace.h index 791bad66..aed95f07 100644 --- a/kmod/src/scoutfs_trace.h +++ b/kmod/src/scoutfs_trace.h @@ -1499,6 +1499,80 @@ DEFINE_EVENT(scoutfs_range_class, scoutfs_read_items, TP_ARGS(sb, start, end) ); +DECLARE_EVENT_CLASS(scoutfs_cached_range_class, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end), + TP_STRUCT__entry( + __field(__u64, fsid) + __field(void *, rng) + __dynamic_array(char, start, scoutfs_key_str(NULL, start)) + __dynamic_array(char, end, scoutfs_key_str(NULL, end)) + ), + TP_fast_assign( + __entry->fsid = FSID_ARG(sb); + __entry->rng = rng; + scoutfs_key_str(__get_dynamic_array(start), start); + scoutfs_key_str(__get_dynamic_array(end), end); + ), + TP_printk("fsid "FSID_FMT" rng %p start %s end %s", + __entry->fsid, __entry->rng, __get_str(start), __get_str(end)) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_free, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_ins_rb_insert, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_remove_mid_left, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_remove_start, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_remove_end, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_rem_rb_insert, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_delete_enoent, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_shrink_start, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + +DEFINE_EVENT(scoutfs_cached_range_class, scoutfs_item_range_shrink_end, + TP_PROTO(struct super_block *sb, void *rng, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, rng, start, end) +); + #define lock_mode(mode) \ __print_symbolic(mode, \ { DLM_LOCK_IV, "IV" }, \