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 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 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 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