Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pr/olsajiri/pinned maps #2832

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 9 additions & 11 deletions pkg/sensors/base/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,26 +64,26 @@ var (
).SetPolicy(basePolicy)

/* Event Ring map */
TCPMonMap = program.MapBuilder("tcpmon_map", Execve)
TCPMonMap = program.MapBuilder("tcpmon_map", Execve, Exit, Fork)
/* Networking and Process Monitoring maps */
ExecveMap = program.MapBuilder("execve_map", Execve)
ExecveMap = program.MapBuilder("execve_map", Execve, Exit, Fork, ExecveBprmCommit)
ExecveTailCallsMap = program.MapBuilderPin("execve_calls", "execve_calls", Execve)

ExecveJoinMap = program.MapBuilder("tg_execve_joined_info_map", ExecveBprmCommit)
ExecveJoinMap = program.MapBuilder("tg_execve_joined_info_map", Execve, Exit, Fork, ExecveBprmCommit)

/* Tetragon runtime configuration */
TetragonConfMap = program.MapBuilder("tg_conf_map", Execve)
TetragonConfMap = program.MapBuilder("tg_conf_map", Execve, Exit, Fork)

/* Internal statistics for debugging */
ExecveStats = program.MapBuilder("execve_map_stats", Execve)
ExecveJoinMapStats = program.MapBuilder("tg_execve_joined_info_map_stats", ExecveBprmCommit)
StatsMap = program.MapBuilder("tg_stats_map", Execve)
ExecveStats = program.MapBuilder("execve_map_stats", Execve, Exit, Fork)
ExecveJoinMapStats = program.MapBuilder("tg_execve_joined_info_map_stats", Execve, Exit, Fork, ExecveBprmCommit)
StatsMap = program.MapBuilder("tg_stats_map", Execve, Exit, Fork)

/* Cgroup rate data, attached to execve sensor */
CgroupRateMap = program.MapBuilder("cgroup_rate_map", Execve, Exit, Fork, CgroupRmdir)
CgroupRateOptionsMap = program.MapBuilder("cgroup_rate_options_map", Execve)
CgroupRateOptionsMap = program.MapBuilder("cgroup_rate_options_map", Execve, Exit, Fork)

MatchBinariesSetMap = program.MapBuilder(mbset.MapName, Execve)
MatchBinariesSetMap = program.MapBuilder(mbset.MapName, Execve, Exit, Fork)

sensor = sensors.Sensor{
Name: basePolicy,
Expand Down Expand Up @@ -169,7 +169,6 @@ func GetInitialSensor() *sensors.Sensor {
sensorInit.Do(func() {
setupPrograms()
sensor.Progs = GetDefaultPrograms(option.CgroupRateEnabled())
sensor.Maps = GetDefaultMaps(option.CgroupRateEnabled())
})
return &sensor
}
Expand All @@ -178,7 +177,6 @@ func GetInitialSensorTest() *sensors.Sensor {
sensorTestInit.Do(func() {
setupPrograms()
sensorTest.Progs = GetDefaultPrograms(true)
sensorTest.Maps = GetDefaultMaps(true)
})
return &sensorTest
}
Expand Down
75 changes: 9 additions & 66 deletions pkg/sensors/load.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ import (
"fmt"
"os"
"path"
"path/filepath"
"strings"

"github.com/cilium/ebpf"
cachedbtf "github.com/cilium/tetragon/pkg/btf"
"github.com/cilium/tetragon/pkg/kernels"
"github.com/cilium/tetragon/pkg/logger"
Expand Down Expand Up @@ -93,10 +91,6 @@ func (s *Sensor) Load(bpfDir string) error {
return fmt.Errorf("tetragon, aborting could not find BPF programs: %w", err)
}

if err := s.loadMaps(bpfDir); err != nil {
return fmt.Errorf("tetragon, aborting could not load sensor BPF maps: %w", err)
}

for _, p := range s.Progs {
if p.LoadState.IsLoaded() {
l.WithField("prog", p.Name).Info("BPF prog is already loaded, incrementing reference count")
Expand All @@ -113,7 +107,6 @@ func (s *Sensor) Load(bpfDir string) error {

// Add the *loaded* programs and maps, so they can be unloaded later
progsAdd(s.Progs)
AllMaps = append(AllMaps, s.Maps...)

l.WithField("sensor", s.Name).Infof("Loaded BPF maps and events for sensor successfully")
s.Loaded = true
Expand All @@ -136,9 +129,11 @@ func (s *Sensor) Unload() error {
unloadProgram(p)
}

for _, m := range s.Maps {
if err := m.Unload(); err != nil {
logger.GetLogger().WithError(err).WithField("map", s.Name).Warn("Failed to unload map")
for _, p := range s.Progs {
for name, m := range p.PinMap {
if err := m.Unload(); err != nil {
logger.GetLogger().WithError(err).WithField("map", name).Warn("Failed to unload map")
}
}
}

Expand Down Expand Up @@ -200,76 +195,24 @@ func (s *Sensor) FindPrograms() error {
if err := s.findProgram(p); err != nil {
return err
}
}
for _, m := range s.Maps {
if err := s.findProgram(m.Prog); err != nil {
return err
}
}
return nil
}

// loadMaps loads all the BPF maps in the sensor.
func (s *Sensor) loadMaps(bpfDir string) error {
l := logger.GetLogger()
for _, m := range s.Maps {
if m.PinState.IsLoaded() {
l.WithFields(logrus.Fields{
"sensor": s.Name,
"map": m.Name,
}).Info("map is already loaded, incrementing reference count")
m.PinState.RefInc()
continue
}

pinPath := filepath.Join(bpfDir, m.PinName)

spec, err := ebpf.LoadCollectionSpec(m.Prog.Name)
if err != nil {
return fmt.Errorf("failed to open collection '%s': %w", m.Prog.Name, err)
}
mapSpec, ok := spec.Maps[m.Name]
if !ok {
return fmt.Errorf("map '%s' not found from '%s'", m.Name, m.Prog.Name)
}

if max, ok := m.GetMaxEntries(); ok {
mapSpec.MaxEntries = max
}

if innerMax, ok := m.GetMaxInnerEntries(); ok {
if innerMs := mapSpec.InnerMap; innerMs != nil {
mapSpec.InnerMap.MaxEntries = innerMax
for _, m := range p.PinMap {
if err := s.findProgram(m.Prog); err != nil {
return err
}
}

if err := m.LoadOrCreatePinnedMap(pinPath, mapSpec); err != nil {
return fmt.Errorf("failed to load map '%s' for sensor '%s': %w", m.Name, s.Name, err)
}

l.WithFields(logrus.Fields{
"sensor": s.Name,
"map": m.Name,
"path": pinPath,
"max": m.Entries,
}).Info("tetragon, map loaded.")
}

return nil
}

func mergeSensors(sensors []*Sensor) *Sensor {
var progs []*program.Program
var maps []*program.Map

for _, s := range sensors {
progs = append(progs, s.Progs...)
maps = append(maps, s.Maps...)
}
return &Sensor{
Name: "__main__",
Progs: progs,
Maps: maps,
}
}

Expand All @@ -283,7 +226,7 @@ func observerLoadInstance(bpfDir string, load *program.Program) error {
l.WithFields(logrus.Fields{
"prog": load.Name,
"kern_version": version,
}).Debug("observerLoadInstance", load.Name, version)
}).Debugf("observerLoadInstance %s %d", load.Name, version)
if load.Type == "tracepoint" {
err = loadInstance(bpfDir, load, version, option.Config.Verbosity)
if err != nil {
Expand Down
20 changes: 20 additions & 0 deletions pkg/sensors/program/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -863,6 +863,26 @@ func doLoadProgram(
}
defer coll.Close()

// Pin all requested maps
for name, m := range coll.Maps {
// Is the map refferenced by program
if _, ok := refMaps[name]; !ok {
continue
}
// Is the map already pinned
if _, ok := pinnedMaps[name]; ok {
continue
}
// Do we want the map to be pinned?
pm, ok := load.PinMap[name]
if !ok {
continue
}
if err := pm.CloneAndPin(bpfDir, m); err != nil {
return nil, fmt.Errorf("map pinning failed: %s", err)
}
}

err = installTailCalls(bpfDir, spec, coll, load)
if err != nil {
return nil, fmt.Errorf("installing tail calls failed: %s", err)
Expand Down
15 changes: 15 additions & 0 deletions pkg/sensors/program/map.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,21 @@ func (m *Map) LoadOrCreatePinnedMap(pinPath string, mapSpec *ebpf.MapSpec) error
return nil
}

func (m *Map) CloneAndPin(bpfDir string, handle *ebpf.Map) error {
var err error

m.MapHandle, err = handle.Clone()
if err != nil {
return fmt.Errorf("failed to clone map '%s': %w", m.Name, err)
}
pinPath := filepath.Join(bpfDir, m.PinName)
if err = m.MapHandle.Pin(pinPath); err != nil {
return fmt.Errorf("failed to pin to %s: %w", pinPath, err)
}
m.PinState.RefInc()
return nil
}

func isValidSubdir(d string) bool {
dir := filepath.Base(d)
return dir != "." && dir != ".."
Expand Down
9 changes: 2 additions & 7 deletions pkg/sensors/sensors.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ type Sensor struct {
Name string
// Progs are all the BPF programs that exist on the filesystem.
Progs []*program.Program
// Maps are all the BPF Maps that the progs use.
Maps []*program.Map
// Loaded indicates whether the sensor has been Loaded.
Loaded bool
// Destroyed indicates whether the sensor had been destroyed.
Expand Down Expand Up @@ -84,19 +82,16 @@ type SensorHook func() error

func SensorCombine(name string, sensors ...*Sensor) *Sensor {
progs := []*program.Program{}
maps := []*program.Map{}
for _, s := range sensors {
progs = append(progs, s.Progs...)
maps = append(maps, s.Maps...)
}
return SensorBuilder(name, progs, maps)
return SensorBuilder(name, progs)
}

func SensorBuilder(name string, p []*program.Program, m []*program.Map) *Sensor {
func SensorBuilder(name string, p []*program.Program) *Sensor {
return &Sensor{
Name: name,
Progs: p,
Maps: m,
}
}

Expand Down
8 changes: 0 additions & 8 deletions pkg/sensors/test/cgroups.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,10 @@ func getCgroupPrograms() []*program.Program {
return progs
}

func getCgroupMaps() []*program.Map {
maps := []*program.Map{
GetCgroupsTrackingMap(),
}
return maps
}

// GetCgroupSensor returns the Cgroups base sensor
func GetCgroupSensor() *sensors.Sensor {
return &sensors.Sensor{
Name: "test-sensor-cgroups",
Progs: getCgroupPrograms(),
Maps: getCgroupMaps(),
}
}
3 changes: 1 addition & 2 deletions pkg/sensors/test/test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ func GetTestSensor() *sensors.Sensor {
sensors.PathJoin(sensorName, "test_lseek_prog"),
"tracepoint",
)}
maps := []*program.Map{}
sensor := &sensors.Sensor{Name: sensorName, Progs: progs, Maps: maps}
sensor := &sensors.Sensor{Name: sensorName, Progs: progs}
return sensor
}
4 changes: 0 additions & 4 deletions pkg/sensors/tracing/enforcer.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,6 @@ func (kp *enforcerPolicy) createEnforcerSensor(
// register enforcer sensor
var load *program.Program
var progs []*program.Program
var maps []*program.Map
specOpts, err := getSpecOptions(opts)
if err != nil {
return nil, fmt.Errorf("failed to get spec options: %s", err)
Expand Down Expand Up @@ -318,8 +317,6 @@ func (kp *enforcerPolicy) createEnforcerSensor(
enforcerDataMap := enforcerMap(policyName, progs...)
enforcerDataMap.SetMaxEntries(enforcerMapMaxEntries)

maps = append(maps, enforcerDataMap)

if ok := kp.enforcerAdd(name, kh); !ok {
return nil, fmt.Errorf("failed to add enforcer: '%s'", name)
}
Expand All @@ -329,7 +326,6 @@ func (kp *enforcerPolicy) createEnforcerSensor(
return &sensors.Sensor{
Name: "__enforcer__",
Progs: progs,
Maps: maps,
PostUnloadHook: func() error {
if ok := kp.enforcerDel(name); !ok {
logger.GetLogger().Infof("Failed to clean up enforcer sensor '%s'", name)
Expand Down
Loading
Loading