eBPF is usually introduced through its most visible products: Kubernetes networking that bypasses older packet paths, low-overhead observability, runtime security hooks, and quick tracing tools that answer questions a normal log pipeline never saw. That list is accurate, but it can make eBPF sound like a bag of infrastructure tricks. Brendan Gregg's "BPF: A New Type of Software" is useful because it starts one layer lower. He treats BPF less as a feature checklist and more as a new place where software can run, with serious consequences for performance engineering, production debugging, and kernel safety.[1]
The official eBPF documentation makes the same point in more formal language: eBPF comes from the Linux kernel, runs sandboxed programs in privileged contexts, and extends kernel capability without changing kernel source or loading a traditional kernel module.[2] That is the sentence to keep in mind while watching the talk. eBPF matters because it changes the extension boundary around the operating system. The kernel can be observed and influenced at runtime, but only after a program passes through privileges, verification, constrained helper APIs, maps, and hook-specific rules.[2][3][4]
That is why the best reading of this video is not "look how much you can trace." It is "look how much ceremony exists so that tracing, filtering, and steering can happen close to the kernel without turning every operator into a kernel-module author." Gregg is a performance engineer, so his examples naturally emphasize latency, flame graphs, and production observability.[1][5] The larger OSS lesson is broader: eBPF succeeds only when power and constraint arrive together.
Image context: the cover image is a real photograph of rack-mounted servers and network gear. It is deliberately physical. eBPF's promise is not abstract dashboard beauty; it is that running Linux systems can expose and act on kernel-level events while still respecting a strict execution contract.[6]
Around 3:30, the important move is from packet filters to general instrumentation
Gregg opens with the old Berkeley Packet Filter lineage, but the practical turn is that modern BPF is no longer just a packet-filtering device.[1] The Cilium reference guide captures this historical shift neatly: classic BPF is known to many people through packet filtering and tools such as tcpdump, while extended BPF appears in newer Linux kernels as a more general, flexible virtual-machine-like construct used across networking, tracing, and security.[4]
That shift is easy to understate. A packet filter is a narrow optimization: put a small program near network traffic so user space does not have to receive everything. eBPF turns the idea into a larger kernel execution model. Programs can attach to hooks such as system calls, tracepoints, kernel probes, user probes, and network events.[2] The result is not one observability product. It is a reusable mechanism for moving carefully bounded logic to the event boundary.
The boundary matters more than the branding. If an engineer hears "run custom programs in the kernel" and stops there, eBPF sounds reckless. If the same engineer follows the whole path, the design looks more disciplined: choose a hook, compile to bytecode, load through the BPF system call, pass the verifier, use approved helpers, exchange state through maps, and let user-space tooling collect or steer the result.[2][3][4] Gregg's talk is a good first viewing because it makes that chain feel practical rather than academic.[1]
Around 12:00, the verifier is the contract's center of gravity
The most important safety idea in the video is not that eBPF programs are small. It is that they are admitted only after the kernel has analyzed whether they can run safely.[1] The eBPF Foundation documentation describes the verification step as the gate that checks privilege, prevents programs from crashing or harming the system, and ensures that programs run to completion.[2] It later spells out more concrete constraints: initialized variables, bounds-checked memory access, finite complexity, and bounded loops that the verifier can prove will exit.[2]
That is the difference between eBPF and a casual plug-in model. A normal extension point trusts a lot of code once it is installed. A traditional kernel module has enormous power and a large failure surface. eBPF instead makes the load path part of the product. The program is not merely compiled; it is inspected against rules that protect the host before it reaches a hook.[2][3]
This also explains why eBPF can frustrate new users. The verifier is not a linter with nicer error messages. It is a kernel safety mechanism. A program that seems obvious to a C programmer may still be rejected if the verifier cannot prove the memory access, loop bound, or control path is safe enough for kernel context.[2][3] The article's practical takeaway is that eBPF development requires a different mindset: you are writing for a constrained runtime whose refusal to load code is a feature, not a tooling failure.
Around 20:00, maps make kernel work observable without turning the kernel into the app
Gregg's performance examples become clearer once you notice the split between kernel-side collection and user-space presentation.[1] eBPF maps are the bridge. The eBPF documentation describes maps as shared data structures that programs and user-space applications can access through system calls, with options such as hash tables, arrays, LRU structures, ring buffers, stack traces, and longest-prefix-match tables.[2] That is not a side detail. It is the reason eBPF tools can collect facts near the event source without making the kernel responsible for the whole user experience.
Brendan Gregg's own eBPF tools page shows the pattern in performance terms. In one example, a custom eBPF program records block I/O timestamps and stores results in a histogram while a user-space program periodically reads the histogram and draws the heat map.[5] That division is exactly what makes eBPF attractive for observability. The kernel-side program does the minimum useful work at the moment of truth. The heavier interpretation, rendering, aggregation, and operator workflow stay outside the kernel.[5]
This is a strong architectural boundary for OSS infrastructure. The temptation in observability is always to collect more raw data and ship it elsewhere. eBPF asks a sharper question: what can be summarized at the event boundary so the rest of the system receives a smaller, more meaningful signal? That does not remove the need for traces, logs, or metrics. It gives teams a way to ask questions that would be too expensive or too late if every event had to travel through a conventional pipeline first.[1][5]
Around 30:00, helper calls are a compatibility boundary, not just a convenience API
One subtle point in eBPF's design is that programs do not get arbitrary access to kernel internals. The eBPF Foundation documentation says programs cannot call arbitrary kernel functions because that would bind them to particular kernel versions and complicate compatibility; instead, they use helper functions offered by the kernel.[2] The kernel documentation's BPF section points readers toward dedicated pages for the verifier, syscall API, helper functions, program types, maps, and related facilities, which is a useful reminder that BPF is a documented subsystem, not a folklore interface.[3]
This makes helper calls more than convenience wrappers. They are part of the contract that lets eBPF code remain portable enough to be useful while still operating near sensitive kernel state. Helpers expose selected capabilities such as map access, time, random numbers, process or cgroup context, and packet manipulation.[2] What matters is the selection. eBPF is powerful because it gets close to the kernel. It is viable because closeness is mediated through APIs the kernel can reason about.
The same contract explains why high-level tools and projects matter. Many users do not write raw eBPF programs. They use bcc, bpftrace, Cilium, security tools, profilers, or observability agents that package the lower-level machinery.[2][4][5] That is healthy when the abstraction respects the boundary. It is dangerous when the marketing makes eBPF sound like unlimited kernel magic. The safest adoption posture is to know which hooks, helpers, maps, privileges, and kernel versions a tool actually depends on.
Around 40:00, the OSS value is a shared substrate, not one vendor's feature
The reason eBPF belongs in an OSS feed is that it has become a shared substrate under many projects. The eBPF documentation explicitly names projects such as Cilium, bcc, and bpftrace as abstractions that let users work at a higher level instead of writing bytecode directly.[2] The Cilium guide places BPF across networking, tracing, and security, then explains that Cilium uses BPF heavily in its data path while still sending readers to lower-level architecture material when they need the details.[4]
That layering is the open-source story. eBPF lets different projects share a kernel capability while competing or specializing above it. A networking project can use BPF to steer packets. A tracing tool can use it to sample stacks and summarize latency. A security tool can use it to observe or constrain runtime behavior. The common substrate does not make the projects identical, but it gives them a powerful shared vocabulary: hooks, maps, program types, helpers, verifier constraints, and user-space loaders.[2][3][4][5]
The risk is that the shared vocabulary can be hidden by product surfaces. If a team only sees a dashboard or a Helm chart, it may miss the operational questions that decide whether eBPF is a good fit: Which kernels are supported? What privileges are required? What happens when a program is rejected by the verifier? How much state lives in maps? Which events are sampled, summarized, or dropped? How does the tool degrade when hooks differ across environments?[2][3]
Gregg's talk remains useful because it trains the viewer to ask those questions from first principles.[1] eBPF is not merely a faster way to get graphs. It is a kernel extension contract: event-driven hooks, bytecode, verifier, helpers, maps, JIT compilation, and user-space tooling all have to hold together. When they do, Linux gains a programmable observability and control plane that is far safer than "just load a module" and far closer to the truth than "just parse logs later."[1][2][3][4][5]
Sources
- Brendan Gregg, "Netflix talks about Extended BPF - A new software type," YouTube video, Ubuntu Masters, October 2019.
- eBPF Foundation, "What is eBPF?" - official introduction to hooks, verification, maps, helpers, JIT compilation, safety, and common project abstractions.
- The Linux Kernel documentation, "BPF Documentation" - kernel-side BPF documentation index for verifier, libbpf, syscall API, helper functions, program types, maps, testing, and related subsystem material.
- Cilium documentation, "BPF and XDP Reference Guide" - technical reference on BPF architecture, development tools, program types, and Cilium's use of BPF in its data path.
- Brendan Gregg, "Linux Extended BPF (eBPF) Tracing Tools" - practical performance-tool examples showing eBPF tracing, bcc, bpftrace, histograms, and user-space presentation.
- Wikimedia Commons, "File:Servers in a Rack.jpg" - source page for the real photographic cover image by Abigor.