From cabd6955d3c3048bb2ba19032b504eeb3776a86f Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 12 Mar 2019 11:17:20 +0000
Subject: [PATCH 268/293] bpf: print struct bpf_prog_info.gpl_compatible

This bit field was added by Linux commit v4.18-rc1~114^2~376^2~6.

* bpf_attr.h (struct bpf_prog_info_struct): Add gpl_compatible field.
* bpf.c (print_bpf_prog_info): Print gpl_compatible field.
* tests/bpf-obj_get_info_by_fd.c (main): Update expected output.
---
 bpf.c                          | 5 ++++-
 bpf_attr.h                     | 1 +
 tests/bpf-obj_get_info_by_fd.c | 3 +++
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/bpf.c b/bpf.c
index 397521e..6fb4c2c 100644
--- a/bpf.c
+++ b/bpf.c
@@ -525,11 +525,14 @@ print_bpf_prog_info(struct tcb * const tcp, uint32_t bpf_fd,
 
 	/*
 	 * ifindex, netns_dev, and netns_ino fields were introduced
-	 * by Linux commit v4.16-rc1~123^2~227^2~5^2~2.
+	 * by Linux commit v4.16-rc1~123^2~227^2~5^2~2, and
+	 * gpl_compatible was added later by Linux commit
+	 * v4.18-rc1~114^2~376^2~6.
 	 */
 	if (len <= offsetof(struct bpf_prog_info_struct, ifindex))
 		goto print_bpf_prog_info_end;
 	PRINT_FIELD_IFINDEX(", ", info, ifindex);
+	tprintf(", gpl_compatible=%u", info.gpl_compatible);
 	PRINT_FIELD_DEV(", ", info, netns_dev);
 	PRINT_FIELD_U(", ", info, netns_ino);
 
diff --git a/bpf_attr.h b/bpf_attr.h
index dc7694c..cb49896 100644
--- a/bpf_attr.h
+++ b/bpf_attr.h
@@ -259,6 +259,7 @@ struct bpf_prog_info_struct {
 	uint64_t ATTRIBUTE_ALIGNED(8) map_ids;
 	char     name[BPF_OBJ_NAME_LEN];
 	uint32_t ifindex;
+	uint32_t gpl_compatible:1;
 	/*
 	 * The kernel UAPI is broken by Linux commit
 	 * v4.16-rc1~123^2~227^2~5^2~2 .
diff --git a/tests/bpf-obj_get_info_by_fd.c b/tests/bpf-obj_get_info_by_fd.c
index fba0e75..ff06e27 100644
--- a/tests/bpf-obj_get_info_by_fd.c
+++ b/tests/bpf-obj_get_info_by_fd.c
@@ -461,6 +461,9 @@ main(void)
 		    offsetof(struct bpf_prog_info_struct, ifindex))
 			printf(", ifindex=%u", prog_info->ifindex);
 		if (bpf_prog_get_info_attr.info_len >
+		    offsetofend(struct bpf_prog_info_struct, ifindex))
+			printf(", gpl_compatible=%u", prog_info->gpl_compatible);
+		if (bpf_prog_get_info_attr.info_len >
 		    offsetof(struct bpf_prog_info_struct, netns_dev))
 			printf(", netns_dev=makedev(%u, %u)",
 			       major(prog_info->netns_dev),
-- 
1.7.12.4

