mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-23 08:35:19 -05:00
bpf: Minor fixes to BPF helpers documentation
Minor improvements to the documentation for BPF helpers: * Fix formatting for the description of "bpf_socket" for bpf_getsockopt() and bpf_setsockopt(), thus suppressing two warnings from rst2man about "Unexpected indentation". * Fix formatting for return values for bpf_sk_assign() and seq_file helpers. * Fix and harmonise formatting, in particular for function/struct names. * Remove blank lines before "Return:" sections. * Replace tabs found in the middle of text lines. * Fix typos. * Add a note to the footer (in Python script) about "bpftool feature probe", including for listing features available to unprivileged users, and add a reference to bpftool man page. Thanks to Florian for reporting two typos (duplicated words). Signed-off-by: Quentin Monnet <quentin@isovalent.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20200511161536.29853-4-quentin@isovalent.com
This commit is contained in:
parent
c8caa0bb4b
commit
ab8d78093d
2 changed files with 65 additions and 50 deletions
|
@ -675,8 +675,8 @@ union bpf_attr {
|
||||||
* For tracing programs, safely attempt to read *size* bytes from
|
* For tracing programs, safely attempt to read *size* bytes from
|
||||||
* kernel space address *unsafe_ptr* and store the data in *dst*.
|
* kernel space address *unsafe_ptr* and store the data in *dst*.
|
||||||
*
|
*
|
||||||
* Generally, use bpf_probe_read_user() or bpf_probe_read_kernel()
|
* Generally, use **bpf_probe_read_user**\ () or
|
||||||
* instead.
|
* **bpf_probe_read_kernel**\ () instead.
|
||||||
* Return
|
* Return
|
||||||
* 0 on success, or a negative error in case of failure.
|
* 0 on success, or a negative error in case of failure.
|
||||||
*
|
*
|
||||||
|
@ -684,7 +684,7 @@ union bpf_attr {
|
||||||
* Description
|
* Description
|
||||||
* Return the time elapsed since system boot, in nanoseconds.
|
* Return the time elapsed since system boot, in nanoseconds.
|
||||||
* Does not include time the system was suspended.
|
* Does not include time the system was suspended.
|
||||||
* See: clock_gettime(CLOCK_MONOTONIC)
|
* See: **clock_gettime**\ (**CLOCK_MONOTONIC**)
|
||||||
* Return
|
* Return
|
||||||
* Current *ktime*.
|
* Current *ktime*.
|
||||||
*
|
*
|
||||||
|
@ -1543,11 +1543,11 @@ union bpf_attr {
|
||||||
* int bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr)
|
* int bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr)
|
||||||
* Description
|
* Description
|
||||||
* Copy a NUL terminated string from an unsafe kernel address
|
* Copy a NUL terminated string from an unsafe kernel address
|
||||||
* *unsafe_ptr* to *dst*. See bpf_probe_read_kernel_str() for
|
* *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* Generally, use bpf_probe_read_user_str() or bpf_probe_read_kernel_str()
|
* Generally, use **bpf_probe_read_user_str**\ () or
|
||||||
* instead.
|
* **bpf_probe_read_kernel_str**\ () instead.
|
||||||
* Return
|
* Return
|
||||||
* On success, the strictly positive length of the string,
|
* On success, the strictly positive length of the string,
|
||||||
* including the trailing NUL character. On error, a negative
|
* including the trailing NUL character. On error, a negative
|
||||||
|
@ -1575,7 +1575,7 @@ union bpf_attr {
|
||||||
*
|
*
|
||||||
* u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx)
|
* u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx)
|
||||||
* Description
|
* Description
|
||||||
* Equivalent to bpf_get_socket_cookie() helper that accepts
|
* Equivalent to **bpf_get_socket_cookie**\ () helper that accepts
|
||||||
* *skb*, but gets socket from **struct bpf_sock_ops** context.
|
* *skb*, but gets socket from **struct bpf_sock_ops** context.
|
||||||
* Return
|
* Return
|
||||||
* A 8-byte long non-decreasing number.
|
* A 8-byte long non-decreasing number.
|
||||||
|
@ -1604,6 +1604,7 @@ union bpf_attr {
|
||||||
* The option value of length *optlen* is pointed by *optval*.
|
* The option value of length *optlen* is pointed by *optval*.
|
||||||
*
|
*
|
||||||
* *bpf_socket* should be one of the following:
|
* *bpf_socket* should be one of the following:
|
||||||
|
*
|
||||||
* * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**.
|
* * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**.
|
||||||
* * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT**
|
* * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT**
|
||||||
* and **BPF_CGROUP_INET6_CONNECT**.
|
* and **BPF_CGROUP_INET6_CONNECT**.
|
||||||
|
@ -1672,12 +1673,12 @@ union bpf_attr {
|
||||||
*
|
*
|
||||||
* The lower two bits of *flags* are used as the return code if
|
* The lower two bits of *flags* are used as the return code if
|
||||||
* the map lookup fails. This is so that the return value can be
|
* the map lookup fails. This is so that the return value can be
|
||||||
* one of the XDP program return codes up to XDP_TX, as chosen by
|
* one of the XDP program return codes up to **XDP_TX**, as chosen
|
||||||
* the caller. Any higher bits in the *flags* argument must be
|
* by the caller. Any higher bits in the *flags* argument must be
|
||||||
* unset.
|
* unset.
|
||||||
*
|
*
|
||||||
* See also bpf_redirect(), which only supports redirecting to an
|
* See also **bpf_redirect**\ (), which only supports redirecting
|
||||||
* ifindex, but doesn't require a map to do so.
|
* to an ifindex, but doesn't require a map to do so.
|
||||||
* Return
|
* Return
|
||||||
* **XDP_REDIRECT** on success, or the value of the two lower bits
|
* **XDP_REDIRECT** on success, or the value of the two lower bits
|
||||||
* of the *flags* argument on error.
|
* of the *flags* argument on error.
|
||||||
|
@ -1785,7 +1786,7 @@ union bpf_attr {
|
||||||
* the time running for event since last normalization. The
|
* the time running for event since last normalization. The
|
||||||
* enabled and running times are accumulated since the perf event
|
* enabled and running times are accumulated since the perf event
|
||||||
* open. To achieve scaling factor between two invocations of an
|
* open. To achieve scaling factor between two invocations of an
|
||||||
* eBPF program, users can can use CPU id as the key (which is
|
* eBPF program, users can use CPU id as the key (which is
|
||||||
* typical for perf array usage model) to remember the previous
|
* typical for perf array usage model) to remember the previous
|
||||||
* value and do the calculation inside the eBPF program.
|
* value and do the calculation inside the eBPF program.
|
||||||
* Return
|
* Return
|
||||||
|
@ -1812,6 +1813,7 @@ union bpf_attr {
|
||||||
* *opval* and of length *optlen*.
|
* *opval* and of length *optlen*.
|
||||||
*
|
*
|
||||||
* *bpf_socket* should be one of the following:
|
* *bpf_socket* should be one of the following:
|
||||||
|
*
|
||||||
* * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**.
|
* * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**.
|
||||||
* * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT**
|
* * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT**
|
||||||
* and **BPF_CGROUP_INET6_CONNECT**.
|
* and **BPF_CGROUP_INET6_CONNECT**.
|
||||||
|
@ -1833,7 +1835,7 @@ union bpf_attr {
|
||||||
* The first argument is the context *regs* on which the kprobe
|
* The first argument is the context *regs* on which the kprobe
|
||||||
* works.
|
* works.
|
||||||
*
|
*
|
||||||
* This helper works by setting setting the PC (program counter)
|
* This helper works by setting the PC (program counter)
|
||||||
* to an override function which is run in place of the original
|
* to an override function which is run in place of the original
|
||||||
* probed function. This means the probed function is not run at
|
* probed function. This means the probed function is not run at
|
||||||
* all. The replacement function just returns with the required
|
* all. The replacement function just returns with the required
|
||||||
|
@ -2300,7 +2302,7 @@ union bpf_attr {
|
||||||
* **bpf_rc_keydown**\ () again with the same values, or calling
|
* **bpf_rc_keydown**\ () again with the same values, or calling
|
||||||
* **bpf_rc_repeat**\ ().
|
* **bpf_rc_repeat**\ ().
|
||||||
*
|
*
|
||||||
* Some protocols include a toggle bit, in case the button was
|
* Some protocols include a toggle bit, in case the button was
|
||||||
* released and pressed again between consecutive scancodes.
|
* released and pressed again between consecutive scancodes.
|
||||||
*
|
*
|
||||||
* The *ctx* should point to the lirc sample as passed into
|
* The *ctx* should point to the lirc sample as passed into
|
||||||
|
@ -2646,7 +2648,6 @@ union bpf_attr {
|
||||||
*
|
*
|
||||||
* *th* points to the start of the TCP header, while *th_len*
|
* *th* points to the start of the TCP header, while *th_len*
|
||||||
* contains **sizeof**\ (**struct tcphdr**).
|
* contains **sizeof**\ (**struct tcphdr**).
|
||||||
*
|
|
||||||
* Return
|
* Return
|
||||||
* 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative
|
* 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative
|
||||||
* error otherwise.
|
* error otherwise.
|
||||||
|
@ -2829,7 +2830,6 @@ union bpf_attr {
|
||||||
*
|
*
|
||||||
* *th* points to the start of the TCP header, while *th_len*
|
* *th* points to the start of the TCP header, while *th_len*
|
||||||
* contains the length of the TCP header.
|
* contains the length of the TCP header.
|
||||||
*
|
|
||||||
* Return
|
* Return
|
||||||
* On success, lower 32 bits hold the generated SYN cookie in
|
* On success, lower 32 bits hold the generated SYN cookie in
|
||||||
* followed by 16 bits which hold the MSS value for that cookie,
|
* followed by 16 bits which hold the MSS value for that cookie,
|
||||||
|
@ -2912,7 +2912,7 @@ union bpf_attr {
|
||||||
* // size, after checking its boundaries.
|
* // size, after checking its boundaries.
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* In comparison, using **bpf_probe_read_user()** helper here
|
* In comparison, using **bpf_probe_read_user**\ () helper here
|
||||||
* instead to read the string would require to estimate the length
|
* instead to read the string would require to estimate the length
|
||||||
* at compile time, and would often result in copying more memory
|
* at compile time, and would often result in copying more memory
|
||||||
* than necessary.
|
* than necessary.
|
||||||
|
@ -2930,14 +2930,14 @@ union bpf_attr {
|
||||||
* int bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr)
|
* int bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr)
|
||||||
* Description
|
* Description
|
||||||
* Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr*
|
* Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr*
|
||||||
* to *dst*. Same semantics as with bpf_probe_read_user_str() apply.
|
* to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply.
|
||||||
* Return
|
* Return
|
||||||
* On success, the strictly positive length of the string, including
|
* On success, the strictly positive length of the string, including
|
||||||
* the trailing NUL character. On error, a negative value.
|
* the trailing NUL character. On error, a negative value.
|
||||||
*
|
*
|
||||||
* int bpf_tcp_send_ack(void *tp, u32 rcv_nxt)
|
* int bpf_tcp_send_ack(void *tp, u32 rcv_nxt)
|
||||||
* Description
|
* Description
|
||||||
* Send out a tcp-ack. *tp* is the in-kernel struct tcp_sock.
|
* Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**.
|
||||||
* *rcv_nxt* is the ack_seq to be sent out.
|
* *rcv_nxt* is the ack_seq to be sent out.
|
||||||
* Return
|
* Return
|
||||||
* 0 on success, or a negative error in case of failure.
|
* 0 on success, or a negative error in case of failure.
|
||||||
|
@ -2965,19 +2965,19 @@ union bpf_attr {
|
||||||
* int bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags)
|
* int bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags)
|
||||||
* Description
|
* Description
|
||||||
* For an eBPF program attached to a perf event, retrieve the
|
* For an eBPF program attached to a perf event, retrieve the
|
||||||
* branch records (struct perf_branch_entry) associated to *ctx*
|
* branch records (**struct perf_branch_entry**) associated to *ctx*
|
||||||
* and store it in the buffer pointed by *buf* up to size
|
* and store it in the buffer pointed by *buf* up to size
|
||||||
* *size* bytes.
|
* *size* bytes.
|
||||||
* Return
|
* Return
|
||||||
* On success, number of bytes written to *buf*. On error, a
|
* On success, number of bytes written to *buf*. On error, a
|
||||||
* negative value.
|
* negative value.
|
||||||
*
|
*
|
||||||
* The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to
|
* The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to
|
||||||
* instead return the number of bytes required to store all the
|
* instead return the number of bytes required to store all the
|
||||||
* branch entries. If this flag is set, *buf* may be NULL.
|
* branch entries. If this flag is set, *buf* may be NULL.
|
||||||
*
|
*
|
||||||
* **-EINVAL** if arguments invalid or **size** not a multiple
|
* **-EINVAL** if arguments invalid or **size** not a multiple
|
||||||
* of sizeof(struct perf_branch_entry).
|
* of **sizeof**\ (**struct perf_branch_entry**\ ).
|
||||||
*
|
*
|
||||||
* **-ENOENT** if architecture does not support branch records.
|
* **-ENOENT** if architecture does not support branch records.
|
||||||
*
|
*
|
||||||
|
@ -2985,8 +2985,8 @@ union bpf_attr {
|
||||||
* Description
|
* Description
|
||||||
* Returns 0 on success, values for *pid* and *tgid* as seen from the current
|
* Returns 0 on success, values for *pid* and *tgid* as seen from the current
|
||||||
* *namespace* will be returned in *nsdata*.
|
* *namespace* will be returned in *nsdata*.
|
||||||
*
|
* Return
|
||||||
* On failure, the returned value is one of the following:
|
* 0 on success, or one of the following in case of failure:
|
||||||
*
|
*
|
||||||
* **-EINVAL** if dev and inum supplied don't match dev_t and inode number
|
* **-EINVAL** if dev and inum supplied don't match dev_t and inode number
|
||||||
* with nsfs of current task, or if dev conversion to dev_t lost high bits.
|
* with nsfs of current task, or if dev conversion to dev_t lost high bits.
|
||||||
|
@ -3025,8 +3025,8 @@ union bpf_attr {
|
||||||
* a global identifier that can be assumed unique. If *ctx* is
|
* a global identifier that can be assumed unique. If *ctx* is
|
||||||
* NULL, then the helper returns the cookie for the initial
|
* NULL, then the helper returns the cookie for the initial
|
||||||
* network namespace. The cookie itself is very similar to that
|
* network namespace. The cookie itself is very similar to that
|
||||||
* of bpf_get_socket_cookie() helper, but for network namespaces
|
* of **bpf_get_socket_cookie**\ () helper, but for network
|
||||||
* instead of sockets.
|
* namespaces instead of sockets.
|
||||||
* Return
|
* Return
|
||||||
* A 8-byte long opaque number.
|
* A 8-byte long opaque number.
|
||||||
*
|
*
|
||||||
|
@ -3061,57 +3061,66 @@ union bpf_attr {
|
||||||
*
|
*
|
||||||
* The *flags* argument must be zero.
|
* The *flags* argument must be zero.
|
||||||
* Return
|
* Return
|
||||||
* 0 on success, or a negative errno in case of failure.
|
* 0 on success, or a negative error in case of failure:
|
||||||
*
|
*
|
||||||
* * **-EINVAL** Unsupported flags specified.
|
* **-EINVAL** if specified *flags* are not supported.
|
||||||
* * **-ENOENT** Socket is unavailable for assignment.
|
*
|
||||||
* * **-ENETUNREACH** Socket is unreachable (wrong netns).
|
* **-ENOENT** if the socket is unavailable for assignment.
|
||||||
* * **-EOPNOTSUPP** Unsupported operation, for example a
|
*
|
||||||
* call from outside of TC ingress.
|
* **-ENETUNREACH** if the socket is unreachable (wrong netns).
|
||||||
* * **-ESOCKTNOSUPPORT** Socket type not supported (reuseport).
|
*
|
||||||
|
* **-EOPNOTSUPP** if the operation is not supported, for example
|
||||||
|
* a call from outside of TC ingress.
|
||||||
|
*
|
||||||
|
* **-ESOCKTNOSUPPORT** if the socket type is not supported
|
||||||
|
* (reuseport).
|
||||||
*
|
*
|
||||||
* u64 bpf_ktime_get_boot_ns(void)
|
* u64 bpf_ktime_get_boot_ns(void)
|
||||||
* Description
|
* Description
|
||||||
* Return the time elapsed since system boot, in nanoseconds.
|
* Return the time elapsed since system boot, in nanoseconds.
|
||||||
* Does include the time the system was suspended.
|
* Does include the time the system was suspended.
|
||||||
* See: clock_gettime(CLOCK_BOOTTIME)
|
* See: **clock_gettime**\ (**CLOCK_BOOTTIME**)
|
||||||
* Return
|
* Return
|
||||||
* Current *ktime*.
|
* Current *ktime*.
|
||||||
*
|
*
|
||||||
* int bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len)
|
* int bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len)
|
||||||
* Description
|
* Description
|
||||||
* seq_printf uses seq_file seq_printf() to print out the format string.
|
* **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print
|
||||||
|
* out the format string.
|
||||||
* The *m* represents the seq_file. The *fmt* and *fmt_size* are for
|
* The *m* represents the seq_file. The *fmt* and *fmt_size* are for
|
||||||
* the format string itself. The *data* and *data_len* are format string
|
* the format string itself. The *data* and *data_len* are format string
|
||||||
* arguments. The *data* are a u64 array and corresponding format string
|
* arguments. The *data* are a **u64** array and corresponding format string
|
||||||
* values are stored in the array. For strings and pointers where pointees
|
* values are stored in the array. For strings and pointers where pointees
|
||||||
* are accessed, only the pointer values are stored in the *data* array.
|
* are accessed, only the pointer values are stored in the *data* array.
|
||||||
* The *data_len* is the *data* size in term of bytes.
|
* The *data_len* is the size of *data* in bytes.
|
||||||
*
|
*
|
||||||
* Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory.
|
* Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory.
|
||||||
* Reading kernel memory may fail due to either invalid address or
|
* Reading kernel memory may fail due to either invalid address or
|
||||||
* valid address but requiring a major memory fault. If reading kernel memory
|
* valid address but requiring a major memory fault. If reading kernel memory
|
||||||
* fails, the string for **%s** will be an empty string, and the ip
|
* fails, the string for **%s** will be an empty string, and the ip
|
||||||
* address for **%p{i,I}{4,6}** will be 0. Not returning error to
|
* address for **%p{i,I}{4,6}** will be 0. Not returning error to
|
||||||
* bpf program is consistent with what bpf_trace_printk() does for now.
|
* bpf program is consistent with what **bpf_trace_printk**\ () does for now.
|
||||||
* Return
|
* Return
|
||||||
* 0 on success, or a negative errno in case of failure.
|
* 0 on success, or a negative error in case of failure:
|
||||||
*
|
*
|
||||||
* * **-EBUSY** Percpu memory copy buffer is busy, can try again
|
* **-EBUSY** if per-CPU memory copy buffer is busy, can try again
|
||||||
* by returning 1 from bpf program.
|
* by returning 1 from bpf program.
|
||||||
* * **-EINVAL** Invalid arguments, or invalid/unsupported formats.
|
*
|
||||||
* * **-E2BIG** Too many format specifiers.
|
* **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported.
|
||||||
* * **-EOVERFLOW** Overflow happens, the same object will be tried again.
|
*
|
||||||
|
* **-E2BIG** if *fmt* contains too many format specifiers.
|
||||||
|
*
|
||||||
|
* **-EOVERFLOW** if an overflow happened: The same object will be tried again.
|
||||||
*
|
*
|
||||||
* int bpf_seq_write(struct seq_file *m, const void *data, u32 len)
|
* int bpf_seq_write(struct seq_file *m, const void *data, u32 len)
|
||||||
* Description
|
* Description
|
||||||
* seq_write uses seq_file seq_write() to write the data.
|
* **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data.
|
||||||
* The *m* represents the seq_file. The *data* and *len* represent the
|
* The *m* represents the seq_file. The *data* and *len* represent the
|
||||||
* data to write in bytes.
|
* data to write in bytes.
|
||||||
* Return
|
* Return
|
||||||
* 0 on success, or a negative errno in case of failure.
|
* 0 on success, or a negative error in case of failure:
|
||||||
*
|
*
|
||||||
* * **-EOVERFLOW** Overflow happens, the same object will be tried again.
|
* **-EOVERFLOW** if an overflow happened: The same object will be tried again.
|
||||||
*/
|
*/
|
||||||
#define __BPF_FUNC_MAPPER(FN) \
|
#define __BPF_FUNC_MAPPER(FN) \
|
||||||
FN(unspec), \
|
FN(unspec), \
|
||||||
|
|
|
@ -318,6 +318,11 @@ may be interested in:
|
||||||
of eBPF maps are used with a given helper function.
|
of eBPF maps are used with a given helper function.
|
||||||
* *kernel/bpf/* directory contains other files in which additional helpers are
|
* *kernel/bpf/* directory contains other files in which additional helpers are
|
||||||
defined (for cgroups, sockmaps, etc.).
|
defined (for cgroups, sockmaps, etc.).
|
||||||
|
* The bpftool utility can be used to probe the availability of helper functions
|
||||||
|
on the system (as well as supported program and map types, and a number of
|
||||||
|
other parameters). To do so, run **bpftool feature probe** (see
|
||||||
|
**bpftool-feature**\ (8) for details). Add the **unprivileged** keyword to
|
||||||
|
list features available to unprivileged users.
|
||||||
|
|
||||||
Compatibility between helper functions and program types can generally be found
|
Compatibility between helper functions and program types can generally be found
|
||||||
in the files where helper functions are defined. Look for the **struct
|
in the files where helper functions are defined. Look for the **struct
|
||||||
|
@ -338,6 +343,7 @@ SEE ALSO
|
||||||
========
|
========
|
||||||
|
|
||||||
**bpf**\ (2),
|
**bpf**\ (2),
|
||||||
|
**bpftool**\ (8),
|
||||||
**cgroups**\ (7),
|
**cgroups**\ (7),
|
||||||
**ip**\ (8),
|
**ip**\ (8),
|
||||||
**perf_event_open**\ (2),
|
**perf_event_open**\ (2),
|
||||||
|
|
Loading…
Add table
Reference in a new issue