Skip to content

Commit

Permalink
pkg/sensors: reduce memory footprint of unused override maps
Browse files Browse the repository at this point in the history
Resize the override_tasks if needed to save memory, thus we are saving
~3MB of kernel memory by kprobe that are not using the override action.

Signed-off-by: Mahe Tardy <mahe.tardy@gmail.com>
  • Loading branch information
mtardy committed Jul 18, 2024
1 parent cd11be0 commit d0b47e2
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
2 changes: 1 addition & 1 deletion bpf/process/bpf_generic_kprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ struct {

struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(max_entries, 32768);
__uint(max_entries, 1); // will be resized by agent when needed
__type(key, __u64);
__type(value, __s32);
} override_tasks SEC(".maps");
Expand Down
16 changes: 16 additions & 0 deletions pkg/sensors/tracing/generickprobe.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ const (
ratelimitMapMaxEntries = 32768
fdInstallMapMaxEntries = 32000
enforcerMapMaxEntries = 32768
overrideMapMaxEntries = 32768
)

func kprobeCharBufErrorToString(e int32) string {
Expand Down Expand Up @@ -292,6 +293,7 @@ func createMultiKprobeSensor(sensorPath, policyName string, multiIDs []idtable.E

has.stackTrace = has.stackTrace || gk.hasStackTrace
has.rateLimit = has.rateLimit || gk.hasRatelimit
has.override = has.override || gk.hasOverride
}

loadProgName := "bpf_multi_kprobe_v53.o"
Expand Down Expand Up @@ -373,6 +375,12 @@ func createMultiKprobeSensor(sensorPath, policyName string, multiIDs []idtable.E
filterMap.SetMaxEntries(len(multiIDs))
configMap.SetMaxEntries(len(multiIDs))

overrideTasksMap := program.MapBuilderPin("override_tasks", sensors.PathJoin(pinPath, "override_tasks"), load)
if has.override {
overrideTasksMap.SetMaxEntries(overrideMapMaxEntries)
}
maps = append(maps, overrideTasksMap)

if len(multiRetIDs) != 0 {
loadret := program.Builder(
path.Join(option.Config.HubbleLib, loadProgRetName),
Expand Down Expand Up @@ -553,6 +561,7 @@ type hasMaps struct {
rateLimit bool
fdInstall bool
enforcer bool
override bool
}

// hasMapsSetup setups the has maps for the per policy maps. The per kprobe maps
Expand Down Expand Up @@ -961,6 +970,12 @@ func createKprobeSensorFromEntry(kprobeEntry *genericKprobe, sensorPath string,
}
maps = append(maps, enforcerDataMap)

overrideTasksMap := program.MapBuilderPin("override_tasks", sensors.PathJoin(pinPath, "override_tasks"), load)
if has.override {
overrideTasksMap.SetMaxEntries(overrideMapMaxEntries)
}
maps = append(maps, overrideTasksMap)

if kprobeEntry.loadArgs.retprobe {
pinRetProg := sensors.PathJoin(pinPath, fmt.Sprintf("%s_ret_prog", kprobeEntry.funcName))
loadret := program.Builder(
Expand Down Expand Up @@ -1022,6 +1037,7 @@ func createSingleKprobeSensor(sensorPath string, ids []idtable.EntryID, has hasM
// setup per kprobe map config
has.stackTrace = gk.hasStackTrace
has.rateLimit = gk.hasRatelimit
has.override = gk.hasOverride

progs, maps = createKprobeSensorFromEntry(gk, sensorPath, progs, maps, has)
}
Expand Down

0 comments on commit d0b47e2

Please # to comment.