Brenden Blanco | a296e1e | 2018-08-08 21:00:18 -0700 | [diff] [blame^] | 1 | #!/usr/bin/env python |
Brenden Blanco | 9cafce2 | 2016-03-04 12:02:10 -0800 | [diff] [blame] | 2 | # Copyright (c) PLUMgrid, Inc. |
| 3 | # Licensed under the Apache License, Version 2.0 (the "License") |
| 4 | |
| 5 | import bcc |
Brenden Blanco | ef6bb80 | 2016-03-04 15:13:13 -0800 | [diff] [blame] | 6 | import distutils.version |
| 7 | import os |
Brenden Blanco | 9cafce2 | 2016-03-04 12:02:10 -0800 | [diff] [blame] | 8 | import unittest |
| 9 | |
Brenden Blanco | ef6bb80 | 2016-03-04 15:13:13 -0800 | [diff] [blame] | 10 | def kernel_version_ge(major, minor): |
| 11 | # True if running kernel is >= X.Y |
| 12 | version = distutils.version.LooseVersion(os.uname()[2]).version |
| 13 | if version[0] > major: |
| 14 | return True |
| 15 | if version[0] < major: |
| 16 | return False |
| 17 | if minor and version[1] < minor: |
| 18 | return False |
| 19 | return True |
| 20 | |
| 21 | |
| 22 | @unittest.skipUnless(kernel_version_ge(4,6), "requires kernel >= 4.6") |
Brenden Blanco | 9cafce2 | 2016-03-04 12:02:10 -0800 | [diff] [blame] | 23 | class TestStackid(unittest.TestCase): |
| 24 | def test_simple(self): |
| 25 | b = bcc.BPF(text=""" |
| 26 | #include <uapi/linux/ptrace.h> |
Brenden Blanco | 33a3daf | 2016-04-08 16:00:03 -0700 | [diff] [blame] | 27 | struct bpf_map; |
Brenden Blanco | 9cafce2 | 2016-03-04 12:02:10 -0800 | [diff] [blame] | 28 | BPF_STACK_TRACE(stack_traces, 10240); |
| 29 | BPF_HASH(stack_entries, int, int); |
| 30 | BPF_HASH(stub); |
Brenden Blanco | 33a3daf | 2016-04-08 16:00:03 -0700 | [diff] [blame] | 31 | int kprobe__htab_map_lookup_elem(struct pt_regs *ctx, struct bpf_map *map, u64 *k) { |
Brenden Blanco | ef6bb80 | 2016-03-04 15:13:13 -0800 | [diff] [blame] | 32 | int id = stack_traces.get_stackid(ctx, BPF_F_REUSE_STACKID); |
Brenden Blanco | ad0e883 | 2016-03-04 13:58:44 -0800 | [diff] [blame] | 33 | if (id < 0) |
| 34 | return 0; |
Brenden Blanco | 9cafce2 | 2016-03-04 12:02:10 -0800 | [diff] [blame] | 35 | int key = 1; |
| 36 | stack_entries.update(&key, &id); |
| 37 | return 0; |
| 38 | } |
| 39 | """) |
| 40 | stub = b["stub"] |
| 41 | stack_traces = b["stack_traces"] |
| 42 | stack_entries = b["stack_entries"] |
Brenden Blanco | 33a3daf | 2016-04-08 16:00:03 -0700 | [diff] [blame] | 43 | try: x = stub[stub.Key(1)] |
Brenden Blanco | 9cafce2 | 2016-03-04 12:02:10 -0800 | [diff] [blame] | 44 | except: pass |
| 45 | k = stack_entries.Key(1) |
| 46 | self.assertIn(k, stack_entries) |
| 47 | stackid = stack_entries[k] |
| 48 | self.assertIsNotNone(stackid) |
Brenden Blanco | ad0e883 | 2016-03-04 13:58:44 -0800 | [diff] [blame] | 49 | stack = stack_traces[stackid].ip |
Brenden Blanco | 42d6098 | 2017-04-24 14:31:28 -0700 | [diff] [blame] | 50 | self.assertEqual(b.ksym(stack[0]), b"htab_map_lookup_elem") |
Brenden Blanco | 9cafce2 | 2016-03-04 12:02:10 -0800 | [diff] [blame] | 51 | |
| 52 | |
| 53 | if __name__ == "__main__": |
| 54 | unittest.main() |