xref: /aosp_15_r20/external/bcc/tests/python/test_lru.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) PLUMgrid, Inc.
3*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
4*387f9dfdSAndroid Build Coastguard Worker
5*387f9dfdSAndroid Build Coastguard Workerimport ctypes as ct
6*387f9dfdSAndroid Build Coastguard Workerimport os
7*387f9dfdSAndroid Build Coastguard Workerimport unittest
8*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF
9*387f9dfdSAndroid Build Coastguard Workerimport multiprocessing
10*387f9dfdSAndroid Build Coastguard Worker
11*387f9dfdSAndroid Build Coastguard Workerclass TestLru(unittest.TestCase):
12*387f9dfdSAndroid Build Coastguard Worker    def test_lru_hash(self):
13*387f9dfdSAndroid Build Coastguard Worker        b = BPF(text=b"""BPF_TABLE("lru_hash", int, u64, lru, 1024);""")
14*387f9dfdSAndroid Build Coastguard Worker        t = b[b"lru"]
15*387f9dfdSAndroid Build Coastguard Worker        for i in range(1, 1032):
16*387f9dfdSAndroid Build Coastguard Worker            t[ct.c_int(i)] = ct.c_ulonglong(i)
17*387f9dfdSAndroid Build Coastguard Worker        for i, v in t.items():
18*387f9dfdSAndroid Build Coastguard Worker            self.assertEqual(v.value, i.value)
19*387f9dfdSAndroid Build Coastguard Worker        # BPF_MAP_TYPE_LRU_HASH eviction happens in batch and we expect less
20*387f9dfdSAndroid Build Coastguard Worker        # items than specified size.
21*387f9dfdSAndroid Build Coastguard Worker        self.assertLess(len(t), 1024);
22*387f9dfdSAndroid Build Coastguard Worker
23*387f9dfdSAndroid Build Coastguard Worker    def test_lru_percpu_hash(self):
24*387f9dfdSAndroid Build Coastguard Worker        test_prog1 = b"""
25*387f9dfdSAndroid Build Coastguard Worker        BPF_TABLE("lru_percpu_hash", u32, u32, stats, 1);
26*387f9dfdSAndroid Build Coastguard Worker        int hello_world(void *ctx) {
27*387f9dfdSAndroid Build Coastguard Worker            u32 key=0;
28*387f9dfdSAndroid Build Coastguard Worker            u32 value = 0, *val;
29*387f9dfdSAndroid Build Coastguard Worker            val = stats.lookup_or_try_init(&key, &value);
30*387f9dfdSAndroid Build Coastguard Worker            if (val) {
31*387f9dfdSAndroid Build Coastguard Worker                *val += 1;
32*387f9dfdSAndroid Build Coastguard Worker            }
33*387f9dfdSAndroid Build Coastguard Worker            return 0;
34*387f9dfdSAndroid Build Coastguard Worker        }
35*387f9dfdSAndroid Build Coastguard Worker        """
36*387f9dfdSAndroid Build Coastguard Worker        b = BPF(text=test_prog1)
37*387f9dfdSAndroid Build Coastguard Worker        stats_map = b.get_table(b"stats")
38*387f9dfdSAndroid Build Coastguard Worker        event_name = b.get_syscall_fnname(b"clone")
39*387f9dfdSAndroid Build Coastguard Worker        b.attach_kprobe(event=event_name, fn_name=b"hello_world")
40*387f9dfdSAndroid Build Coastguard Worker        ini = stats_map.Leaf()
41*387f9dfdSAndroid Build Coastguard Worker        for i in range(0, multiprocessing.cpu_count()):
42*387f9dfdSAndroid Build Coastguard Worker            ini[i] = 0
43*387f9dfdSAndroid Build Coastguard Worker        # First initialize with key 1
44*387f9dfdSAndroid Build Coastguard Worker        stats_map[ stats_map.Key(1) ] = ini
45*387f9dfdSAndroid Build Coastguard Worker        # Then initialize with key 0
46*387f9dfdSAndroid Build Coastguard Worker        stats_map[ stats_map.Key(0) ] = ini
47*387f9dfdSAndroid Build Coastguard Worker        # Key 1 should have been evicted
48*387f9dfdSAndroid Build Coastguard Worker        with self.assertRaises(KeyError):
49*387f9dfdSAndroid Build Coastguard Worker            val = stats_map[ stats_map.Key(1) ]
50*387f9dfdSAndroid Build Coastguard Worker        f = os.popen("hostname")
51*387f9dfdSAndroid Build Coastguard Worker        f.close()
52*387f9dfdSAndroid Build Coastguard Worker        self.assertEqual(len(stats_map),1)
53*387f9dfdSAndroid Build Coastguard Worker        val = stats_map[ stats_map.Key(0) ]
54*387f9dfdSAndroid Build Coastguard Worker        sum = stats_map.sum(stats_map.Key(0))
55*387f9dfdSAndroid Build Coastguard Worker        avg = stats_map.average(stats_map.Key(0))
56*387f9dfdSAndroid Build Coastguard Worker        max = stats_map.max(stats_map.Key(0))
57*387f9dfdSAndroid Build Coastguard Worker        self.assertGreater(sum.value, 0)
58*387f9dfdSAndroid Build Coastguard Worker        self.assertGreater(max.value, 0)
59*387f9dfdSAndroid Build Coastguard Worker        b.detach_kprobe(event_name)
60*387f9dfdSAndroid Build Coastguard Worker
61*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__":
62*387f9dfdSAndroid Build Coastguard Worker    unittest.main()
63