/* Hack, because gc and splitting nodes doesn't mix yet: */
        if (!(flags & BTREE_INSERT_GC_LOCK_HELD) &&
            !down_read_trylock(&c->gc_lock)) {
-               if (flags & BTREE_INSERT_NOUNLOCK)
+               if (flags & BTREE_INSERT_NOUNLOCK) {
+                       trace_transaction_restart_ip(trans->ip, _THIS_IP_);
                        return -EINTR;
+               }
 
                bch2_trans_unlock(trans);
                down_read(&c->gc_lock);
                        BUG_ON(flags & BTREE_INSERT_NOUNLOCK);
                        bch2_trans_unlock(trans);
                        ret = -EINTR;
+
+                       trace_transaction_restart_ip(trans->ip, _THIS_IP_);
                }
                goto out;
        }
 
                __entry->buckets_moved, __entry->buckets_not_moved)
 );
 
+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("%pF %pF", (void *) __entry->caller, (void *) __entry->ip)
+);
+
 DECLARE_EVENT_CLASS(transaction_restart,
        TP_PROTO(unsigned long ip),
        TP_ARGS(ip),