X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libust%2Ftracer.h;h=ed237e34dd89b0d10de53f9817bc74f08b16dd00;hb=8161463975e218e0833d31ab1577a7ceb9e8e9f3;hp=e4ff21e4044da00aa9e347a1eea0d9cab2ba41e3;hpb=b73a4c471dc987ea8548632dffb3c7050de77dd0;p=ust.git diff --git a/libust/tracer.h b/libust/tracer.h index e4ff21e..ed237e3 100644 --- a/libust/tracer.h +++ b/libust/tracer.h @@ -26,12 +26,13 @@ #include #include -#include +#include +#include +#include #include "channels.h" #include "tracercore.h" #include "tracerconst.h" -#include -#include +#include "buffers.h" /* Number of bytes to log with a read/write event */ #define LTT_LOG_RW_SIZE 32L @@ -47,9 +48,9 @@ #define LTT_ARCH_VARIANT LTT_ARCH_VARIANT_NONE #endif -struct ltt_active_marker; +struct ltt_active_ust_marker; -/* Maximum number of callbacks per marker */ +/* Maximum number of callbacks per ust_marker */ #define LTT_NR_CALLBACKS 10 struct ltt_serialize_closure; @@ -64,7 +65,8 @@ struct ltt_serialize_closure { extern size_t ltt_serialize_data(struct ust_buffer *buf, size_t buf_offset, struct ltt_serialize_closure *closure, void *serialize_private, - int *largest_align, const char *fmt, va_list *args); + unsigned int stack_pos_ctx, int *largest_align, + const char *fmt, va_list *args); struct ltt_probe_private_data { struct ust_trace *trace; /* @@ -85,38 +87,44 @@ enum ltt_channels { LTT_CHANNEL_UST, }; -struct ltt_active_marker { - struct list_head node; /* active markers list */ +struct chan_info_struct { + const char *name; + unsigned int def_subbufsize; + unsigned int def_subbufcount; +}; + +struct ltt_active_ust_marker { + struct cds_list_head node; /* active markers list */ const char *channel; const char *name; const char *format; struct ltt_available_probe *probe; }; -struct marker; //ust// -extern void ltt_vtrace(const struct marker *mdata, void *probe_data, - struct registers *regs, void *call_data, const char *fmt, va_list *args); -extern void ltt_trace(const struct marker *mdata, void *probe_data, - struct registers *regs, void *call_data, const char *fmt, ...); +struct ust_marker; //ust// +extern void ltt_vtrace(const struct ust_marker *mdata, void *probe_data, + void *call_data, const char *fmt, va_list *args); +extern void ltt_trace(const struct ust_marker *mdata, void *probe_data, + void *call_data, const char *fmt, ...); /* * Unique ID assigned to each registered probe. */ -enum marker_id { - MARKER_ID_SET_MARKER_ID = 0, /* Static IDs available (range 0-7) */ - MARKER_ID_SET_MARKER_FORMAT, - MARKER_ID_COMPACT, /* Compact IDs (range: 8-127) */ - MARKER_ID_DYNAMIC, /* Dynamic IDs (range: 128-65535) */ +enum ust_marker_id { + UST_MARKER_ID_SET_MARKER_ID = 0, /* Static IDs available (range 0-7) */ + UST_MARKER_ID_SET_MARKER_FORMAT, + UST_MARKER_ID_COMPACT, /* Compact IDs (range: 8-127) */ + UST_MARKER_ID_DYNAMIC, /* Dynamic IDs (range: 128-65535) */ }; /* static ids 0-1 reserved for internal use. */ -#define MARKER_CORE_IDS 2 -static __inline__ enum marker_id marker_id_type(uint16_t id) +#define UST_MARKER_CORE_IDS 2 +static __inline__ enum ust_marker_id ust_marker_id_type(uint16_t id) { - if (id < MARKER_CORE_IDS) - return (enum marker_id)id; + if (id < UST_MARKER_CORE_IDS) + return (enum ust_marker_id)id; else - return MARKER_ID_DYNAMIC; + return UST_MARKER_ID_DYNAMIC; } struct user_dbg_data { @@ -150,7 +158,7 @@ struct ltt_trace_ops { struct ltt_transport { char *name; struct module *owner; - struct list_head node; + struct cds_list_head node; struct ltt_trace_ops ops; }; @@ -162,7 +170,7 @@ enum trace_mode { LTT_TRACE_NORMAL, LTT_TRACE_FLIGHT, LTT_TRACE_HYBRID }; /* Per-trace information - each trace/flight recorder represented by one */ struct ust_trace { /* First 32 bytes cache-hot cacheline */ - struct list_head list; + struct cds_list_head list; struct ltt_trace_ops *ops; int active; /* Second 32 bytes cache-hot cacheline */ @@ -177,9 +185,9 @@ struct ust_trace { struct { struct dentry *trace_root; } dentry; - struct kref kref; /* Each channel has a kref of the trace struct */ + struct urcu_ref urcu_ref; /* Each channel has a urcu_ref of the trace struct */ struct ltt_transport *transport; - struct kref ltt_transport_kref; + struct urcu_ref ltt_transport_urcu_ref; char trace_name[NAME_MAX]; } ____cacheline_aligned; @@ -213,8 +221,8 @@ struct ltt_subbuffer_header { * used all along the trace. */ uint32_t freq_scale; /* Frequency scaling (divisor) */ - uint32_t lost_size; /* Size unused at end of subbuffer */ - uint32_t buf_size; /* Size of this subbuffer */ + uint32_t data_size; /* Size of data in subbuffer */ + uint32_t sb_size; /* Subbuffer size (including padding) */ uint32_t events_lost; /* * Events lost in this subbuffer since * the beginning of the trace. @@ -240,8 +248,7 @@ static __inline__ size_t ltt_subbuffer_header_size(void) return offsetof(struct ltt_subbuffer_header, header_end); } -extern size_t ltt_write_event_header_slow(struct ust_trace *trace, - struct ust_channel *channel, +extern size_t ltt_write_event_header_slow(struct ust_channel *channel, struct ust_buffer *buf, long buf_offset, u16 eID, u32 event_size, u64 tsc, unsigned int rflags); @@ -263,8 +270,7 @@ extern size_t ltt_write_event_header_slow(struct ust_trace *trace, * * returns : offset where the event data must be written. */ -static __inline__ size_t ltt_write_event_header(struct ust_trace *trace, - struct ust_channel *channel, +static __inline__ size_t ltt_write_event_header(struct ust_channel *chan, struct ust_buffer *buf, long buf_offset, u16 eID, u32 event_size, u64 tsc, unsigned int rflags) @@ -275,11 +281,14 @@ static __inline__ size_t ltt_write_event_header(struct ust_trace *trace, goto slow_path; header.id_time = eID << LTT_TSC_BITS; + header.id_time |= (u32)tsc & LTT_TSC_MASK; + ust_buffers_write(buf, buf_offset, &header, sizeof(header)); + buf_offset += sizeof(header); return buf_offset; slow_path: - return ltt_write_event_header_slow(trace, channel, buf, buf_offset, + return ltt_write_event_header_slow(chan, buf, buf_offset, eID, event_size, tsc, rflags); } @@ -313,7 +322,7 @@ slow_path: #define LTT_DEFAULT_N_SUBBUFS_HIGH 2 #define LTT_TRACER_MAGIC_NUMBER 0x00D6B7ED #define LTT_TRACER_VERSION_MAJOR 2 -#define LTT_TRACER_VERSION_MINOR 3 +#define LTT_TRACER_VERSION_MINOR 6 /** * ust_write_trace_header - Write trace header @@ -334,6 +343,36 @@ static __inline__ void ltt_write_trace_header(struct ust_trace *trace, header->freq_scale = trace->freq_scale; } +#ifndef UST_VALGRIND + +static __inline__ int ust_get_cpu(void) +{ + int cpu; + + cpu = sched_getcpu(); + if (likely(cpu >= 0)) + return cpu; + /* + * If getcpu(2) is not implemented in the Kernel use CPU 0 as fallback. + */ + return 0; +} + +#else /* #else #ifndef UST_VALGRIND */ + +static __inline__ int ust_get_cpu(void) +{ + /* + * Valgrind does not support the sched_getcpu() vsyscall. + * It causes it to detect a segfault in the program and stop it. + * So if we want to check libust with valgrind, we have to refrain + * from using this call. TODO: it would probably be better to return + * other values too, to better test it. + */ + return 0; +} + +#endif /* #else #ifndef UST_VALGRIND */ /* * Size reserved for high priority events (interrupts, NMI, BH) at the end of a @@ -381,7 +420,7 @@ extern int ltt_trace_set_channel_enable(const char *trace_name, extern int ltt_trace_set_channel_overwrite(const char *trace_name, const char *channel_name, unsigned int overwrite); extern int ltt_trace_alloc(const char *trace_name); -extern int ltt_trace_destroy(const char *trace_name); +extern int ltt_trace_destroy(const char *trace_name, int drop); extern int ltt_trace_start(const char *trace_name); extern int ltt_trace_stop(const char *trace_name); @@ -403,10 +442,10 @@ extern void ltt_core_register(int (*function)(u8, void *)); extern void ltt_core_unregister(void); -extern void ltt_release_trace(struct kref *kref); -extern void ltt_release_transport(struct kref *kref); +extern void ltt_release_trace(struct urcu_ref *urcu_ref); +extern void ltt_release_transport(struct urcu_ref *urcu_ref); -extern void ltt_dump_marker_state(struct ust_trace *trace); +extern void ltt_dump_ust_marker_state(struct ust_trace *trace); extern void ltt_lock_traces(void); extern void ltt_unlock_traces(void);