~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/samples/bpf/lathist_kern.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* Copyright (c) 2013-2015 PLUMgrid, http://plumgrid.com
  2  * Copyright (c) 2015 BMW Car IT GmbH
  3  *
  4  * This program is free software; you can redistribute it and/or
  5  * modify it under the terms of version 2 of the GNU General Public
  6  * License as published by the Free Software Foundation.
  7  */
  8 #include <linux/version.h>
  9 #include <linux/ptrace.h>
 10 #include <uapi/linux/bpf.h>
 11 #include <bpf/bpf_helpers.h>
 12 
 13 #define MAX_ENTRIES     20
 14 #define MAX_CPU         4
 15 
 16 /* We need to stick to static allocated memory (an array instead of
 17  * hash table) because managing dynamic memory from the
 18  * trace_preempt_[on|off] tracepoints hooks is not supported.
 19  */
 20 
 21 struct {
 22         __uint(type, BPF_MAP_TYPE_ARRAY);
 23         __type(key, int);
 24         __type(value, u64);
 25         __uint(max_entries, MAX_CPU);
 26 } my_map SEC(".maps");
 27 
 28 SEC("kprobe/trace_preempt_off")
 29 int bpf_prog1(struct pt_regs *ctx)
 30 {
 31         int cpu = bpf_get_smp_processor_id();
 32         u64 *ts = bpf_map_lookup_elem(&my_map, &cpu);
 33 
 34         if (ts)
 35                 *ts = bpf_ktime_get_ns();
 36 
 37         return 0;
 38 }
 39 
 40 static unsigned int log2(unsigned int v)
 41 {
 42         unsigned int r;
 43         unsigned int shift;
 44 
 45         r = (v > 0xFFFF) << 4; v >>= r;
 46         shift = (v > 0xFF) << 3; v >>= shift; r |= shift;
 47         shift = (v > 0xF) << 2; v >>= shift; r |= shift;
 48         shift = (v > 0x3) << 1; v >>= shift; r |= shift;
 49         r |= (v >> 1);
 50 
 51         return r;
 52 }
 53 
 54 static unsigned int log2l(unsigned long v)
 55 {
 56         unsigned int hi = v >> 32;
 57 
 58         if (hi)
 59                 return log2(hi) + 32;
 60         else
 61                 return log2(v);
 62 }
 63 
 64 struct {
 65         __uint(type, BPF_MAP_TYPE_ARRAY);
 66         __type(key, int);
 67         __type(value, long);
 68         __uint(max_entries, MAX_CPU * MAX_ENTRIES);
 69 } my_lat SEC(".maps");
 70 
 71 SEC("kprobe/trace_preempt_on")
 72 int bpf_prog2(struct pt_regs *ctx)
 73 {
 74         u64 *ts, cur_ts, delta;
 75         int key, cpu;
 76         long *val;
 77 
 78         cpu = bpf_get_smp_processor_id();
 79         ts = bpf_map_lookup_elem(&my_map, &cpu);
 80         if (!ts)
 81                 return 0;
 82 
 83         cur_ts = bpf_ktime_get_ns();
 84         delta = log2l(cur_ts - *ts);
 85 
 86         if (delta > MAX_ENTRIES - 1)
 87                 delta = MAX_ENTRIES - 1;
 88 
 89         key = cpu * MAX_ENTRIES + delta;
 90         val = bpf_map_lookup_elem(&my_lat, &key);
 91         if (val)
 92                 __sync_fetch_and_add((long *)val, 1);
 93 
 94         return 0;
 95 
 96 }
 97 
 98 char _license[] SEC("license") = "GPL";
 99 u32 _version SEC("version") = LINUX_VERSION_CODE;
100 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php