From 82820da22f13bfb6df7cac22f8c4d359b77c36ae Mon Sep 17 00:00:00 2001
From: Burak Ok <burakok@microsoft.com>
Date: Thu, 27 Aug 2026 16:44:48 +0200
Subject: [PATCH 1/2] inspektor-gadget: support cilium/ebpf v0.22.0

Backport the BTF iterator and program statistics API migrations required after upgrading github.com/cilium/ebpf.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 05823411-83af-42c4-9d78-38161b9c88db
---
 pkg/gadgets/run/types/metadata.go     |  8 +++++---
 pkg/gadgets/top/ebpf/tracer/tracer.go |  9 +++++++--
 pkg/operators/ebpf/ebpf.go            | 14 ++++++++------
 pkg/operators/ebpf/stats.go           | 17 ++++++++---------
 4 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/pkg/gadgets/run/types/metadata.go b/pkg/gadgets/run/types/metadata.go
index eb77056c..9b826a8e 100644
--- a/pkg/gadgets/run/types/metadata.go
+++ b/pkg/gadgets/run/types/metadata.go
@@ -327,9 +327,11 @@ func GetGadgetIdentByPrefix(spec *ebpf.CollectionSpec, prefix string) ([]string,
 	var resultNames []string
 	var errs []error
 
-	it := spec.Types.Iterate()
-	for it.Next() {
-		btfVar, ok := it.Type.(*btf.Var)
+	for typ, err := range spec.Types.All() {
+		if err != nil {
+			return nil, fmt.Errorf("getting type: %w", err)
+		}
+		btfVar, ok := typ.(*btf.Var)
 		if !ok {
 			continue
 		}
diff --git a/pkg/gadgets/top/ebpf/tracer/tracer.go b/pkg/gadgets/top/ebpf/tracer/tracer.go
index 55ae6076..516e02a5 100644
--- a/pkg/gadgets/top/ebpf/tracer/tracer.go
+++ b/pkg/gadgets/top/ebpf/tracer/tracer.go
@@ -168,8 +168,13 @@ func (t *Tracer) nextStats() ([]*types.Stats, error) {
 			}
 		}
 
-		totalRuntime, _ := pi.Runtime()
-		totalRunCount, _ := pi.RunCount()
+		programStats, err := prog.Stats()
+		if err != nil {
+			prog.Close()
+			continue
+		}
+		totalRuntime := programStats.Runtime
+		totalRunCount := programStats.RunCount
 
 		curRuntime := int64(0)
 		curRunCount := uint64(0)
diff --git a/pkg/operators/ebpf/ebpf.go b/pkg/operators/ebpf/ebpf.go
index c0a3e0a0..87783cf4 100644
--- a/pkg/operators/ebpf/ebpf.go
+++ b/pkg/operators/ebpf/ebpf.go
@@ -272,21 +272,23 @@ func (i *ebpfInstance) analyze() error {
 	}
 
 	// Iterate over types and populate the gadget
-	it := i.collectionSpec.Types.Iterate()
-	for it.Next() {
+	for typ, err := range i.collectionSpec.Types.All() {
+		if err != nil {
+			return fmt.Errorf("iterating over types: %w", err)
+		}
 		for _, entry := range prefixLookups {
-			typeName, ok := entry.prefixFunc(it.Type.TypeName())
+			typeName, ok := entry.prefixFunc(typ.TypeName())
 			if !ok {
 				continue
 			}
 			if entry.validator != nil {
-				err := entry.validator(it.Type, strings.TrimPrefix(it.Type.TypeName(), typeName))
+				err := entry.validator(typ, strings.TrimPrefix(typ.TypeName(), typeName))
 				if err != nil {
-					i.logger.Debugf("type %q error: %v", it.Type.TypeName(), err)
+					i.logger.Debugf("type %q error: %v", typ.TypeName(), err)
 					continue
 				}
 			}
-			err := entry.populateFunc(it.Type, typeName)
+			err := entry.populateFunc(typ, typeName)
 			if err != nil {
 				return fmt.Errorf("handling type by prefix %q: %w", typeName, err)
 			}
diff --git a/pkg/operators/ebpf/stats.go b/pkg/operators/ebpf/stats.go
index 8c57d4e4..7c60cb09 100644
--- a/pkg/operators/ebpf/stats.go
+++ b/pkg/operators/ebpf/stats.go
@@ -374,17 +374,14 @@ func getProgramStats(cache map[ebpf.ProgramID]progStat, id ebpf.ProgramID) (prog
 	}
 	defer prog.Close()
 
-	pi, err := prog.Info()
+	programStats, err := prog.Stats()
 	if err != nil {
 		return progStat{}, err
 	}
 
-	runtime, _ := pi.Runtime()
-	runcount, _ := pi.RunCount()
-
 	stat := progStat{
-		runtime:  uint64(runtime),
-		runcount: runcount,
+		runtime:  uint64(programStats.Runtime),
+		runcount: programStats.RunCount,
 	}
 	cache[id] = stat
 
@@ -495,6 +492,9 @@ func (i *ebpfOperatorDataInstance) getStats() ([]stat, error) {
 			prog.Close()
 			continue
 		}
+		programStats, _ := prog.Stats()
+		// If stats are not available (e.g. Linux < 5.8), still retrieve what
+		// we can
 
 		stat := stat{}
 
@@ -502,9 +502,8 @@ func (i *ebpfOperatorDataInstance) getStats() ([]stat, error) {
 		stat.programID = uint32(id)
 		stat.programName = pi.Name
 		stat.programType = pi.Type.String()
-		runtime, _ := pi.Runtime()
-		stat.runtime = uint64(runtime)
-		stat.runcount, _ = pi.RunCount()
+		stat.runtime = uint64(programStats.Runtime)
+		stat.runcount = programStats.RunCount
 
 		i.oldProgStats[curID] = progStat{
 			runtime:  stat.runtime,
-- 
2.43.0


From ea81d9a745bac68bf631ebf83c6961028d560fdf Mon Sep 17 00:00:00 2001
From: Burak Ok <burakok@microsoft.com>
Date: Thu, 27 Aug 2026 19:52:23 +0200
Subject: [PATCH 2/2] inspektor-gadget: complete cilium/ebpf v0.22.0 migration

Avoid shadowing the programStats type and adapt VariableSpec inspection to its public fields.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 05823411-83af-42c4-9d78-38161b9c88db
---
 pkg/gadgets/top/ebpf/tracer/tracer.go | 6 +++---
 pkg/operators/ebpf/extrainfo.go       | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/pkg/gadgets/top/ebpf/tracer/tracer.go b/pkg/gadgets/top/ebpf/tracer/tracer.go
index 516e02a5..129dd1a8 100644
--- a/pkg/gadgets/top/ebpf/tracer/tracer.go
+++ b/pkg/gadgets/top/ebpf/tracer/tracer.go
@@ -168,13 +168,13 @@ func (t *Tracer) nextStats() ([]*types.Stats, error) {
 			}
 		}
 
-		programStats, err := prog.Stats()
+		progStats, err := prog.Stats()
 		if err != nil {
 			prog.Close()
 			continue
 		}
-		totalRuntime := programStats.Runtime
-		totalRunCount := programStats.RunCount
+		totalRuntime := progStats.Runtime
+		totalRunCount := progStats.RunCount
 
 		curRuntime := int64(0)
 		curRunCount := uint64(0)
diff --git a/pkg/operators/ebpf/extrainfo.go b/pkg/operators/ebpf/extrainfo.go
index 571797a1..d7116d0a 100644
--- a/pkg/operators/ebpf/extrainfo.go
+++ b/pkg/operators/ebpf/extrainfo.go
@@ -89,9 +89,9 @@ func (i *ebpfInstance) addExtraInfo(gadgetCtx operators.GadgetContext) error {
 	for name, v := range i.collectionSpec.Variables {
 		variables = append(variables, &extraInfoVariable{
 			Name:   name,
-			Offset: v.Offset(),
-			Size:   v.Size(),
-			Map:    v.MapName(),
+			Offset: uint64(v.Offset),
+			Size:   uint64(v.Size()),
+			Map:    v.SectionName,
 		})
 	}
 	variablesJson, _ := json.Marshal(variables)
-- 
2.43.0

