mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
restructure maps dir, fix imports
This commit is contained in:
47
examples/c-form/ex8.bpf.c
Normal file
47
examples/c-form/ex8.bpf.c
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
#include <linux/bpf.h>
|
||||||
|
#include <bpf/bpf_helpers.h>
|
||||||
|
#include <bpf/bpf_tracing.h>
|
||||||
|
#include <linux/blkdev.h>
|
||||||
|
#define __TARGET_ARCH_aarch64
|
||||||
|
#define u64 unsigned long long
|
||||||
|
|
||||||
|
struct {
|
||||||
|
__uint(type, BPF_MAP_TYPE_HASH);
|
||||||
|
__uint(max_entries, 10240);
|
||||||
|
__type(key, struct request *);
|
||||||
|
__type(value, u64);
|
||||||
|
} start SEC(".maps");
|
||||||
|
|
||||||
|
SEC("kprobe/blk_start_request")
|
||||||
|
int BPF_KPROBE(trace_start_req, struct request *req)
|
||||||
|
{
|
||||||
|
u64 ts = bpf_ktime_get_ns();
|
||||||
|
bpf_map_update_elem(&start, &req, &ts, BPF_ANY);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEC("kprobe/blk_mq_start_request")
|
||||||
|
int BPF_KPROBE(trace_start_mq, struct request *req)
|
||||||
|
{
|
||||||
|
u64 ts = bpf_ktime_get_ns();
|
||||||
|
bpf_map_update_elem(&start, &req, &ts, BPF_ANY);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEC("kprobe/blk_account_io_completion")
|
||||||
|
int BPF_KPROBE(trace_completion, struct request *req)
|
||||||
|
{
|
||||||
|
u64 *tsp, delta;
|
||||||
|
|
||||||
|
tsp = bpf_map_lookup_elem(&start, &req);
|
||||||
|
if (tsp) {
|
||||||
|
delta = bpf_ktime_get_ns() - *tsp;
|
||||||
|
bpf_printk("%d %x %d\n", req->__data_len,
|
||||||
|
req->cmd_flags, delta / 1000);
|
||||||
|
bpf_map_delete_elem(&start, &req);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char LICENSE[] SEC("license") = "GPL";
|
||||||
@ -1,7 +1,7 @@
|
|||||||
from pythonbpf.decorators import bpf, map, section, bpfglobal
|
from pythonbpf.decorators import bpf, map, section, bpfglobal
|
||||||
from ctypes import c_void_p, c_int64, c_int32, c_uint64
|
from ctypes import c_void_p, c_int64, c_int32, c_uint64
|
||||||
from pythonbpf.helpers import ktime
|
from pythonbpf.helpers import ktime
|
||||||
from pythonbpf.maps import HashMap
|
from pythonbpf.maps.maps import HashMap
|
||||||
|
|
||||||
|
|
||||||
@bpf
|
@bpf
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from pythonbpf import bpf, map, section, bpfglobal, compile
|
from pythonbpf import bpf, map, section, bpfglobal, compile
|
||||||
from pythonbpf.helpers import ktime, deref
|
from pythonbpf.helpers import ktime, deref
|
||||||
from pythonbpf.maps import HashMap
|
from pythonbpf.maps.maps import HashMap
|
||||||
|
|
||||||
from ctypes import c_void_p, c_int64, c_int32, c_uint64
|
from ctypes import c_void_p, c_int64, c_int32, c_uint64
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import ast
|
|||||||
from llvmlite import ir
|
from llvmlite import ir
|
||||||
from .license_pass import license_processing
|
from .license_pass import license_processing
|
||||||
from .functions_pass import func_proc
|
from .functions_pass import func_proc
|
||||||
from .maps_pass import maps_proc
|
from pythonbpf.maps.maps_pass import maps_proc
|
||||||
from .structs.structs_pass import structs_proc
|
from .structs.structs_pass import structs_proc
|
||||||
from .globals_pass import globals_processing
|
from .globals_pass import globals_processing
|
||||||
import os
|
import os
|
||||||
@ -125,8 +125,8 @@ def BPF() -> BpfProgram:
|
|||||||
caller_frame = inspect.stack()[1]
|
caller_frame = inspect.stack()[1]
|
||||||
src = inspect.getsource(caller_frame.frame)
|
src = inspect.getsource(caller_frame.frame)
|
||||||
with tempfile.NamedTemporaryFile(mode="w+", delete=True, suffix=".py") as f, \
|
with tempfile.NamedTemporaryFile(mode="w+", delete=True, suffix=".py") as f, \
|
||||||
tempfile.NamedTemporaryFile(mode="w+", delete=True, suffix=".ll") as inter, \
|
tempfile.NamedTemporaryFile(mode="w+", delete=True, suffix=".ll") as inter, \
|
||||||
tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".o") as obj_file:
|
tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".o") as obj_file:
|
||||||
f.write(src)
|
f.write(src)
|
||||||
f.flush()
|
f.flush()
|
||||||
source = f.name
|
source = f.name
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import ast
|
import ast
|
||||||
from llvmlite import ir
|
from llvmlite import ir
|
||||||
from .type_deducer import ctypes_to_ir
|
from pythonbpf.type_deducer import ctypes_to_ir
|
||||||
from . import dwarf_constants as dc
|
from pythonbpf import dwarf_constants as dc
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
map_sym_tab = {}
|
map_sym_tab = {}
|
||||||
@ -28,12 +28,6 @@ class BPFMapType(Enum):
|
|||||||
PERF_EVENT_ARRAY = 4
|
PERF_EVENT_ARRAY = 4
|
||||||
|
|
||||||
|
|
||||||
BPF_MAP_MAPPINGS = {
|
|
||||||
"HASH": 1, # BPF_MAP_TYPE_HASH
|
|
||||||
"PERF_EVENT_ARRAY": 4, # BPF_MAP_TYPE_PERF_EVENT_ARRAY
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def create_bpf_map(module, map_name, map_params):
|
def create_bpf_map(module, map_name, map_params):
|
||||||
"""Create a BPF map in the module with the given parameters and debug info"""
|
"""Create a BPF map in the module with the given parameters and debug info"""
|
||||||
|
|
||||||
@ -191,7 +185,7 @@ def create_map_debug_info(module, map_global, map_name, map_params):
|
|||||||
|
|
||||||
def process_hash_map(map_name, rval, module):
|
def process_hash_map(map_name, rval, module):
|
||||||
print(f"Creating HashMap map: {map_name}")
|
print(f"Creating HashMap map: {map_name}")
|
||||||
map_params: = {"type": BPFMapType.HASH}
|
map_params = {"type": BPFMapType.HASH}
|
||||||
|
|
||||||
# Assuming order: key_type, value_type, max_entries
|
# Assuming order: key_type, value_type, max_entries
|
||||||
if len(rval.args) >= 1 and isinstance(rval.args[0], ast.Name):
|
if len(rval.args) >= 1 and isinstance(rval.args[0], ast.Name):
|
||||||
Reference in New Issue
Block a user