Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[sfrench/cifs-2.6.git] / tools / lib / bpf / libbpf_probes.c
index a9eb8b322671fb7ab1b9bb459e5419c799dfd008..b782ebef6ac9265269ab47db41b3584b1ef326ba 100644 (file)
@@ -17,6 +17,9 @@
 #include "libbpf.h"
 #include "libbpf_internal.h"
 
+/* make sure libbpf doesn't use kernel-only integer typedefs */
+#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64
+
 static bool grep(const char *buffer, const char *pattern)
 {
        return !!strstr(buffer, pattern);
@@ -103,6 +106,8 @@ probe_load(enum bpf_prog_type prog_type, const struct bpf_insn *insns,
        case BPF_PROG_TYPE_CGROUP_SYSCTL:
        case BPF_PROG_TYPE_CGROUP_SOCKOPT:
        case BPF_PROG_TYPE_TRACING:
+       case BPF_PROG_TYPE_STRUCT_OPS:
+       case BPF_PROG_TYPE_EXT:
        default:
                break;
        }
@@ -251,6 +256,7 @@ bool bpf_probe_map_type(enum bpf_map_type map_type, __u32 ifindex)
        case BPF_MAP_TYPE_XSKMAP:
        case BPF_MAP_TYPE_SOCKHASH:
        case BPF_MAP_TYPE_REUSEPORT_SOCKARRAY:
+       case BPF_MAP_TYPE_STRUCT_OPS:
        default:
                break;
        }
@@ -321,3 +327,24 @@ bool bpf_probe_helper(enum bpf_func_id id, enum bpf_prog_type prog_type,
 
        return res;
 }
+
+/*
+ * Probe for availability of kernel commit (5.3):
+ *
+ * c04c0d2b968a ("bpf: increase complexity limit and maximum program size")
+ */
+bool bpf_probe_large_insn_limit(__u32 ifindex)
+{
+       struct bpf_insn insns[BPF_MAXINSNS + 1];
+       int i;
+
+       for (i = 0; i < BPF_MAXINSNS; i++)
+               insns[i] = BPF_MOV64_IMM(BPF_REG_0, 1);
+       insns[BPF_MAXINSNS] = BPF_EXIT_INSN();
+
+       errno = 0;
+       probe_load(BPF_PROG_TYPE_SCHED_CLS, insns, ARRAY_SIZE(insns), NULL, 0,
+                  ifindex);
+
+       return errno != E2BIG && errno != EINVAL;
+}