1*baabeb49SKent Overstreet // SPDX-License-Identifier: GPL-2.0
2*baabeb49SKent Overstreet #include "bcachefs.h"
3*baabeb49SKent Overstreet #include "bbpos.h"
4*baabeb49SKent Overstreet #include "disk_accounting.h"
5*baabeb49SKent Overstreet #include "progress.h"
6*baabeb49SKent Overstreet
bch2_progress_init(struct progress_indicator_state * s,struct bch_fs * c,u64 btree_id_mask)7*baabeb49SKent Overstreet void bch2_progress_init(struct progress_indicator_state *s,
8*baabeb49SKent Overstreet struct bch_fs *c,
9*baabeb49SKent Overstreet u64 btree_id_mask)
10*baabeb49SKent Overstreet {
11*baabeb49SKent Overstreet memset(s, 0, sizeof(*s));
12*baabeb49SKent Overstreet
13*baabeb49SKent Overstreet s->next_print = jiffies + HZ * 10;
14*baabeb49SKent Overstreet
15*baabeb49SKent Overstreet for (unsigned i = 0; i < BTREE_ID_NR; i++) {
16*baabeb49SKent Overstreet if (!(btree_id_mask & BIT_ULL(i)))
17*baabeb49SKent Overstreet continue;
18*baabeb49SKent Overstreet
19*baabeb49SKent Overstreet struct disk_accounting_pos acc = {
20*baabeb49SKent Overstreet .type = BCH_DISK_ACCOUNTING_btree,
21*baabeb49SKent Overstreet .btree.id = i,
22*baabeb49SKent Overstreet };
23*baabeb49SKent Overstreet
24*baabeb49SKent Overstreet u64 v;
25*baabeb49SKent Overstreet bch2_accounting_mem_read(c, disk_accounting_pos_to_bpos(&acc), &v, 1);
26*baabeb49SKent Overstreet s->nodes_total += div64_ul(v, btree_sectors(c));
27*baabeb49SKent Overstreet }
28*baabeb49SKent Overstreet }
29*baabeb49SKent Overstreet
progress_update_p(struct progress_indicator_state * s)30*baabeb49SKent Overstreet static inline bool progress_update_p(struct progress_indicator_state *s)
31*baabeb49SKent Overstreet {
32*baabeb49SKent Overstreet bool ret = time_after_eq(jiffies, s->next_print);
33*baabeb49SKent Overstreet
34*baabeb49SKent Overstreet if (ret)
35*baabeb49SKent Overstreet s->next_print = jiffies + HZ * 10;
36*baabeb49SKent Overstreet return ret;
37*baabeb49SKent Overstreet }
38*baabeb49SKent Overstreet
bch2_progress_update_iter(struct btree_trans * trans,struct progress_indicator_state * s,struct btree_iter * iter,const char * msg)39*baabeb49SKent Overstreet void bch2_progress_update_iter(struct btree_trans *trans,
40*baabeb49SKent Overstreet struct progress_indicator_state *s,
41*baabeb49SKent Overstreet struct btree_iter *iter,
42*baabeb49SKent Overstreet const char *msg)
43*baabeb49SKent Overstreet {
44*baabeb49SKent Overstreet struct bch_fs *c = trans->c;
45*baabeb49SKent Overstreet struct btree *b = path_l(btree_iter_path(trans, iter))->b;
46*baabeb49SKent Overstreet
47*baabeb49SKent Overstreet s->nodes_seen += b != s->last_node;
48*baabeb49SKent Overstreet s->last_node = b;
49*baabeb49SKent Overstreet
50*baabeb49SKent Overstreet if (progress_update_p(s)) {
51*baabeb49SKent Overstreet struct printbuf buf = PRINTBUF;
52*baabeb49SKent Overstreet unsigned percent = s->nodes_total
53*baabeb49SKent Overstreet ? div64_u64(s->nodes_seen * 100, s->nodes_total)
54*baabeb49SKent Overstreet : 0;
55*baabeb49SKent Overstreet
56*baabeb49SKent Overstreet prt_printf(&buf, "%s: %d%%, done %llu/%llu nodes, at ",
57*baabeb49SKent Overstreet msg, percent, s->nodes_seen, s->nodes_total);
58*baabeb49SKent Overstreet bch2_bbpos_to_text(&buf, BBPOS(iter->btree_id, iter->pos));
59*baabeb49SKent Overstreet
60*baabeb49SKent Overstreet bch_info(c, "%s", buf.buf);
61*baabeb49SKent Overstreet printbuf_exit(&buf);
62*baabeb49SKent Overstreet }
63*baabeb49SKent Overstreet }
64