Lines Matching full:g

78 	struct trans_waiting_for_lock	g[8];  member
82 static noinline void print_cycle(struct printbuf *out, struct lock_graph *g) in print_cycle() argument
86 prt_printf(out, "Found lock cycle (%u entries):", g->nr); in print_cycle()
89 for (i = g->g; i < g->g + g->nr; i++) { in print_cycle()
95 bch2_prt_task_backtrace(out, task, i == g->g ? 5 : 1, GFP_NOWAIT); in print_cycle()
99 static noinline void print_chain(struct printbuf *out, struct lock_graph *g) in print_chain() argument
103 for (i = g->g; i != g->g + g->nr; i++) { in print_chain()
105 if (i != g->g) in print_chain()
112 static void lock_graph_up(struct lock_graph *g) in lock_graph_up() argument
114 closure_put(&g->g[--g->nr].trans->ref); in lock_graph_up()
117 static noinline void lock_graph_pop_all(struct lock_graph *g) in lock_graph_pop_all() argument
119 while (g->nr) in lock_graph_pop_all()
120 lock_graph_up(g); in lock_graph_pop_all()
123 static void __lock_graph_down(struct lock_graph *g, struct btree_trans *trans) in __lock_graph_down() argument
125 g->g[g->nr++] = (struct trans_waiting_for_lock) { in __lock_graph_down()
132 static void lock_graph_down(struct lock_graph *g, struct btree_trans *trans) in lock_graph_down() argument
135 __lock_graph_down(g, trans); in lock_graph_down()
138 static bool lock_graph_remove_non_waiters(struct lock_graph *g) in lock_graph_remove_non_waiters() argument
142 for (i = g->g + 1; i < g->g + g->nr; i++) in lock_graph_remove_non_waiters()
145 while (g->g + g->nr > i) in lock_graph_remove_non_waiters()
146 lock_graph_up(g); in lock_graph_remove_non_waiters()
153 static void trace_would_deadlock(struct lock_graph *g, struct btree_trans *trans) in trace_would_deadlock() argument
163 print_cycle(&buf, g); in trace_would_deadlock()
170 static int abort_lock(struct lock_graph *g, struct trans_waiting_for_lock *i) in abort_lock() argument
172 if (i == g->g) { in abort_lock()
173 trace_would_deadlock(g, i->trans); in abort_lock()
193 static noinline int break_cycle(struct lock_graph *g, struct printbuf *cycle) in break_cycle() argument
199 if (lock_graph_remove_non_waiters(g)) in break_cycle()
204 print_cycle(cycle, g); in break_cycle()
209 for (i = g->g; i < g->g + g->nr; i++) { in break_cycle()
220 prt_printf(&buf, bch2_fmt(g->g->trans->c, "cycle of nofail locks")); in break_cycle()
222 for (i = g->g; i < g->g + g->nr; i++) { in break_cycle()
240 ret = abort_lock(g, abort); in break_cycle()
243 while (g->nr) in break_cycle()
244 lock_graph_up(g); in break_cycle()
248 static int lock_graph_descend(struct lock_graph *g, struct btree_trans *trans, in lock_graph_descend() argument
251 struct btree_trans *orig_trans = g->g->trans; in lock_graph_descend()
254 for (i = g->g; i < g->g + g->nr; i++) in lock_graph_descend()
257 return break_cycle(g, cycle); in lock_graph_descend()
260 if (g->nr == ARRAY_SIZE(g->g)) { in lock_graph_descend()
266 while (g->nr) in lock_graph_descend()
267 lock_graph_up(g); in lock_graph_descend()
276 __lock_graph_down(g, trans); in lock_graph_descend()
287 struct lock_graph g; in bch2_check_for_deadlock() local
293 g.nr = 0; in bch2_check_for_deadlock()
299 trace_would_deadlock(&g, trans); in bch2_check_for_deadlock()
303 lock_graph_down(&g, trans); in bch2_check_for_deadlock()
310 if (!g.nr) in bch2_check_for_deadlock()
313 top = &g.g[g.nr - 1]; in bch2_check_for_deadlock()
350 if (!lock_graph_remove_non_waiters(&g)) { in bch2_check_for_deadlock()
360 lock_graph_pop_all(&g); in bch2_check_for_deadlock()
387 ret = lock_graph_descend(&g, trans, cycle); in bch2_check_for_deadlock()
397 if (g.nr > 1 && cycle) in bch2_check_for_deadlock()
398 print_chain(cycle, &g); in bch2_check_for_deadlock()
399 lock_graph_up(&g); in bch2_check_for_deadlock()