

Mathieu Desnoyers

March 2006

Here is a simpler, but slower, version of user space tracing design.

It will be useful on architectures where doing a system call is mandatory, for
example when CPUs are lacking a 64 bits TSC : it must be worked around by doing
a system call to the the time or the synthetic MSB of the TSC (yes, disabling
preemption is at least required).


So the design is simple :

Two system calls :

One system call for event logging


ltt_trace_generic
args :
fac_id
event_id
data pointer
data size

ltt_register_generic
args:
struct pointer (in)
fac_id pointer (out)

#define NAME_MAX 4096

struct :
char name[NAME_MAX]
u32 num_events
u32 checksum
u32 alignment
u32 int_size
u32 long_size
u32 pointer_size
u32 size_t_size


If a facility is registered twice, the same handle is used.
	For a facility to be the exact same, it must share _every_ element of the
	struct (even type sizes).
Potential problem : If a facility is registered, it is never unregistered.

Now.. not being able to free facilities when they are not used is not fun. So
how can we know every process that has registered a facility have finished using
it ? If we know that, we might do a cleanup when _all_ the traces are destroyed:
this is way better than a reboot.

A solution might be to keep a reference count to the fac_id : it would be
incremented upon registration and decremented when a process exits. To do that,
a process must keep an array of fac ids it uses. 0 is unset.

CONFIG option :

CONFIG_LTT_USERSPACE_GENERIC






