mutex_unlock(&text_mutex);
 }
 
+#define TP_VEC_MAX (PAGE_SIZE / sizeof(struct text_poke_loc))
+static struct text_poke_loc tp_vec[TP_VEC_MAX];
+int tp_vec_nr = 0;
+
+bool arch_jump_label_transform_queue(struct jump_entry *entry,
+                                    enum jump_label_type type)
+{
+       struct text_poke_loc *tp;
+       void *entry_code;
+
+       if (system_state == SYSTEM_BOOTING) {
+               /*
+                * Fallback to the non-batching mode.
+                */
+               arch_jump_label_transform(entry, type);
+               return true;
+       }
+
+       /*
+        * No more space in the vector, tell upper layer to apply
+        * the queue before continuing.
+        */
+       if (tp_vec_nr == TP_VEC_MAX)
+               return false;
+
+       tp = &tp_vec[tp_vec_nr];
+
+       entry_code = (void *)jump_entry_code(entry);
+
+       /*
+        * The INT3 handler will do a bsearch in the queue, so we need entries
+        * to be sorted. We can survive an unsorted list by rejecting the entry,
+        * forcing the generic jump_label code to apply the queue. Warning once,
+        * to raise the attention to the case of an unsorted entry that is
+        * better not happen, because, in the worst case we will perform in the
+        * same way as we do without batching - with some more overhead.
+        */
+       if (tp_vec_nr > 0) {
+               int prev = tp_vec_nr - 1;
+               struct text_poke_loc *prev_tp = &tp_vec[prev];
+
+               if (WARN_ON_ONCE(prev_tp->addr > entry_code))
+                       return false;
+       }
+
+       __jump_label_set_jump_code(entry, type,
+                                  (union jump_code_union *) &tp->opcode, 0);
+
+       tp->addr = entry_code;
+       tp->detour = entry_code + JUMP_LABEL_NOP_SIZE;
+       tp->len = JUMP_LABEL_NOP_SIZE;
+
+       tp_vec_nr++;
+
+       return true;
+}
+
+void arch_jump_label_transform_apply(void)
+{
+       if (!tp_vec_nr)
+               return;
+
+       mutex_lock(&text_mutex);
+       text_poke_bp_batch(tp_vec, tp_vec_nr);
+       mutex_unlock(&text_mutex);
+
+       tp_vec_nr = 0;
+}
+
 static enum {
        JL_STATE_START,
        JL_STATE_NO_UPDATE,