Files
odroid-linux/include/linux
Andrey Ignatov 7dd68b3279 bpf: Support replacing cgroup-bpf program in MULTI mode
The common use-case in production is to have multiple cgroup-bpf
programs per attach type that cover multiple use-cases. Such programs
are attached with BPF_F_ALLOW_MULTI and can be maintained by different
people.

Order of programs usually matters, for example imagine two egress
programs: the first one drops packets and the second one counts packets.
If they're swapped the result of counting program will be different.

It brings operational challenges with updating cgroup-bpf program(s)
attached with BPF_F_ALLOW_MULTI since there is no way to replace a
program:

* One way to update is to detach all programs first and then attach the
  new version(s) again in the right order. This introduces an
  interruption in the work a program is doing and may not be acceptable
  (e.g. if it's egress firewall);

* Another way is attach the new version of a program first and only then
  detach the old version. This introduces the time interval when two
  versions of same program are working, what may not be acceptable if a
  program is not idempotent. It also imposes additional burden on
  program developers to make sure that two versions of their program can
  co-exist.

Solve the problem by introducing a "replace" mode in BPF_PROG_ATTACH
command for cgroup-bpf programs being attached with BPF_F_ALLOW_MULTI
flag. This mode is enabled by newly introduced BPF_F_REPLACE attach flag
and bpf_attr.replace_bpf_fd attribute to pass fd of the old program to
replace

That way user can replace any program among those attached with
BPF_F_ALLOW_MULTI flag without the problems described above.

Details of the new API:

* If BPF_F_REPLACE is set but replace_bpf_fd doesn't have valid
  descriptor of BPF program, BPF_PROG_ATTACH will return corresponding
  error (EINVAL or EBADF).

* If replace_bpf_fd has valid descriptor of BPF program but such a
  program is not attached to specified cgroup, BPF_PROG_ATTACH will
  return ENOENT.

BPF_F_REPLACE is introduced to make the user intent clear, since
replace_bpf_fd alone can't be used for this (its default value, 0, is a
valid fd). BPF_F_REPLACE also makes it possible to extend the API in the
future (e.g. add BPF_F_BEFORE and BPF_F_AFTER if needed).

Signed-off-by: Andrey Ignatov <rdna@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Acked-by: Andrii Narkyiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/30cd850044a0057bdfcaaf154b7d2f39850ba813.1576741281.git.rdna@fb.com
2019-12-19 21:22:25 -08:00
..
2019-08-09 09:15:05 +02:00
2019-09-16 09:56:27 -07:00
2019-05-31 11:13:10 +02:00
2019-11-12 11:43:29 -05:00
2019-10-31 16:54:00 +05:30
2019-08-20 22:09:52 +02:00
2019-05-14 19:52:50 -07:00
2019-07-01 08:18:54 -06:00
2018-11-07 13:44:59 -07:00
2018-11-07 13:44:59 -07:00
2019-11-15 23:44:48 +01:00
2019-12-03 07:36:38 -07:00
2019-06-12 20:27:13 +02:00
2019-11-26 10:26:26 +01:00
2019-10-09 19:33:43 -07:00
2019-12-03 11:20:37 +01:00
2019-09-05 19:52:33 -06:00
2019-02-28 03:28:53 -05:00
2019-02-28 08:24:23 -07:00
2018-12-19 10:42:08 +01:00
2019-11-20 09:40:10 +01:00
2019-12-01 12:59:06 -08:00
2019-02-15 16:54:38 +01:00
2019-09-05 11:40:54 +02:00
2019-10-02 06:36:50 -07:00
2019-07-05 21:34:50 +02:00
2019-06-26 13:19:46 -07:00
2019-10-04 12:31:46 -07:00
2019-10-15 13:34:25 +02:00
2018-11-19 19:03:46 -07:00
2019-11-11 09:02:56 +01:00
2019-06-10 13:00:24 +02:00
2019-04-08 22:56:14 +02:00
2019-12-04 19:44:14 -08:00
2019-09-02 11:43:54 +01:00
2019-10-15 20:40:06 -07:00
2019-03-07 18:32:03 -08:00
2019-09-05 12:32:05 +02:00
2019-08-14 15:30:35 +02:00
2019-08-08 09:09:25 +02:00
2019-11-15 13:49:04 -05:00
2019-11-14 19:06:47 -08:00
2018-10-17 13:56:58 -07:00
2019-07-08 19:25:19 -07:00
2019-11-06 08:55:23 -05:00
2019-10-09 12:06:19 -04:00
2019-11-06 08:55:23 -05:00
2019-06-13 09:02:33 -04:00
2019-02-20 07:22:10 -07:00
2018-12-06 15:45:46 +01:00
2019-02-08 15:02:49 -08:00
2019-07-26 17:01:29 -06:00
2018-10-21 10:46:39 -04:00
2019-11-13 19:09:47 +08:00
2019-07-16 19:23:25 -07:00
2018-10-08 22:53:10 +11:00
2019-06-15 12:25:49 +02:00
2019-05-14 19:52:48 -07:00
2019-08-23 16:39:26 +01:00
2019-10-19 22:55:46 +02:00
2019-11-14 13:07:48 +08:00
2019-12-04 19:44:14 -08:00
2019-10-10 14:55:24 -07:00
2019-05-16 15:51:55 -07:00
2019-12-01 06:29:17 -08:00
2019-11-13 12:15:34 -08:00
2019-02-07 16:38:35 +01:00
2019-11-13 00:33:21 +11:00
2018-10-11 09:16:44 -07:00
2019-11-07 07:00:26 +01:00
2019-08-30 07:27:17 -07:00
2019-08-01 20:51:22 +02:00
2019-08-20 17:05:05 +02:00
2019-07-31 19:03:35 +02:00
2018-12-10 10:17:45 +01:00
2019-01-11 18:05:40 -08:00
2019-11-14 12:20:02 +08:00
2019-05-15 17:35:54 +01:00
2018-12-22 12:15:29 +01:00
2019-10-14 15:04:01 -07:00