| 1 |
|
| 2 | |
| 3 | * Events for filesystem locks
|
| 4 | *
|
| 5 | * Copyright 2013 Jeff Layton <[email protected]>
|
| 6 |
|
| 7 | #undef TRACE_SYSTEM
|
| 8 | #define TRACE_SYSTEM filelock
|
| 9 |
|
| 10 | #if !defined(_TRACE_FILELOCK_H) || defined(TRACE_HEADER_MULTI_READ)
|
| 11 | #define _TRACE_FILELOCK_H
|
| 12 |
|
| 13 | #include <linux/tracepoint.h>
|
| 14 | #include <linux/fs.h>
|
| 15 | #include <linux/device.h>
|
| 16 | #include <linux/kdev_t.h>
|
| 17 |
|
| 18 | #define show_fl_flags(val) \
|
| 19 | __print_flags(val, "|", \
|
| 20 | { FL_POSIX, "FL_POSIX" }, \
|
| 21 | { FL_FLOCK, "FL_FLOCK" }, \
|
| 22 | { FL_DELEG, "FL_DELEG" }, \
|
| 23 | { FL_ACCESS, "FL_ACCESS" }, \
|
| 24 | { FL_EXISTS, "FL_EXISTS" }, \
|
| 25 | { FL_LEASE, "FL_LEASE" }, \
|
| 26 | { FL_CLOSE, "FL_CLOSE" }, \
|
| 27 | { FL_SLEEP, "FL_SLEEP" }, \
|
| 28 | { FL_DOWNGRADE_PENDING, "FL_DOWNGRADE_PENDING" }, \
|
| 29 | { FL_UNLOCK_PENDING, "FL_UNLOCK_PENDING" }, \
|
| 30 | { FL_OFDLCK, "FL_OFDLCK" }, \
|
| 31 | { FL_RECLAIM, "FL_RECLAIM" }, \
|
| 32 | { FL_IGN_DIR_CREATE, "FL_IGN_DIR_CREATE" }, \
|
| 33 | { FL_IGN_DIR_DELETE, "FL_IGN_DIR_DELETE" }, \
|
| 34 | { FL_IGN_DIR_RENAME, "FL_IGN_DIR_RENAME" })
|
| 35 |
|
| 36 | #define show_fl_type(val) \
|
| 37 | __print_symbolic(val, \
|
| 38 | { F_RDLCK, "F_RDLCK" }, \
|
| 39 | { F_WRLCK, "F_WRLCK" }, \
|
| 40 | { F_UNLCK, "F_UNLCK" })
|
| 41 |
|
| 42 | TRACE_EVENT(locks_get_lock_context,
|
| 43 | TP_PROTO(struct inode *inode, int type, struct file_lock_context *ctx),
|
| 44 |
|
| 45 | TP_ARGS(inode, type, ctx),
|
| 46 |
|
| 47 | TP_STRUCT__entry(
|
| 48 | __field(u64, i_ino)
|
| 49 | __field(struct file_lock_context *, ctx)
|
| 50 | __field(dev_t, s_dev)
|
| 51 | __field(unsigned char, type)
|
| 52 | ),
|
| 53 |
|
| 54 | TP_fast_assign(
|
| 55 | __entry->s_dev = inode->i_sb->s_dev;
|
| 56 | __entry->i_ino = inode->i_ino;
|
| 57 | __entry->type = type;
|
| 58 | __entry->ctx = ctx;
|
| 59 | ),
|
| 60 |
|
| 61 | TP_printk("dev=0x%x:0x%x ino=0x%llx type=%s ctx=%p",
|
| 62 | MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
|
| 63 | __entry->i_ino, show_fl_type(__entry->type), __entry->ctx)
|
| 64 | );
|
| 65 |
|
| 66 | DECLARE_EVENT_CLASS(filelock_lock,
|
| 67 | TP_PROTO(struct inode *inode, struct file_lock *fl, int ret),
|
| 68 |
|
| 69 | TP_ARGS(inode, fl, ret),
|
| 70 |
|
| 71 | TP_STRUCT__entry(
|
| 72 | __field(u64, i_ino)
|
| 73 | __field(loff_t, fl_start)
|
| 74 | __field(loff_t, fl_end)
|
| 75 | __field(struct file_lock *, fl)
|
| 76 | __field(struct file_lock_core *, blocker)
|
| 77 | __field(fl_owner_t, owner)
|
| 78 | __field(dev_t, s_dev)
|
| 79 | __field(unsigned int, pid)
|
| 80 | __field(unsigned int, flags)
|
| 81 | __field(unsigned char, type)
|
| 82 | __field(int, ret)
|
| 83 | ),
|
| 84 |
|
| 85 | TP_fast_assign(
|
| 86 | __entry->fl = fl ? fl : NULL;
|
| 87 | __entry->s_dev = inode->i_sb->s_dev;
|
| 88 | __entry->i_ino = inode->i_ino;
|
| 89 | __entry->blocker = fl ? fl->c.flc_blocker : NULL;
|
| 90 | __entry->owner = fl ? fl->c.flc_owner : NULL;
|
| 91 | __entry->pid = fl ? fl->c.flc_pid : 0;
|
| 92 | __entry->flags = fl ? fl->c.flc_flags : 0;
|
| 93 | __entry->type = fl ? fl->c.flc_type : 0;
|
| 94 | __entry->fl_start = fl ? fl->fl_start : 0;
|
| 95 | __entry->fl_end = fl ? fl->fl_end : 0;
|
| 96 | __entry->ret = ret;
|
| 97 | ),
|
| 98 |
|
| 99 | TP_printk("fl=%p dev=0x%x:0x%x ino=0x%llx fl_blocker=%p fl_owner=%p fl_pid=%u fl_flags=%s fl_type=%s fl_start=%lld fl_end=%lld ret=%d",
|
| 100 | __entry->fl, MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
|
| 101 | __entry->i_ino, __entry->blocker, __entry->owner,
|
| 102 | __entry->pid, show_fl_flags(__entry->flags),
|
| 103 | show_fl_type(__entry->type),
|
| 104 | __entry->fl_start, __entry->fl_end, __entry->ret)
|
| 105 | );
|
| 106 |
|
| 107 | DEFINE_EVENT(filelock_lock, posix_lock_inode,
|
| 108 | TP_PROTO(struct inode *inode, struct file_lock *fl, int ret),
|
| 109 | TP_ARGS(inode, fl, ret));
|
| 110 |
|
| 111 | DEFINE_EVENT(filelock_lock, fcntl_setlk,
|
| 112 | TP_PROTO(struct inode *inode, struct file_lock *fl, int ret),
|
| 113 | TP_ARGS(inode, fl, ret));
|
| 114 |
|
| 115 | DEFINE_EVENT(filelock_lock, locks_remove_posix,
|
| 116 | TP_PROTO(struct inode *inode, struct file_lock *fl, int ret),
|
| 117 | TP_ARGS(inode, fl, ret));
|
| 118 |
|
| 119 | DEFINE_EVENT(filelock_lock, flock_lock_inode,
|
| 120 | TP_PROTO(struct inode *inode, struct file_lock *fl, int ret),
|
| 121 | TP_ARGS(inode, fl, ret));
|
| 122 |
|
| 123 | #define show_lease_break_flags(val) \
|
| 124 | __print_flags(val, "|", \
|
| 125 | { LEASE_BREAK_LEASE, "LEASE" }, \
|
| 126 | { LEASE_BREAK_DELEG, "DELEG" }, \
|
| 127 | { LEASE_BREAK_LAYOUT, "LAYOUT" }, \
|
| 128 | { LEASE_BREAK_NONBLOCK, "NONBLOCK" }, \
|
| 129 | { LEASE_BREAK_OPEN_RDONLY, "OPEN_RDONLY" }, \
|
| 130 | { LEASE_BREAK_DIR_CREATE, "DIR_CREATE" }, \
|
| 131 | { LEASE_BREAK_DIR_DELETE, "DIR_DELETE" }, \
|
| 132 | { LEASE_BREAK_DIR_RENAME, "DIR_RENAME" })
|
| 133 |
|
| 134 | TRACE_EVENT(break_lease,
|
| 135 | TP_PROTO(struct inode *inode, unsigned int flags),
|
| 136 |
|
| 137 | TP_ARGS(inode, flags),
|
| 138 |
|
| 139 | TP_STRUCT__entry(
|
| 140 | __field(unsigned long, i_ino)
|
| 141 | __field(dev_t, s_dev)
|
| 142 | __field(unsigned int, flags)
|
| 143 | ),
|
| 144 |
|
| 145 | TP_fast_assign(
|
| 146 | __entry->s_dev = inode->i_sb->s_dev;
|
| 147 | __entry->i_ino = inode->i_ino;
|
| 148 | __entry->flags = flags;
|
| 149 | ),
|
| 150 |
|
| 151 | TP_printk("dev=0x%x:0x%x ino=0x%lx flags=%s",
|
| 152 | MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
|
| 153 | __entry->i_ino, show_lease_break_flags(__entry->flags))
|
| 154 | );
|
| 155 |
|
| 156 | DECLARE_EVENT_CLASS(filelock_lease,
|
| 157 | TP_PROTO(struct inode *inode, struct file_lease *fl),
|
| 158 |
|
| 159 | TP_ARGS(inode, fl),
|
| 160 |
|
| 161 | TP_STRUCT__entry(
|
| 162 | __field(u64, i_ino)
|
| 163 | __field(struct file_lease *, fl)
|
| 164 | __field(struct file_lock_core *, blocker)
|
| 165 | __field(fl_owner_t, owner)
|
| 166 | __field(unsigned long, break_time)
|
| 167 | __field(unsigned long, downgrade_time)
|
| 168 | __field(dev_t, s_dev)
|
| 169 | __field(unsigned int, flags)
|
| 170 | __field(unsigned char, type)
|
| 171 | ),
|
| 172 |
|
| 173 | TP_fast_assign(
|
| 174 | __entry->fl = fl ? fl : NULL;
|
| 175 | __entry->s_dev = inode->i_sb->s_dev;
|
| 176 | __entry->i_ino = inode->i_ino;
|
| 177 | __entry->blocker = fl ? fl->c.flc_blocker : NULL;
|
| 178 | __entry->owner = fl ? fl->c.flc_owner : NULL;
|
| 179 | __entry->flags = fl ? fl->c.flc_flags : 0;
|
| 180 | __entry->type = fl ? fl->c.flc_type : 0;
|
| 181 | __entry->break_time = fl ? fl->fl_break_time : 0;
|
| 182 | __entry->downgrade_time = fl ? fl->fl_downgrade_time : 0;
|
| 183 | ),
|
| 184 |
|
| 185 | TP_printk("fl=%p dev=0x%x:0x%x ino=0x%llx fl_blocker=%p fl_owner=%p fl_flags=%s fl_type=%s fl_break_time=%lu fl_downgrade_time=%lu",
|
| 186 | __entry->fl, MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
|
| 187 | __entry->i_ino, __entry->blocker, __entry->owner,
|
| 188 | show_fl_flags(__entry->flags),
|
| 189 | show_fl_type(__entry->type),
|
| 190 | __entry->break_time, __entry->downgrade_time)
|
| 191 | );
|
| 192 |
|
| 193 | DEFINE_EVENT(filelock_lease, break_lease_noblock, TP_PROTO(struct inode *inode, struct file_lease *fl),
|
| 194 | TP_ARGS(inode, fl));
|
| 195 |
|
| 196 | DEFINE_EVENT(filelock_lease, break_lease_block, TP_PROTO(struct inode *inode, struct file_lease *fl),
|
| 197 | TP_ARGS(inode, fl));
|
| 198 |
|
| 199 | DEFINE_EVENT(filelock_lease, break_lease_unblock, TP_PROTO(struct inode *inode, struct file_lease *fl),
|
| 200 | TP_ARGS(inode, fl));
|
| 201 |
|
| 202 | DEFINE_EVENT(filelock_lease, generic_delete_lease, TP_PROTO(struct inode *inode, struct file_lease *fl),
|
| 203 | TP_ARGS(inode, fl));
|
| 204 |
|
| 205 | DEFINE_EVENT(filelock_lease, time_out_leases, TP_PROTO(struct inode *inode, struct file_lease *fl),
|
| 206 | TP_ARGS(inode, fl));
|
| 207 |
|
| 208 | TRACE_EVENT(generic_add_lease,
|
| 209 | TP_PROTO(struct inode *inode, struct file_lease *fl),
|
| 210 |
|
| 211 | TP_ARGS(inode, fl),
|
| 212 |
|
| 213 | TP_STRUCT__entry(
|
| 214 | __field(u64, i_ino)
|
| 215 | __field(fl_owner_t, owner)
|
| 216 | __field(dev_t, s_dev)
|
| 217 | __field(int, wcount)
|
| 218 | __field(int, rcount)
|
| 219 | __field(int, icount)
|
| 220 | __field(unsigned int, flags)
|
| 221 | __field(unsigned char, type)
|
| 222 | ),
|
| 223 |
|
| 224 | TP_fast_assign(
|
| 225 | __entry->s_dev = inode->i_sb->s_dev;
|
| 226 | __entry->i_ino = inode->i_ino;
|
| 227 | __entry->wcount = atomic_read(&inode->i_writecount);
|
| 228 | __entry->rcount = atomic_read(&inode->i_readcount);
|
| 229 | __entry->icount = icount_read_once(inode);
|
| 230 | __entry->owner = fl->c.flc_owner;
|
| 231 | __entry->flags = fl->c.flc_flags;
|
| 232 | __entry->type = fl->c.flc_type;
|
| 233 | ),
|
| 234 |
|
| 235 | TP_printk("dev=0x%x:0x%x ino=0x%llx wcount=%d rcount=%d icount=%d fl_owner=%p fl_flags=%s fl_type=%s",
|
| 236 | MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
|
| 237 | __entry->i_ino, __entry->wcount, __entry->rcount,
|
| 238 | __entry->icount, __entry->owner,
|
| 239 | show_fl_flags(__entry->flags),
|
| 240 | show_fl_type(__entry->type))
|
| 241 | );
|
| 242 |
|
| 243 | TRACE_EVENT(leases_conflict,
|
| 244 | TP_PROTO(bool conflict, struct file_lease *lease, struct file_lease *breaker),
|
| 245 |
|
| 246 | TP_ARGS(conflict, lease, breaker),
|
| 247 |
|
| 248 | TP_STRUCT__entry(
|
| 249 | __field(void *, lease)
|
| 250 | __field(void *, breaker)
|
| 251 | __field(unsigned int, l_fl_flags)
|
| 252 | __field(unsigned int, b_fl_flags)
|
| 253 | __field(unsigned char, l_fl_type)
|
| 254 | __field(unsigned char, b_fl_type)
|
| 255 | __field(bool, conflict)
|
| 256 | ),
|
| 257 |
|
| 258 | TP_fast_assign(
|
| 259 | __entry->lease = lease;
|
| 260 | __entry->l_fl_flags = lease->c.flc_flags;
|
| 261 | __entry->l_fl_type = lease->c.flc_type;
|
| 262 | __entry->breaker = breaker;
|
| 263 | __entry->b_fl_flags = breaker->c.flc_flags;
|
| 264 | __entry->b_fl_type = breaker->c.flc_type;
|
| 265 | __entry->conflict = conflict;
|
| 266 | ),
|
| 267 |
|
| 268 | TP_printk("conflict %d: lease=%p fl_flags=%s fl_type=%s; breaker=%p fl_flags=%s fl_type=%s",
|
| 269 | __entry->conflict,
|
| 270 | __entry->lease,
|
| 271 | show_fl_flags(__entry->l_fl_flags),
|
| 272 | show_fl_type(__entry->l_fl_type),
|
| 273 | __entry->breaker,
|
| 274 | show_fl_flags(__entry->b_fl_flags),
|
| 275 | show_fl_type(__entry->b_fl_type))
|
| 276 | );
|
| 277 |
|
| 278 | #endif
|
| 279 |
|
| 280 |
|
| 281 | #include <trace/define_trace.h>
|