Commit e21d585c authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov

libbpf: Deprecate multi-instance bpf_program APIs

Schedule deprecation of a set of APIs that are related to multi-instance
bpf_programs:
  - bpf_program__set_prep() ([0]);
  - bpf_program__{set,unset}_instance() ([1]);
  - bpf_program__nth_fd().

These APIs are obscure, very niche, and don't seem to be used much in
practice. bpf_program__set_prep() is pretty useless for anything but the
simplest BPF programs, as it doesn't allow to adjust BPF program load
attributes, among other things. In short, it already bitrotted and will
bitrot some more if not removed.

With bpf_program__insns() API, which gives access to post-processed BPF
program instructions of any given entry-point BPF program, it's now
possible to do whatever necessary adjustments were possible with
set_prep() API before, but also more. Given any such use case is
automatically an advanced use case, requiring users to stick to
low-level bpf_prog_load() APIs and managing their own prog FDs is
reasonable.

  [0] Closes: https://github.com/libbpf/libbpf/issues/299
  [1] Closes: https://github.com/libbpf/libbpf/issues/300Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20211025224531.1088894-4-andrii@kernel.org
parent 65a7fa2e
...@@ -7358,8 +7358,7 @@ static int check_path(const char *path) ...@@ -7358,8 +7358,7 @@ static int check_path(const char *path)
return err; return err;
} }
int bpf_program__pin_instance(struct bpf_program *prog, const char *path, static int bpf_program_pin_instance(struct bpf_program *prog, const char *path, int instance)
int instance)
{ {
char *cp, errmsg[STRERR_BUFSIZE]; char *cp, errmsg[STRERR_BUFSIZE];
int err; int err;
...@@ -7394,8 +7393,7 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path, ...@@ -7394,8 +7393,7 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path,
return 0; return 0;
} }
int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, static int bpf_program_unpin_instance(struct bpf_program *prog, const char *path, int instance)
int instance)
{ {
int err; int err;
...@@ -7423,6 +7421,12 @@ int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, ...@@ -7423,6 +7421,12 @@ int bpf_program__unpin_instance(struct bpf_program *prog, const char *path,
return 0; return 0;
} }
__attribute__((alias("bpf_program_pin_instance")))
int bpf_object__pin_instance(struct bpf_program *prog, const char *path, int instance);
__attribute__((alias("bpf_program_unpin_instance")))
int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, int instance);
int bpf_program__pin(struct bpf_program *prog, const char *path) int bpf_program__pin(struct bpf_program *prog, const char *path)
{ {
int i, err; int i, err;
...@@ -7447,7 +7451,7 @@ int bpf_program__pin(struct bpf_program *prog, const char *path) ...@@ -7447,7 +7451,7 @@ int bpf_program__pin(struct bpf_program *prog, const char *path)
if (prog->instances.nr == 1) { if (prog->instances.nr == 1) {
/* don't create subdirs when pinning single instance */ /* don't create subdirs when pinning single instance */
return bpf_program__pin_instance(prog, path, 0); return bpf_program_pin_instance(prog, path, 0);
} }
for (i = 0; i < prog->instances.nr; i++) { for (i = 0; i < prog->instances.nr; i++) {
...@@ -7463,7 +7467,7 @@ int bpf_program__pin(struct bpf_program *prog, const char *path) ...@@ -7463,7 +7467,7 @@ int bpf_program__pin(struct bpf_program *prog, const char *path)
goto err_unpin; goto err_unpin;
} }
err = bpf_program__pin_instance(prog, buf, i); err = bpf_program_pin_instance(prog, buf, i);
if (err) if (err)
goto err_unpin; goto err_unpin;
} }
...@@ -7481,7 +7485,7 @@ int bpf_program__pin(struct bpf_program *prog, const char *path) ...@@ -7481,7 +7485,7 @@ int bpf_program__pin(struct bpf_program *prog, const char *path)
else if (len >= PATH_MAX) else if (len >= PATH_MAX)
continue; continue;
bpf_program__unpin_instance(prog, buf, i); bpf_program_unpin_instance(prog, buf, i);
} }
rmdir(path); rmdir(path);
...@@ -7509,7 +7513,7 @@ int bpf_program__unpin(struct bpf_program *prog, const char *path) ...@@ -7509,7 +7513,7 @@ int bpf_program__unpin(struct bpf_program *prog, const char *path)
if (prog->instances.nr == 1) { if (prog->instances.nr == 1) {
/* don't create subdirs when pinning single instance */ /* don't create subdirs when pinning single instance */
return bpf_program__unpin_instance(prog, path, 0); return bpf_program_unpin_instance(prog, path, 0);
} }
for (i = 0; i < prog->instances.nr; i++) { for (i = 0; i < prog->instances.nr; i++) {
...@@ -7522,7 +7526,7 @@ int bpf_program__unpin(struct bpf_program *prog, const char *path) ...@@ -7522,7 +7526,7 @@ int bpf_program__unpin(struct bpf_program *prog, const char *path)
else if (len >= PATH_MAX) else if (len >= PATH_MAX)
return libbpf_err(-ENAMETOOLONG); return libbpf_err(-ENAMETOOLONG);
err = bpf_program__unpin_instance(prog, buf, i); err = bpf_program_unpin_instance(prog, buf, i);
if (err) if (err)
return err; return err;
} }
......
...@@ -263,9 +263,11 @@ LIBBPF_API size_t bpf_program__insn_cnt(const struct bpf_program *prog); ...@@ -263,9 +263,11 @@ LIBBPF_API size_t bpf_program__insn_cnt(const struct bpf_program *prog);
LIBBPF_API int bpf_program__load(struct bpf_program *prog, char *license, LIBBPF_API int bpf_program__load(struct bpf_program *prog, char *license,
__u32 kern_version); __u32 kern_version);
LIBBPF_API int bpf_program__fd(const struct bpf_program *prog); LIBBPF_API int bpf_program__fd(const struct bpf_program *prog);
LIBBPF_DEPRECATED_SINCE(0, 7, "multi-instance bpf_program support is deprecated")
LIBBPF_API int bpf_program__pin_instance(struct bpf_program *prog, LIBBPF_API int bpf_program__pin_instance(struct bpf_program *prog,
const char *path, const char *path,
int instance); int instance);
LIBBPF_DEPRECATED_SINCE(0, 7, "multi-instance bpf_program support is deprecated")
LIBBPF_API int bpf_program__unpin_instance(struct bpf_program *prog, LIBBPF_API int bpf_program__unpin_instance(struct bpf_program *prog,
const char *path, const char *path,
int instance); int instance);
...@@ -427,7 +429,7 @@ bpf_program__attach_iter(const struct bpf_program *prog, ...@@ -427,7 +429,7 @@ bpf_program__attach_iter(const struct bpf_program *prog,
* one instance. In this case bpf_program__fd(prog) is equal to * one instance. In this case bpf_program__fd(prog) is equal to
* bpf_program__nth_fd(prog, 0). * bpf_program__nth_fd(prog, 0).
*/ */
LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_program__insns() for getting bpf_program instructions")
struct bpf_prog_prep_result { struct bpf_prog_prep_result {
/* /*
* If not NULL, load new instruction array. * If not NULL, load new instruction array.
...@@ -456,9 +458,11 @@ typedef int (*bpf_program_prep_t)(struct bpf_program *prog, int n, ...@@ -456,9 +458,11 @@ typedef int (*bpf_program_prep_t)(struct bpf_program *prog, int n,
struct bpf_insn *insns, int insns_cnt, struct bpf_insn *insns, int insns_cnt,
struct bpf_prog_prep_result *res); struct bpf_prog_prep_result *res);
LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_program__insns() for getting bpf_program instructions")
LIBBPF_API int bpf_program__set_prep(struct bpf_program *prog, int nr_instance, LIBBPF_API int bpf_program__set_prep(struct bpf_program *prog, int nr_instance,
bpf_program_prep_t prep); bpf_program_prep_t prep);
LIBBPF_DEPRECATED_SINCE(0, 7, "multi-instance bpf_program support is deprecated")
LIBBPF_API int bpf_program__nth_fd(const struct bpf_program *prog, int n); LIBBPF_API int bpf_program__nth_fd(const struct bpf_program *prog, int n);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment