diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-10-31 16:13:05 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:29 -0400 |
commit | b17d3cec14b487924df709dbeffb900f124a2607 (patch) | |
tree | e3a5ce061e8e294d8d0570a7916996cebefb9d8d /fs/bcachefs/util.c | |
parent | 5f417394033a0d8bfb31d02b3becf7381dc13867 (diff) |
bcachefs: Run btree updates after write out of write_point
In the write path, after the write to the block device(s) complete we
have to punt to process context to do the btree update.
Instead of using the work item embedded in op->cl, this patch switches
to a per write-point work item. This helps with two different issues:
- lock contention: btree updates to the same writepoint will (usually)
be updating the same alloc keys
- context switch overhead: when we're bottlenecked on btree updates,
having a thread (running out of a work item) checking the write point
for completed ops is cheaper than queueing up a new work item and
waking up a kworker.
In an arbitrary benchmark, 4k random writes with fio running inside a
VM, this patch resulted in a 10% improvement in total iops.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/util.c')
-rw-r--r-- | fs/bcachefs/util.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/bcachefs/util.c b/fs/bcachefs/util.c index f290c069c683..e1d36d9b092c 100644 --- a/fs/bcachefs/util.c +++ b/fs/bcachefs/util.c @@ -390,7 +390,7 @@ static const struct time_unit *pick_time_units(u64 ns) return u; } -static void pr_time_units(struct printbuf *out, u64 ns) +void bch2_pr_time_units(struct printbuf *out, u64 ns) { const struct time_unit *u = pick_time_units(ns); @@ -410,13 +410,13 @@ void bch2_time_stats_to_text(struct printbuf *out, struct bch2_time_stats *stats freq ? div64_u64(NSEC_PER_SEC, freq) : 0); pr_buf(out, "frequency:\t"); - pr_time_units(out, freq); + bch2_pr_time_units(out, freq); pr_buf(out, "\navg duration:\t"); - pr_time_units(out, stats->average_duration); + bch2_pr_time_units(out, stats->average_duration); pr_buf(out, "\nmax duration:\t"); - pr_time_units(out, stats->max_duration); + bch2_pr_time_units(out, stats->max_duration); i = eytzinger0_first(NR_QUANTILES); u = pick_time_units(stats->quantiles.entries[i].m); |