[ltt-dev] Usage of relayfs specific operations in generic code

Mathieu Desnoyers compudj at krystal.dyndns.org
Sat Nov 21 12:16:38 EST 2009


* Mathieu Desnoyers (compudj at krystal.dyndns.org) wrote:
> * Viktor Rosendahl (viktor.rosendahl at nokia.com) wrote:
> > Hello,
> >
> 
> Hi Viktor,
> 
> > I was trying to implement support for a Nokia specific HW transport when  
> > I came across this lovely snippet of code in ltt-serialize.c:
> >
> > 		/* FIXME : could probably encapsulate transport better. */
> > 		buf = ((struct rchan *)channel->trans_channel_data)->buf[cpu];
> > 		/* Out-of-order write : header and data */
> > 		buf_offset = ltt_write_event_header(trace,
> > 					channel, buf, buf_offset,
> > 					eID, data_size, tsc, rflags);
> > 		ltt_write_event_data(buf, buf_offset, &closure,
> > 					serialize_private,
> > 					largest_align, fmt, &args_copy);
> >
> >
> > It could be mentioned that both ltt_write_event_header() and  
> > ltt_write_event_data() both uses relayfs specific functions. Also, I  
> > think that the rchan struct is more or less specific to relayfs.
> 
> LTTng has stopped using relayfs a long time ago. We have all the
> locking, allocation and vfs interface code within the ltt/ directory.
> Note that I refer to the term "transport" as a combination of:
> 
> - locking scheme
> - allocation scheme
> - interface (e.g. vfs)
> 
> >
> > To me this seems like the generic LTTng code is using relayfs specific  
> > operations to write an event header and the data.
> >
> > Now I wonder, what is the proper way of tackling this problem?
> 
> A bit of history here:
> 
> In the past, LTTng transports could be chosen by specifying a callback
> that would be called for space reservation and commit. This is however
> too slow, as it adds unnecessary function calls to the tracing hot path.
> 
> Currently, the way this is done is by allowing to select the LTTng
> locking scheme at build time (e.g. lockless, irqoff, spinlock+irqoff).
> Recently, I dropped all schemes except lockless, because it was faster
> to do lots of code changes in just one scheme.
> 
> Eventually, the goal is to permit to compile various kernel modules for
> the different transports (and select any of these at runtime), _but_ not
> require extra function calls. This will lead to duplication of some
> objects, which will be compiled in more than one module with slightly
> different parameters, but given we typically only use one transport at a
> time, this should not be a problem.
> 
> So what I propose is that you work on the latest LTTng tree, changing
> ltt-relay-alloc to suit your needs, possibly copying this file and doing
> your work in a different C file, that could be chosen to replace
> ltt-relay-alloc with the proper CONFIG option. If you need some extra
> hooks to be called by ltt-relay-lockless.c to, for example, flush the
> data out when a subbuffer is filled, then we can work on that together.
> 
> This first step would allow you to choose your own transport at build
> time (the standard transport would not be available anymore). Then, when
> we do the integration, we can work together to ensure that we allow
> kernel modules for both transports to be compiled and we allow to select
> between those at runtime.

BTW, you will also need to copy include/linux/ltt-relay.h and specialize
it for your needs.

How it currently works:

* synchronization

ltt/ltt-relay-lockless.c
ltt/ltt-relay-lockless.h

* allocation

ltt/ltt-relay-alloc.c
include/linux/ltt-relay.h

In the larger scheme of things, we will eventually have to move
include/linux/ltt-relay.h to ltt/ so it can be used for one specific
type of transport.

Mathieu

> 
> How does that sound ?
> 
> Mathieu
> 
> 
> >
> > Should I add a couple of transport specific operations to the  
> > ltt_trace_ops struct and try to move the relayfs specific functionality  
> > into ltt-relay.c and ltt-relay-locked.c ?
> >
> > Are there any other places where transport relayfs code is used in those  
> > parts of LTTng that one would expect to be generic ?
> >
> > Any other hints ?
> >
> > BTW, I am currently using lttng-0.88 on a 2.6.28 based kernel.However, I  
> > checked that the same problem is still present in the very latest LTTng  
> > in the git repository.
> >
> > Also, I saw that the problem was introduced in  
> > patch-2.6.27-rc7-lttng-0.27.tar.gz, which was released in October 2008.  
> > In other words, this issue has been present in the LTTng code base for  
> > about a year, if I am not mistaken.
> >
> > best regards,
> >
> > Viktor
> >
> > _______________________________________________
> > ltt-dev mailing list
> > ltt-dev at lists.casi.polymtl.ca
> > http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
> >
> 
> -- 
> Mathieu Desnoyers
> OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
> 
> _______________________________________________
> ltt-dev mailing list
> ltt-dev at lists.casi.polymtl.ca
> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
> 

-- 
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68




More information about the lttng-dev mailing list