[RFC PATCH 06/10] fs/locks: Add longterm lease traces

From: ira . weiny
Date: Mon Apr 29 2019 - 00:55:00 EST


From: Ira Weiny <ira.weiny@xxxxxxxxx>

---
fs/locks.c | 5 +++++
include/trace/events/filelock.h | 37 ++++++++++++++++++++++++++++++++-
2 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/fs/locks.c b/fs/locks.c
index ae508d192223..58c6d7a411b6 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -2136,6 +2136,8 @@ static int do_fcntl_add_lease(unsigned int fd, struct file *filp, long arg)
}
new->fa_fd = fd;

+ trace_take_longterm_lease(fl);
+
error = vfs_setlease(filp, arg, &fl, (void **)&new);
if (fl)
locks_free_lock(fl);
@@ -3118,6 +3120,8 @@ bool page_set_longterm_lease(struct page *page)
kref_get(&existing_fl->gup_ref);
}

+ trace_take_longterm_lease(existing_fl);
+
spin_unlock(&ctx->flc_lock);
percpu_up_read(&file_rwsem);

@@ -3153,6 +3157,7 @@ void page_remove_longterm_lease(struct page *page)
percpu_down_read(&file_rwsem);
spin_lock(&ctx->flc_lock);
found = find_longterm_lease(inode);
+ trace_release_longterm_lease(found);
if (found)
kref_put(&found->gup_ref, release_longterm_lease);
spin_unlock(&ctx->flc_lock);
diff --git a/include/trace/events/filelock.h b/include/trace/events/filelock.h
index 4b735923f2ff..c6f39f03cb8b 100644
--- a/include/trace/events/filelock.h
+++ b/include/trace/events/filelock.h
@@ -27,7 +27,8 @@
{ FL_SLEEP, "FL_SLEEP" }, \
{ FL_DOWNGRADE_PENDING, "FL_DOWNGRADE_PENDING" }, \
{ FL_UNLOCK_PENDING, "FL_UNLOCK_PENDING" }, \
- { FL_OFDLCK, "FL_OFDLCK" })
+ { FL_OFDLCK, "FL_OFDLCK" }, \
+ { FL_LONGTERM, "FL_LONGTERM" })

#define show_fl_type(val) \
__print_symbolic(val, \
@@ -238,6 +239,40 @@ TRACE_EVENT(leases_conflict,
show_fl_type(__entry->b_fl_type))
);

+DECLARE_EVENT_CLASS(longterm_lease,
+ TP_PROTO(struct file_lock *fl),
+
+ TP_ARGS(fl),
+
+ TP_STRUCT__entry(
+ __field(void *, fl)
+ __field(void *, owner)
+ __field(unsigned int, fl_flags)
+ __field(unsigned int, cnt)
+ __field(unsigned char, fl_type)
+ ),
+
+ TP_fast_assign(
+ __entry->fl = fl;
+ __entry->owner = fl ? fl->fl_owner : NULL;
+ __entry->fl_flags = fl ? fl->fl_flags : 0;
+ __entry->cnt = fl ? kref_read(&fl->gup_ref) : 0;
+ __entry->fl_type = fl ? fl->fl_type : 0;
+ ),
+
+ TP_printk("owner=0x%p fl=%p(%d) fl_flags=%s fl_type=%s",
+ __entry->owner, __entry->fl, __entry->cnt,
+ show_fl_flags(__entry->fl_flags),
+ show_fl_type(__entry->fl_type))
+);
+DEFINE_EVENT(longterm_lease, take_longterm_lease,
+ TP_PROTO(struct file_lock *fl),
+ TP_ARGS(fl));
+DEFINE_EVENT(longterm_lease, release_longterm_lease,
+ TP_PROTO(struct file_lock *fl),
+ TP_ARGS(fl));
+
+
#endif /* _TRACE_FILELOCK_H */

/* This part must be outside protection */
--
2.20.1