Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/fs/bcachefs/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 47 kB image not shown  

Quelle  trace.h   Sprache: C

 
/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM bcachefs

#if !defined(_TRACE_BCACHEFS_H) || defined(TRACE_HEADER_MULTI_READ)

#include <linux/tracepoint.h>

#define TRACE_BPOS_entries(name)    \
 __field(u64,   name##_inode ) \
 __field(u64,   name##_offset ) \
 __field(u32,   name##_snapshot )

#define TRACE_BPOS_assign(dst, src)    \
 __entry->dst##_inode  = (src).inode;  \
 __entry->dst##_offset  = (src).offset;  \
 __entry->dst##_snapshot  = (src).snapshot

DECLARE_EVENT_CLASS(bpos,
 TP_PROTO(const struct bpos *p),
 TP_ARGS(p),

 TP_STRUCT__entry(
  TRACE_BPOS_entries(p)
 ),

 TP_fast_assign(
  TRACE_BPOS_assign(p, *p);
 ),

 TP_printk("%llu:%llu:%u", __entry->p_inode, __entry->p_offset, __entry->p_snapshot)
);

DECLARE_EVENT_CLASS(fs_str,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __string(str,  str   )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __assign_str(str);
 ),

 TP_printk("%d,%d\n%s", MAJOR(__entry->dev), MINOR(__entry->dev), __get_str(str))
);

DECLARE_EVENT_CLASS(trans_str,
 TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *str),
 TP_ARGS(trans, caller_ip, str),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __array(char,  trans_fn, 32  )
  __field(unsigned long, caller_ip  )
  __string(str,  str   )
 ),

 TP_fast_assign(
  __entry->dev  = trans->c->dev;
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
  __assign_str(str);
 ),

 TP_printk("%d,%d %s %pS %s",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->trans_fn, (void *) __entry->caller_ip, __get_str(str))
);

DECLARE_EVENT_CLASS(trans_str_nocaller,
 TP_PROTO(struct btree_trans *trans, const char *str),
 TP_ARGS(trans, str),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __array(char,  trans_fn, 32  )
  __string(str,  str   )
 ),

 TP_fast_assign(
  __entry->dev  = trans->c->dev;
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __assign_str(str);
 ),

 TP_printk("%d,%d %s %s",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->trans_fn, __get_str(str))
);

DECLARE_EVENT_CLASS(btree_node_nofs,
 TP_PROTO(struct bch_fs *c, struct btree *b),
 TP_ARGS(c, b),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(u8,  level   )
  __field(u8,  btree_id  )
  TRACE_BPOS_entries(pos)
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __entry->level  = b->c.level;
  __entry->btree_id = b->c.btree_id;
  TRACE_BPOS_assign(pos, b->key.k.p);
 ),

 TP_printk("%d,%d %u %s %llu:%llu:%u",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->level,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode, __entry->pos_offset, __entry->pos_snapshot)
);

DECLARE_EVENT_CLASS(btree_node,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __array(char,  trans_fn, 32  )
  __field(u8,  level   )
  __field(u8,  btree_id  )
  TRACE_BPOS_entries(pos)
 ),

 TP_fast_assign(
  __entry->dev  = trans->c->dev;
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->level  = b->c.level;
  __entry->btree_id = b->c.btree_id;
  TRACE_BPOS_assign(pos, b->key.k.p);
 ),

 TP_printk("%d,%d %s %u %s %llu:%llu:%u",
    MAJOR(__entry->dev), MINOR(__entry->dev), __entry->trans_fn,
    __entry->level,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode, __entry->pos_offset, __entry->pos_snapshot)
);

DECLARE_EVENT_CLASS(bch_fs,
 TP_PROTO(struct bch_fs *c),
 TP_ARGS(c),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
 ),

 TP_printk("%d,%d", MAJOR(__entry->dev), MINOR(__entry->dev))
);

DECLARE_EVENT_CLASS(btree_trans,
 TP_PROTO(struct btree_trans *trans),
 TP_ARGS(trans),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __array(char,  trans_fn, 32  )
 ),

 TP_fast_assign(
  __entry->dev  = trans->c->dev;
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
 ),

 TP_printk("%d,%d %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->trans_fn)
);

DECLARE_EVENT_CLASS(bio,
 TP_PROTO(struct bio *bio),
 TP_ARGS(bio),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(sector_t, sector   )
  __field(unsigned int, nr_sector  )
  __array(char,  rwbs, 6  )
 ),

 TP_fast_assign(
  __entry->dev  = bio->bi_bdev ? bio_dev(bio) : 0;
  __entry->sector  = bio->bi_iter.bi_sector;
  __entry->nr_sector = bio->bi_iter.bi_size >> 9;
  blk_fill_rwbs(__entry->rwbs, bio->bi_opf);
 ),

 TP_printk("%d,%d %s %llu + %u",
    MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
    (unsigned long long)__entry->sector, __entry->nr_sector)
);

/* errors */

TRACE_EVENT(error_throw,
 TP_PROTO(struct bch_fs *c, int bch_err, unsigned long ip),
 TP_ARGS(c, bch_err, ip),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(int,  err   )
  __array(char,  err_str, 32  )
  __array(char,  ip, 32   )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __entry->err  = bch_err;
  strscpy(__entry->err_str, bch2_err_str(bch_err), sizeof(__entry->err_str));
  snprintf(__entry->ip, sizeof(__entry->ip), "%ps", (void *) ip);
 ),

 TP_printk("%d,%d %s ret %s", MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->ip, __entry->err_str)
);

TRACE_EVENT(error_downcast,
 TP_PROTO(int bch_err, int std_err, unsigned long ip),
 TP_ARGS(bch_err, std_err, ip),

 TP_STRUCT__entry(
  __array(char,  bch_err, 32  )
  __array(char,  std_err, 32  )
  __array(char,  ip, 32   )
 ),

 TP_fast_assign(
  strscpy(__entry->bch_err, bch2_err_str(bch_err), sizeof(__entry->bch_err));
  strscpy(__entry->std_err, bch2_err_str(std_err), sizeof(__entry->std_err));
  snprintf(__entry->ip, sizeof(__entry->ip), "%ps", (void *) ip);
 ),

 TP_printk("%s ret %s -> %s %s", __entry->ip,
    __entry->bch_err, __entry->std_err, __entry->ip)
);

/* disk_accounting.c */

TRACE_EVENT(accounting_mem_insert,
 TP_PROTO(struct bch_fs *c, const char *acc),
 TP_ARGS(c, acc),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(unsigned, new_nr   )
  __string(acc,  acc   )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __entry->new_nr  = c->accounting.k.nr;
  __assign_str(acc);
 ),

 TP_printk("%d,%d entries %u added %s",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->new_nr,
    __get_str(acc))
);

/* fs.c: */
TRACE_EVENT(bch2_sync_fs,
 TP_PROTO(struct super_block *sb, int wait),

 TP_ARGS(sb, wait),

 TP_STRUCT__entry(
  __field( dev_t, dev   )
  __field( int, wait   )

 ),

 TP_fast_assign(
  __entry->dev = sb->s_dev;
  __entry->wait = wait;
 ),

 TP_printk("dev %d,%d wait %d",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->wait)
);

/* fs-io.c: */
TRACE_EVENT(bch2_fsync,
 TP_PROTO(struct file *file, int datasync),

 TP_ARGS(file, datasync),

 TP_STRUCT__entry(
  __field( dev_t, dev   )
  __field( ino_t, ino   )
  __field( ino_t, parent   )
  __field( int, datasync  )
 ),

 TP_fast_assign(
  struct dentry *dentry = file->f_path.dentry;

  __entry->dev  = dentry->d_sb->s_dev;
  __entry->ino  = d_inode(dentry)->i_ino;
  __entry->parent  = d_inode(dentry->d_parent)->i_ino;
  __entry->datasync = datasync;
 ),

 TP_printk("dev %d,%d ino %lu parent %lu datasync %d ",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    (unsigned long) __entry->ino,
    (unsigned long) __entry->parent, __entry->datasync)
);

/* super-io.c: */
TRACE_EVENT(write_super,
 TP_PROTO(struct bch_fs *c, unsigned long ip),
 TP_ARGS(c, ip),

 TP_STRUCT__entry(
  __field(dev_t,  dev )
  __field(unsigned long, ip )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __entry->ip  = ip;
 ),

 TP_printk("%d,%d for %pS",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    (void *) __entry->ip)
);

/* io.c: */

DEFINE_EVENT(bio, io_read_promote,
 TP_PROTO(struct bio *bio),
 TP_ARGS(bio)
);

TRACE_EVENT(io_read_nopromote,
 TP_PROTO(struct bch_fs *c, int ret),
 TP_ARGS(c, ret),

 TP_STRUCT__entry(
  __field(dev_t,  dev  )
  __array(char,  ret, 32  )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  strscpy(__entry->ret, bch2_err_str(ret), sizeof(__entry->ret));
 ),

 TP_printk("%d,%d ret %s",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->ret)
);

DEFINE_EVENT(bio, io_read_bounce,
 TP_PROTO(struct bio *bio),
 TP_ARGS(bio)
);

DEFINE_EVENT(bio, io_read_split,
 TP_PROTO(struct bio *bio),
 TP_ARGS(bio)
);

DEFINE_EVENT(bio, io_read_retry,
 TP_PROTO(struct bio *bio),
 TP_ARGS(bio)
);

DEFINE_EVENT(bio, io_read_reuse_race,
 TP_PROTO(struct bio *bio),
 TP_ARGS(bio)
);

DEFINE_EVENT(bio, io_read_fail_and_poison,
 TP_PROTO(struct bio *bio),
 TP_ARGS(bio)
);

/* ec.c */

TRACE_EVENT(stripe_create,
 TP_PROTO(struct bch_fs *c, u64 idx, int ret),
 TP_ARGS(c, idx, ret),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(u64,  idx   )
  __field(int,  ret   )
 ),

 TP_fast_assign(
  __entry->dev   = c->dev;
  __entry->idx   = idx;
  __entry->ret   = ret;
 ),

 TP_printk("%d,%d idx %llu ret %i",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->idx,
    __entry->ret)
);

/* Journal */

DEFINE_EVENT(bch_fs, journal_full,
 TP_PROTO(struct bch_fs *c),
 TP_ARGS(c)
);

DEFINE_EVENT(fs_str, journal_entry_full,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, journal_entry_close,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(bio, journal_write,
 TP_PROTO(struct bio *bio),
 TP_ARGS(bio)
);

TRACE_EVENT(journal_reclaim_start,
 TP_PROTO(struct bch_fs *c, bool direct, bool kicked,
   u64 min_nr, u64 min_key_cache,
   u64 btree_cache_dirty, u64 btree_cache_total,
   u64 btree_key_cache_dirty, u64 btree_key_cache_total),
 TP_ARGS(c, direct, kicked, min_nr, min_key_cache,
  btree_cache_dirty, btree_cache_total,
  btree_key_cache_dirty, btree_key_cache_total),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(bool,  direct   )
  __field(bool,  kicked   )
  __field(u64,  min_nr   )
  __field(u64,  min_key_cache  )
  __field(u64,  btree_cache_dirty )
  __field(u64,  btree_cache_total )
  __field(u64,  btree_key_cache_dirty )
  __field(u64,  btree_key_cache_total )
 ),

 TP_fast_assign(
  __entry->dev   = c->dev;
  __entry->direct   = direct;
  __entry->kicked   = kicked;
  __entry->min_nr   = min_nr;
  __entry->min_key_cache  = min_key_cache;
  __entry->btree_cache_dirty = btree_cache_dirty;
  __entry->btree_cache_total = btree_cache_total;
  __entry->btree_key_cache_dirty = btree_key_cache_dirty;
  __entry->btree_key_cache_total = btree_key_cache_total;
 ),

 TP_printk("%d,%d direct %u kicked %u min %llu key cache %llu btree cache %llu/%llu key cache %llu/%llu",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->direct,
    __entry->kicked,
    __entry->min_nr,
    __entry->min_key_cache,
    __entry->btree_cache_dirty,
    __entry->btree_cache_total,
    __entry->btree_key_cache_dirty,
    __entry->btree_key_cache_total)
);

TRACE_EVENT(journal_reclaim_finish,
 TP_PROTO(struct bch_fs *c, u64 nr_flushed),
 TP_ARGS(c, nr_flushed),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(u64,  nr_flushed  )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __entry->nr_flushed = nr_flushed;
 ),

 TP_printk("%d,%d flushed %llu",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->nr_flushed)
);

/* bset.c: */

DEFINE_EVENT(bpos, bkey_pack_pos_fail,
 TP_PROTO(const struct bpos *p),
 TP_ARGS(p)
);

/* Btree cache: */

TRACE_EVENT(btree_cache_scan,
 TP_PROTO(long nr_to_scan, long can_free, long ret),
 TP_ARGS(nr_to_scan, can_free, ret),

 TP_STRUCT__entry(
  __field(long, nr_to_scan  )
  __field(long, can_free  )
  __field(long, ret   )
 ),

 TP_fast_assign(
  __entry->nr_to_scan = nr_to_scan;
  __entry->can_free = can_free;
  __entry->ret  = ret;
 ),

 TP_printk("scanned for %li nodes, can free %li, ret %li",
    __entry->nr_to_scan, __entry->can_free, __entry->ret)
);

DEFINE_EVENT(btree_node_nofs, btree_cache_reap,
 TP_PROTO(struct bch_fs *c, struct btree *b),
 TP_ARGS(c, b)
);

DEFINE_EVENT(btree_trans, btree_cache_cannibalize_lock_fail,
 TP_PROTO(struct btree_trans *trans),
 TP_ARGS(trans)
);

DEFINE_EVENT(btree_trans, btree_cache_cannibalize_lock,
 TP_PROTO(struct btree_trans *trans),
 TP_ARGS(trans)
);

DEFINE_EVENT(btree_trans, btree_cache_cannibalize,
 TP_PROTO(struct btree_trans *trans),
 TP_ARGS(trans)
);

DEFINE_EVENT(btree_trans, btree_cache_cannibalize_unlock,
 TP_PROTO(struct btree_trans *trans),
 TP_ARGS(trans)
);

/* Btree */

DEFINE_EVENT(btree_node, btree_node_read,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b)
);

TRACE_EVENT(btree_node_write,
 TP_PROTO(struct btree *b, unsigned bytes, unsigned sectors),
 TP_ARGS(b, bytes, sectors),

 TP_STRUCT__entry(
  __field(enum btree_node_type, type)
  __field(unsigned, bytes   )
  __field(unsigned, sectors   )
 ),

 TP_fast_assign(
  __entry->type = btree_node_type(b);
  __entry->bytes = bytes;
  __entry->sectors = sectors;
 ),

 TP_printk("bkey type %u bytes %u sectors %u",
    __entry->type , __entry->bytes, __entry->sectors)
);

DEFINE_EVENT(btree_node, btree_node_alloc,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b)
);

DEFINE_EVENT(btree_node, btree_node_free,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b)
);

TRACE_EVENT(btree_reserve_get_fail,
 TP_PROTO(const char *trans_fn,
   unsigned long caller_ip,
   size_t required,
   int ret),
 TP_ARGS(trans_fn, caller_ip, required, ret),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __field(size_t,   required )
  __array(char,   ret, 32  )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans_fn, sizeof(__entry->trans_fn));
  __entry->caller_ip = caller_ip;
  __entry->required = required;
  strscpy(__entry->ret, bch2_err_str(ret), sizeof(__entry->ret));
 ),

 TP_printk("%s %pS required %zu ret %s",
    __entry->trans_fn,
    (void *) __entry->caller_ip,
    __entry->required,
    __entry->ret)
);

DEFINE_EVENT(btree_node, btree_node_compact,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b)
);

DEFINE_EVENT(btree_node, btree_node_merge,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b)
);

DEFINE_EVENT(btree_node, btree_node_split,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b)
);

DEFINE_EVENT(btree_node, btree_node_rewrite,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b)
);

DEFINE_EVENT(btree_node, btree_node_set_root,
 TP_PROTO(struct btree_trans *trans, struct btree *b),
 TP_ARGS(trans, b)
);

TRACE_EVENT(btree_path_relock_fail,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path,
   unsigned level),
 TP_ARGS(trans, caller_ip, path, level),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __field(u8,   btree_id )
  __field(u8,   level  )
  __field(u8,   path_idx)
  TRACE_BPOS_entries(pos)
  __array(char,   node, 24 )
  __field(u8,   self_read_count )
  __field(u8,   self_intent_count)
  __field(u8,   read_count )
  __field(u8,   intent_count )
  __field(u32,   iter_lock_seq )
  __field(u32,   node_lock_seq )
 ),

 TP_fast_assign(
  struct btree *b = btree_path_node(path, level);
  struct six_lock_count c;

  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
  __entry->btree_id  = path->btree_id;
  __entry->level   = level;
  __entry->path_idx  = path - trans->paths;
  TRACE_BPOS_assign(pos, path->pos);

  c = bch2_btree_node_lock_counts(trans, NULL, &path->l[level].b->c, level);
  __entry->self_read_count = c.n[SIX_LOCK_read];
  __entry->self_intent_count = c.n[SIX_LOCK_intent];

  if (IS_ERR(b)) {
   strscpy(__entry->node, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node));
  } else {
   c = six_lock_counts(&path->l[level].b->c.lock);
   __entry->read_count = c.n[SIX_LOCK_read];
   __entry->intent_count = c.n[SIX_LOCK_intent];
   scnprintf(__entry->node, sizeof(__entry->node), "%px", &b->c);
  }
  __entry->iter_lock_seq  = path->l[level].lock_seq;
  __entry->node_lock_seq  = is_btree_node(path, level)
   ? six_lock_seq(&path->l[level].b->c.lock)
   : 0;
 ),

 TP_printk("%s %pS\nidx %2u btree %s pos %llu:%llu:%u level %u node %s held %u:%u lock count %u:%u iter seq %u lock seq %u",
    __entry->trans_fn,
    (void *) __entry->caller_ip,
    __entry->path_idx,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot,
    __entry->level,
    __entry->node,
    __entry->self_read_count,
    __entry->self_intent_count,
    __entry->read_count,
    __entry->intent_count,
    __entry->iter_lock_seq,
    __entry->node_lock_seq)
);

TRACE_EVENT(btree_path_upgrade_fail,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path,
   unsigned level),
 TP_ARGS(trans, caller_ip, path, level),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __field(u8,   btree_id )
  __field(u8,   level  )
  __field(u8,   path_idx)
  TRACE_BPOS_entries(pos)
  __field(u8,   locked  )
  __field(u8,   self_read_count )
  __field(u8,   self_intent_count)
  __field(u8,   read_count )
  __field(u8,   intent_count )
  __field(u32,   iter_lock_seq )
  __field(u32,   node_lock_seq )
 ),

 TP_fast_assign(
  struct six_lock_count c;

  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
  __entry->btree_id  = path->btree_id;
  __entry->level   = level;
  __entry->path_idx  = path - trans->paths;
  TRACE_BPOS_assign(pos, path->pos);
  __entry->locked   = btree_node_locked(path, level);

  c = bch2_btree_node_lock_counts(trans, NULL, &path->l[level].b->c, level),
  __entry->self_read_count = c.n[SIX_LOCK_read];
  __entry->self_intent_count = c.n[SIX_LOCK_intent];
  c = six_lock_counts(&path->l[level].b->c.lock);
  __entry->read_count  = c.n[SIX_LOCK_read];
  __entry->intent_count  = c.n[SIX_LOCK_intent];
  __entry->iter_lock_seq  = path->l[level].lock_seq;
  __entry->node_lock_seq  = is_btree_node(path, level)
   ? six_lock_seq(&path->l[level].b->c.lock)
   : 0;
 ),

 TP_printk("%s %pS\nidx %2u btree %s pos %llu:%llu:%u level %u locked %u held %u:%u lock count %u:%u iter seq %u lock seq %u",
    __entry->trans_fn,
    (void *) __entry->caller_ip,
    __entry->path_idx,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot,
    __entry->level,
    __entry->locked,
    __entry->self_read_count,
    __entry->self_intent_count,
    __entry->read_count,
    __entry->intent_count,
    __entry->iter_lock_seq,
    __entry->node_lock_seq)
);

/* Garbage collection */

DEFINE_EVENT(bch_fs, gc_gens_start,
 TP_PROTO(struct bch_fs *c),
 TP_ARGS(c)
);

DEFINE_EVENT(bch_fs, gc_gens_end,
 TP_PROTO(struct bch_fs *c),
 TP_ARGS(c)
);

/* Allocator */

DEFINE_EVENT(fs_str, bucket_alloc,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, bucket_alloc_fail,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DECLARE_EVENT_CLASS(discard_buckets_class,
 TP_PROTO(struct bch_fs *c, u64 seen, u64 open,
   u64 need_journal_commit, u64 discarded, const char *err),
 TP_ARGS(c, seen, open, need_journal_commit, discarded, err),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(u64,  seen   )
  __field(u64,  open   )
  __field(u64,  need_journal_commit )
  __field(u64,  discarded  )
  __array(char,  err, 16  )
 ),

 TP_fast_assign(
  __entry->dev   = c->dev;
  __entry->seen   = seen;
  __entry->open   = open;
  __entry->need_journal_commit = need_journal_commit;
  __entry->discarded  = discarded;
  strscpy(__entry->err, err, sizeof(__entry->err));
 ),

 TP_printk("%d%d seen %llu open %llu need_journal_commit %llu discarded %llu err %s",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->seen,
    __entry->open,
    __entry->need_journal_commit,
    __entry->discarded,
    __entry->err)
);

DEFINE_EVENT(discard_buckets_class, discard_buckets,
 TP_PROTO(struct bch_fs *c, u64 seen, u64 open,
   u64 need_journal_commit, u64 discarded, const char *err),
 TP_ARGS(c, seen, open, need_journal_commit, discarded, err)
);

DEFINE_EVENT(discard_buckets_class, discard_buckets_fast,
 TP_PROTO(struct bch_fs *c, u64 seen, u64 open,
   u64 need_journal_commit, u64 discarded, const char *err),
 TP_ARGS(c, seen, open, need_journal_commit, discarded, err)
);

TRACE_EVENT(bucket_invalidate,
 TP_PROTO(struct bch_fs *c, unsigned dev, u64 bucket, u32 sectors),
 TP_ARGS(c, dev, bucket, sectors),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(u32,  dev_idx   )
  __field(u32,  sectors   )
  __field(u64,  bucket   )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __entry->dev_idx = dev;
  __entry->sectors = sectors;
  __entry->bucket  = bucket;
 ),

 TP_printk("%d:%d invalidated %u:%llu cached sectors %u",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->dev_idx, __entry->bucket,
    __entry->sectors)
);

/* Moving IO */

DEFINE_EVENT(fs_str, io_move,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_read,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_write,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_finish,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_fail,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_write_fail,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_start_fail,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

TRACE_EVENT(move_data,
 TP_PROTO(struct bch_fs *c,
   struct bch_move_stats *stats),
 TP_ARGS(c, stats),

 TP_STRUCT__entry(
  __field(dev_t,  dev  )
  __field(u64,  keys_moved )
  __field(u64,  keys_raced )
  __field(u64,  sectors_seen )
  __field(u64,  sectors_moved )
  __field(u64,  sectors_raced )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __entry->keys_moved = atomic64_read(&stats->keys_moved);
  __entry->keys_raced = atomic64_read(&stats->keys_raced);
  __entry->sectors_seen = atomic64_read(&stats->sectors_seen);
  __entry->sectors_moved = atomic64_read(&stats->sectors_moved);
  __entry->sectors_raced = atomic64_read(&stats->sectors_raced);
 ),

 TP_printk("%d,%d keys moved %llu raced %llu"
    "sectors seen %llu moved %llu raced %llu",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->keys_moved,
    __entry->keys_raced,
    __entry->sectors_seen,
    __entry->sectors_moved,
    __entry->sectors_raced)
);

TRACE_EVENT(copygc,
 TP_PROTO(struct bch_fs *c,
   u64 buckets,
   u64 sectors_seen,
   u64 sectors_moved),
 TP_ARGS(c, buckets, sectors_seen, sectors_moved),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(u64,  buckets   )
  __field(u64,  sectors_seen  )
  __field(u64,  sectors_moved  )
 ),

 TP_fast_assign(
  __entry->dev   = c->dev;
  __entry->buckets  = buckets;
  __entry->sectors_seen  = sectors_seen;
  __entry->sectors_moved  = sectors_moved;
 ),

 TP_printk("%d,%d buckets %llu sectors seen %llu moved %llu",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->buckets,
    __entry->sectors_seen,
    __entry->sectors_moved)
);

TRACE_EVENT(copygc_wait,
 TP_PROTO(struct bch_fs *c,
   u64 wait_amount, u64 until),
 TP_ARGS(c, wait_amount, until),

 TP_STRUCT__entry(
  __field(dev_t,  dev   )
  __field(u64,  wait_amount  )
  __field(u64,  until   )
 ),

 TP_fast_assign(
  __entry->dev  = c->dev;
  __entry->wait_amount = wait_amount;
  __entry->until  = until;
 ),

 TP_printk("%d,%u waiting for %llu sectors until %llu",
    MAJOR(__entry->dev), MINOR(__entry->dev),
    __entry->wait_amount, __entry->until)
);

/* btree transactions: */

DECLARE_EVENT_CLASS(transaction_event,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
 ),

 TP_printk("%s %pS", __entry->trans_fn, (void *) __entry->caller_ip)
);

DEFINE_EVENT(transaction_event, transaction_commit,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip)
);

DEFINE_EVENT(transaction_event, trans_restart_injected,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip)
);

TRACE_EVENT(trans_restart_split_race,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree *b),
 TP_ARGS(trans, caller_ip, b),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __field(u8,   level  )
  __field(u16,   written  )
  __field(u16,   blocks  )
  __field(u16,   u64s_remaining )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
  __entry->level  = b->c.level;
  __entry->written = b->written;
  __entry->blocks  = btree_blocks(trans->c);
  __entry->u64s_remaining = bch2_btree_keys_u64s_remaining(b);
 ),

 TP_printk("%s %pS l=%u written %u/%u u64s remaining %u",
    __entry->trans_fn, (void *) __entry->caller_ip,
    __entry->level,
    __entry->written, __entry->blocks,
    __entry->u64s_remaining)
);

TRACE_EVENT(trans_blocked_journal_reclaim,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )

  __field(unsigned long,  key_cache_nr_keys )
  __field(unsigned long,  key_cache_nr_dirty )
  __field(long,   must_wait  )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
  __entry->key_cache_nr_keys = atomic_long_read(&trans->c->btree_key_cache.nr_keys);
  __entry->key_cache_nr_dirty = atomic_long_read(&trans->c->btree_key_cache.nr_dirty);
  __entry->must_wait  = __bch2_btree_key_cache_must_wait(trans->c);
 ),

 TP_printk("%s %pS key cache keys %lu dirty %lu must_wait %li",
    __entry->trans_fn, (void *) __entry->caller_ip,
    __entry->key_cache_nr_keys,
    __entry->key_cache_nr_dirty,
    __entry->must_wait)
);

#if 0
/* todo: bring back dynamic fault injection */
DEFINE_EVENT(transaction_event, trans_restart_fault_inject,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip)
);
#endif

DEFINE_EVENT(transaction_event, trans_traverse_all,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip)
);

DEFINE_EVENT(transaction_event, trans_restart_key_cache_raced,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip)
);

DEFINE_EVENT(trans_str, trans_restart_too_many_iters,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   const char *paths),
 TP_ARGS(trans, caller_ip, paths)
);

DECLARE_EVENT_CLASS(transaction_restart_iter,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __field(u8,   btree_id )
  TRACE_BPOS_entries(pos)
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
  __entry->btree_id  = path->btree_id;
  TRACE_BPOS_assign(pos, path->pos)
 ),

 TP_printk("%s %pS btree %s pos %llu:%llu:%u",
    __entry->trans_fn,
    (void *) __entry->caller_ip,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot)
);

DEFINE_EVENT(transaction_restart_iter, trans_restart_btree_node_reused,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path)
);

DEFINE_EVENT(transaction_restart_iter, trans_restart_btree_node_split,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path)
);

DEFINE_EVENT(fs_str, trans_restart_upgrade,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(trans_str, trans_restart_relock,
 TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *str),
 TP_ARGS(trans, caller_ip, str)
);

DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_next_node,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path)
);

DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_parent_for_fill,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path)
);

DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_key_cache_fill,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path)
);

DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_path,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path)
);

DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_path_intent,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path)
);

DEFINE_EVENT(transaction_restart_iter, trans_restart_memory_allocation_failure,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path),
 TP_ARGS(trans, caller_ip, path)
);

DEFINE_EVENT(trans_str_nocaller, trans_restart_would_deadlock,
 TP_PROTO(struct btree_trans *trans,
   const char *cycle),
 TP_ARGS(trans, cycle)
);

DEFINE_EVENT(transaction_event, trans_restart_would_deadlock_recursion_limit,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip)
);

TRACE_EVENT(trans_restart_would_deadlock_write,
 TP_PROTO(struct btree_trans *trans),
 TP_ARGS(trans),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
 ),

 TP_printk("%s", __entry->trans_fn)
);

TRACE_EVENT(trans_restart_mem_realloced,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   unsigned long bytes),
 TP_ARGS(trans, caller_ip, bytes),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __field(unsigned long,  bytes  )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip = caller_ip;
  __entry->bytes  = bytes;
 ),

 TP_printk("%s %pS bytes %lu",
    __entry->trans_fn,
    (void *) __entry->caller_ip,
    __entry->bytes)
);

DEFINE_EVENT(transaction_event, trans_restart_write_buffer_flush,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip),
 TP_ARGS(trans, caller_ip)
);

TRACE_EVENT(path_downgrade,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_path *path,
   unsigned old_locks_want),
 TP_ARGS(trans, caller_ip, path, old_locks_want),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __field(unsigned,  old_locks_want )
  __field(unsigned,  new_locks_want )
  __field(unsigned,  btree  )
  TRACE_BPOS_entries(pos)
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
  __entry->old_locks_want  = old_locks_want;
  __entry->new_locks_want  = path->locks_want;
  __entry->btree   = path->btree_id;
  TRACE_BPOS_assign(pos, path->pos);
 ),

 TP_printk("%s %pS locks_want %u -> %u %s %llu:%llu:%u",
    __entry->trans_fn,
    (void *) __entry->caller_ip,
    __entry->old_locks_want,
    __entry->new_locks_want,
    bch2_btree_id_str(__entry->btree),
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot)
);

TRACE_EVENT(key_cache_fill,
 TP_PROTO(struct btree_trans *trans, const char *key),
 TP_ARGS(trans, key),

 TP_STRUCT__entry(
  __array(char,  trans_fn, 32 )
  __string(key,  key   )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __assign_str(key);
 ),

 TP_printk("%s %s", __entry->trans_fn, __get_str(key))
);

TRACE_EVENT(write_buffer_flush,
 TP_PROTO(struct btree_trans *trans, size_t nr, size_t skipped, size_t fast, size_t size),
 TP_ARGS(trans, nr, skipped, fast, size),

 TP_STRUCT__entry(
  __field(size_t,  nr  )
  __field(size_t,  skipped  )
  __field(size_t,  fast  )
  __field(size_t,  size  )
 ),

 TP_fast_assign(
  __entry->nr = nr;
  __entry->skipped = skipped;
  __entry->fast = fast;
  __entry->size = size;
 ),

 TP_printk("%zu/%zu skipped %zu fast %zu",
    __entry->nr, __entry->size, __entry->skipped, __entry->fast)
);

TRACE_EVENT(write_buffer_flush_sync,
 TP_PROTO(struct btree_trans *trans, unsigned long caller_ip),
 TP_ARGS(trans, caller_ip),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
 ),

 TP_printk("%s %pS", __entry->trans_fn, (void *) __entry->caller_ip)
);

TRACE_EVENT(write_buffer_flush_slowpath,
 TP_PROTO(struct btree_trans *trans, size_t slowpath, size_t total),
 TP_ARGS(trans, slowpath, total),

 TP_STRUCT__entry(
  __field(size_t,  slowpath )
  __field(size_t,  total  )
 ),

 TP_fast_assign(
  __entry->slowpath = slowpath;
  __entry->total  = total;
 ),

 TP_printk("%zu/%zu", __entry->slowpath, __entry->total)
);

TRACE_EVENT(write_buffer_maybe_flush,
 TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *key),
 TP_ARGS(trans, caller_ip, key),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __string(key,   key  )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __assign_str(key);
 ),

 TP_printk("%s %pS %s", __entry->trans_fn, (void *) __entry->caller_ip, __get_str(key))
);

DEFINE_EVENT(fs_str, rebalance_extent,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, data_update,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_pred,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_created_rebalance,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, io_move_evacuate_bucket,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, extent_trim_atomic,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, btree_iter_peek_slot,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, __btree_iter_peek,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, btree_iter_peek_max,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

DEFINE_EVENT(fs_str, btree_iter_peek_prev_min,
 TP_PROTO(struct bch_fs *c, const char *str),
 TP_ARGS(c, str)
);

#ifdef CONFIG_BCACHEFS_PATH_TRACEPOINTS

TRACE_EVENT(update_by_path,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path,
   struct btree_insert_entry *i, bool overwrite),
 TP_ARGS(trans, path, i, overwrite),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(btree_path_idx_t, path_idx )
  __field(u8,   btree_id )
  TRACE_BPOS_entries(pos)
  __field(u8,   overwrite )
  __field(btree_path_idx_t, update_idx )
  __field(btree_path_idx_t, nr_updates )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->path_idx  = path - trans->paths;
  __entry->btree_id  = path->btree_id;
  TRACE_BPOS_assign(pos, path->pos);
  __entry->overwrite  = overwrite;
  __entry->update_idx  = i - trans->updates;
  __entry->nr_updates  = trans->nr_updates;
 ),

 TP_printk("%s path %3u btree %s pos %llu:%llu:%u overwrite %u update %u/%u",
    __entry->trans_fn,
    __entry->path_idx,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot,
    __entry->overwrite,
    __entry->update_idx,
    __entry->nr_updates)
);

TRACE_EVENT(btree_path_lock,
 TP_PROTO(struct btree_trans *trans,
   unsigned long caller_ip,
   struct btree_bkey_cached_common *b),
 TP_ARGS(trans, caller_ip, b),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(unsigned long,  caller_ip )
  __field(u8,   btree_id )
  __field(u8,   level  )
  __array(char,   node, 24 )
  __field(u32,   lock_seq )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
  __entry->caller_ip  = caller_ip;
  __entry->btree_id  = b->btree_id;
  __entry->level   = b->level;

  scnprintf(__entry->node, sizeof(__entry->node), "%px", b);
  __entry->lock_seq  = six_lock_seq(&b->lock);
 ),

 TP_printk("%s %pS\nbtree %s level %u node %s lock seq %u",
    __entry->trans_fn,
    (void *) __entry->caller_ip,
    bch2_btree_id_str(__entry->btree_id),
    __entry->level,
    __entry->node,
    __entry->lock_seq)
);

DECLARE_EVENT_CLASS(btree_path_ev,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path),
 TP_ARGS(trans, path),

 TP_STRUCT__entry(
  __field(u16,   idx  )
  __field(u8,   ref  )
  __field(u8,   btree_id )
  TRACE_BPOS_entries(pos)
 ),

 TP_fast_assign(
  __entry->idx   = path - trans->paths;
  __entry->ref   = path->ref;
  __entry->btree_id  = path->btree_id;
  TRACE_BPOS_assign(pos, path->pos);
 ),

 TP_printk("path %3u ref %u btree %s pos %llu:%llu:%u",
    __entry->idx, __entry->ref,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot)
);

DEFINE_EVENT(btree_path_ev, btree_path_get_ll,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path),
 TP_ARGS(trans, path)
);

DEFINE_EVENT(btree_path_ev, btree_path_put_ll,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path),
 TP_ARGS(trans, path)
);

DEFINE_EVENT(btree_path_ev, btree_path_should_be_locked,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path),
 TP_ARGS(trans, path)
);

TRACE_EVENT(btree_path_alloc,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path),
 TP_ARGS(trans, path),

 TP_STRUCT__entry(
  __field(btree_path_idx_t, idx  )
  __field(u8,   locks_want )
  __field(u8,   btree_id )
  TRACE_BPOS_entries(pos)
 ),

 TP_fast_assign(
  __entry->idx   = path - trans->paths;
  __entry->locks_want  = path->locks_want;
  __entry->btree_id  = path->btree_id;
  TRACE_BPOS_assign(pos, path->pos);
 ),

 TP_printk("path %3u btree %s locks_want %u pos %llu:%llu:%u",
    __entry->idx,
    bch2_btree_id_str(__entry->btree_id),
    __entry->locks_want,
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot)
);

TRACE_EVENT(btree_path_get,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path, struct bpos *new_pos),
 TP_ARGS(trans, path, new_pos),

 TP_STRUCT__entry(
  __field(btree_path_idx_t, idx  )
  __field(u8,   ref  )
  __field(u8,   preserve )
  __field(u8,   locks_want )
  __field(u8,   btree_id )
  TRACE_BPOS_entries(old_pos)
  TRACE_BPOS_entries(new_pos)
 ),

 TP_fast_assign(
  __entry->idx   = path - trans->paths;
  __entry->ref   = path->ref;
  __entry->preserve  = path->preserve;
  __entry->locks_want  = path->locks_want;
  __entry->btree_id  = path->btree_id;
  TRACE_BPOS_assign(old_pos, path->pos);
  TRACE_BPOS_assign(new_pos, *new_pos);
 ),

 TP_printk(" path %3u ref %u preserve %u btree %s locks_want %u pos %llu:%llu:%u -> %llu:%llu:%u",
    __entry->idx,
    __entry->ref,
    __entry->preserve,
    bch2_btree_id_str(__entry->btree_id),
    __entry->locks_want,
    __entry->old_pos_inode,
    __entry->old_pos_offset,
    __entry->old_pos_snapshot,
    __entry->new_pos_inode,
    __entry->new_pos_offset,
    __entry->new_pos_snapshot)
);

DECLARE_EVENT_CLASS(btree_path_clone,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path, struct btree_path *new),
 TP_ARGS(trans, path, new),

 TP_STRUCT__entry(
  __field(btree_path_idx_t, idx  )
  __field(u8,   new_idx  )
  __field(u8,   btree_id )
  __field(u8,   ref  )
  __field(u8,   preserve )
  TRACE_BPOS_entries(pos)
 ),

 TP_fast_assign(
  __entry->idx   = path - trans->paths;
  __entry->new_idx  = new - trans->paths;
  __entry->btree_id  = path->btree_id;
  __entry->ref   = path->ref;
  __entry->preserve  = path->preserve;
  TRACE_BPOS_assign(pos, path->pos);
 ),

 TP_printk(" path %3u ref %u preserve %u btree %s %llu:%llu:%u -> %u",
    __entry->idx,
    __entry->ref,
    __entry->preserve,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot,
    __entry->new_idx)
);

DEFINE_EVENT(btree_path_clone, btree_path_clone,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path, struct btree_path *new),
 TP_ARGS(trans, path, new)
);

DEFINE_EVENT(btree_path_clone, btree_path_save_pos,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path, struct btree_path *new),
 TP_ARGS(trans, path, new)
);

DECLARE_EVENT_CLASS(btree_path_traverse,
 TP_PROTO(struct btree_trans *trans,
   struct btree_path *path),
 TP_ARGS(trans, path),

 TP_STRUCT__entry(
  __array(char,   trans_fn, 32 )
  __field(btree_path_idx_t, idx  )
  __field(u8,   ref  )
  __field(u8,   preserve )
  __field(u8,   should_be_locked )
  __field(u8,   btree_id )
  __field(u8,   level  )
  TRACE_BPOS_entries(pos)
  __field(u8,   locks_want )
  __field(u8,   nodes_locked )
  __array(char,   node0, 24 )
  __array(char,   node1, 24 )
  __array(char,   node2, 24 )
  __array(char,   node3, 24 )
 ),

 TP_fast_assign(
  strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));

  __entry->idx   = path - trans->paths;
  __entry->ref   = path->ref;
  __entry->preserve  = path->preserve;
  __entry->btree_id  = path->btree_id;
  __entry->level   = path->level;
  TRACE_BPOS_assign(pos, path->pos);

  __entry->locks_want  = path->locks_want;
  __entry->nodes_locked  = path->nodes_locked;
  struct btree *b = path->l[0].b;
  if (IS_ERR(b))
   strscpy(__entry->node0, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));
  else
   scnprintf(__entry->node0, sizeof(__entry->node0), "%px", &b->c);
  b = path->l[1].b;
  if (IS_ERR(b))
   strscpy(__entry->node1, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));
  else
   scnprintf(__entry->node1, sizeof(__entry->node0), "%px", &b->c);
  b = path->l[2].b;
  if (IS_ERR(b))
   strscpy(__entry->node2, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));
  else
   scnprintf(__entry->node2, sizeof(__entry->node0), "%px", &b->c);
  b = path->l[3].b;
  if (IS_ERR(b))
   strscpy(__entry->node3, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));
  else
   scnprintf(__entry->node3, sizeof(__entry->node0), "%px", &b->c);
 ),

 TP_printk("%s\npath %3u ref %u preserve %u btree %s %llu:%llu:%u level %u locks_want %u\n"
    "locks %u %u %u %u node %s %s %s %s",
    __entry->trans_fn,
    __entry->idx,
    __entry->ref,
    __entry->preserve,
    bch2_btree_id_str(__entry->btree_id),
    __entry->pos_inode,
    __entry->pos_offset,
    __entry->pos_snapshot,
    __entry->level,
    __entry->locks_want,
    (__entry->nodes_locked >> 6) & 3,
    (__entry->nodes_locked >> 4) & 3,
    (__entry->nodes_locked >> 2) & 3,
    (__entry->nodes_locked >> 0) & 3,
    __entry->node3,
    __entry->node2,
    __entry->node1,
    __entry->node0)
);

DEFINE_EVENT(btree_path_traverse, btree_path_traverse_start,
 TP_PROTO(struct btree_trans *trans,
   struct btree_path *path),
 TP_ARGS(trans, path)
);

DEFINE_EVENT(btree_path_traverse, btree_path_traverse_end,
 TP_PROTO(struct btree_trans *trans, struct btree_path *path),
 TP_ARGS(trans, path)
);

TRACE_EVENT(btree_path_set_pos,
 TP_PROTO(struct btree_trans *trans,
   struct btree_path *path,
   struct bpos *new_pos),
 TP_ARGS(trans, path, new_pos),

 TP_STRUCT__entry(
  __field(btree_path_idx_t, idx  )
  __field(u8,   ref  )
  __field(u8,   preserve )
  __field(u8,   btree_id )
  TRACE_BPOS_entries(old_pos)
  TRACE_BPOS_entries(new_pos)
  __field(u8,   locks_want )
  __field(u8,   nodes_locked )
  __array(char,   node0, 24 )
  __array(char,   node1, 24 )
  __array(char,   node2, 24 )
  __array(char,   node3, 24 )
 ),

 TP_fast_assign(
  __entry->idx   = path - trans->paths;
  __entry->ref   = path->ref;
  __entry->preserve  = path->preserve;
  __entry->btree_id  = path->btree_id;
  TRACE_BPOS_assign(old_pos, path->pos);
  TRACE_BPOS_assign(new_pos, *new_pos);

  __entry->nodes_locked  = path->nodes_locked;
  struct btree *b = path->l[0].b;
  if (IS_ERR(b))
   strscpy(__entry->node0, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));
  else
   scnprintf(__entry->node0, sizeof(__entry->node0), "%px", &b->c);
  b = path->l[1].b;
  if (IS_ERR(b))
   strscpy(__entry->node1, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));
  else
   scnprintf(__entry->node1, sizeof(__entry->node0), "%px", &b->c);
  b = path->l[2].b;
  if (IS_ERR(b))
   strscpy(__entry->node2, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));
  else
   scnprintf(__entry->node2, sizeof(__entry->node0), "%px", &b->c);
  b = path->l[3].b;
  if (IS_ERR(b))
   strscpy(__entry->node3, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));
  else
   scnprintf(__entry->node3, sizeof(__entry->node0), "%px", &b->c);
 ),

 TP_printk("\npath %3u ref %u preserve %u btree %s %llu:%llu:%u -> %llu:%llu:%u\n"
    "locks %u %u %u %u node %s %s %s %s",
    __entry->idx,
    __entry->ref,
    __entry->preserve,
    bch2_btree_id_str(__entry->btree_id),
    __entry->old_pos_inode,
    __entry->old_pos_offset,
    __entry->old_pos_snapshot,
    __entry->new_pos_inode,
    __entry->new_pos_offset,
    __entry->new_pos_snapshot,
    (__entry->nodes_locked >> 6) & 3,
    (__entry->nodes_locked >> 4) & 3,
    (__entry->nodes_locked >> 2) & 3,
    (__entry->nodes_locked >> 0) & 3,
    __entry->node3,
    __entry->node2,
    __entry->node1,
    __entry->node0)
);

TRACE_EVENT(btree_path_free,
 TP_PROTO(struct btree_trans *trans, btree_path_idx_t path, struct btree_path *dup),
 TP_ARGS(trans, path, dup),

 TP_STRUCT__entry(
  __field(btree_path_idx_t, idx  )
  __field(u8,   preserve )
  __field(u8,   should_be_locked)
  __field(s8,   dup  )
  __field(u8,   dup_locked )
 ),

 TP_fast_assign(
  __entry->idx   = path;
  __entry->preserve  = trans->paths[path].preserve;
  __entry->should_be_locked = trans->paths[path].should_be_locked;
  __entry->dup   = dup ? dup - trans->paths  : -1;
  __entry->dup_locked  = dup ? btree_node_locked(dup, dup->level) : 0;
 ),

 TP_printk(" path %3u %c %c dup %2i locked %u", __entry->idx,
    __entry->preserve ? 'P' : ' ',
    __entry->should_be_locked ? 'S' : ' ',
    __entry->dup,
    __entry->dup_locked)
);

#else /* CONFIG_BCACHEFS_PATH_TRACEPOINTS */
#ifndef _TRACE_BCACHEFS_H

static inline void trace_update_by_path(struct btree_trans *trans, struct btree_path *path,
     struct btree_insert_entry *i, bool overwrite) {}
static inline void trace_btree_path_lock(struct btree_trans *trans, unsigned long caller_ip, struct btree_bkey_cached_common *b) {}
static inline void trace_btree_path_get_ll(struct btree_trans *trans, struct btree_path *path) {}
static inline void trace_btree_path_put_ll(struct btree_trans *trans, struct btree_path *path) {}
static inline void trace_btree_path_should_be_locked(struct btree_trans *trans, struct btree_path *path) {}
static inline void trace_btree_path_alloc(struct btree_trans *trans, struct btree_path *path) {}
static inline void trace_btree_path_get(struct btree_trans *trans, struct btree_path *path, struct bpos *new_pos) {}
static inline void trace_btree_path_clone(struct btree_trans *trans, struct btree_path *path, struct btree_path *new) {}
static inline void trace_btree_path_save_pos(struct btree_trans *trans, struct btree_path *path, struct btree_path *new) {}
static inline void trace_btree_path_traverse_start(struct btree_trans *trans, struct btree_path *path) {}
static inline void trace_btree_path_traverse_end(struct btree_trans *trans, struct btree_path *path) {}
static inline void trace_btree_path_set_pos(struct btree_trans *trans, struct btree_path *path, struct bpos *new_pos) {}
static inline void trace_btree_path_free(struct btree_trans *trans, btree_path_idx_t path, struct btree_path *dup) {}

#endif
#endif /* CONFIG_BCACHEFS_PATH_TRACEPOINTS */

#define _TRACE_BCACHEFS_H
#endif /* _TRACE_BCACHEFS_H */

/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH ../../fs/bcachefs

#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE trace

#include <trace/define_trace.h>

Messung V0.5
C=97 H=90 G=93

¤ Dauer der Verarbeitung: 0.14 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.