ret = btree_key_cache_create(trans, ck_path, k);
        if (ret)
                goto err;
+
+       if (trace_key_cache_fill_enabled()) {
+               struct printbuf buf = PRINTBUF;
+
+               bch2_bpos_to_text(&buf, ck_path->pos);
+               prt_char(&buf, ' ');
+               bch2_bkey_val_to_text(&buf, trans->c, k);
+               trace_key_cache_fill(trans, buf.buf);
+               printbuf_exit(&buf);
+       }
 out:
        /* We're not likely to need this iterator again: */
        bch2_set_btree_iter_dontneed(&iter);
 
                  __entry->new_u64s)
 );
 
+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,
                  __entry->pos_snapshot)
 );
 
-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(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_STRUCT__entry(
                __array(char,                   trans_fn, 32    )
                __field(unsigned long,          caller_ip       )
-               __string(key,           key                     )
+               __string(key,                   key             )
        ),
 
        TP_fast_assign(