From 5f13ae34ff30e1b573efc3bbf2dd2f6479181607 Mon Sep 17 00:00:00 2001 From: Timo Beckers Date: Wed, 30 Mar 2022 18:29:55 +0200 Subject: [PATCH] link: test - attach k(ret)probe to optimized kernel symbols containing dots These are all local symbols that visible in /proc/kallsyms and traceable by kprobes. Make sure the library supports attaching to these. Signed-off-by: Timo Beckers --- link/kprobe_test.go | 63 +++++++++++++++++++++++++++++++++------------ link/link_test.go | 6 ++--- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/link/kprobe_test.go b/link/kprobe_test.go index 4b19f7a01..444033cd1 100644 --- a/link/kprobe_test.go +++ b/link/kprobe_test.go @@ -13,43 +13,72 @@ import ( "github.com/cilium/ebpf/internal/unix" ) -// Kernel symbol that should be present on all tested kernels. +// Global symbol, present on all tested kernels. var ksym = "vprintk" -func TestKprobe(t *testing.T) { - c := qt.New(t) +// Collection of various symbols present in all tested kernels. +// Compiler optimizations result in different names for these symbols. +var symTests = []string{ + "async_resume.cold", // marked with 'cold' gcc attribute, unlikely to be executed + "echo_char.isra.0", // function optimized by -fipa-sra + "get_buffer.constprop.0", // optimized function with constant operands + "unregister_kprobes.part.0", // function body that was split and partially inlined +} +func TestKprobe(t *testing.T) { prog := mustLoadProgram(t, ebpf.Kprobe, 0, "") - k, err := Kprobe(ksym, prog, nil) - c.Assert(err, qt.IsNil) - defer k.Close() + for _, tt := range symTests { + t.Run(tt, func(t *testing.T) { + k, err := Kprobe(tt, prog, nil) + if err != nil { + t.Fatal(err) + } + defer k.Close() + }) + } - testLink(t, k, prog) + c := qt.New(t) - k, err = Kprobe("bogus", prog, nil) - c.Assert(errors.Is(err, os.ErrNotExist), qt.IsTrue, qt.Commentf("got error: %s", err)) + k, err := Kprobe("bogus", prog, nil) + c.Assert(err, qt.ErrorIs, os.ErrNotExist, qt.Commentf("got error: %s", err)) if k != nil { k.Close() } + + k, err = Kprobe(ksym, prog, nil) + c.Assert(err, qt.IsNil) + defer k.Close() + + testLink(t, k, prog) } func TestKretprobe(t *testing.T) { - c := qt.New(t) - prog := mustLoadProgram(t, ebpf.Kprobe, 0, "") - k, err := Kretprobe(ksym, prog, nil) - c.Assert(err, qt.IsNil) - defer k.Close() + for _, tt := range symTests { + t.Run(tt, func(t *testing.T) { + k, err := Kretprobe(tt, prog, nil) + if err != nil { + t.Fatal(err) + } + defer k.Close() + }) + } - testLink(t, k, prog) + c := qt.New(t) - k, err = Kretprobe("bogus", prog, nil) - c.Assert(errors.Is(err, os.ErrNotExist), qt.IsTrue, qt.Commentf("got error: %s", err)) + k, err := Kretprobe("bogus", prog, nil) + c.Assert(err, qt.ErrorIs, os.ErrNotExist, qt.Commentf("got error: %s", err)) if k != nil { k.Close() } + + k, err = Kretprobe(ksym, prog, nil) + c.Assert(err, qt.IsNil) + defer k.Close() + + testLink(t, k, prog) } func TestKprobeErrors(t *testing.T) { diff --git a/link/link_test.go b/link/link_test.go index ae4880220..f8142fd0c 100644 --- a/link/link_test.go +++ b/link/link_test.go @@ -97,7 +97,7 @@ func testLink(t *testing.T, link Link, prog *ebpf.Program) { } defer os.RemoveAll(tmp) - t.Run("pinning", func(t *testing.T) { + t.Run("link/pinning", func(t *testing.T) { path := filepath.Join(tmp, "link") err = link.Pin(path) testutils.SkipIfNotSupported(t, err) @@ -123,7 +123,7 @@ func testLink(t *testing.T, link Link, prog *ebpf.Program) { } }) - t.Run("update", func(t *testing.T) { + t.Run("link/update", func(t *testing.T) { err := link.Update(prog) testutils.SkipIfNotSupported(t, err) if err != nil { @@ -142,7 +142,7 @@ func testLink(t *testing.T, link Link, prog *ebpf.Program) { }() }) - t.Run("link_info", func(t *testing.T) { + t.Run("link/info", func(t *testing.T) { info, err := link.Info() testutils.SkipIfNotSupported(t, err) if err != nil {