Skip to content

Commit 32ed4a6

Browse files
koverstreetKent Overstreet
authored and
Kent Overstreet
committed
bcachefs: Btree path tracepoints
Fastpath tracepoints, rarely needed, only enabled with CONFIG_BCACHEFS_PATH_TRACEPOINTS. Signed-off-by: Kent Overstreet <[email protected]>
1 parent abbfc4d commit 32ed4a6

File tree

7 files changed

+508
-22
lines changed

7 files changed

+508
-22
lines changed

fs/bcachefs/Kconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ config BCACHEFS_SIX_OPTIMISTIC_SPIN
8787
is held by another thread, spin for a short while, as long as the
8888
thread owning the lock is running.
8989

90+
config BCACHEFS_PATH_TRACEPOINTS
91+
bool "Extra btree_path tracepoints"
92+
depends on BCACHEFS_FS
93+
help
94+
Enable extra tracepoints for debugging btree_path operations; we don't
95+
normally want these enabled because they happen at very high rates.
96+
9097
config MEAN_AND_VARIANCE_UNIT_TEST
9198
tristate "mean_and_variance unit tests" if !KUNIT_ALL_TESTS
9299
depends on KUNIT

fs/bcachefs/btree_iter.c

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,8 @@ int bch2_btree_path_traverse_one(struct btree_trans *trans,
11311131
if (unlikely(!trans->srcu_held))
11321132
bch2_trans_srcu_lock(trans);
11331133

1134+
trace_btree_path_traverse_start(trans, path);
1135+
11341136
/*
11351137
* Ensure we obey path->should_be_locked: if it's set, we can't unlock
11361138
* and re-traverse the path without a transaction restart:
@@ -1194,6 +1196,7 @@ int bch2_btree_path_traverse_one(struct btree_trans *trans,
11941196

11951197
out_uptodate:
11961198
path->uptodate = BTREE_ITER_UPTODATE;
1199+
trace_btree_path_traverse_end(trans, path);
11971200
out:
11981201
if (bch2_err_matches(ret, BCH_ERR_transaction_restart) != !!trans->restarted)
11991202
panic("ret %s (%i) trans->restarted %s (%i)\n",
@@ -1236,8 +1239,10 @@ __flatten
12361239
btree_path_idx_t __bch2_btree_path_make_mut(struct btree_trans *trans,
12371240
btree_path_idx_t path, bool intent, unsigned long ip)
12381241
{
1242+
struct btree_path *old = trans->paths + path;
12391243
__btree_path_put(trans, trans->paths + path, intent);
12401244
path = btree_path_clone(trans, path, intent, ip);
1245+
trace_btree_path_clone(trans, old, trans->paths + path);
12411246
trans->paths[path].preserve = false;
12421247
return path;
12431248
}
@@ -1252,6 +1257,8 @@ __bch2_btree_path_set_pos(struct btree_trans *trans,
12521257
bch2_trans_verify_not_in_restart(trans);
12531258
EBUG_ON(!trans->paths[path_idx].ref);
12541259

1260+
trace_btree_path_set_pos(trans, trans->paths + path_idx, &new_pos);
1261+
12551262
path_idx = bch2_btree_path_make_mut(trans, path_idx, intent, ip);
12561263

12571264
struct btree_path *path = trans->paths + path_idx;
@@ -1368,6 +1375,8 @@ void bch2_path_put(struct btree_trans *trans, btree_path_idx_t path_idx, bool in
13681375
? have_path_at_pos(trans, path)
13691376
: have_node_at_pos(trans, path);
13701377

1378+
trace_btree_path_free(trans, path_idx, dup);
1379+
13711380
if (!dup && !(!path->preserve && !is_btree_node(path, path->level)))
13721381
return;
13731382

@@ -1421,8 +1430,8 @@ void __noreturn bch2_trans_unlocked_error(struct btree_trans *trans)
14211430
noinline __cold
14221431
void bch2_trans_updates_to_text(struct printbuf *buf, struct btree_trans *trans)
14231432
{
1424-
prt_printf(buf, "transaction updates for %s journal seq %llu\n",
1425-
trans->fn, trans->journal_res.seq);
1433+
prt_printf(buf, "%u transaction updates for %s journal seq %llu\n",
1434+
trans->nr_updates, trans->fn, trans->journal_res.seq);
14261435
printbuf_indent_add(buf, 2);
14271436

14281437
trans_for_each_update(trans, i) {
@@ -1464,7 +1473,7 @@ static void bch2_btree_path_to_text_short(struct printbuf *out, struct btree_tra
14641473
{
14651474
struct btree_path *path = trans->paths + path_idx;
14661475

1467-
prt_printf(out, "path: idx %2u ref %u:%u %c %c %c btree=%s l=%u pos ",
1476+
prt_printf(out, "path: idx %3u ref %u:%u %c %c %c btree=%s l=%u pos ",
14681477
path_idx, path->ref, path->intent_ref,
14691478
path->preserve ? 'P' : ' ',
14701479
path->should_be_locked ? 'S' : ' ',
@@ -1716,6 +1725,8 @@ btree_path_idx_t bch2_path_get(struct btree_trans *trans,
17161725
trans->paths[path_pos].cached == cached &&
17171726
trans->paths[path_pos].btree_id == btree_id &&
17181727
trans->paths[path_pos].level == level) {
1728+
trace_btree_path_get(trans, trans->paths + path_pos, &pos);
1729+
17191730
__btree_path_get(trans, trans->paths + path_pos, intent);
17201731
path_idx = bch2_btree_path_set_pos(trans, path_pos, pos, intent, ip);
17211732
path = trans->paths + path_idx;
@@ -1738,6 +1749,8 @@ btree_path_idx_t bch2_path_get(struct btree_trans *trans,
17381749
path->ip_allocated = ip;
17391750
#endif
17401751
trans->paths_sorted = false;
1752+
1753+
trace_btree_path_alloc(trans, path);
17411754
}
17421755

17431756
if (!(flags & BTREE_ITER_nopreserve))
@@ -1857,7 +1870,7 @@ bch2_btree_iter_traverse(struct btree_iter *iter)
18571870

18581871
struct btree_path *path = btree_iter_path(trans, iter);
18591872
if (btree_path_node(path, path->level))
1860-
btree_path_set_should_be_locked(path);
1873+
btree_path_set_should_be_locked(trans, path);
18611874
return 0;
18621875
}
18631876

@@ -1889,7 +1902,7 @@ struct btree *bch2_btree_iter_peek_node(struct btree_iter *iter)
18891902
iter->path = bch2_btree_path_set_pos(trans, iter->path, b->key.k.p,
18901903
iter->flags & BTREE_ITER_intent,
18911904
btree_iter_ip_allocated(iter));
1892-
btree_path_set_should_be_locked(btree_iter_path(trans, iter));
1905+
btree_path_set_should_be_locked(trans, btree_iter_path(trans, iter));
18931906
out:
18941907
bch2_btree_iter_verify_entry_exit(iter);
18951908
bch2_btree_iter_verify(iter);
@@ -1983,7 +1996,7 @@ struct btree *bch2_btree_iter_next_node(struct btree_iter *iter)
19831996
iter->path = bch2_btree_path_set_pos(trans, iter->path, b->key.k.p,
19841997
iter->flags & BTREE_ITER_intent,
19851998
btree_iter_ip_allocated(iter));
1986-
btree_path_set_should_be_locked(btree_iter_path(trans, iter));
1999+
btree_path_set_should_be_locked(trans, btree_iter_path(trans, iter));
19872000
EBUG_ON(btree_iter_path(trans, iter)->uptodate);
19882001
out:
19892002
bch2_btree_iter_verify_entry_exit(iter);
@@ -2155,7 +2168,7 @@ struct bkey_s_c btree_trans_peek_key_cache(struct btree_iter *iter, struct bpos
21552168
if (unlikely(ret))
21562169
return bkey_s_c_err(ret);
21572170

2158-
btree_path_set_should_be_locked(trans->paths + iter->key_cache_path);
2171+
btree_path_set_should_be_locked(trans, trans->paths + iter->key_cache_path);
21592172

21602173
k = bch2_btree_path_peek_slot(trans->paths + iter->key_cache_path, &u);
21612174
if (k.k && !bkey_err(k)) {
@@ -2199,7 +2212,7 @@ static struct bkey_s_c __bch2_btree_iter_peek(struct btree_iter *iter, struct bp
21992212
goto out;
22002213
}
22012214

2202-
btree_path_set_should_be_locked(path);
2215+
btree_path_set_should_be_locked(trans, path);
22032216

22042217
k = btree_path_level_peek_all(trans->c, l, &iter->k);
22052218

@@ -2382,14 +2395,14 @@ struct bkey_s_c bch2_btree_iter_peek_upto(struct btree_iter *iter, struct bpos e
23822395
iter->flags & BTREE_ITER_intent,
23832396
btree_iter_ip_allocated(iter));
23842397

2385-
btree_path_set_should_be_locked(btree_iter_path(trans, iter));
2398+
btree_path_set_should_be_locked(trans, btree_iter_path(trans, iter));
23862399
out_no_locked:
23872400
if (iter->update_path) {
23882401
ret = bch2_btree_path_relock(trans, trans->paths + iter->update_path, _THIS_IP_);
23892402
if (unlikely(ret))
23902403
k = bkey_s_c_err(ret);
23912404
else
2392-
btree_path_set_should_be_locked(trans->paths + iter->update_path);
2405+
btree_path_set_should_be_locked(trans, trans->paths + iter->update_path);
23932406
}
23942407

23952408
if (!(iter->flags & BTREE_ITER_all_snapshots))
@@ -2511,6 +2524,7 @@ struct bkey_s_c bch2_btree_iter_peek_prev(struct btree_iter *iter)
25112524
iter->flags & BTREE_ITER_intent,
25122525
_THIS_IP_);
25132526
path = btree_iter_path(trans, iter);
2527+
trace_btree_path_save_pos(trans, path, trans->paths + saved_path);
25142528
saved_k = *k.k;
25152529
saved_v = k.v;
25162530
}
@@ -2527,7 +2541,7 @@ struct bkey_s_c bch2_btree_iter_peek_prev(struct btree_iter *iter)
25272541
continue;
25282542
}
25292543

2530-
btree_path_set_should_be_locked(path);
2544+
btree_path_set_should_be_locked(trans, path);
25312545
break;
25322546
} else if (likely(!bpos_eq(path->l[0].b->data->min_key, POS_MIN))) {
25332547
/* Advance to previous leaf node: */
@@ -2685,7 +2699,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
26852699
}
26862700
}
26872701
out:
2688-
btree_path_set_should_be_locked(btree_iter_path(trans, iter));
2702+
btree_path_set_should_be_locked(trans, btree_iter_path(trans, iter));
26892703
out_no_locked:
26902704
bch2_btree_iter_verify_entry_exit(iter);
26912705
bch2_btree_iter_verify(iter);

fs/bcachefs/btree_iter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ static inline void __btree_path_get(struct btree_trans *trans, struct btree_path
3131

3232
path->ref++;
3333
path->intent_ref += intent;
34+
trace_btree_path_get_ll(trans, path);
3435
}
3536

3637
static inline bool __btree_path_put(struct btree_trans *trans, struct btree_path *path, bool intent)
@@ -39,6 +40,7 @@ static inline bool __btree_path_put(struct btree_trans *trans, struct btree_path
3940
EBUG_ON(!path->ref);
4041
EBUG_ON(!path->intent_ref && intent);
4142

43+
trace_btree_path_put_ll(trans, path);
4244
path->intent_ref -= intent;
4345
return --path->ref == 0;
4446
}

fs/bcachefs/btree_locking.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,9 @@ static inline int __btree_node_lock_nopath(struct btree_trans *trans,
228228
bch2_six_check_for_deadlock, trans, ip);
229229
WRITE_ONCE(trans->locking, NULL);
230230
WRITE_ONCE(trans->locking_wait.start_time, 0);
231+
232+
if (!ret)
233+
trace_btree_path_lock(trans, _THIS_IP_, b);
231234
return ret;
232235
}
233236

@@ -400,12 +403,13 @@ static inline int bch2_btree_path_upgrade(struct btree_trans *trans,
400403

401404
/* misc: */
402405

403-
static inline void btree_path_set_should_be_locked(struct btree_path *path)
406+
static inline void btree_path_set_should_be_locked(struct btree_trans *trans, struct btree_path *path)
404407
{
405408
EBUG_ON(!btree_node_locked(path, path->level));
406409
EBUG_ON(path->uptodate);
407410

408411
path->should_be_locked = true;
412+
trace_btree_path_should_be_locked(trans, path);
409413
}
410414

411415
static inline void __btree_path_set_level_up(struct btree_trans *trans,

fs/bcachefs/btree_update.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ static noinline int flush_new_cached_update(struct btree_trans *trans,
374374
i->key_cache_already_flushed = true;
375375
i->flags |= BTREE_TRIGGER_norun;
376376

377-
btree_path_set_should_be_locked(btree_path);
377+
btree_path_set_should_be_locked(trans, btree_path);
378378
ret = bch2_trans_update_by_path(trans, path_idx, i->k, flags, ip);
379379
out:
380380
bch2_path_put(trans, path_idx, true);
@@ -422,7 +422,9 @@ bch2_trans_update_by_path(struct btree_trans *trans, btree_path_idx_t path_idx,
422422
break;
423423
}
424424

425-
if (!cmp && i < trans->updates + trans->nr_updates) {
425+
bool overwrite = !cmp && i < trans->updates + trans->nr_updates;
426+
427+
if (overwrite) {
426428
EBUG_ON(i->insert_trigger_run || i->overwrite_trigger_run);
427429

428430
bch2_path_put(trans, i->path, true);
@@ -451,6 +453,8 @@ bch2_trans_update_by_path(struct btree_trans *trans, btree_path_idx_t path_idx,
451453

452454
__btree_path_get(trans, trans->paths + i->path, true);
453455

456+
trace_update_by_path(trans, path, i, overwrite);
457+
454458
/*
455459
* If a key is present in the key cache, it must also exist in the
456460
* btree - this is necessary for cache coherency. When iterating over
@@ -498,7 +502,7 @@ static noinline int bch2_trans_update_get_key_cache(struct btree_trans *trans,
498502
return btree_trans_restart(trans, BCH_ERR_transaction_restart_key_cache_raced);
499503
}
500504

501-
btree_path_set_should_be_locked(trans->paths + iter->key_cache_path);
505+
btree_path_set_should_be_locked(trans, trans->paths + iter->key_cache_path);
502506
}
503507

504508
return 0;

fs/bcachefs/btree_update_interior.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1981,7 +1981,7 @@ int __bch2_foreground_maybe_merge(struct btree_trans *trans,
19811981
if (ret)
19821982
goto err;
19831983

1984-
btree_path_set_should_be_locked(trans->paths + sib_path);
1984+
btree_path_set_should_be_locked(trans, trans->paths + sib_path);
19851985

19861986
m = trans->paths[sib_path].l[level].b;
19871987

0 commit comments

Comments
 (0)