@@ -939,21 +939,48 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
939939
940940 loadProgName , loadProgRetName := config .GenericKprobeObjs (false )
941941 isSecurityFunc := strings .HasPrefix (kprobeEntry .funcName , "security_" )
942+ useFentry := ! kprobeEntry .hasOverride && config .EnableV61Progs ()
942943
943944 pinProg := kprobeEntry .funcName
944945 if kprobeEntry .instance != 0 {
945946 pinProg = fmt .Sprintf ("%s:%d" , kprobeEntry .funcName , kprobeEntry .instance )
946947 }
947948
948- load := program .Builder (
949- path .Join (option .Config .HubbleLib , loadProgName ),
950- kprobeEntry .funcName ,
951- "kprobe/generic_kprobe" ,
952- pinProg ,
953- "generic_kprobe" ).
954- SetLoaderData (kprobeEntry .tableId ).
955- SetPolicy (kprobeEntry .policyName )
949+ var load * program.Program
950+
951+ if useFentry {
952+ data := & program.TracingAttachData {
953+ AttachTo : kprobeEntry .funcName ,
954+ }
955+
956+ loadProgName , loadProgRetName = config .GenericTracingObjs ()
957+
958+ load = program .Builder (
959+ path .Join (option .Config .HubbleLib , loadProgName ),
960+ kprobeEntry .funcName ,
961+ "fentry/generic_fentry" ,
962+ pinProg ,
963+ "generic_kprobe" ).
964+ SetAttachData (data )
965+
966+ tailCalls := program .MapBuilderProgram ("fentry_calls" , load )
967+ maps = append (maps , tailCalls )
968+ } else {
969+ load = program .Builder (
970+ path .Join (option .Config .HubbleLib , loadProgName ),
971+ kprobeEntry .funcName ,
972+ "kprobe/generic_kprobe" ,
973+ pinProg ,
974+ "generic_kprobe" )
975+
976+ tailCalls := program .MapBuilderProgram ("kprobe_calls" , load )
977+ maps = append (maps , tailCalls )
978+ }
979+
980+ load .SetPolicy (kprobeEntry .policyName )
981+ load .SetLoaderData (kprobeEntry .tableId )
956982 load .Override = kprobeEntry .hasOverride
983+
957984 if load .Override {
958985 load .OverrideFmodRet = isSecurityFunc && bpf .HasModifyReturn ()
959986 }
@@ -968,9 +995,6 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
968995 configMap := program .MapBuilderProgram ("config_map" , load )
969996 maps = append (maps , configMap )
970997
971- tailCalls := program .MapBuilderProgram ("kprobe_calls" , load )
972- maps = append (maps , tailCalls )
973-
974998 filterMap := program .MapBuilderProgram ("filter_map" , load )
975999 maps = append (maps , filterMap )
9761000
@@ -1041,15 +1065,42 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
10411065 if kprobeEntry .instance != 0 {
10421066 pinRetProg = sensors .PathJoin (fmt .Sprintf ("%s_return:%d" , kprobeEntry .funcName , kprobeEntry .instance ))
10431067 }
1044- loadret := program .Builder (
1045- path .Join (option .Config .HubbleLib , loadProgRetName ),
1046- kprobeEntry .funcName ,
1047- "kprobe/generic_retkprobe" ,
1048- pinRetProg ,
1049- "generic_kprobe" ).
1050- SetRetProbe (true ).
1051- SetLoaderData (kprobeEntry .tableId ).
1052- SetPolicy (kprobeEntry .policyName )
1068+
1069+ var loadret * program.Program
1070+
1071+ if useFentry {
1072+ data := & program.TracingAttachData {
1073+ AttachTo : kprobeEntry .funcName ,
1074+ }
1075+
1076+ loadProgName , loadProgRetName = config .GenericTracingObjs ()
1077+
1078+ loadret = program .Builder (
1079+ path .Join (option .Config .HubbleLib , loadProgRetName ),
1080+ kprobeEntry .funcName ,
1081+ "fexit/generic_fexit" ,
1082+ pinRetProg ,
1083+ "generic_kprobe" ).
1084+ SetAttachData (data )
1085+
1086+ tailCalls := program .MapBuilderProgram ("fexit_calls" , loadret )
1087+ maps = append (maps , tailCalls )
1088+ } else {
1089+ loadret = program .Builder (
1090+ path .Join (option .Config .HubbleLib , loadProgRetName ),
1091+ kprobeEntry .funcName ,
1092+ "kprobe/generic_retkprobe" ,
1093+ pinRetProg ,
1094+ "generic_kprobe" )
1095+
1096+ tailCalls := program .MapBuilderProgram ("retkprobe_calls" , loadret )
1097+ maps = append (maps , tailCalls )
1098+ }
1099+
1100+ loadret .SetRetProbe (true )
1101+ loadret .SetLoaderData (kprobeEntry .tableId )
1102+ loadret .SetPolicy (kprobeEntry .policyName )
1103+
10531104 progs = append (progs , loadret )
10541105
10551106 retProbe := program .MapBuilderSensor ("retprobe_map" , loadret )
@@ -1058,9 +1109,6 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
10581109 retConfigMap := program .MapBuilderProgram ("config_map" , loadret )
10591110 maps = append (maps , retConfigMap )
10601111
1061- tailCalls := program .MapBuilderProgram ("retkprobe_calls" , loadret )
1062- maps = append (maps , tailCalls )
1063-
10641112 filterMap := program .MapBuilderProgram ("filter_map" , loadret )
10651113 maps = append (maps , filterMap )
10661114
@@ -1134,10 +1182,14 @@ func loadSingleKprobeSensor(id idtable.EntryID, bpfDir string, load *program.Pro
11341182 }
11351183 load .MapLoad = append (load .MapLoad , config )
11361184
1137- if err := program .LoadKprobeProgram (bpfDir , load , maps , verbose ); err == nil {
1138- logger .GetLogger ().Info (fmt .Sprintf ("Loaded generic kprobe program: %s -> %s" , load .Name , load .Attach ))
1185+ if load .Label == "fentry/generic_fentry" || load .Label == "fexit/generic_fexit" {
1186+ if err = program .LoadTracingProgram (bpfDir , load , maps , verbose ); err == nil {
1187+ logger .GetLogger ().Info (fmt .Sprintf ("Loaded generic fentry program: %s -> %s" , load .Name , load .Attach ))
1188+ }
11391189 } else {
1140- return err
1190+ if err = program .LoadKprobeProgram (bpfDir , load , maps , verbose ); err == nil {
1191+ logger .GetLogger ().Info (fmt .Sprintf ("Loaded generic kprobe program: %s -> %s" , load .Name , load .Attach ))
1192+ }
11411193 }
11421194
11431195 return err
0 commit comments