diff --git a/kmod/src/lock.c b/kmod/src/lock.c index 62f09129..f9eae7f2 100644 --- a/kmod/src/lock.c +++ b/kmod/src/lock.c @@ -99,6 +99,8 @@ static int invalidate_caches(struct super_block *sb, int mode, { int ret; + trace_scoutfs_lock_invalidate_sb(sb, mode, start, end); + ret = scoutfs_item_writeback(sb, start, end); if (ret) return ret; @@ -176,6 +178,8 @@ int scoutfs_lock_range(struct super_block *sb, int mode, lck->end = end; lck->mode = mode; + trace_scoutfs_lock_range(sb, lck); + ret = wait_event_interruptible(held->waitq, lock_added(held, lck)); if (ret == 0) { ret = invalidate_others(sb, mode, start, end); @@ -191,6 +195,8 @@ void scoutfs_unlock_range(struct super_block *sb, struct scoutfs_lock *lck) DECLARE_LOCK_INFO(sb, linf); struct held_locks *held = linf->held; + trace_scoutfs_unlock_range(sb, lck); + unlock(held, lck); } diff --git a/kmod/src/scoutfs_trace.h b/kmod/src/scoutfs_trace.h index 6b5a828c..ae1c4c16 100644 --- a/kmod/src/scoutfs_trace.h +++ b/kmod/src/scoutfs_trace.h @@ -28,6 +28,7 @@ #include "key.h" #include "format.h" #include "kvec.h" +#include "lock.h" struct scoutfs_sb_info; @@ -231,6 +232,59 @@ TRACE_EVENT(scoutfs_item_insert_batch, TP_printk("start %s end %s", __get_str(start), __get_str(end)) ); +#define lock_mode(mode) \ + __print_symbolic(mode, \ + { SCOUTFS_LOCK_MODE_READ, "READ" }, \ + { SCOUTFS_LOCK_MODE_WRITE, "WRITE" }) + +DECLARE_EVENT_CLASS(scoutfs_lock_class, + TP_PROTO(struct super_block *sb, struct scoutfs_lock *lck), + TP_ARGS(sb, lck), + TP_STRUCT__entry( + __field(int, mode) + __dynamic_array(char, start, scoutfs_key_str(NULL, lck->start)) + __dynamic_array(char, end, scoutfs_key_str(NULL, lck->end)) + ), + TP_fast_assign( + __entry->mode = lck->mode; + scoutfs_key_str(__get_dynamic_array(start), lck->start); + scoutfs_key_str(__get_dynamic_array(end), lck->end); + ), + TP_printk("mode %s start %s end %s", + lock_mode(__entry->mode), __get_str(start), __get_str(end)) +); + +DEFINE_EVENT(scoutfs_lock_class, scoutfs_lock_range, + TP_PROTO(struct super_block *sb, struct scoutfs_lock *lck), + TP_ARGS(sb, lck) +); + +DEFINE_EVENT(scoutfs_lock_class, scoutfs_unlock_range, + TP_PROTO(struct super_block *sb, struct scoutfs_lock *lck), + TP_ARGS(sb, lck) +); + +TRACE_EVENT(scoutfs_lock_invalidate_sb, + TP_PROTO(struct super_block *sb, int mode, + struct scoutfs_key_buf *start, struct scoutfs_key_buf *end), + TP_ARGS(sb, mode, start, end), + TP_STRUCT__entry( + __field(void *, sb) + __field(int, mode) + __dynamic_array(char, start, scoutfs_key_str(NULL, start)) + __dynamic_array(char, end, scoutfs_key_str(NULL, end)) + ), + TP_fast_assign( + __entry->sb = sb; + __entry->mode = mode; + scoutfs_key_str(__get_dynamic_array(start), start); + scoutfs_key_str(__get_dynamic_array(end), end); + ), + TP_printk("sb %p mode %s start %s end %s", + __entry->sb, lock_mode(__entry->mode), + __get_str(start), __get_str(end)) +); + #endif /* _TRACE_SCOUTFS_H */ /* This part must be outside protection */