kernel/fork.c: fix typos
[linux-2.6-microblaze.git] / kernel / bpf / syscall.c
index 2505034..941ca06 100644 (file)
@@ -1694,7 +1694,9 @@ static void __bpf_prog_put_noref(struct bpf_prog *prog, bool deferred)
 {
        bpf_prog_kallsyms_del_all(prog);
        btf_put(prog->aux->btf);
-       bpf_prog_free_linfo(prog);
+       kvfree(prog->aux->jited_linfo);
+       kvfree(prog->aux->linfo);
+       kfree(prog->aux->kfunc_tab);
        if (prog->aux->attach_btf)
                btf_put(prog->aux->attach_btf);
 
@@ -2549,6 +2551,9 @@ static int bpf_tracing_link_fill_link_info(const struct bpf_link *link,
                container_of(link, struct bpf_tracing_link, link);
 
        info->tracing.attach_type = tr_link->attach_type;
+       bpf_trampoline_unpack_key(tr_link->trampoline->key,
+                                 &info->tracing.target_obj_id,
+                                 &info->tracing.target_btf_id);
 
        return 0;
 }
@@ -2643,14 +2648,25 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,
         *   target_btf_id using the link_create API.
         *
         * - if tgt_prog == NULL when this function was called using the old
-         *   raw_tracepoint_open API, and we need a target from prog->aux
-         *
-         * The combination of no saved target in prog->aux, and no target
-         * specified on load is illegal, and we reject that here.
+        *   raw_tracepoint_open API, and we need a target from prog->aux
+        *
+        * - if prog->aux->dst_trampoline and tgt_prog is NULL, the program
+        *   was detached and is going for re-attachment.
         */
        if (!prog->aux->dst_trampoline && !tgt_prog) {
-               err = -ENOENT;
-               goto out_unlock;
+               /*
+                * Allow re-attach for TRACING and LSM programs. If it's
+                * currently linked, bpf_trampoline_link_prog will fail.
+                * EXT programs need to specify tgt_prog_fd, so they
+                * re-attach in separate code path.
+                */
+               if (prog->type != BPF_PROG_TYPE_TRACING &&
+                   prog->type != BPF_PROG_TYPE_LSM) {
+                       err = -EINVAL;
+                       goto out_unlock;
+               }
+               btf_id = prog->aux->attach_btf_id;
+               key = bpf_trampoline_compute_key(NULL, prog->aux->attach_btf, btf_id);
        }
 
        if (!prog->aux->dst_trampoline ||
@@ -2946,6 +2962,7 @@ attach_type_to_prog_type(enum bpf_attach_type attach_type)
                return BPF_PROG_TYPE_SK_MSG;
        case BPF_SK_SKB_STREAM_PARSER:
        case BPF_SK_SKB_STREAM_VERDICT:
+       case BPF_SK_SKB_VERDICT:
                return BPF_PROG_TYPE_SK_SKB;
        case BPF_LIRC_MODE2:
                return BPF_PROG_TYPE_LIRC_MODE2;