bpf.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH bpf-next] bpf: add helpers documentation about GPL compatibility
@ 2021-08-22 11:59 Lorenzo Fontana
  2021-08-24  0:10 ` Alexei Starovoitov
  0 siblings, 1 reply; 3+ messages in thread
From: Lorenzo Fontana @ 2021-08-22 11:59 UTC (permalink / raw)
  To: bpf; +Cc: Quentin Monnet, Daniel Borkmann, Lorenzo Fontana

When writing BPF programs one might refer to the man page
to lookup helpers. When you do so, however you don't have
a way to immediately know if you can use the helper
based on your program licensing requirements.

This patch adds a specific line in the man bpf-helpers
to show that information straight away.

Signed-off-by: Lorenzo Fontana <fontanalorenz@gmail.com>
---
 include/uapi/linux/bpf.h       | 336 +++++++++++++++++++++++++++++++++
 scripts/bpf_doc.py             |  34 +++-
 tools/include/uapi/linux/bpf.h | 336 +++++++++++++++++++++++++++++++++
 3 files changed, 704 insertions(+), 2 deletions(-)

diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index c4f7892edb2b..2c03010024e3 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -1512,6 +1512,8 @@ union bpf_attr {
  * 	Return
  * 		Map value associated to *key*, or **NULL** if no entry was
  * 		found.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)
  * 	Description
@@ -1530,6 +1532,8 @@ union bpf_attr {
  * 		elements always exist), the helper would return an error.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_map_delete_elem(struct bpf_map *map, const void *key)
  * 	Description
@@ -1546,6 +1550,8 @@ union bpf_attr {
  * 		**bpf_probe_read_kernel**\ () instead.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_ktime_get_ns(void)
  * 	Description
@@ -1554,6 +1560,8 @@ union bpf_attr {
  * 		See: **clock_gettime**\ (**CLOCK_MONOTONIC**)
  * 	Return
  * 		Current *ktime*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...)
  * 	Description
@@ -1613,6 +1621,8 @@ union bpf_attr {
  * 	Return
  * 		The number of bytes written to the buffer, or a negative error
  * 		in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u32 bpf_get_prandom_u32(void)
  * 	Description
@@ -1625,6 +1635,8 @@ union bpf_attr {
  * 		cryptographically secure.
  * 	Return
  * 		A random 32-bit unsigned value.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_smp_processor_id(void)
  * 	Description
@@ -1634,6 +1646,8 @@ union bpf_attr {
  * 		program.
  * 	Return
  * 		The SMP id of the processor running the program.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags)
  * 	Description
@@ -1651,6 +1665,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size)
  * 	Description
@@ -1676,6 +1692,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags)
  * 	Description
@@ -1708,6 +1726,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index)
  * 	Description
@@ -1739,6 +1759,8 @@ union bpf_attr {
  * 		which is currently set to 32.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags)
  * 	Description
@@ -1763,6 +1785,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_pid_tgid(void)
  * 	Return
@@ -1770,11 +1794,15 @@ union bpf_attr {
  * 		created as such:
  * 		*current_task*\ **->tgid << 32 \|**
  * 		*current_task*\ **->pid**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_uid_gid(void)
  * 	Return
  * 		A 64-bit integer containing the current GID and UID, and
  * 		created as such: *current_gid* **<< 32 \|** *current_uid*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_current_comm(void *buf, u32 size_of_buf)
  * 	Description
@@ -1786,6 +1814,8 @@ union bpf_attr {
  * 		it is filled with zeroes.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_cgroup_classid(struct sk_buff *skb)
  * 	Description
@@ -1812,6 +1842,8 @@ union bpf_attr {
  * 		"**y**" or to "**m**".
  * 	Return
  * 		The classid, or 0 for the default unconfigured classid.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci)
  * 	Description
@@ -1828,6 +1860,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_vlan_pop(struct sk_buff *skb)
  * 	Description
@@ -1840,6 +1874,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
  * 	Description
@@ -1891,6 +1927,8 @@ union bpf_attr {
  * 		Geneve, GRE or IP in IP (IPIP).
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
  * 	Description
@@ -1928,6 +1966,8 @@ union bpf_attr {
  * 		helper for additional information.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags)
  * 	Description
@@ -1957,6 +1997,8 @@ union bpf_attr {
  * 	Return
  * 		The value of the perf event counter read from the map, or a
  * 		negative error code in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_redirect(u32 ifindex, u64 flags)
  * 	Description
@@ -1980,6 +2022,8 @@ union bpf_attr {
  * 		**XDP_ABORTED** on error. For other program types, the values
  * 		are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on
  * 		error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_route_realm(struct sk_buff *skb)
  * 	Description
@@ -2004,6 +2048,8 @@ union bpf_attr {
  * 	Return
  * 		The realm of the route for the packet associated to *skb*, or 0
  * 		if none was found.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_perf_event_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
  * 	Description
@@ -2049,6 +2095,8 @@ union bpf_attr {
  * 		* A combination of both.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_skb_load_bytes(const void *skb, u32 offset, void *to, u32 len)
  * 	Description
@@ -2066,6 +2114,8 @@ union bpf_attr {
  * 		at once from a packet into the eBPF stack.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_stackid(void *ctx, struct bpf_map *map, u64 flags)
  * 	Description
@@ -2108,6 +2158,8 @@ union bpf_attr {
  * 	Return
  * 		The positive or null stack id on success, or a negative error
  * 		in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed)
  * 	Description
@@ -2135,6 +2187,8 @@ union bpf_attr {
  * 	Return
  * 		The checksum result, or a negative error code in case of
  * 		failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_get_tunnel_opt(struct sk_buff *skb, void *opt, u32 size)
  * 	Description
@@ -2153,6 +2207,8 @@ union bpf_attr {
  * 		headers.
  * 	Return
  * 		The size of the option data retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_set_tunnel_opt(struct sk_buff *skb, void *opt, u32 size)
  * 	Description
@@ -2190,6 +2246,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_change_type(struct sk_buff *skb, u32 type)
  * 	Description
@@ -2217,6 +2275,8 @@ union bpf_attr {
  * 			Send packet to someone else.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index)
  * 	Description
@@ -2228,6 +2288,8 @@ union bpf_attr {
  * 		* 0, if the *skb* failed the cgroup2 descendant test.
  * 		* 1, if the *skb* succeeded the cgroup2 descendant test.
  * 		* A negative error code, if an error occurred.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_hash_recalc(struct sk_buff *skb)
  * 	Description
@@ -2244,6 +2306,8 @@ union bpf_attr {
  * 		**bpf_get_hash_recalc**\ ().
  * 	Return
  * 		The 32-bit hash.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_task(void)
  * 	Return
@@ -2267,6 +2331,8 @@ union bpf_attr {
  * 		logs.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_current_task_under_cgroup(struct bpf_map *map, u32 index)
  * 	Description
@@ -2279,6 +2345,8 @@ union bpf_attr {
  *		* 0, if current task belongs to the cgroup2.
  *		* 1, if current task does not belong to the cgroup2.
  * 		* A negative error code, if an error occurred.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags)
  * 	Description
@@ -2303,6 +2371,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_pull_data(struct sk_buff *skb, u32 len)
  * 	Description
@@ -2339,6 +2409,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum)
  * 	Description
@@ -2351,6 +2423,8 @@ union bpf_attr {
  * 	Return
  * 		The checksum on success, or a negative error code in case of
  * 		failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void bpf_set_hash_invalid(struct sk_buff *skb)
  * 	Description
@@ -2359,6 +2433,8 @@ union bpf_attr {
  * 		indicate that the hash is outdated and to trigger a
  * 		recalculation the next time the kernel tries to access this
  * 		hash or when the **bpf_get_hash_recalc**\ () helper is called.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_numa_node_id(void)
  * 	Description
@@ -2370,6 +2446,8 @@ union bpf_attr {
  * 		similarly to **bpf_get_smp_processor_id**\ ().
  * 	Return
  * 		The id of current NUMA node.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags)
  * 	Description
@@ -2391,6 +2469,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta)
  * 	Description
@@ -2406,6 +2486,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr)
  * 	Description
@@ -2419,6 +2501,8 @@ union bpf_attr {
  * 		On success, the strictly positive length of the string,
  * 		including the trailing NUL character. On error, a negative
  * 		value.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_socket_cookie(struct sk_buff *skb)
  * 	Description
@@ -2432,6 +2516,8 @@ union bpf_attr {
  * 	Return
  * 		A 8-byte long unique number on success, or 0 if the socket
  * 		field is missing inside *skb*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx)
  * 	Description
@@ -2439,6 +2525,8 @@ union bpf_attr {
  * 		*skb*, but gets socket from **struct bpf_sock_addr** context.
  * 	Return
  * 		A 8-byte long unique number.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx)
  * 	Description
@@ -2446,6 +2534,8 @@ union bpf_attr {
  * 		*skb*, but gets socket from **struct bpf_sock_ops** context.
  * 	Return
  * 		A 8-byte long unique number.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_socket_cookie(struct sock *sk)
  * 	Description
@@ -2454,6 +2544,8 @@ union bpf_attr {
  * 		also works for sleepable programs.
  * 	Return
  * 		A 8-byte long unique number or 0 if *sk* is NULL.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_socket_uid(struct sk_buff *skb)
  * 	Return
@@ -2469,6 +2561,8 @@ union bpf_attr {
  * 		to value *hash*.
  * 	Return
  * 		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_setsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen)
  * 	Description
@@ -2500,6 +2594,8 @@ union bpf_attr {
  * 		* **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags)
  * 	Description
@@ -2550,6 +2646,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags)
  * 	Description
@@ -2575,6 +2673,8 @@ union bpf_attr {
  * 	Return
  * 		**XDP_REDIRECT** on success, or the value of the two lower bits
  * 		of the *flags* argument on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_redirect_map(struct sk_buff *skb, struct bpf_map *map, u32 key, u64 flags)
  * 	Description
@@ -2586,6 +2686,8 @@ union bpf_attr {
  * 		egress path otherwise). This is the only flag supported for now.
  * 	Return
  * 		**SK_PASS** on success, or **SK_DROP** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags)
  * 	Description
@@ -2605,6 +2707,8 @@ union bpf_attr {
  * 		already attached to eBPF programs, this results in an error.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta)
  * 	Description
@@ -2634,6 +2738,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size)
  * 	Description
@@ -2684,6 +2790,8 @@ union bpf_attr {
  * 		value and do the calculation inside the eBPF program.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size)
  * 	Description
@@ -2695,6 +2803,8 @@ union bpf_attr {
  * 		more details).
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_getsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen)
  * 	Description
@@ -2720,6 +2830,8 @@ union bpf_attr {
  * 		* **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_override_return(struct pt_regs *regs, u64 rc)
  * 	Description
@@ -2745,6 +2857,8 @@ union bpf_attr {
  * 		x86 architecture is the only one to support this feature.
  * 	Return
  * 		0
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval)
  * 	Description
@@ -2789,6 +2903,8 @@ union bpf_attr {
  * 		otherwise, a positive number containing the bits that could not
  * 		be set is returned (which comes down to 0 if all bits were set
  * 		as required).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags)
  * 	Description
@@ -2803,6 +2919,8 @@ union bpf_attr {
  * 		egress path otherwise). This is the only flag supported for now.
  * 	Return
  * 		**SK_PASS** on success, or **SK_DROP** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes)
  * 	Description
@@ -2837,6 +2955,8 @@ union bpf_attr {
  * 		being buffered for *bytes* and is sent as it is received.
  * 	Return
  * 		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes)
  * 	Description
@@ -2855,6 +2975,8 @@ union bpf_attr {
  * 		been accumulated.
  * 	Return
  * 		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags)
  * 	Description
@@ -2886,6 +3008,8 @@ union bpf_attr {
  * 		be left at zero.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len)
  * 	Description
@@ -2904,6 +3028,8 @@ union bpf_attr {
  * 		lead to degraded performance.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta)
  * 	Description
@@ -2918,6 +3044,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags)
  * 	Description
@@ -2934,6 +3062,8 @@ union bpf_attr {
  * 		**CONFIG_XFRM** configuration option.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_stack(void *ctx, void *buf, u32 size, u64 flags)
  * 	Description
@@ -2967,6 +3097,8 @@ union bpf_attr {
  * 	Return
  * 		A non-negative value equal to or less than *size* on success,
  * 		or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_skb_load_bytes_relative(const void *skb, u32 offset, void *to, u32 len, u32 start_header)
  * 	Description
@@ -2989,6 +3121,8 @@ union bpf_attr {
  * 		is not available.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags)
  *	Description
@@ -3023,6 +3157,8 @@ union bpf_attr {
  *
  *		If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU
  *		was exceeded and output params->mtu_result contains the MTU.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_sock_hash_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags)
  *	Description
@@ -3042,6 +3178,8 @@ union bpf_attr {
  *		already attached to eBPF programs, this results in an error.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags)
  *	Description
@@ -3056,6 +3194,8 @@ union bpf_attr {
  *		egress path otherwise). This is the only flag supported for now.
  *	Return
  *		**SK_PASS** on success, or **SK_DROP** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags)
  *	Description
@@ -3070,6 +3210,8 @@ union bpf_attr {
  *		egress otherwise). This is the only flag supported for now.
  *	Return
  *		**SK_PASS** on success, or **SK_DROP** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len)
  *	Description
@@ -3107,6 +3249,8 @@ union bpf_attr {
  * 		direct packet access.
  *	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len)
  *	Description
@@ -3122,6 +3266,8 @@ union bpf_attr {
  * 		direct packet access.
  *	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta)
  *	Description
@@ -3138,6 +3284,8 @@ union bpf_attr {
  * 		direct packet access.
  *	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len)
  *	Description
@@ -3167,6 +3315,8 @@ union bpf_attr {
  * 		direct packet access.
  *	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_rc_repeat(void *ctx)
  *	Description
@@ -3186,6 +3336,8 @@ union bpf_attr {
  *		"**y**".
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle)
  *	Description
@@ -3212,6 +3364,8 @@ union bpf_attr {
  *		"**y**".
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_skb_cgroup_id(struct sk_buff *skb)
  * 	Description
@@ -3228,6 +3382,8 @@ union bpf_attr {
  * 		**CONFIG_SOCK_CGROUP_DATA** configuration option.
  * 	Return
  * 		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_cgroup_id(void)
  * 	Return
@@ -3251,6 +3407,8 @@ union bpf_attr {
  *		the shared data.
  *	Return
  *		A pointer to the local storage area.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags)
  *	Description
@@ -3260,6 +3418,8 @@ union bpf_attr {
  *		request in the socket buffer.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level)
  *	Description
@@ -3278,6 +3438,8 @@ union bpf_attr {
  *		**bpf_skb_cgroup_id**\ ().
  *	Return
  *		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_sk_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
  *	Description
@@ -3315,6 +3477,8 @@ union bpf_attr {
  *		For sockets with reuseport option, the **struct bpf_sock**
  *		result is from *reuse*\ **->socks**\ [] using the hash of the
  *		tuple.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_sk_lookup_udp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
  *	Description
@@ -3352,6 +3516,8 @@ union bpf_attr {
  *		For sockets with reuseport option, the **struct bpf_sock**
  *		result is from *reuse*\ **->socks**\ [] using the hash of the
  *		tuple.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_release(void *sock)
  *	Description
@@ -3360,6 +3526,8 @@ union bpf_attr {
  *		**bpf_sk_lookup_xxx**\ ().
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags)
  * 	Description
@@ -3370,6 +3538,8 @@ union bpf_attr {
  * 			removed to make room for this.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_map_pop_elem(struct bpf_map *map, void *value)
  * 	Description
@@ -3382,6 +3552,8 @@ union bpf_attr {
  * 		Get an element from *map* without removing it.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_push_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags)
  *	Description
@@ -3398,6 +3570,8 @@ union bpf_attr {
  *		error and BPF programs will need to handle them.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags)
  *	Description
@@ -3410,6 +3584,8 @@ union bpf_attr {
  *		payload and/or *pop* value being to large.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
  *	Description
@@ -3424,6 +3600,8 @@ union bpf_attr {
  *		"**y**".
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_spin_lock(struct bpf_spin_lock *lock)
  *	Description
@@ -3472,6 +3650,8 @@ union bpf_attr {
  *		* **bpf_spin_lock** is not allowed in inner maps of map-in-map.
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_spin_unlock(struct bpf_spin_lock *lock)
  *	Description
@@ -3479,6 +3659,8 @@ union bpf_attr {
  *		**bpf_spin_lock**\ (\ *lock*\ ).
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_sk_fullsock(struct bpf_sock *sk)
  *	Description
@@ -3487,6 +3669,8 @@ union bpf_attr {
  *	Return
  *		A **struct bpf_sock** pointer on success, or **NULL** in
  *		case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_tcp_sock *bpf_tcp_sock(struct bpf_sock *sk)
  *	Description
@@ -3495,6 +3679,8 @@ union bpf_attr {
  *	Return
  *		A **struct bpf_tcp_sock** pointer on success, or **NULL** in
  *		case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_ecn_set_ce(struct sk_buff *skb)
  *	Description
@@ -3505,6 +3691,8 @@ union bpf_attr {
  *	Return
  *		1 if the **CE** flag is set (either by the current helper call
  *		or because it was already present), 0 if it is not set.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_get_listener_sock(struct bpf_sock *sk)
  *	Description
@@ -3513,6 +3701,8 @@ union bpf_attr {
  *	Return
  *		A **struct bpf_sock** pointer on success, or **NULL** in
  *		case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_skc_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
  *	Description
@@ -3532,6 +3722,8 @@ union bpf_attr {
  *		For sockets with reuseport option, the **struct bpf_sock**
  *		result is from *reuse*\ **->socks**\ [] using the hash of the
  *		tuple.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_tcp_check_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
  * 	Description
@@ -3547,6 +3739,8 @@ union bpf_attr {
  * 	Return
  * 		0 if *iph* and *th* are a valid SYN cookie ACK, or a negative
  * 		error otherwise.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_sysctl_get_name(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags)
  *	Description
@@ -3563,6 +3757,8 @@ union bpf_attr {
  *
  *		**-E2BIG** if the buffer wasn't big enough (*buf* will contain
  *		truncated name in this case).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sysctl_get_current_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len)
  *	Description
@@ -3582,6 +3778,8 @@ union bpf_attr {
  *
  *		**-EINVAL** if current value was unavailable, e.g. because
  *		sysctl is uninitialized and read returns -EIO for it.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sysctl_get_new_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len)
  *	Description
@@ -3599,6 +3797,8 @@ union bpf_attr {
  *		truncated name in this case).
  *
  *		**-EINVAL** if sysctl is being read.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sysctl_set_new_value(struct bpf_sysctl *ctx, const char *buf, size_t buf_len)
  *	Description
@@ -3616,6 +3816,8 @@ union bpf_attr {
  *		**-E2BIG** if the *buf_len* is too big.
  *
  *		**-EINVAL** if sysctl is being read.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_strtol(const char *buf, size_t buf_len, u64 flags, long *res)
  *	Description
@@ -3640,6 +3842,8 @@ union bpf_attr {
  *		was provided.
  *
  *		**-ERANGE** if resulting value was out of range.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_strtoul(const char *buf, size_t buf_len, u64 flags, unsigned long *res)
  *	Description
@@ -3663,6 +3867,8 @@ union bpf_attr {
  *		was provided.
  *
  *		**-ERANGE** if resulting value was out of range.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_sk_storage_get(struct bpf_map *map, void *sk, void *value, u64 flags)
  *	Description
@@ -3694,6 +3900,8 @@ union bpf_attr {
  *
  *		**NULL** if not found or there was an error in adding
  *		a new bpf-local-storage.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_storage_delete(struct bpf_map *map, void *sk)
  *	Description
@@ -3703,6 +3911,8 @@ union bpf_attr {
  *
  *		**-ENOENT** if the bpf-local-storage cannot be found.
  *		**-EINVAL** if sk is not a fullsock (e.g. a request_sock).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_send_signal(u32 sig)
  *	Description
@@ -3718,6 +3928,8 @@ union bpf_attr {
  *		**-EPERM** if no permission to send the *sig*.
  *
  *		**-EAGAIN** if bpf program can try again.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * s64 bpf_tcp_gen_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
  *	Description
@@ -3744,6 +3956,8 @@ union bpf_attr {
  *		**-EOPNOTSUPP** kernel configuration does not enable SYN cookies
  *
  *		**-EPROTONOSUPPORT** IP packet version is not 4 or 6
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_skb_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
  * 	Description
@@ -3768,6 +3982,8 @@ union bpf_attr {
  * 		restricted to raw_tracepoint bpf programs.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_probe_read_user(void *dst, u32 size, const void *unsafe_ptr)
  * 	Description
@@ -3782,6 +3998,8 @@ union bpf_attr {
  * 		*unsafe_ptr* and store the data in *dst*.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_probe_read_user_str(void *dst, u32 size, const void *unsafe_ptr)
  * 	Description
@@ -3826,6 +4044,8 @@ union bpf_attr {
  * 		On success, the strictly positive length of the output string,
  * 		including the trailing NUL character. On error, a negative
  * 		value.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr)
  * 	Description
@@ -3841,6 +4061,8 @@ union bpf_attr {
  *		*rcv_nxt* is the ack_seq to be sent out.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_send_signal_thread(u32 sig)
  *	Description
@@ -3855,12 +4077,16 @@ union bpf_attr {
  *		**-EPERM** if no permission to send the *sig*.
  *
  *		**-EAGAIN** if bpf program can try again.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_jiffies64(void)
  *	Description
  *		Obtain the 64bit jiffies
  *	Return
  *		The 64 bit jiffies
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags)
  *	Description
@@ -3880,6 +4106,8 @@ union bpf_attr {
  *		of **sizeof**\ (**struct perf_branch_entry**\ ).
  *
  *		**-ENOENT** if architecture does not support branch records.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info *nsdata, u32 size)
  *	Description
@@ -3892,6 +4120,8 @@ union bpf_attr {
  *              with nsfs of current task, or if dev conversion to dev_t lost high bits.
  *
  *		**-ENOENT** if pidns does not exists for the current task.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_xdp_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
  *	Description
@@ -3916,6 +4146,8 @@ union bpf_attr {
  *		restricted to raw_tracepoint bpf programs.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_get_netns_cookie(void *ctx)
  * 	Description
@@ -3929,6 +4161,8 @@ union bpf_attr {
  * 		namespaces instead of sockets.
  * 	Return
  * 		A 8-byte long opaque number.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_ancestor_cgroup_id(int ancestor_level)
  * 	Description
@@ -3947,6 +4181,8 @@ union bpf_attr {
  * 		**bpf_get_current_cgroup_id**\ ().
  * 	Return
  * 		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_assign(struct sk_buff *skb, void *sk, u64 flags)
  *	Description
@@ -3978,6 +4214,8 @@ union bpf_attr {
  *
  *		**-ESOCKTNOSUPPORT** if the socket type is not supported
  *		(reuseport).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_assign(struct bpf_sk_lookup *ctx, struct bpf_sock *sk, u64 flags)
  *	Description
@@ -4028,6 +4266,8 @@ union bpf_attr {
  *
  *		* **-ESOCKTNOSUPPORT** if socket is not in allowed
  *		  state (TCP listening or UDP unconnected).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_ktime_get_boot_ns(void)
  * 	Description
@@ -4036,6 +4276,8 @@ union bpf_attr {
  * 		See: **clock_gettime**\ (**CLOCK_BOOTTIME**)
  * 	Return
  * 		Current *ktime*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len)
  * 	Description
@@ -4065,6 +4307,8 @@ union bpf_attr {
  *		**-E2BIG** if *fmt* contains too many format specifiers.
  *
  *		**-EOVERFLOW** if an overflow happened: The same object will be tried again.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_seq_write(struct seq_file *m, const void *data, u32 len)
  * 	Description
@@ -4075,6 +4319,8 @@ union bpf_attr {
  * 		0 on success, or a negative error in case of failure:
  *
  *		**-EOVERFLOW** if an overflow happened: The same object will be tried again.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_sk_cgroup_id(void *sk)
  *	Description
@@ -4089,6 +4335,8 @@ union bpf_attr {
  *		the **CONFIG_SOCK_CGROUP_DATA** configuration option.
  *	Return
  *		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_sk_ancestor_cgroup_id(void *sk, int ancestor_level)
  *	Description
@@ -4107,6 +4355,8 @@ union bpf_attr {
  *		**bpf_sk_cgroup_id**\ ().
  *	Return
  *		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_ringbuf_output(void *ringbuf, void *data, u64 size, u64 flags)
  * 	Description
@@ -4124,6 +4374,8 @@ union bpf_attr {
  * 		as it will process the newly added payload automatically.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_ringbuf_reserve(void *ringbuf, u64 size, u64 flags)
  * 	Description
@@ -4132,6 +4384,8 @@ union bpf_attr {
  * 	Return
  * 		Valid pointer with *size* bytes of memory available; NULL,
  * 		otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void bpf_ringbuf_submit(void *data, u64 flags)
  * 	Description
@@ -4146,6 +4400,8 @@ union bpf_attr {
  * 		See 'bpf_ringbuf_output()' for the definition of adaptive notification.
  * 	Return
  * 		Nothing. Always succeeds.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void bpf_ringbuf_discard(void *data, u64 flags)
  * 	Description
@@ -4160,6 +4416,8 @@ union bpf_attr {
  * 		See 'bpf_ringbuf_output()' for the definition of adaptive notification.
  * 	Return
  * 		Nothing. Always succeeds.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_ringbuf_query(void *ringbuf, u64 flags)
  *	Description
@@ -4177,6 +4435,8 @@ union bpf_attr {
  *		calculation.
  *	Return
  *		Requested value, or 0, if *flags* are not recognized.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_csum_level(struct sk_buff *skb, u64 level)
  * 	Description
@@ -4209,36 +4469,48 @@ union bpf_attr {
  * 		case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level
  * 		is returned or the error code -EACCES in case the skb is not
  * 		subject to CHECKSUM_UNNECESSARY.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct tcp6_sock *bpf_skc_to_tcp6_sock(void *sk)
  *	Description
  *		Dynamically cast a *sk* pointer to a *tcp6_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct tcp_sock *bpf_skc_to_tcp_sock(void *sk)
  *	Description
  *		Dynamically cast a *sk* pointer to a *tcp_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct tcp_timewait_sock *bpf_skc_to_tcp_timewait_sock(void *sk)
  * 	Description
  *		Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct tcp_request_sock *bpf_skc_to_tcp_request_sock(void *sk)
  * 	Description
  *		Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct udp6_sock *bpf_skc_to_udp6_sock(void *sk)
  * 	Description
  *		Dynamically cast a *sk* pointer to a *udp6_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_task_stack(struct task_struct *task, void *buf, u32 size, u64 flags)
  *	Description
@@ -4271,6 +4543,8 @@ union bpf_attr {
  *	Return
  *		A non-negative value equal to or less than *size* on success,
  *		or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_load_hdr_opt(struct bpf_sock_ops *skops, void *searchby_res, u32 len, u64 flags)
  *	Description
@@ -4334,6 +4608,8 @@ union bpf_attr {
  *
  *		**-EPERM** if the helper cannot be used under the current
  *		*skops*\ **->op**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_store_hdr_opt(struct bpf_sock_ops *skops, const void *from, u32 len, u64 flags)
  *	Description
@@ -4367,6 +4643,8 @@ union bpf_attr {
  *
  *		**-EPERM** if the helper cannot be used under the current
  *		*skops*\ **->op**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_reserve_hdr_opt(struct bpf_sock_ops *skops, u32 len, u64 flags)
  *	Description
@@ -4389,6 +4667,8 @@ union bpf_attr {
  *
  *		**-EPERM** if the helper cannot be used under the current
  *		*skops*\ **->op**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_inode_storage_get(struct bpf_map *map, void *inode, void *value, u64 flags)
  *	Description
@@ -4425,6 +4705,8 @@ union bpf_attr {
  *		0 on success.
  *
  *		**-ENOENT** if the bpf_local_storage cannot be found.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_d_path(struct path *path, char *buf, u32 sz)
  *	Description
@@ -4437,6 +4719,8 @@ union bpf_attr {
  *		On success, the strictly positive length of the string,
  *		including the trailing NUL character. On error, a negative
  *		value.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_copy_from_user(void *dst, u32 size, const void *user_ptr)
  * 	Description
@@ -4444,6 +4728,8 @@ union bpf_attr {
  * 		the data in *dst*. This is a wrapper of **copy_from_user**\ ().
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_snprintf_btf(char *str, u32 str_size, struct btf_ptr *ptr, u32 btf_ptr_size, u64 flags)
  *	Description
@@ -4480,6 +4766,8 @@ union bpf_attr {
  *		The number of bytes that were written (or would have been
  *		written if output had to be truncated due to string size),
  *		or a negative error in cases of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_seq_printf_btf(struct seq_file *m, struct btf_ptr *ptr, u32 ptr_size, u64 flags)
  *	Description
@@ -4488,6 +4776,8 @@ union bpf_attr {
  *		*flags* are identical to those used for bpf_snprintf_btf.
  *	Return
  *		0 on success or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_skb_cgroup_classid(struct sk_buff *skb)
  * 	Description
@@ -4518,6 +4808,8 @@ union bpf_attr {
  * 	Return
  * 		The helper returns **TC_ACT_REDIRECT** on success or
  * 		**TC_ACT_SHOT** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_per_cpu_ptr(const void *percpu_ptr, u32 cpu)
  *     Description
@@ -4535,6 +4827,8 @@ union bpf_attr {
  *     Return
  *             A pointer pointing to the kernel percpu variable on *cpu*, or
  *             NULL, if *cpu* is invalid.
+ *     GPL Compatibility
+ *             Not required
  *
  * void *bpf_this_cpu_ptr(const void *percpu_ptr)
  *	Description
@@ -4547,6 +4841,8 @@ union bpf_attr {
  *		never return NULL.
  *	Return
  *		A pointer pointing to the kernel percpu variable on this cpu.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_redirect_peer(u32 ifindex, u64 flags)
  * 	Description
@@ -4563,6 +4859,8 @@ union bpf_attr {
  * 	Return
  * 		The helper returns **TC_ACT_REDIRECT** on success or
  * 		**TC_ACT_SHOT** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_task_storage_get(struct bpf_map *map, struct task_struct *task, void *value, u64 flags)
  *	Description
@@ -4591,6 +4889,8 @@ union bpf_attr {
  *
  *		**NULL** if not found or there was an error in adding
  *		a new bpf_local_storage.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_task_storage_delete(struct bpf_map *map, struct task_struct *task)
  *	Description
@@ -4599,6 +4899,8 @@ union bpf_attr {
  *		0 on success.
  *
  *		**-ENOENT** if the bpf_local_storage cannot be found.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct task_struct *bpf_get_current_task_btf(void)
  *	Description
@@ -4607,6 +4909,8 @@ union bpf_attr {
  *		*ARG_PTR_TO_BTF_ID* of type *task_struct*.
  *	Return
  *		Pointer to the current task.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_bprm_opts_set(struct linux_binprm *bprm, u64 flags)
  *	Description
@@ -4617,6 +4921,8 @@ union bpf_attr {
  *		is cleared if the flag is not specified.
  *	Return
  *		**-EINVAL** if invalid *flags* are passed, zero otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_ktime_get_coarse_ns(void)
  * 	Description
@@ -4627,6 +4933,8 @@ union bpf_attr {
  * 		See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**)
  * 	Return
  * 		Current *ktime*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_ima_inode_hash(struct inode *inode, void *dst, u32 size)
  *	Description
@@ -4637,6 +4945,8 @@ union bpf_attr {
  *		The **hash_algo** is returned on success,
  *		**-EOPNOTSUP** if IMA is disabled or **-EINVAL** if
  *		invalid arguments are passed.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct socket *bpf_sock_from_file(struct file *file)
  *	Description
@@ -4645,6 +4955,8 @@ union bpf_attr {
  *	Return
  *		A pointer to a struct socket on success or NULL if the file is
  *		not a socket.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags)
  *	Description
@@ -4712,6 +5024,8 @@ union bpf_attr {
  *
  *		* **BPF_MTU_CHK_RET_FRAG_NEEDED**
  *		* **BPF_MTU_CHK_RET_SEGS_TOOBIG**
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_for_each_map_elem(struct bpf_map *map, void *callback_fn, void *callback_ctx, u64 flags)
  *	Description
@@ -4741,6 +5055,8 @@ union bpf_attr {
  *	Return
  *		The number of traversed map elements for success, **-EINVAL** for
  *		invalid **flags**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_snprintf(char *str, u32 str_size, const char *fmt, u64 *data, u32 data_len)
  *	Description
@@ -4768,24 +5084,32 @@ union bpf_attr {
  *		be zero-terminated except when **str_size** is 0.
  *
  *		Or **-EBUSY** if the per-CPU memory copy buffer is busy.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_sys_bpf(u32 cmd, void *attr, u32 attr_size)
  * 	Description
  * 		Execute bpf syscall with given arguments.
  * 	Return
  * 		A syscall result.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_btf_find_by_name_kind(char *name, int name_sz, u32 kind, int flags)
  * 	Description
  * 		Find BTF type with given name and kind in vmlinux BTF or in module's BTFs.
  * 	Return
  * 		Returns btf_id and btf_obj_fd in lower and upper 32 bits.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sys_close(u32 fd)
  * 	Description
  * 		Execute close syscall for given FD.
  * 	Return
  * 		A syscall result.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_timer_init(struct bpf_timer *timer, struct bpf_map *map, u64 flags)
  *	Description
@@ -4803,6 +5127,8 @@ union bpf_attr {
  *		The user space should either hold a file descriptor to a map with timers
  *		or pin such map in bpffs. When map is unpinned or file descriptor is
  *		closed all timers in the map will be cancelled and freed.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_timer_set_callback(struct bpf_timer *timer, void *callback_fn)
  *	Description
@@ -4814,6 +5140,8 @@ union bpf_attr {
  *		The user space should either hold a file descriptor to a map with timers
  *		or pin such map in bpffs. When map is unpinned or file descriptor is
  *		closed all timers in the map will be cancelled and freed.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_timer_start(struct bpf_timer *timer, u64 nsecs, u64 flags)
  *	Description
@@ -4840,6 +5168,8 @@ union bpf_attr {
  *		0 on success.
  *		**-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier
  *		or invalid *flags* are passed.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_timer_cancel(struct bpf_timer *timer)
  *	Description
@@ -4850,12 +5180,16 @@ union bpf_attr {
  *		**-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier.
  *		**-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its
  *		own timer which would have led to a deadlock otherwise.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_get_func_ip(void *ctx)
  * 	Description
  * 		Get address of the traced function (for tracing and kprobe programs).
  * 	Return
  * 		Address of the traced function.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_get_attach_cookie(void *ctx)
  * 	Description
@@ -4871,6 +5205,8 @@ union bpf_attr {
  * 	Return
  *		Value specified by user at BPF link creation/attachment time
  *		or 0, if it was not specified.
+ * 	GPL Compatibility
+ * 		Not required
  */
 #define __BPF_FUNC_MAPPER(FN)		\
 	FN(unspec),			\
diff --git a/scripts/bpf_doc.py b/scripts/bpf_doc.py
index 00ac7b79cddb..b27c3b8ee831 100755
--- a/scripts/bpf_doc.py
+++ b/scripts/bpf_doc.py
@@ -32,12 +32,14 @@ class APIElement(object):
     An object representing the description of an aspect of the eBPF API.
     @proto: prototype of the API symbol
     @desc: textual description of the symbol
+    @gpl: determine if this API element is GPL only
     @ret: (optional) description of any associated return value
     """
-    def __init__(self, proto='', desc='', ret=''):
+    def __init__(self, proto='', desc='', ret='', gpl=''):
         self.proto = proto
         self.desc = desc
         self.ret = ret
+        self.gpl = gpl
 
 
 class Helper(APIElement):
@@ -98,7 +100,8 @@ class HeaderParser(object):
         proto    = self.parse_proto()
         desc     = self.parse_desc()
         ret      = self.parse_ret()
-        return Helper(proto=proto, desc=desc, ret=ret)
+        gpl      = self.parse_gpl()
+        return Helper(proto=proto, desc=desc, ret=ret, gpl=gpl)
 
     def parse_symbol(self):
         p = re.compile(' \* ?(.+)$')
@@ -172,6 +175,29 @@ class HeaderParser(object):
                 else:
                     break
         return ret
+    
+    def parse_gpl(self):
+        p = re.compile(' \* ?(?:\t| {5,8})GPL Compatibility$')
+        capture = p.match(self.line)
+        if not capture:
+            # Helper can have empty GPL Compatilibity and we might be parsing another
+            # attribute: return but do not consume.
+            return ''
+        # GPL Compatibility can be several lines, some of them possibly empty, and it
+        # stops when another subsection title is met.
+        desc = ''
+        while True:
+            self.line = self.reader.readline()
+            if self.line == ' *\n':
+                desc += '\n'
+            else:
+                p = re.compile(' \* ?(?:\t| {5,8})(?:\t| {8})(.*)')
+                capture = p.match(self.line)
+                if capture:
+                    desc += capture.group(1) + '\n'
+                else:
+                    break
+        return desc
 
     def seek_to(self, target, help_message):
         self.reader.seek(0)
@@ -293,6 +319,10 @@ class PrinterRST(Printer):
             for line in elem.ret.rstrip().split('\n'):
                 print('{}{}'.format('\t\t' if line else '', line))
 
+        if (elem.gpl):
+            print('\tGPL Compatibility')
+            for line in elem.gpl.rstrip().split('\n'):
+                print('{}{}'.format('\t\t' if line else '', line))
         print('')
 
 
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index c4f7892edb2b..2c03010024e3 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -1512,6 +1512,8 @@ union bpf_attr {
  * 	Return
  * 		Map value associated to *key*, or **NULL** if no entry was
  * 		found.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)
  * 	Description
@@ -1530,6 +1532,8 @@ union bpf_attr {
  * 		elements always exist), the helper would return an error.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_map_delete_elem(struct bpf_map *map, const void *key)
  * 	Description
@@ -1546,6 +1550,8 @@ union bpf_attr {
  * 		**bpf_probe_read_kernel**\ () instead.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_ktime_get_ns(void)
  * 	Description
@@ -1554,6 +1560,8 @@ union bpf_attr {
  * 		See: **clock_gettime**\ (**CLOCK_MONOTONIC**)
  * 	Return
  * 		Current *ktime*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...)
  * 	Description
@@ -1613,6 +1621,8 @@ union bpf_attr {
  * 	Return
  * 		The number of bytes written to the buffer, or a negative error
  * 		in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u32 bpf_get_prandom_u32(void)
  * 	Description
@@ -1625,6 +1635,8 @@ union bpf_attr {
  * 		cryptographically secure.
  * 	Return
  * 		A random 32-bit unsigned value.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_smp_processor_id(void)
  * 	Description
@@ -1634,6 +1646,8 @@ union bpf_attr {
  * 		program.
  * 	Return
  * 		The SMP id of the processor running the program.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags)
  * 	Description
@@ -1651,6 +1665,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size)
  * 	Description
@@ -1676,6 +1692,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags)
  * 	Description
@@ -1708,6 +1726,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index)
  * 	Description
@@ -1739,6 +1759,8 @@ union bpf_attr {
  * 		which is currently set to 32.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags)
  * 	Description
@@ -1763,6 +1785,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_pid_tgid(void)
  * 	Return
@@ -1770,11 +1794,15 @@ union bpf_attr {
  * 		created as such:
  * 		*current_task*\ **->tgid << 32 \|**
  * 		*current_task*\ **->pid**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_uid_gid(void)
  * 	Return
  * 		A 64-bit integer containing the current GID and UID, and
  * 		created as such: *current_gid* **<< 32 \|** *current_uid*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_current_comm(void *buf, u32 size_of_buf)
  * 	Description
@@ -1786,6 +1814,8 @@ union bpf_attr {
  * 		it is filled with zeroes.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_cgroup_classid(struct sk_buff *skb)
  * 	Description
@@ -1812,6 +1842,8 @@ union bpf_attr {
  * 		"**y**" or to "**m**".
  * 	Return
  * 		The classid, or 0 for the default unconfigured classid.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci)
  * 	Description
@@ -1828,6 +1860,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_vlan_pop(struct sk_buff *skb)
  * 	Description
@@ -1840,6 +1874,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
  * 	Description
@@ -1891,6 +1927,8 @@ union bpf_attr {
  * 		Geneve, GRE or IP in IP (IPIP).
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
  * 	Description
@@ -1928,6 +1966,8 @@ union bpf_attr {
  * 		helper for additional information.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags)
  * 	Description
@@ -1957,6 +1997,8 @@ union bpf_attr {
  * 	Return
  * 		The value of the perf event counter read from the map, or a
  * 		negative error code in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_redirect(u32 ifindex, u64 flags)
  * 	Description
@@ -1980,6 +2022,8 @@ union bpf_attr {
  * 		**XDP_ABORTED** on error. For other program types, the values
  * 		are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on
  * 		error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_route_realm(struct sk_buff *skb)
  * 	Description
@@ -2004,6 +2048,8 @@ union bpf_attr {
  * 	Return
  * 		The realm of the route for the packet associated to *skb*, or 0
  * 		if none was found.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_perf_event_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
  * 	Description
@@ -2049,6 +2095,8 @@ union bpf_attr {
  * 		* A combination of both.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_skb_load_bytes(const void *skb, u32 offset, void *to, u32 len)
  * 	Description
@@ -2066,6 +2114,8 @@ union bpf_attr {
  * 		at once from a packet into the eBPF stack.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_stackid(void *ctx, struct bpf_map *map, u64 flags)
  * 	Description
@@ -2108,6 +2158,8 @@ union bpf_attr {
  * 	Return
  * 		The positive or null stack id on success, or a negative error
  * 		in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed)
  * 	Description
@@ -2135,6 +2187,8 @@ union bpf_attr {
  * 	Return
  * 		The checksum result, or a negative error code in case of
  * 		failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_get_tunnel_opt(struct sk_buff *skb, void *opt, u32 size)
  * 	Description
@@ -2153,6 +2207,8 @@ union bpf_attr {
  * 		headers.
  * 	Return
  * 		The size of the option data retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_set_tunnel_opt(struct sk_buff *skb, void *opt, u32 size)
  * 	Description
@@ -2190,6 +2246,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_change_type(struct sk_buff *skb, u32 type)
  * 	Description
@@ -2217,6 +2275,8 @@ union bpf_attr {
  * 			Send packet to someone else.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index)
  * 	Description
@@ -2228,6 +2288,8 @@ union bpf_attr {
  * 		* 0, if the *skb* failed the cgroup2 descendant test.
  * 		* 1, if the *skb* succeeded the cgroup2 descendant test.
  * 		* A negative error code, if an error occurred.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_hash_recalc(struct sk_buff *skb)
  * 	Description
@@ -2244,6 +2306,8 @@ union bpf_attr {
  * 		**bpf_get_hash_recalc**\ ().
  * 	Return
  * 		The 32-bit hash.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_task(void)
  * 	Return
@@ -2267,6 +2331,8 @@ union bpf_attr {
  * 		logs.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_current_task_under_cgroup(struct bpf_map *map, u32 index)
  * 	Description
@@ -2279,6 +2345,8 @@ union bpf_attr {
  *		* 0, if current task belongs to the cgroup2.
  *		* 1, if current task does not belong to the cgroup2.
  * 		* A negative error code, if an error occurred.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags)
  * 	Description
@@ -2303,6 +2371,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_pull_data(struct sk_buff *skb, u32 len)
  * 	Description
@@ -2339,6 +2409,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum)
  * 	Description
@@ -2351,6 +2423,8 @@ union bpf_attr {
  * 	Return
  * 		The checksum on success, or a negative error code in case of
  * 		failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void bpf_set_hash_invalid(struct sk_buff *skb)
  * 	Description
@@ -2359,6 +2433,8 @@ union bpf_attr {
  * 		indicate that the hash is outdated and to trigger a
  * 		recalculation the next time the kernel tries to access this
  * 		hash or when the **bpf_get_hash_recalc**\ () helper is called.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_numa_node_id(void)
  * 	Description
@@ -2370,6 +2446,8 @@ union bpf_attr {
  * 		similarly to **bpf_get_smp_processor_id**\ ().
  * 	Return
  * 		The id of current NUMA node.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags)
  * 	Description
@@ -2391,6 +2469,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta)
  * 	Description
@@ -2406,6 +2486,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr)
  * 	Description
@@ -2419,6 +2501,8 @@ union bpf_attr {
  * 		On success, the strictly positive length of the string,
  * 		including the trailing NUL character. On error, a negative
  * 		value.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_socket_cookie(struct sk_buff *skb)
  * 	Description
@@ -2432,6 +2516,8 @@ union bpf_attr {
  * 	Return
  * 		A 8-byte long unique number on success, or 0 if the socket
  * 		field is missing inside *skb*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx)
  * 	Description
@@ -2439,6 +2525,8 @@ union bpf_attr {
  * 		*skb*, but gets socket from **struct bpf_sock_addr** context.
  * 	Return
  * 		A 8-byte long unique number.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx)
  * 	Description
@@ -2446,6 +2534,8 @@ union bpf_attr {
  * 		*skb*, but gets socket from **struct bpf_sock_ops** context.
  * 	Return
  * 		A 8-byte long unique number.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_socket_cookie(struct sock *sk)
  * 	Description
@@ -2454,6 +2544,8 @@ union bpf_attr {
  * 		also works for sleepable programs.
  * 	Return
  * 		A 8-byte long unique number or 0 if *sk* is NULL.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u32 bpf_get_socket_uid(struct sk_buff *skb)
  * 	Return
@@ -2469,6 +2561,8 @@ union bpf_attr {
  * 		to value *hash*.
  * 	Return
  * 		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_setsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen)
  * 	Description
@@ -2500,6 +2594,8 @@ union bpf_attr {
  * 		* **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags)
  * 	Description
@@ -2550,6 +2646,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags)
  * 	Description
@@ -2575,6 +2673,8 @@ union bpf_attr {
  * 	Return
  * 		**XDP_REDIRECT** on success, or the value of the two lower bits
  * 		of the *flags* argument on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_redirect_map(struct sk_buff *skb, struct bpf_map *map, u32 key, u64 flags)
  * 	Description
@@ -2586,6 +2686,8 @@ union bpf_attr {
  * 		egress path otherwise). This is the only flag supported for now.
  * 	Return
  * 		**SK_PASS** on success, or **SK_DROP** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags)
  * 	Description
@@ -2605,6 +2707,8 @@ union bpf_attr {
  * 		already attached to eBPF programs, this results in an error.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta)
  * 	Description
@@ -2634,6 +2738,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size)
  * 	Description
@@ -2684,6 +2790,8 @@ union bpf_attr {
  * 		value and do the calculation inside the eBPF program.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size)
  * 	Description
@@ -2695,6 +2803,8 @@ union bpf_attr {
  * 		more details).
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_getsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen)
  * 	Description
@@ -2720,6 +2830,8 @@ union bpf_attr {
  * 		* **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_override_return(struct pt_regs *regs, u64 rc)
  * 	Description
@@ -2745,6 +2857,8 @@ union bpf_attr {
  * 		x86 architecture is the only one to support this feature.
  * 	Return
  * 		0
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval)
  * 	Description
@@ -2789,6 +2903,8 @@ union bpf_attr {
  * 		otherwise, a positive number containing the bits that could not
  * 		be set is returned (which comes down to 0 if all bits were set
  * 		as required).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags)
  * 	Description
@@ -2803,6 +2919,8 @@ union bpf_attr {
  * 		egress path otherwise). This is the only flag supported for now.
  * 	Return
  * 		**SK_PASS** on success, or **SK_DROP** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes)
  * 	Description
@@ -2837,6 +2955,8 @@ union bpf_attr {
  * 		being buffered for *bytes* and is sent as it is received.
  * 	Return
  * 		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes)
  * 	Description
@@ -2855,6 +2975,8 @@ union bpf_attr {
  * 		been accumulated.
  * 	Return
  * 		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags)
  * 	Description
@@ -2886,6 +3008,8 @@ union bpf_attr {
  * 		be left at zero.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len)
  * 	Description
@@ -2904,6 +3028,8 @@ union bpf_attr {
  * 		lead to degraded performance.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta)
  * 	Description
@@ -2918,6 +3044,8 @@ union bpf_attr {
  * 		direct packet access.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags)
  * 	Description
@@ -2934,6 +3062,8 @@ union bpf_attr {
  * 		**CONFIG_XFRM** configuration option.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_stack(void *ctx, void *buf, u32 size, u64 flags)
  * 	Description
@@ -2967,6 +3097,8 @@ union bpf_attr {
  * 	Return
  * 		A non-negative value equal to or less than *size* on success,
  * 		or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_skb_load_bytes_relative(const void *skb, u32 offset, void *to, u32 len, u32 start_header)
  * 	Description
@@ -2989,6 +3121,8 @@ union bpf_attr {
  * 		is not available.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags)
  *	Description
@@ -3023,6 +3157,8 @@ union bpf_attr {
  *
  *		If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU
  *		was exceeded and output params->mtu_result contains the MTU.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_sock_hash_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags)
  *	Description
@@ -3042,6 +3178,8 @@ union bpf_attr {
  *		already attached to eBPF programs, this results in an error.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags)
  *	Description
@@ -3056,6 +3194,8 @@ union bpf_attr {
  *		egress path otherwise). This is the only flag supported for now.
  *	Return
  *		**SK_PASS** on success, or **SK_DROP** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags)
  *	Description
@@ -3070,6 +3210,8 @@ union bpf_attr {
  *		egress otherwise). This is the only flag supported for now.
  *	Return
  *		**SK_PASS** on success, or **SK_DROP** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len)
  *	Description
@@ -3107,6 +3249,8 @@ union bpf_attr {
  * 		direct packet access.
  *	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len)
  *	Description
@@ -3122,6 +3266,8 @@ union bpf_attr {
  * 		direct packet access.
  *	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta)
  *	Description
@@ -3138,6 +3284,8 @@ union bpf_attr {
  * 		direct packet access.
  *	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len)
  *	Description
@@ -3167,6 +3315,8 @@ union bpf_attr {
  * 		direct packet access.
  *	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_rc_repeat(void *ctx)
  *	Description
@@ -3186,6 +3336,8 @@ union bpf_attr {
  *		"**y**".
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle)
  *	Description
@@ -3212,6 +3364,8 @@ union bpf_attr {
  *		"**y**".
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_skb_cgroup_id(struct sk_buff *skb)
  * 	Description
@@ -3228,6 +3382,8 @@ union bpf_attr {
  * 		**CONFIG_SOCK_CGROUP_DATA** configuration option.
  * 	Return
  * 		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_cgroup_id(void)
  * 	Return
@@ -3251,6 +3407,8 @@ union bpf_attr {
  *		the shared data.
  *	Return
  *		A pointer to the local storage area.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags)
  *	Description
@@ -3260,6 +3418,8 @@ union bpf_attr {
  *		request in the socket buffer.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level)
  *	Description
@@ -3278,6 +3438,8 @@ union bpf_attr {
  *		**bpf_skb_cgroup_id**\ ().
  *	Return
  *		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_sk_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
  *	Description
@@ -3315,6 +3477,8 @@ union bpf_attr {
  *		For sockets with reuseport option, the **struct bpf_sock**
  *		result is from *reuse*\ **->socks**\ [] using the hash of the
  *		tuple.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_sk_lookup_udp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
  *	Description
@@ -3352,6 +3516,8 @@ union bpf_attr {
  *		For sockets with reuseport option, the **struct bpf_sock**
  *		result is from *reuse*\ **->socks**\ [] using the hash of the
  *		tuple.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_release(void *sock)
  *	Description
@@ -3360,6 +3526,8 @@ union bpf_attr {
  *		**bpf_sk_lookup_xxx**\ ().
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags)
  * 	Description
@@ -3370,6 +3538,8 @@ union bpf_attr {
  * 			removed to make room for this.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_map_pop_elem(struct bpf_map *map, void *value)
  * 	Description
@@ -3382,6 +3552,8 @@ union bpf_attr {
  * 		Get an element from *map* without removing it.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_push_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags)
  *	Description
@@ -3398,6 +3570,8 @@ union bpf_attr {
  *		error and BPF programs will need to handle them.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags)
  *	Description
@@ -3410,6 +3584,8 @@ union bpf_attr {
  *		payload and/or *pop* value being to large.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
  *	Description
@@ -3424,6 +3600,8 @@ union bpf_attr {
  *		"**y**".
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_spin_lock(struct bpf_spin_lock *lock)
  *	Description
@@ -3472,6 +3650,8 @@ union bpf_attr {
  *		* **bpf_spin_lock** is not allowed in inner maps of map-in-map.
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_spin_unlock(struct bpf_spin_lock *lock)
  *	Description
@@ -3479,6 +3659,8 @@ union bpf_attr {
  *		**bpf_spin_lock**\ (\ *lock*\ ).
  *	Return
  *		0
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_sk_fullsock(struct bpf_sock *sk)
  *	Description
@@ -3487,6 +3669,8 @@ union bpf_attr {
  *	Return
  *		A **struct bpf_sock** pointer on success, or **NULL** in
  *		case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_tcp_sock *bpf_tcp_sock(struct bpf_sock *sk)
  *	Description
@@ -3495,6 +3679,8 @@ union bpf_attr {
  *	Return
  *		A **struct bpf_tcp_sock** pointer on success, or **NULL** in
  *		case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_skb_ecn_set_ce(struct sk_buff *skb)
  *	Description
@@ -3505,6 +3691,8 @@ union bpf_attr {
  *	Return
  *		1 if the **CE** flag is set (either by the current helper call
  *		or because it was already present), 0 if it is not set.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_get_listener_sock(struct bpf_sock *sk)
  *	Description
@@ -3513,6 +3701,8 @@ union bpf_attr {
  *	Return
  *		A **struct bpf_sock** pointer on success, or **NULL** in
  *		case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct bpf_sock *bpf_skc_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
  *	Description
@@ -3532,6 +3722,8 @@ union bpf_attr {
  *		For sockets with reuseport option, the **struct bpf_sock**
  *		result is from *reuse*\ **->socks**\ [] using the hash of the
  *		tuple.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_tcp_check_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
  * 	Description
@@ -3547,6 +3739,8 @@ union bpf_attr {
  * 	Return
  * 		0 if *iph* and *th* are a valid SYN cookie ACK, or a negative
  * 		error otherwise.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_sysctl_get_name(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags)
  *	Description
@@ -3563,6 +3757,8 @@ union bpf_attr {
  *
  *		**-E2BIG** if the buffer wasn't big enough (*buf* will contain
  *		truncated name in this case).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sysctl_get_current_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len)
  *	Description
@@ -3582,6 +3778,8 @@ union bpf_attr {
  *
  *		**-EINVAL** if current value was unavailable, e.g. because
  *		sysctl is uninitialized and read returns -EIO for it.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sysctl_get_new_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len)
  *	Description
@@ -3599,6 +3797,8 @@ union bpf_attr {
  *		truncated name in this case).
  *
  *		**-EINVAL** if sysctl is being read.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sysctl_set_new_value(struct bpf_sysctl *ctx, const char *buf, size_t buf_len)
  *	Description
@@ -3616,6 +3816,8 @@ union bpf_attr {
  *		**-E2BIG** if the *buf_len* is too big.
  *
  *		**-EINVAL** if sysctl is being read.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_strtol(const char *buf, size_t buf_len, u64 flags, long *res)
  *	Description
@@ -3640,6 +3842,8 @@ union bpf_attr {
  *		was provided.
  *
  *		**-ERANGE** if resulting value was out of range.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_strtoul(const char *buf, size_t buf_len, u64 flags, unsigned long *res)
  *	Description
@@ -3663,6 +3867,8 @@ union bpf_attr {
  *		was provided.
  *
  *		**-ERANGE** if resulting value was out of range.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_sk_storage_get(struct bpf_map *map, void *sk, void *value, u64 flags)
  *	Description
@@ -3694,6 +3900,8 @@ union bpf_attr {
  *
  *		**NULL** if not found or there was an error in adding
  *		a new bpf-local-storage.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_storage_delete(struct bpf_map *map, void *sk)
  *	Description
@@ -3703,6 +3911,8 @@ union bpf_attr {
  *
  *		**-ENOENT** if the bpf-local-storage cannot be found.
  *		**-EINVAL** if sk is not a fullsock (e.g. a request_sock).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_send_signal(u32 sig)
  *	Description
@@ -3718,6 +3928,8 @@ union bpf_attr {
  *		**-EPERM** if no permission to send the *sig*.
  *
  *		**-EAGAIN** if bpf program can try again.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * s64 bpf_tcp_gen_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
  *	Description
@@ -3744,6 +3956,8 @@ union bpf_attr {
  *		**-EOPNOTSUPP** kernel configuration does not enable SYN cookies
  *
  *		**-EPROTONOSUPPORT** IP packet version is not 4 or 6
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_skb_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
  * 	Description
@@ -3768,6 +3982,8 @@ union bpf_attr {
  * 		restricted to raw_tracepoint bpf programs.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_probe_read_user(void *dst, u32 size, const void *unsafe_ptr)
  * 	Description
@@ -3782,6 +3998,8 @@ union bpf_attr {
  * 		*unsafe_ptr* and store the data in *dst*.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_probe_read_user_str(void *dst, u32 size, const void *unsafe_ptr)
  * 	Description
@@ -3826,6 +4044,8 @@ union bpf_attr {
  * 		On success, the strictly positive length of the output string,
  * 		including the trailing NUL character. On error, a negative
  * 		value.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr)
  * 	Description
@@ -3841,6 +4061,8 @@ union bpf_attr {
  *		*rcv_nxt* is the ack_seq to be sent out.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_send_signal_thread(u32 sig)
  *	Description
@@ -3855,12 +4077,16 @@ union bpf_attr {
  *		**-EPERM** if no permission to send the *sig*.
  *
  *		**-EAGAIN** if bpf program can try again.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_jiffies64(void)
  *	Description
  *		Obtain the 64bit jiffies
  *	Return
  *		The 64 bit jiffies
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags)
  *	Description
@@ -3880,6 +4106,8 @@ union bpf_attr {
  *		of **sizeof**\ (**struct perf_branch_entry**\ ).
  *
  *		**-ENOENT** if architecture does not support branch records.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info *nsdata, u32 size)
  *	Description
@@ -3892,6 +4120,8 @@ union bpf_attr {
  *              with nsfs of current task, or if dev conversion to dev_t lost high bits.
  *
  *		**-ENOENT** if pidns does not exists for the current task.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_xdp_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
  *	Description
@@ -3916,6 +4146,8 @@ union bpf_attr {
  *		restricted to raw_tracepoint bpf programs.
  *	Return
  *		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_get_netns_cookie(void *ctx)
  * 	Description
@@ -3929,6 +4161,8 @@ union bpf_attr {
  * 		namespaces instead of sockets.
  * 	Return
  * 		A 8-byte long opaque number.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_get_current_ancestor_cgroup_id(int ancestor_level)
  * 	Description
@@ -3947,6 +4181,8 @@ union bpf_attr {
  * 		**bpf_get_current_cgroup_id**\ ().
  * 	Return
  * 		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_assign(struct sk_buff *skb, void *sk, u64 flags)
  *	Description
@@ -3978,6 +4214,8 @@ union bpf_attr {
  *
  *		**-ESOCKTNOSUPPORT** if the socket type is not supported
  *		(reuseport).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sk_assign(struct bpf_sk_lookup *ctx, struct bpf_sock *sk, u64 flags)
  *	Description
@@ -4028,6 +4266,8 @@ union bpf_attr {
  *
  *		* **-ESOCKTNOSUPPORT** if socket is not in allowed
  *		  state (TCP listening or UDP unconnected).
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_ktime_get_boot_ns(void)
  * 	Description
@@ -4036,6 +4276,8 @@ union bpf_attr {
  * 		See: **clock_gettime**\ (**CLOCK_BOOTTIME**)
  * 	Return
  * 		Current *ktime*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len)
  * 	Description
@@ -4065,6 +4307,8 @@ union bpf_attr {
  *		**-E2BIG** if *fmt* contains too many format specifiers.
  *
  *		**-EOVERFLOW** if an overflow happened: The same object will be tried again.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_seq_write(struct seq_file *m, const void *data, u32 len)
  * 	Description
@@ -4075,6 +4319,8 @@ union bpf_attr {
  * 		0 on success, or a negative error in case of failure:
  *
  *		**-EOVERFLOW** if an overflow happened: The same object will be tried again.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_sk_cgroup_id(void *sk)
  *	Description
@@ -4089,6 +4335,8 @@ union bpf_attr {
  *		the **CONFIG_SOCK_CGROUP_DATA** configuration option.
  *	Return
  *		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_sk_ancestor_cgroup_id(void *sk, int ancestor_level)
  *	Description
@@ -4107,6 +4355,8 @@ union bpf_attr {
  *		**bpf_sk_cgroup_id**\ ().
  *	Return
  *		The id is returned or 0 in case the id could not be retrieved.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_ringbuf_output(void *ringbuf, void *data, u64 size, u64 flags)
  * 	Description
@@ -4124,6 +4374,8 @@ union bpf_attr {
  * 		as it will process the newly added payload automatically.
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_ringbuf_reserve(void *ringbuf, u64 size, u64 flags)
  * 	Description
@@ -4132,6 +4384,8 @@ union bpf_attr {
  * 	Return
  * 		Valid pointer with *size* bytes of memory available; NULL,
  * 		otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void bpf_ringbuf_submit(void *data, u64 flags)
  * 	Description
@@ -4146,6 +4400,8 @@ union bpf_attr {
  * 		See 'bpf_ringbuf_output()' for the definition of adaptive notification.
  * 	Return
  * 		Nothing. Always succeeds.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void bpf_ringbuf_discard(void *data, u64 flags)
  * 	Description
@@ -4160,6 +4416,8 @@ union bpf_attr {
  * 		See 'bpf_ringbuf_output()' for the definition of adaptive notification.
  * 	Return
  * 		Nothing. Always succeeds.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_ringbuf_query(void *ringbuf, u64 flags)
  *	Description
@@ -4177,6 +4435,8 @@ union bpf_attr {
  *		calculation.
  *	Return
  *		Requested value, or 0, if *flags* are not recognized.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_csum_level(struct sk_buff *skb, u64 level)
  * 	Description
@@ -4209,36 +4469,48 @@ union bpf_attr {
  * 		case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level
  * 		is returned or the error code -EACCES in case the skb is not
  * 		subject to CHECKSUM_UNNECESSARY.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct tcp6_sock *bpf_skc_to_tcp6_sock(void *sk)
  *	Description
  *		Dynamically cast a *sk* pointer to a *tcp6_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct tcp_sock *bpf_skc_to_tcp_sock(void *sk)
  *	Description
  *		Dynamically cast a *sk* pointer to a *tcp_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct tcp_timewait_sock *bpf_skc_to_tcp_timewait_sock(void *sk)
  * 	Description
  *		Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct tcp_request_sock *bpf_skc_to_tcp_request_sock(void *sk)
  * 	Description
  *		Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct udp6_sock *bpf_skc_to_udp6_sock(void *sk)
  * 	Description
  *		Dynamically cast a *sk* pointer to a *udp6_sock* pointer.
  *	Return
  *		*sk* if casting is valid, or **NULL** otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_get_task_stack(struct task_struct *task, void *buf, u32 size, u64 flags)
  *	Description
@@ -4271,6 +4543,8 @@ union bpf_attr {
  *	Return
  *		A non-negative value equal to or less than *size* on success,
  *		or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_load_hdr_opt(struct bpf_sock_ops *skops, void *searchby_res, u32 len, u64 flags)
  *	Description
@@ -4334,6 +4608,8 @@ union bpf_attr {
  *
  *		**-EPERM** if the helper cannot be used under the current
  *		*skops*\ **->op**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_store_hdr_opt(struct bpf_sock_ops *skops, const void *from, u32 len, u64 flags)
  *	Description
@@ -4367,6 +4643,8 @@ union bpf_attr {
  *
  *		**-EPERM** if the helper cannot be used under the current
  *		*skops*\ **->op**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_reserve_hdr_opt(struct bpf_sock_ops *skops, u32 len, u64 flags)
  *	Description
@@ -4389,6 +4667,8 @@ union bpf_attr {
  *
  *		**-EPERM** if the helper cannot be used under the current
  *		*skops*\ **->op**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_inode_storage_get(struct bpf_map *map, void *inode, void *value, u64 flags)
  *	Description
@@ -4425,6 +4705,8 @@ union bpf_attr {
  *		0 on success.
  *
  *		**-ENOENT** if the bpf_local_storage cannot be found.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_d_path(struct path *path, char *buf, u32 sz)
  *	Description
@@ -4437,6 +4719,8 @@ union bpf_attr {
  *		On success, the strictly positive length of the string,
  *		including the trailing NUL character. On error, a negative
  *		value.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_copy_from_user(void *dst, u32 size, const void *user_ptr)
  * 	Description
@@ -4444,6 +4728,8 @@ union bpf_attr {
  * 		the data in *dst*. This is a wrapper of **copy_from_user**\ ().
  * 	Return
  * 		0 on success, or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_snprintf_btf(char *str, u32 str_size, struct btf_ptr *ptr, u32 btf_ptr_size, u64 flags)
  *	Description
@@ -4480,6 +4766,8 @@ union bpf_attr {
  *		The number of bytes that were written (or would have been
  *		written if output had to be truncated due to string size),
  *		or a negative error in cases of failure.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_seq_printf_btf(struct seq_file *m, struct btf_ptr *ptr, u32 ptr_size, u64 flags)
  *	Description
@@ -4488,6 +4776,8 @@ union bpf_attr {
  *		*flags* are identical to those used for bpf_snprintf_btf.
  *	Return
  *		0 on success or a negative error in case of failure.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_skb_cgroup_classid(struct sk_buff *skb)
  * 	Description
@@ -4518,6 +4808,8 @@ union bpf_attr {
  * 	Return
  * 		The helper returns **TC_ACT_REDIRECT** on success or
  * 		**TC_ACT_SHOT** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_per_cpu_ptr(const void *percpu_ptr, u32 cpu)
  *     Description
@@ -4535,6 +4827,8 @@ union bpf_attr {
  *     Return
  *             A pointer pointing to the kernel percpu variable on *cpu*, or
  *             NULL, if *cpu* is invalid.
+ *     GPL Compatibility
+ *             Not required
  *
  * void *bpf_this_cpu_ptr(const void *percpu_ptr)
  *	Description
@@ -4547,6 +4841,8 @@ union bpf_attr {
  *		never return NULL.
  *	Return
  *		A pointer pointing to the kernel percpu variable on this cpu.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_redirect_peer(u32 ifindex, u64 flags)
  * 	Description
@@ -4563,6 +4859,8 @@ union bpf_attr {
  * 	Return
  * 		The helper returns **TC_ACT_REDIRECT** on success or
  * 		**TC_ACT_SHOT** on error.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * void *bpf_task_storage_get(struct bpf_map *map, struct task_struct *task, void *value, u64 flags)
  *	Description
@@ -4591,6 +4889,8 @@ union bpf_attr {
  *
  *		**NULL** if not found or there was an error in adding
  *		a new bpf_local_storage.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_task_storage_delete(struct bpf_map *map, struct task_struct *task)
  *	Description
@@ -4599,6 +4899,8 @@ union bpf_attr {
  *		0 on success.
  *
  *		**-ENOENT** if the bpf_local_storage cannot be found.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct task_struct *bpf_get_current_task_btf(void)
  *	Description
@@ -4607,6 +4909,8 @@ union bpf_attr {
  *		*ARG_PTR_TO_BTF_ID* of type *task_struct*.
  *	Return
  *		Pointer to the current task.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_bprm_opts_set(struct linux_binprm *bprm, u64 flags)
  *	Description
@@ -4617,6 +4921,8 @@ union bpf_attr {
  *		is cleared if the flag is not specified.
  *	Return
  *		**-EINVAL** if invalid *flags* are passed, zero otherwise.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * u64 bpf_ktime_get_coarse_ns(void)
  * 	Description
@@ -4627,6 +4933,8 @@ union bpf_attr {
  * 		See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**)
  * 	Return
  * 		Current *ktime*.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_ima_inode_hash(struct inode *inode, void *dst, u32 size)
  *	Description
@@ -4637,6 +4945,8 @@ union bpf_attr {
  *		The **hash_algo** is returned on success,
  *		**-EOPNOTSUP** if IMA is disabled or **-EINVAL** if
  *		invalid arguments are passed.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * struct socket *bpf_sock_from_file(struct file *file)
  *	Description
@@ -4645,6 +4955,8 @@ union bpf_attr {
  *	Return
  *		A pointer to a struct socket on success or NULL if the file is
  *		not a socket.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags)
  *	Description
@@ -4712,6 +5024,8 @@ union bpf_attr {
  *
  *		* **BPF_MTU_CHK_RET_FRAG_NEEDED**
  *		* **BPF_MTU_CHK_RET_SEGS_TOOBIG**
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_for_each_map_elem(struct bpf_map *map, void *callback_fn, void *callback_ctx, u64 flags)
  *	Description
@@ -4741,6 +5055,8 @@ union bpf_attr {
  *	Return
  *		The number of traversed map elements for success, **-EINVAL** for
  *		invalid **flags**.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_snprintf(char *str, u32 str_size, const char *fmt, u64 *data, u32 data_len)
  *	Description
@@ -4768,24 +5084,32 @@ union bpf_attr {
  *		be zero-terminated except when **str_size** is 0.
  *
  *		Or **-EBUSY** if the per-CPU memory copy buffer is busy.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_sys_bpf(u32 cmd, void *attr, u32 attr_size)
  * 	Description
  * 		Execute bpf syscall with given arguments.
  * 	Return
  * 		A syscall result.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_btf_find_by_name_kind(char *name, int name_sz, u32 kind, int flags)
  * 	Description
  * 		Find BTF type with given name and kind in vmlinux BTF or in module's BTFs.
  * 	Return
  * 		Returns btf_id and btf_obj_fd in lower and upper 32 bits.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_sys_close(u32 fd)
  * 	Description
  * 		Execute close syscall for given FD.
  * 	Return
  * 		A syscall result.
+ * 	GPL Compatibility
+ * 		Not required
  *
  * long bpf_timer_init(struct bpf_timer *timer, struct bpf_map *map, u64 flags)
  *	Description
@@ -4803,6 +5127,8 @@ union bpf_attr {
  *		The user space should either hold a file descriptor to a map with timers
  *		or pin such map in bpffs. When map is unpinned or file descriptor is
  *		closed all timers in the map will be cancelled and freed.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_timer_set_callback(struct bpf_timer *timer, void *callback_fn)
  *	Description
@@ -4814,6 +5140,8 @@ union bpf_attr {
  *		The user space should either hold a file descriptor to a map with timers
  *		or pin such map in bpffs. When map is unpinned or file descriptor is
  *		closed all timers in the map will be cancelled and freed.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_timer_start(struct bpf_timer *timer, u64 nsecs, u64 flags)
  *	Description
@@ -4840,6 +5168,8 @@ union bpf_attr {
  *		0 on success.
  *		**-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier
  *		or invalid *flags* are passed.
+ * 	GPL Compatibility
+ * 		Required
  *
  * long bpf_timer_cancel(struct bpf_timer *timer)
  *	Description
@@ -4850,12 +5180,16 @@ union bpf_attr {
  *		**-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier.
  *		**-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its
  *		own timer which would have led to a deadlock otherwise.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_get_func_ip(void *ctx)
  * 	Description
  * 		Get address of the traced function (for tracing and kprobe programs).
  * 	Return
  * 		Address of the traced function.
+ * 	GPL Compatibility
+ * 		Required
  *
  * u64 bpf_get_attach_cookie(void *ctx)
  * 	Description
@@ -4871,6 +5205,8 @@ union bpf_attr {
  * 	Return
  *		Value specified by user at BPF link creation/attachment time
  *		or 0, if it was not specified.
+ * 	GPL Compatibility
+ * 		Not required
  */
 #define __BPF_FUNC_MAPPER(FN)		\
 	FN(unspec),			\
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH bpf-next] bpf: add helpers documentation about GPL compatibility
  2021-08-22 11:59 [PATCH bpf-next] bpf: add helpers documentation about GPL compatibility Lorenzo Fontana
@ 2021-08-24  0:10 ` Alexei Starovoitov
  2021-09-04  2:28   ` Lorenzo Fontana
  0 siblings, 1 reply; 3+ messages in thread
From: Alexei Starovoitov @ 2021-08-24  0:10 UTC (permalink / raw)
  To: Lorenzo Fontana; +Cc: bpf, Quentin Monnet, Daniel Borkmann

On Sun, Aug 22, 2021 at 01:59:00PM +0200, Lorenzo Fontana wrote:
> When writing BPF programs one might refer to the man page
> to lookup helpers. When you do so, however you don't have
> a way to immediately know if you can use the helper
> based on your program licensing requirements.
> 
> This patch adds a specific line in the man bpf-helpers
> to show that information straight away.
> 
> Signed-off-by: Lorenzo Fontana <fontanalorenz@gmail.com>
...
>   * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...)
>   * 	Description
> @@ -1613,6 +1621,8 @@ union bpf_attr {
>   * 	Return
>   * 		The number of bytes written to the buffer, or a negative error
>   * 		in case of failure.
> + * 	GPL Compatibility
> + * 		Required

I think manually annotating the docs is too easy to get wrong.
I think scripts/bpf_doc.py should be able to pick it up from the code somehow?
or rely on dynamic discovery by bpftool?

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH bpf-next] bpf: add helpers documentation about GPL compatibility
  2021-08-24  0:10 ` Alexei Starovoitov
@ 2021-09-04  2:28   ` Lorenzo Fontana
  0 siblings, 0 replies; 3+ messages in thread
From: Lorenzo Fontana @ 2021-09-04  2:28 UTC (permalink / raw)
  To: Alexei Starovoitov; +Cc: bpf, Quentin Monnet, Daniel Borkmann

On Mon, Aug 23, 2021 at 05:10:13PM -0700, Alexei Starovoitov wrote:
> On Sun, Aug 22, 2021 at 01:59:00PM +0200, Lorenzo Fontana wrote:
> > When writing BPF programs one might refer to the man page
> > to lookup helpers. When you do so, however you don't have
> > a way to immediately know if you can use the helper
> > based on your program licensing requirements.
> > 
> > This patch adds a specific line in the man bpf-helpers
> > to show that information straight away.
> > 
> > Signed-off-by: Lorenzo Fontana <fontanalorenz@gmail.com>
> ...
> >   * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...)
> >   * 	Description
> > @@ -1613,6 +1621,8 @@ union bpf_attr {
> >   * 	Return
> >   * 		The number of bytes written to the buffer, or a negative error
> >   * 		in case of failure.
> > + * 	GPL Compatibility
> > + * 		Required
> 
> I think manually annotating the docs is too easy to get wrong.
> I think scripts/bpf_doc.py should be able to pick it up from the code somehow?
> or rely on dynamic discovery by bpftool?

Thanks for the review Alexei. I agree it's not the best but I followed
the same approach as for the other elements. It might seem that the
script parses those from code but in reality it just parses them from
a comment in the helpers file. I tried to accomplish this by looking at
the various C files containing this information but it would mean
changing a lot the way the script works. I can still do that but wanted
to also note that it will be very unlikely that an helper changes
licensing and since the helper makers will always need to annotate the
helpers header file with information I thought that adding this
immediately would've been enough.

I'll explore the possibility of doing this with bpftool instead, that's
a great suggestion. Thank you!


Lore

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-09-04  2:28 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-22 11:59 [PATCH bpf-next] bpf: add helpers documentation about GPL compatibility Lorenzo Fontana
2021-08-24  0:10 ` Alexei Starovoitov
2021-09-04  2:28   ` Lorenzo Fontana

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).