Преглед изворни кода

Fixed #TASK_QT-9810 [arm适配/4.18适配]tail修正

Carl пре 1 година
родитељ
комит
122ce1504c

+ 2 - 0
ebpftracer/ebpf/config.h

@@ -59,6 +59,8 @@ enum {
 
 
 enum {
 enum {
 	PROG_DATA_SAVE_UP_IDX,
 	PROG_DATA_SAVE_UP_IDX,
+	PROG_DATA_JAVA_UPDATE_HEADER_UP_IDX,
+	PROG_DATA_GO_UPDATE_HEADER_UP_IDX,
 	PROG_UP_NUM
 	PROG_UP_NUM
 };
 };
 
 

+ 6 - 5
ebpftracer/ebpf/utrace/go/net/client.probe.bpf.c

@@ -396,7 +396,7 @@ static __always_inline long cw_inject_header2(void* headers_ptr, struct apm_span
 }
 }
 
 
 // 00:00:1015481350055581:5450531005555981:5610250100539899:304775019cd3218a304775019cd3218a:1001025098564810:140acc88cde8773f
 // 00:00:1015481350055581:5450531005555981:5610250100539899:304775019cd3218a304775019cd3218a:1001025098564810:140acc88cde8773f
-static __always_inline long cw_inject_header3(void* headers_ptr, char * header_str,struct ebpf_proc_info* proc_info) {
+static __always_inline long cw_inject_header_half(void* headers_ptr, char * header_str,struct ebpf_proc_info* proc_info) {
     // Read the key-value count - this field must be the first one in the hmap struct as documented in src/runtime/map.go
     // Read the key-value count - this field must be the first one in the hmap struct as documented in src/runtime/map.go
     u64 curr_keyvalue_count = 0;
     u64 curr_keyvalue_count = 0;
     long res = bpf_probe_read_user(&curr_keyvalue_count, sizeof(curr_keyvalue_count), headers_ptr);
     long res = bpf_probe_read_user(&curr_keyvalue_count, sizeof(curr_keyvalue_count), headers_ptr);
@@ -665,13 +665,15 @@ int uprobe_Transport_roundTrip(struct pt_regs *ctx) {
 	char val[CW_HEADER_VAL_LENGTH];
 	char val[CW_HEADER_VAL_LENGTH];
 	span_context_to_cw_string(&httpReq->apm_sc, val);
 	span_context_to_cw_string(&httpReq->apm_sc, val);
 
 
-	long res2 = cw_inject_header3(headers_ptr, val,proc_info);
+	long res2 = cw_inject_header_half(headers_ptr, val,proc_info);
 	if (res2 < 0) {
 	if (res2 < 0) {
 		cw_bpf_debug("uprobe_Transport_roundTrip: Failed to inject header");
 		cw_bpf_debug("uprobe_Transport_roundTrip: Failed to inject header");
 		return -1;
 		return -1;
 	}
 	}
 
 
-	bpf_tail_call(ctx, &jmp_table2, 0);
+	bpf_tail_call(ctx, &NAME(progs_jmp_up_map), PROG_DATA_GO_UPDATE_HEADER_UP_IDX);
+
+//	bpf_tail_call(ctx, &jmp_table2, 0);
 
 
     // Write event
     // Write event
 //    bpf_map_update_elem(&http_events, &key, httpReq, 0);
 //    bpf_map_update_elem(&http_events, &key, httpReq, 0);
@@ -680,9 +682,8 @@ int uprobe_Transport_roundTrip(struct pt_regs *ctx) {
     return 0;
     return 0;
 }
 }
 
 
+// bpf_prog_up__go_update_header
 PROGUP(go_update_header)(struct pt_regs *ctx) {
 PROGUP(go_update_header)(struct pt_regs *ctx) {
-//	return 1;
-
 	__u64 pid_tgid = bpf_get_current_pid_tgid();
 	__u64 pid_tgid = bpf_get_current_pid_tgid();
 	__u32 tgid = pid_tgid >> 32;
 	__u32 tgid = pid_tgid >> 32;
 	struct ebpf_proc_info *proc_info =
 	struct ebpf_proc_info *proc_info =

+ 3 - 2
ebpftracer/ebpf/utrace/java/net/client.probe.bpf.c

@@ -419,13 +419,14 @@ int uprobe_Java_java_net_SocketOutputStream_socketWrite0(struct pt_regs *ctx) {
 
 
 	// 多批
 	// 多批
 	if (end_str_len > copy_size) {
 	if (end_str_len > copy_size) {
-		bpf_tail_call(ctx, &jmp_table1, 1);
+//		bpf_tail_call(ctx, &jmp_table1, 1);
+		bpf_tail_call(ctx, &NAME(progs_jmp_up_map), PROG_DATA_JAVA_UPDATE_HEADER_UP_IDX);
 	}
 	}
 
 
 	return 0;
 	return 0;
 }
 }
 
 
-
+// bpf_prog_up_update_header
 PROGUP(update_header)(struct pt_regs *ctx) {
 PROGUP(update_header)(struct pt_regs *ctx) {
 	u32 k0 = 0;
 	u32 k0 = 0;
 	u32 copy_size = L7_IOVEC_BUF_SIZE;
 	u32 copy_size = L7_IOVEC_BUF_SIZE;

+ 3 - 1
ebpftracer/ebpf/utrace/java/net/server.probe.bpf.c

@@ -36,6 +36,7 @@ struct {
 	 __uint(max_entries, 2);
 	 __uint(max_entries, 2);
  } jmp_table1 SEC(".maps");
  } jmp_table1 SEC(".maps");
 
 
+// bpf_prog_up__save_sc
 PROGUP(save_sc)(struct pt_regs *ctx) {
 PROGUP(save_sc)(struct pt_regs *ctx) {
 	cw_bpf_debug("tail call save_sc\n");
 	cw_bpf_debug("tail call save_sc\n");
 	u32 key = 0;
 	u32 key = 0;
@@ -211,6 +212,7 @@ int uprobe_ret_Java_sun_nio_ch_FileDispatcherImpl_read0(struct pt_regs *ctx) {
 	map_data->header_offset_idx = offset;
 	map_data->header_offset_idx = offset;
 
 
 
 
-	bpf_tail_call(ctx, &jmp_table1, 0);
+//	bpf_tail_call(ctx, &jmp_table1, 0);
+	bpf_tail_call(ctx, &NAME(progs_jmp_up_map), PROG_DATA_SAVE_UP_IDX);
 	return 0;
 	return 0;
 }
 }

+ 11 - 7
ebpftracer/tracer/common.go

@@ -27,13 +27,15 @@ const (
 	MAP_PROGS_JMP_UP_NAME = "__progs_jmp_up_map"
 	MAP_PROGS_JMP_UP_NAME = "__progs_jmp_up_map"
 
 
 	// This prog is designed to handle data transfer
 	// This prog is designed to handle data transfer
-	PROG_DATA_SUBMIT_NAME_FOR_KP = "bpf_prog_kp__data_submit"
-	PROG_DATA_SUBMIT_NAME_FOR_TP = "bpf_prog_tp__data_submit"
-	PROG_OUTPUT_DATA_NAME_FOR_KP = "bpf_prog_kp__output_data"
-	PROG_OUTPUT_DATA_NAME_FOR_TP = "bpf_prog_tp__output_data"
-	PROG_IO_EVENT_NAME_FOR_TP    = "bpf_prog_tp__io_event"
-	PROG_SAVE_SC_DATA_FOR_TP     = "bpf_prog_tp__save_sc"
-	MAP_PROC_INFO_MAP_NAME       = "proc_info_map"
+	PROG_DATA_SUBMIT_NAME_FOR_KP   = "bpf_prog_kp__data_submit"
+	PROG_DATA_SUBMIT_NAME_FOR_TP   = "bpf_prog_tp__data_submit"
+	PROG_OUTPUT_DATA_NAME_FOR_KP   = "bpf_prog_kp__output_data"
+	PROG_OUTPUT_DATA_NAME_FOR_TP   = "bpf_prog_tp__output_data"
+	PROG_IO_EVENT_NAME_FOR_TP      = "bpf_prog_tp__io_event"
+	MAP_PROC_INFO_MAP_NAME         = "proc_info_map"
+	PROG_SAVE_SC_DATA_FOR_UP       = "bpf_prog_tp__save_sc"
+	PROG_JAVA_UPDATE_HEADER_FOR_UP = "bpf_prog_up__update_header"
+	PROG_GO_UPDATE_HEADER_FOR_UP   = "bpf_prog_up__go_update_header"
 )
 )
 
 
 const (
 const (
@@ -51,6 +53,8 @@ const (
 
 
 const (
 const (
 	PROG_DATA_SAVE_UP_IDX = iota
 	PROG_DATA_SAVE_UP_IDX = iota
+	PROG_DATA_JAVA_UPDATE_HEADER_UP_IDX
+	PROG_DATA_GO_UPDATE_HEADER_UP_IDX
 	PROG_UPROBE_NUM
 	PROG_UPROBE_NUM
 )
 )
 
 

+ 3 - 3
ebpftracer/tracer/socket.go

@@ -63,9 +63,9 @@ func insert_output_prog_to_map(collection *ebpf.Collection) {
 	__insert_output_prog_to_map(collection, MAP_PROGS_JMP_KP_NAME, PROG_DATA_SUBMIT_NAME_FOR_KP, PROG_DATA_SUBMIT_KP_IDX)
 	__insert_output_prog_to_map(collection, MAP_PROGS_JMP_KP_NAME, PROG_DATA_SUBMIT_NAME_FOR_KP, PROG_DATA_SUBMIT_KP_IDX)
 	__insert_output_prog_to_map(collection, MAP_PROGS_JMP_KP_NAME, PROG_OUTPUT_DATA_NAME_FOR_KP, PROG_OUTPUT_DATA_KP_IDX)
 	__insert_output_prog_to_map(collection, MAP_PROGS_JMP_KP_NAME, PROG_OUTPUT_DATA_NAME_FOR_KP, PROG_OUTPUT_DATA_KP_IDX)
 
 
-	__insert_output_prog_to_map(collection, "jmp_table1", "bpf_prog_up__save_sc", 0)
-	__insert_output_prog_to_map(collection, "jmp_table1", "bpf_prog_up__update_header", 1)
-	__insert_output_prog_to_map(collection, "jmp_table2", "bpf_prog_up__go_update_header", 0)
+	__insert_output_prog_to_map(collection, MAP_PROGS_JMP_UP_NAME, PROG_SAVE_SC_DATA_FOR_UP, PROG_DATA_SAVE_UP_IDX)
+	__insert_output_prog_to_map(collection, MAP_PROGS_JMP_UP_NAME, PROG_JAVA_UPDATE_HEADER_FOR_UP, PROG_DATA_JAVA_UPDATE_HEADER_UP_IDX)
+	__insert_output_prog_to_map(collection, MAP_PROGS_JMP_UP_NAME, PROG_GO_UPDATE_HEADER_FOR_UP, PROG_DATA_GO_UPDATE_HEADER_UP_IDX)
 }
 }
 
 
 func __insert_output_prog_to_map(collection *ebpf.Collection, mapName string, progName string, key uint32) {
 func __insert_output_prog_to_map(collection *ebpf.Collection, mapName string, progName string, key uint32) {