libbpf: Add bpf_link detach APIs
authorAndrii Nakryiko <andriin@fb.com>
Fri, 31 Jul 2020 18:28:27 +0000 (11:28 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 2 Aug 2020 03:38:28 +0000 (20:38 -0700)
Add low-level bpf_link_detach() API. Also add higher-level bpf_link__detach()
one.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Song Liu <songliubraving@fb.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20200731182830.286260-3-andriin@fb.com
tools/include/uapi/linux/bpf.h
tools/lib/bpf/bpf.c
tools/lib/bpf/bpf.h
tools/lib/bpf/libbpf.c
tools/lib/bpf/libbpf.h
tools/lib/bpf/libbpf.map

index eb5e0c3..b134e67 100644 (file)
@@ -117,6 +117,7 @@ enum bpf_cmd {
        BPF_LINK_GET_NEXT_ID,
        BPF_ENABLE_STATS,
        BPF_ITER_CREATE,
+       BPF_LINK_DETACH,
 };
 
 enum bpf_map_type {
@@ -634,6 +635,10 @@ union bpf_attr {
                __u32           old_prog_fd;
        } link_update;
 
+       struct {
+               __u32           link_fd;
+       } link_detach;
+
        struct { /* struct used by BPF_ENABLE_STATS command */
                __u32           type;
        } enable_stats;
index e1bdf21..eab14c9 100644 (file)
@@ -603,6 +603,16 @@ int bpf_link_create(int prog_fd, int target_fd,
        return sys_bpf(BPF_LINK_CREATE, &attr, sizeof(attr));
 }
 
+int bpf_link_detach(int link_fd)
+{
+       union bpf_attr attr;
+
+       memset(&attr, 0, sizeof(attr));
+       attr.link_detach.link_fd = link_fd;
+
+       return sys_bpf(BPF_LINK_DETACH, &attr, sizeof(attr));
+}
+
 int bpf_link_update(int link_fd, int new_prog_fd,
                    const struct bpf_link_update_opts *opts)
 {
index 6d367e0..28855fd 100644 (file)
@@ -178,6 +178,8 @@ LIBBPF_API int bpf_link_create(int prog_fd, int target_fd,
                               enum bpf_attach_type attach_type,
                               const struct bpf_link_create_opts *opts);
 
+LIBBPF_API int bpf_link_detach(int link_fd);
+
 struct bpf_link_update_opts {
        size_t sz; /* size of this struct for forward/backward compatibility */
        __u32 flags;       /* extra flags */
index b9f11f8..7be04e4 100644 (file)
@@ -7748,6 +7748,11 @@ struct bpf_link *bpf_link__open(const char *path)
        return link;
 }
 
+int bpf_link__detach(struct bpf_link *link)
+{
+       return bpf_link_detach(link->fd) ? -errno : 0;
+}
+
 int bpf_link__pin(struct bpf_link *link, const char *path)
 {
        int err;
index 9924385..3ed1399 100644 (file)
@@ -229,6 +229,7 @@ LIBBPF_API int bpf_link__unpin(struct bpf_link *link);
 LIBBPF_API int bpf_link__update_program(struct bpf_link *link,
                                        struct bpf_program *prog);
 LIBBPF_API void bpf_link__disconnect(struct bpf_link *link);
+LIBBPF_API int bpf_link__detach(struct bpf_link *link);
 LIBBPF_API int bpf_link__destroy(struct bpf_link *link);
 
 LIBBPF_API struct bpf_link *
index ca49a6a..0998634 100644 (file)
@@ -273,6 +273,8 @@ LIBBPF_0.0.9 {
 
 LIBBPF_0.1.0 {
        global:
+               bpf_link__detach;
+               bpf_link_detach;
                bpf_map__ifindex;
                bpf_map__key_size;
                bpf_map__map_flags;