hi all: I found there seems no declaring about "struct ftrace_entry". below the greping result of my kernel source code: # grep -rwn 'struct ftrace_entry' * kernel/trace/trace.h:214: IF_ASSIGN(var, ent, struct ftrace_entry, TRACE_FN); \ kernel/trace/trace_events.c:1483: struct ftrace_entry *entry; kernel/trace/trace_output.c:818: struct ftrace_entry *field; kernel/trace/trace_output.c:845: struct ftrace_entry *field; kernel/trace/trace_output.c:859: struct ftrace_entry *field; kernel/trace/trace_output.c:872: struct ftrace_entry *field; kernel/trace/trace.c:1098: struct ftrace_entry *entry; # usually we use a struct we will declare its elements such as: struct usb_host_endpoint { struct usb_endpoint_descriptor desc; struct list_head urb_list; void *hcpriv; ...................... }; I guess the secret should be "if_assign", but how does compiler interpret it? -- Regards, miloody
I found there seems no declaring about "struct ftrace_entry".
usually we use a struct we will declare its elements such as:
struct usb_host_endpoint { struct usb_endpoint_descriptor desc; struct list_head urb_list; void *hcpriv; ...................... };
There is not an "explicit" declaration but if you look at kernel/trace/trace.h you will find this macro: #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ struct struct_name { \ struct trace_entry ent; \ tstruct \ }
I guess the secret should be "if_assign", but how does compiler interpret it?
--
Actually in kernel/trace/trace_entries.h the macro is used to declare the ftrace_entry FTRACE_ENTRY(function, ftrace_entry, TRACE_FN, F_STRUCT( __field( unsigned long, ip ) __field( unsigned long, parent_ip ) ), F_printk(" %lx <-- %lx", __entry->ip, __entry->parent_ip) ); Also in this header other structures are declared in the same way for example ftrace_graph_ent_entry and and ftrace_graph_ret_entry. If you search for "struct ftrace_graph_ret_entry" declaration you won't find anything either. Best regards, -- ----------------------------------------- Javier Martínez Canillas (+34) 682 39 81 69 PhD Student in High Performance Computing Computer Architecture and Operating System Department (CAOS) Universitat Autònoma de Barcelona Barcelona, Spain
Hi Miloody
I found there seems no declaring about "struct ftrace_entry". below the greping result of my kernel source code:
# grep -rwn 'struct ftrace_entry' * kernel/trace/trace.h:214: IF_ASSIGN(var, ent, struct ftrace_entry, TRACE_FN); \ kernel/trace/trace_events.c:1483: struct ftrace_entry *entry; kernel/trace/trace_output.c:818: struct ftrace_entry *field; kernel/trace/trace_output.c:845: struct ftrace_entry *field; kernel/trace/trace_output.c:859: struct ftrace_entry *field; kernel/trace/trace_output.c:872: struct ftrace_entry *field; kernel/trace/trace.c:1098: struct ftrace_entry *entry;
usually we use a struct we will declare its elements such as:
struct usb_host_endpoint { struct usb_endpoint_descriptor desc; struct list_head urb_list; void *hcpriv; ...................... };
I think this struct is not explicitly declared but generated by a macro. Look in kernel/trace/trace_entries.h The code that uses struct ftrace_entry all seems to #include this file either directly or indirectly: Directly by kernel/trace/trace_export.c and kernel/trace/trace.h Then kernel/trace/trace.c includes trace.h kernel/trace/trace_output.h includes trace.h kernel/trace/trace_output.c and kernel/trace/trace_events.c include trace_output.h I don't know why there is an advantage to creating a struct this way (perhaps a performance/storage advantage?) but then I haven't looked at the code in a lot of detail. Cheers Julie
participants (3)
-
Javier Martinez Canillas -
julie Sullivan -
loody