blob: 25872934bfa54697be009e2df87491794e8d1052 [file] [log] [blame]
Brenden Blancoa296e1e2018-08-08 21:00:18 -07001#!/usr/bin/env python
Brenden Blanco9cafce22016-03-04 12:02:10 -08002# Copyright (c) PLUMgrid, Inc.
3# Licensed under the Apache License, Version 2.0 (the "License")
4
5import bcc
Brenden Blancoef6bb802016-03-04 15:13:13 -08006import distutils.version
7import os
Brenden Blanco9cafce22016-03-04 12:02:10 -08008import unittest
9
Brenden Blancoef6bb802016-03-04 15:13:13 -080010def 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 Blanco9cafce22016-03-04 12:02:10 -080023class TestStackid(unittest.TestCase):
24 def test_simple(self):
25 b = bcc.BPF(text="""
26#include <uapi/linux/ptrace.h>
Brenden Blanco33a3daf2016-04-08 16:00:03 -070027struct bpf_map;
Brenden Blanco9cafce22016-03-04 12:02:10 -080028BPF_STACK_TRACE(stack_traces, 10240);
29BPF_HASH(stack_entries, int, int);
30BPF_HASH(stub);
Brenden Blanco33a3daf2016-04-08 16:00:03 -070031int kprobe__htab_map_lookup_elem(struct pt_regs *ctx, struct bpf_map *map, u64 *k) {
Brenden Blancoef6bb802016-03-04 15:13:13 -080032 int id = stack_traces.get_stackid(ctx, BPF_F_REUSE_STACKID);
Brenden Blancoad0e8832016-03-04 13:58:44 -080033 if (id < 0)
34 return 0;
Brenden Blanco9cafce22016-03-04 12:02:10 -080035 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 Blanco33a3daf2016-04-08 16:00:03 -070043 try: x = stub[stub.Key(1)]
Brenden Blanco9cafce22016-03-04 12:02:10 -080044 except: pass
45 k = stack_entries.Key(1)
46 self.assertIn(k, stack_entries)
47 stackid = stack_entries[k]
48 self.assertIsNotNone(stackid)
Brenden Blancoad0e8832016-03-04 13:58:44 -080049 stack = stack_traces[stackid].ip
Brenden Blanco42d60982017-04-24 14:31:28 -070050 self.assertEqual(b.ksym(stack[0]), b"htab_map_lookup_elem")
Brenden Blanco9cafce22016-03-04 12:02:10 -080051
52
53if __name__ == "__main__":
54 unittest.main()