Merge tag 'arm-soc/for-5.20/devicetree-arm64-part2' of https://github.com/Broadcom...
[linux-2.6-microblaze.git] / kernel / kprobes.c
index dd58c0b..f214f8c 100644 (file)
@@ -1257,79 +1257,6 @@ void kprobe_busy_end(void)
        preempt_enable();
 }
 
-#if !defined(CONFIG_KRETPROBE_ON_RETHOOK)
-static void free_rp_inst_rcu(struct rcu_head *head)
-{
-       struct kretprobe_instance *ri = container_of(head, struct kretprobe_instance, rcu);
-
-       if (refcount_dec_and_test(&ri->rph->ref))
-               kfree(ri->rph);
-       kfree(ri);
-}
-NOKPROBE_SYMBOL(free_rp_inst_rcu);
-
-static void recycle_rp_inst(struct kretprobe_instance *ri)
-{
-       struct kretprobe *rp = get_kretprobe(ri);
-
-       if (likely(rp))
-               freelist_add(&ri->freelist, &rp->freelist);
-       else
-               call_rcu(&ri->rcu, free_rp_inst_rcu);
-}
-NOKPROBE_SYMBOL(recycle_rp_inst);
-
-/*
- * This function is called from delayed_put_task_struct() when a task is
- * dead and cleaned up to recycle any kretprobe instances associated with
- * this task. These left over instances represent probed functions that
- * have been called but will never return.
- */
-void kprobe_flush_task(struct task_struct *tk)
-{
-       struct kretprobe_instance *ri;
-       struct llist_node *node;
-
-       /* Early boot, not yet initialized. */
-       if (unlikely(!kprobes_initialized))
-               return;
-
-       kprobe_busy_begin();
-
-       node = __llist_del_all(&tk->kretprobe_instances);
-       while (node) {
-               ri = container_of(node, struct kretprobe_instance, llist);
-               node = node->next;
-
-               recycle_rp_inst(ri);
-       }
-
-       kprobe_busy_end();
-}
-NOKPROBE_SYMBOL(kprobe_flush_task);
-
-static inline void free_rp_inst(struct kretprobe *rp)
-{
-       struct kretprobe_instance *ri;
-       struct freelist_node *node;
-       int count = 0;
-
-       node = rp->freelist.head;
-       while (node) {
-               ri = container_of(node, struct kretprobe_instance, freelist);
-               node = node->next;
-
-               kfree(ri);
-               count++;
-       }
-
-       if (refcount_sub_and_test(count, &rp->rph->ref)) {
-               kfree(rp->rph);
-               rp->rph = NULL;
-       }
-}
-#endif /* !CONFIG_KRETPROBE_ON_RETHOOK */
-
 /* Add the new probe to 'ap->list'. */
 static int add_new_kprobe(struct kprobe *ap, struct kprobe *p)
 {
@@ -1928,6 +1855,77 @@ static struct notifier_block kprobe_exceptions_nb = {
 #ifdef CONFIG_KRETPROBES
 
 #if !defined(CONFIG_KRETPROBE_ON_RETHOOK)
+static void free_rp_inst_rcu(struct rcu_head *head)
+{
+       struct kretprobe_instance *ri = container_of(head, struct kretprobe_instance, rcu);
+
+       if (refcount_dec_and_test(&ri->rph->ref))
+               kfree(ri->rph);
+       kfree(ri);
+}
+NOKPROBE_SYMBOL(free_rp_inst_rcu);
+
+static void recycle_rp_inst(struct kretprobe_instance *ri)
+{
+       struct kretprobe *rp = get_kretprobe(ri);
+
+       if (likely(rp))
+               freelist_add(&ri->freelist, &rp->freelist);
+       else
+               call_rcu(&ri->rcu, free_rp_inst_rcu);
+}
+NOKPROBE_SYMBOL(recycle_rp_inst);
+
+/*
+ * This function is called from delayed_put_task_struct() when a task is
+ * dead and cleaned up to recycle any kretprobe instances associated with
+ * this task. These left over instances represent probed functions that
+ * have been called but will never return.
+ */
+void kprobe_flush_task(struct task_struct *tk)
+{
+       struct kretprobe_instance *ri;
+       struct llist_node *node;
+
+       /* Early boot, not yet initialized. */
+       if (unlikely(!kprobes_initialized))
+               return;
+
+       kprobe_busy_begin();
+
+       node = __llist_del_all(&tk->kretprobe_instances);
+       while (node) {
+               ri = container_of(node, struct kretprobe_instance, llist);
+               node = node->next;
+
+               recycle_rp_inst(ri);
+       }
+
+       kprobe_busy_end();
+}
+NOKPROBE_SYMBOL(kprobe_flush_task);
+
+static inline void free_rp_inst(struct kretprobe *rp)
+{
+       struct kretprobe_instance *ri;
+       struct freelist_node *node;
+       int count = 0;
+
+       node = rp->freelist.head;
+       while (node) {
+               ri = container_of(node, struct kretprobe_instance, freelist);
+               node = node->next;
+
+               kfree(ri);
+               count++;
+       }
+
+       if (refcount_sub_and_test(count, &rp->rph->ref)) {
+               kfree(rp->rph);
+               rp->rph = NULL;
+       }
+}
+
 /* This assumes the 'tsk' is the current task or the is not running. */
 static kprobe_opcode_t *__kretprobe_find_ret_addr(struct task_struct *tsk,
                                                  struct llist_node **cur)