}
if (unlikely(deadlock_path)) {
- trace_trans_restart_would_deadlock(trans->ip, ip,
+ trace_trans_restart_would_deadlock(trans->fn, ip,
trans->in_traverse_all, reason,
deadlock_path->btree_id,
deadlock_path->cached,
trans_for_each_path(trans, path)
if (path->should_be_locked &&
!bch2_btree_path_relock(trans, path, _RET_IP_)) {
- trace_trans_restart_relock(trans->ip, _RET_IP_,
+ trace_trans_restart_relock(trans->fn, _RET_IP_,
path->btree_id, &path->pos);
BUG_ON(!trans->restarted);
return false;
out:
bch2_btree_cache_cannibalize_unlock(c);
- trace_trans_traverse_all(trans->ip, trace_ip);
+ trans->in_traverse_all = false;
+
+ trace_trans_traverse_all(trans->fn, trace_ip);
return ret;
}
trans->mem_bytes = new_bytes;
if (old_bytes) {
- trace_trans_restart_mem_realloced(trans->ip, _RET_IP_, new_bytes);
+ trace_trans_restart_mem_realloced(trans->fn, _RET_IP_, new_bytes);
btree_trans_restart(trans);
return ERR_PTR(-EINTR);
}
trans->updates = p; p += updates_bytes;
}
-void bch2_trans_init(struct btree_trans *trans, struct bch_fs *c,
- unsigned expected_nr_iters,
- size_t expected_mem_bytes)
+void __bch2_trans_init(struct btree_trans *trans, struct bch_fs *c,
+ unsigned expected_nr_iters,
+ size_t expected_mem_bytes,
+ const char *fn)
__acquires(&c->btree_trans_barrier)
{
memset(trans, 0, sizeof(*trans));
trans->c = c;
- trans->ip = _RET_IP_;
+ trans->fn = fn;
trans->journal_replay_not_finished =
!test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags);
goto leaked;
return;
leaked:
- bch_err(c, "btree paths leaked from %pS!", (void *) trans->ip);
+ bch_err(c, "btree paths leaked from %s!", trans->fn);
trans_for_each_path(trans, path)
if (path->ref)
printk(KERN_ERR " btree %s %pS\n",
if (!trans_has_locks(trans))
continue;
- pr_buf(out, "%i %ps\n", trans->pid, (void *) trans->ip);
+ pr_buf(out, "%i %s\n", trans->pid, trans->fn);
trans_for_each_path(trans, path) {
if (!path->nodes_locked)
return ret;
if (!bch2_trans_relock(trans)) {
- trace_trans_restart_journal_preres_get(trans->ip, trace_ip);
+ trace_trans_restart_journal_preres_get(trans->fn, trace_ip);
return -EINTR;
}
l->entry.pad[0] = 0;
l->entry.pad[1] = 0;
l->entry.pad[2] = 0;
- b = snprintf(l->d, buflen, "%ps", (void *) trans->ip);
+ b = min_t(unsigned, strlen(trans->fn), buflen);
+ memcpy(l->d, trans->fn, b);
while (b < buflen)
l->d[b++] = '\0';
int ret;
if (race_fault()) {
- trace_trans_restart_fault_inject(trans->ip, trace_ip);
+ trace_trans_restart_fault_inject(trans->fn, trace_ip);
trans->restarted = true;
return -EINTR;
}
bch2_btree_node_unlock_write_inlined(trans, i->path, insert_l(i)->b);
}
- trace_trans_restart_would_deadlock_write(trans->ip);
+ trace_trans_restart_would_deadlock_write(trans->fn);
return btree_trans_restart(trans);
}
char buf[200];
bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(i->k));
- bch_err(c, "invalid bkey %s on insert from %ps -> %ps: %s\n",
- buf, (void *) trans->ip,
- (void *) i->ip_allocated, invalid);
+ bch_err(c, "invalid bkey %s on insert from %s -> %ps: %s\n",
+ buf, trans->fn, (void *) i->ip_allocated, invalid);
bch2_fatal_error(c);
return -EINVAL;
}
return 0;
if (ret == -EINTR)
- trace_trans_restart_btree_node_split(trans->ip, trace_ip,
+ trace_trans_restart_btree_node_split(trans->fn, trace_ip,
i->btree_id, &i->path->pos);
break;
case BTREE_INSERT_NEED_MARK_REPLICAS:
if (bch2_trans_relock(trans))
return 0;
- trace_trans_restart_mark_replicas(trans->ip, trace_ip);
+ trace_trans_restart_mark_replicas(trans->fn, trace_ip);
ret = -EINTR;
break;
case BTREE_INSERT_NEED_JOURNAL_RES:
if (bch2_trans_relock(trans))
return 0;
- trace_trans_restart_journal_res_get(trans->ip, trace_ip);
+ trace_trans_restart_journal_res_get(trans->fn, trace_ip);
ret = -EINTR;
break;
case BTREE_INSERT_NEED_JOURNAL_RECLAIM:
bch2_trans_unlock(trans);
- trace_trans_blocked_journal_reclaim(trans->ip, trace_ip);
+ trace_trans_blocked_journal_reclaim(trans->fn, trace_ip);
wait_event_freezable(c->journal.reclaim_wait,
(ret = journal_reclaim_wait_done(c)));
if (bch2_trans_relock(trans))
return 0;
- trace_trans_restart_journal_reclaim(trans->ip, trace_ip);
+ trace_trans_restart_journal_reclaim(trans->fn, trace_ip);
ret = -EINTR;
break;
default:
}
if (ret == -EINTR)
- trace_trans_restart_mark(trans->ip, _RET_IP_,
+ trace_trans_restart_mark(trans->fn, _RET_IP_,
i->btree_id, &i->path->pos);
if (ret)
return ret;
BTREE_TRIGGER_OVERWRITE|i->flags);
if (ret == -EINTR)
- trace_trans_restart_mark(trans->ip, _RET_IP_,
+ trace_trans_restart_mark(trans->fn, _RET_IP_,
i->btree_id, &i->path->pos);
if (ret)
return ret;
BUG_ON(!i->path->should_be_locked);
if (unlikely(!bch2_btree_path_upgrade(trans, i->path, i->level + 1))) {
- trace_trans_restart_upgrade(trans->ip, _RET_IP_,
+ trace_trans_restart_upgrade(trans->fn, _RET_IP_,
i->btree_id, &i->path->pos);
ret = btree_trans_restart(trans);
goto out;
__entry->wait_amount, __entry->until)
);
-TRACE_EVENT(transaction_restart_ip,
- TP_PROTO(unsigned long caller, unsigned long ip),
- TP_ARGS(caller, ip),
-
- TP_STRUCT__entry(
- __field(unsigned long, caller )
- __field(unsigned long, ip )
- ),
-
- TP_fast_assign(
- __entry->caller = caller;
- __entry->ip = ip;
- ),
-
- TP_printk("%pS %pS", (void *) __entry->caller, (void *) __entry->ip)
-);
-
DECLARE_EVENT_CLASS(transaction_restart,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip),
- TP_ARGS(trans_ip, caller_ip),
+ TP_ARGS(trans_fn, caller_ip),
TP_STRUCT__entry(
- __field(unsigned long, trans_ip )
+ __array(char, trans_fn, 24 )
__field(unsigned long, caller_ip )
),
TP_fast_assign(
- __entry->trans_ip = trans_ip;
+ strncpy(__entry->trans_fn, trans_fn, sizeof(__entry->trans_fn));
__entry->caller_ip = caller_ip;
),
- TP_printk("%pS %pS",
- (void *) __entry->trans_ip,
- (void *) __entry->caller_ip)
+ TP_printk("%s %pS", __entry->trans_fn, (void *) __entry->caller_ip)
+);
+
+DEFINE_EVENT(transaction_restart, transaction_restart_ip,
+ TP_PROTO(const char *trans_fn,
+ unsigned long caller_ip),
+ TP_ARGS(trans_fn, caller_ip)
);
DEFINE_EVENT(transaction_restart, trans_blocked_journal_reclaim,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip),
- TP_ARGS(trans_ip, caller_ip)
+ TP_ARGS(trans_fn, caller_ip)
);
DEFINE_EVENT(transaction_restart, trans_restart_journal_res_get,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip),
- TP_ARGS(trans_ip, caller_ip)
+ TP_ARGS(trans_fn, caller_ip)
);
DEFINE_EVENT(transaction_restart, trans_restart_journal_preres_get,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip),
- TP_ARGS(trans_ip, caller_ip)
+ TP_ARGS(trans_fn, caller_ip)
);
DEFINE_EVENT(transaction_restart, trans_restart_journal_reclaim,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip),
- TP_ARGS(trans_ip, caller_ip)
+ TP_ARGS(trans_fn, caller_ip)
);
DEFINE_EVENT(transaction_restart, trans_restart_fault_inject,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip),
- TP_ARGS(trans_ip, caller_ip)
+ TP_ARGS(trans_fn, caller_ip)
);
DEFINE_EVENT(transaction_restart, trans_traverse_all,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip),
- TP_ARGS(trans_ip, caller_ip)
+ TP_ARGS(trans_fn, caller_ip)
);
DEFINE_EVENT(transaction_restart, trans_restart_mark_replicas,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip),
- TP_ARGS(trans_ip, caller_ip)
+ TP_ARGS(trans_fn, caller_ip)
);
DECLARE_EVENT_CLASS(transaction_restart_iter,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
enum btree_id btree_id,
struct bpos *pos),
- TP_ARGS(trans_ip, caller_ip, btree_id, pos),
+ TP_ARGS(trans_fn, caller_ip, btree_id, pos),
TP_STRUCT__entry(
- __field(unsigned long, trans_ip )
+ __array(char, trans_fn, 24 )
__field(unsigned long, caller_ip )
__field(u8, btree_id )
__field(u64, pos_inode )
),
TP_fast_assign(
- __entry->trans_ip = trans_ip;
+ strncpy(__entry->trans_fn, trans_fn, sizeof(__entry->trans_fn));
__entry->caller_ip = caller_ip;
__entry->btree_id = btree_id;
__entry->pos_inode = pos->inode;
__entry->pos_snapshot = pos->snapshot;
),
- TP_printk("%ps %pS btree %u pos %llu:%llu:%u",
- (void *) __entry->trans_ip,
+ TP_printk("%s %pS btree %u pos %llu:%llu:%u",
+ __entry->trans_fn,
(void *) __entry->caller_ip,
__entry->btree_id,
__entry->pos_inode,
);
DEFINE_EVENT(transaction_restart_iter, trans_restart_btree_node_reused,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
enum btree_id btree_id,
struct bpos *pos),
- TP_ARGS(trans_ip, caller_ip, btree_id, pos)
+ TP_ARGS(trans_fn, caller_ip, btree_id, pos)
);
DEFINE_EVENT(transaction_restart_iter, trans_restart_btree_node_split,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
enum btree_id btree_id,
struct bpos *pos),
- TP_ARGS(trans_ip, caller_ip, btree_id, pos)
+ TP_ARGS(trans_fn, caller_ip, btree_id, pos)
);
DEFINE_EVENT(transaction_restart_iter, trans_restart_mark,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
enum btree_id btree_id,
struct bpos *pos),
- TP_ARGS(trans_ip, caller_ip, btree_id, pos)
+ TP_ARGS(trans_fn, caller_ip, btree_id, pos)
);
DEFINE_EVENT(transaction_restart_iter, trans_restart_upgrade,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
enum btree_id btree_id,
struct bpos *pos),
- TP_ARGS(trans_ip, caller_ip, btree_id, pos)
+ TP_ARGS(trans_fn, caller_ip, btree_id, pos)
);
DEFINE_EVENT(transaction_restart_iter, trans_restart_iter_upgrade,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
enum btree_id btree_id,
struct bpos *pos),
- TP_ARGS(trans_ip, caller_ip, btree_id, pos)
+ TP_ARGS(trans_fn, caller_ip, btree_id, pos)
);
DEFINE_EVENT(transaction_restart_iter, trans_restart_relock,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
enum btree_id btree_id,
struct bpos *pos),
- TP_ARGS(trans_ip, caller_ip, btree_id, pos)
+ TP_ARGS(trans_fn, caller_ip, btree_id, pos)
);
DEFINE_EVENT(transaction_restart_iter, trans_restart_traverse,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
enum btree_id btree_id,
struct bpos *pos),
- TP_ARGS(trans_ip, caller_ip, btree_id, pos)
+ TP_ARGS(trans_fn, caller_ip, btree_id, pos)
);
TRACE_EVENT(trans_restart_would_deadlock,
- TP_PROTO(unsigned long trans_ip,
+ TP_PROTO(const char *trans_fn,
unsigned long caller_ip,
bool in_traverse_all,
unsigned reason,
enum btree_id want_btree_id,
unsigned want_iter_type,
struct bpos *want_pos),
- TP_ARGS(trans_ip, caller_ip, in_traverse_all, reason,
+ TP_ARGS(trans_fn, caller_ip, in_traverse_all, reason,
have_btree_id, have_iter_type, have_pos,
want_btree_id, want_iter_type, want_pos),
TP_STRUCT__entry(
- __field(unsigned long, trans_ip )
+ __array(char, trans_fn, 24 )
__field(unsigned long, caller_ip )
__field(u8, in_traverse_all )
__field(u8, reason )
),
TP_fast_assign(
- __entry->trans_ip = trans_ip;
+ strncpy(__entry->trans_fn, trans_fn, sizeof(__entry->trans_fn));
__entry->caller_ip = caller_ip;
__entry->in_traverse_all = in_traverse_all;
__entry->reason = reason;
__entry->want_pos_snapshot = want_pos->snapshot;
),
- TP_printk("%pS %pS traverse_all %u because %u have %u:%u %llu:%llu:%u want %u:%u %llu:%llu:%u",
- (void *) __entry->trans_ip,
+ TP_printk("%s %pS traverse_all %u because %u have %u:%u %llu:%llu:%u want %u:%u %llu:%llu:%u",
+ __entry->trans_fn,
(void *) __entry->caller_ip,
__entry->in_traverse_all,
__entry->reason,
);
TRACE_EVENT(trans_restart_would_deadlock_write,
- TP_PROTO(unsigned long trans_ip),
- TP_ARGS(trans_ip),
+ TP_PROTO(const char *trans_fn),
+ TP_ARGS(trans_fn),
TP_STRUCT__entry(
- __field(unsigned long, trans_ip )
+ __array(char, trans_fn, 24 )
),
TP_fast_assign(
- __entry->trans_ip = trans_ip;
+ strncpy(__entry->trans_fn, trans_fn, sizeof(__entry->trans_fn));
),
- TP_printk("%ps", (void *) __entry->trans_ip)
+ TP_printk("%s", __entry->trans_fn)
);
TRACE_EVENT(trans_restart_mem_realloced,
- TP_PROTO(unsigned long trans_ip, unsigned long caller_ip,
+ TP_PROTO(const char *trans_fn,
+ unsigned long caller_ip,
unsigned long bytes),
- TP_ARGS(trans_ip, caller_ip, bytes),
+ TP_ARGS(trans_fn, caller_ip, bytes),
TP_STRUCT__entry(
- __field(unsigned long, trans_ip )
+ __array(char, trans_fn, 24 )
__field(unsigned long, caller_ip )
__field(unsigned long, bytes )
),
TP_fast_assign(
- __entry->trans_ip = trans_ip;
+ strncpy(__entry->trans_fn, trans_fn, sizeof(__entry->trans_fn));
__entry->caller_ip = caller_ip;
__entry->bytes = bytes;
),
- TP_printk("%pS %pS bytes %lu",
- (void *) __entry->trans_ip,
+ TP_printk("%s %pS bytes %lu",
+ __entry->trans_fn,
(void *) __entry->caller_ip,
__entry->bytes)
);