Creator of 0x.tools and a long time computer performance nerd. Performance & Troubleshooting Training: learn.tanelpoder.com

Miami, FL
Replying to @P99CONF
This should be (again) useful and fun! In addition to other things, I'll demo my new "brr" eBPF Runtime Reporter and Profiler tool that uses perf_events for profiling both the eBPF program functions and OS kernel function calls underneath 😎 github.com/tanelpoder/brr
1
6
324
Tanel Poder 🇺🇦 retweeted
eBPF and #P99CONF go together like peanut butter and jelly. What are the latest advances for this kernel technology? Find out from @TanelPoder, Enzo Venturi, Hayden Stainsby, Ershaad Basheer, @PeterZaitsev, and more at our free virtual event. ow.ly/qN9N50ZQfXw #ScyllaDB
1
5
569
Tanel Poder 🇺🇦 retweeted
I've been following a lot of the wal-on-s3 and database-on-s3 debates... and I think everyone is wrong 🤣 First. All the hand-wringing about whether it counts as database-on-s3 if there are cache layers above it. Guys, DBs for the last 40 years had cache layers above an extremely slow storage layer. You think S3 is slow? Try a Netapp device with RAID-5 when the DB has a completely over-subscribed top-of-rack switch. Try a high performance Symmetrix, with a dedicated storage network, with a massively undersized Barracuda switch that basically tips over whenever someone takes a backup. Databases were designed for slow storage, and caches are the way to go. Even with NVMes, caches rock the world. I don't understand why suddenly this is a topic for debate. Second. Getting this to work reliably is not trivial. You can vibe-code it... If you have 20 years experience building distributed data systems, and you know every algorithm and how well they worked in production and how to comprehensively test them. Then you can guide your LLM toward a great outcome. But if it is your first time building a distributed system (or any kind of data store), you should see this as a learning experience - and embrace the lessons that are facing you. As many people discovered in the last week - learning in public is a great way to learn, but is not for the faint of heart. But learning *is* the important bit. Which is why I'm sharing my 2 bits - so everyone can yell at me and I can learn too!
18
35
341
34,982
Tanel Poder 🇺🇦 retweeted
To get you ready for @TanelPoder's 2026 #P99CONF talk, check out his 2025 session where he shared the prod/GA ready version of xCapture v3 + xtop and demonstrated how it helps with real life troubleshooting scenarios. Watch for free here: ow.ly/QfGR50XpsSN #ScyllaDB
3
10
759
Tanel Poder 🇺🇦 retweeted
What are proven ways to optimize eBPF? @TanelPoder will share the trade-offs and help #eBPF build observability systems that remain trustworthy under production workloads. Don't miss this highly technical session at @P99CONF. ow.ly/9pNn50ZxJUi #ScyllaDB #P99CONF
1
2
8
1,101
Tanel Poder 🇺🇦 retweeted
How can you avoid production latency, throughput, and reliability pitfalls? #P99CONF veteran @tanelpoder will help practitioners understand the trade-offs and build observability systems that remain trustworthy under production workloads. ow.ly/u3sy50Znqf9 #ScyllaDB #ePBF
1
5
10
877
Tanel Poder 🇺🇦 retweeted
Releasing an eBPF Runtime Reporter and Profiler tool (brr). I've used it for profiling eBPF programs themselves. It unifies bpftop-like utilization/event frequency monitoring with perf_events based CPU sampling, with source code line mapping. github.com/tanelpoder/brr/
1
11
83
5,151
Tanel Poder 🇺🇦 retweeted
You can have managed, serverless MCP Servers for your Oracle AI Databases in the Cloud These enable you to talk to your database But for critical reports you may want verified #SQL @thatjeffsmith shows how to use predefined reports with the MCP server thatjeffsmith.com/archive/20…
5
11
1,451
Tanel Poder 🇺🇦 retweeted
Welp, that happened faster than I predicted. Thought it would be end of 2027, then early 2027, but agentic traffic growing so fast that bots have now passed human traffic online for the first time in the Internet's history. radar.cloudflare.com/traffic…
398
1,821
8,269
2,292,517
Tanel Poder 🇺🇦 retweeted
someone made a fork of opencode that routes through the unsecured ai endpoints from chipotle
205
608
11,806
2,387,232
Tanel Poder 🇺🇦 retweeted
Turns out that I had dreamed up the database version when the scalable LMT "space header" feature was introduced. It was introduced already in 12c, with the "_enable_12g_bft" parameter - enable 12g bigfile tablespace. When upgrading from an earlier version to 12c+, you still had to create a new tablespace with this setting was enabled (old ones do not get converted to the new scalable LMT space management). The space header block (#2) now shows "KTFBN File Space Header" (not KTFB). I guess the N means "new". Kun Sun has written an article about another issue, but covers the differences of old vs new 12c bigfile tablespace headers here: ksun-oracle.blogspot.com/202…
1
9
799
Tanel Poder 🇺🇦 retweeted
But now I can't find the article, I hope I didn't read it in my dreams or something 😅 Related, the old way is described here (the block#=2 in each datafile was the single LMT space management *header* block per file): tanelpoder.com/2013/11/06/di…
1
1
4
1,137
Question for fellow Oracle nerds: I'm sure I saw a post recently about an Oracle 23/26 enhancement for more scalable LMT bigfile tablespace space management. Something like where now there can be multiple "KTFB Bitmapped File Space Header" blocks, instead of just one header block
1
3
1,008
But now I can't find the article, I hope I didn't read it in my dreams or something 😅 Related, the old way is described here (the block#=2 in each datafile was the single LMT space management *header* block per file): tanelpoder.com/2013/11/06/di…
1
1
4
1,137
Turns out that I had dreamed up the database version when the scalable LMT "space header" feature was introduced. It was introduced already in 12c, with the "_enable_12g_bft" parameter - enable 12g bigfile tablespace. When upgrading from an earlier version to 12c+, you still had to create a new tablespace with this setting was enabled (old ones do not get converted to the new scalable LMT space management). The space header block (#2) now shows "KTFBN File Space Header" (not KTFB). I guess the N means "new". Kun Sun has written an article about another issue, but covers the differences of old vs new 12c bigfile tablespace headers here: ksun-oracle.blogspot.com/202…
1
9
799
I wont forget to pitch my xtop TUI tool (for eBPF xcapture output analysis) as well! tanelpoder.com/posts/xcaptur…
5
655
Tanel Poder 🇺🇦 retweeted
Solving the Identity Crisis for AI Agents uber.com/us/en/blog/solving-…
1
6
818
Tanel Poder 🇺🇦 retweeted
It's a gorgeous and funny bug. Fwiw, I'm the biggest eBPF fanatic, but I don't think unprivileged users should be able to load arbitrary eBPF programs.
found a verifier/interpreter mismatch in the Linux BPF subsystem (CVE-2026-31525, CVSS 7.8). arbitrary kernel read/write; become root, escape containers, disable SELinux, read TLS keys out of other processes' memory. anyway, it starts with the math bars, the absolute value. computers store negative numbers in two's complement. the smallest 32-bit signed integer is -2,147,483,648, and the largest positive is +2,147,483,647. there is no +2,147,483,648, since it simply does not fit. so when you call abs(-2,147,483,648), the C specification thinks about it for a moment, says "undefined," and leaves the room. on x86 and arm64, what you actually get back is -2,147,483,648. you asked for the absolute value of a negative number, you got back the same negative number. thank you computer :D the BPF interpreter implements signed 32-bit division (BPF_ALU | BPF_DIV/MOD, off == 1, added in ec0e2da95f72) by decomposing it into unsigned division: take abs() of both operands, divide via do_div(), reapply the sign. the handler in ___bpf_prog_run (kernel/bpf/core.c): AX = abs((s32)DST); AX = do_div(AX, abs((s32)SRC)); and look, the kernel even documents this. include/linux/math.h: "the return value is undefined when the input is the minimum value of the type." when DST = 0x80000000 (S32_MIN), abs() tries to negate it. -(-2,147,483,648) overflows s32, the C spec calls it undefined behavior, and the CPU hands back 0x80000000 unchanged. still negative. abs() had one job. this s32 then gets assigned into AX, a u64 BPF register. s32 → u64 sign-extends: 0x80000000 becomes 0xFFFFFFFF80000000. that's 18,446,744,071,562,067,968. you wanted 2,147,483,648, you got 18.4 quintillion; a rounding error of about 18.4 quintillion. do_div() is a 64-by-32-bit unsigned division macro and it operates on this full u64 numerator. the quotient is off by a factor of 2³². the smod path has the same problem since do_div() modifies the dividend in place and returns the remainder, both wrong. 8 call sites across sdiv32/smod32 src/imm handlers, all quietly producing nonsense whenever S32_MIN shows up. the BPF verifier is the safety system that statically analyzes every BPF program before allowing it to run. it exists specifically to guarantee that nothing bad can happen. scalar32_min_max_sdiv() in kernel/bpf/verifier.c tracks value ranges through abstract interpretation. it handles signed division correctly, including S32_MIN. computes tight, mathematically correct bounds. the interpreter, as we've established, computes whatever it feels like. so the verifier thinks register R0 is in range X. the interpreter puts value Y in R0. the safety system and the execution engine disagree about what a program does. in BPF security research, this is where you set down your coffee. concretely: load S32_MIN into R1, load 2 into R2, execute SDIV32 R1 R2. verifier determines R1 ∈ [-1,073,741,824, -1,073,741,824]. interpreter computes do_div(0xFFFFFFFF80000000, 2) = 0x7FFFFFFFC0000000, reapplies the sign, produces a completely unrelated value. use R1 as an index into a BPF map. verifier approves the access, bounds check passes against its calculated range. interpreter uses the actual value. out-of-bounds read/write on a kernel data structure. on every Linux machine running the BPF interpreter. the root cause of all of this: the absolute value function doesn't handle one number. one specific number, out of 4.2 billion possible inputs, and it's the one that gives you kernel read/write. the fix is: c static u32 abs_s32(s32 x) { return x >= 0 ? (u32)x : -(u32)x; } cast to u32 before negating. -(u32)0x80000000 = 0x80000000 unsigned. correct absolute value, no overflow, no undefined behavior. the kind of function you'd assume already exists somewhere in 30 million lines of kernel code. it did not. I got to write it. :D I reported this, wrote the patch, got it through 5 revisions of review. acked by Yonghong Song and Mykyta Yatsenko. now patched in stable 6.6, 6.12, 6.18, 6.19. if you haven't updated your kernel: maybe do that.
7
23
154
25,663