X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libust%2Frelay.h;h=0e1827912b4870472088ed51f07d32d4e9fe42e6;hb=a2dc02e0e0a685b8814b68a2f07ce73c08e0ef50;hp=4b27b5bc8a7a476e5ded96c5ff7c84cbbe4287b0;hpb=b4512257eb71d0432554047acf6278dc42a15a75;p=ust.git diff --git a/libust/relay.h b/libust/relay.h index 4b27b5b..0e18279 100644 --- a/libust/relay.h +++ b/libust/relay.h @@ -21,8 +21,11 @@ //ust// #include //ust// #include //ust// #include -#include "kref.h" -#include "list.h" +#include +#include +//#include "list.h" +#include "channels.h" +#include "buffer.h" /* Needs a _much_ better name... */ #define FIX_SIZE(x) ((((x) - 1) & PAGE_MASK) + PAGE_SIZE) @@ -210,18 +213,26 @@ static inline struct buf_page *ltt_relay_cache_page(struct rchan_buf *buf, } //ust// #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS - static inline void ltt_relay_do_copy(void *dest, const void *src, size_t len) +static inline void ltt_relay_do_copy(void *dest, const void *src, size_t len) { + union { + const void *src; + const u8 *src8; + const u16 *src16; + const u32 *src32; + const u64 *src64; + } u = { .src = src }; + switch (len) { case 0: break; - case 1: *(u8 *)dest = *(const u8 *)src; + case 1: *(u8 *)dest = *u.src8; break; - case 2: *(u16 *)dest = *(const u16 *)src; + case 2: *(u16 *)dest = *u.src16; break; - case 4: *(u32 *)dest = *(const u32 *)src; + case 4: *(u32 *)dest = *u.src32; break; //ust// #if (BITS_PER_LONG == 64) - case 8: *(u64 *)dest = *(const u64 *)src; + case 8: *(u64 *)dest = *u.src64; break; //ust// #endif default: @@ -289,13 +300,16 @@ static inline int ltt_relay_write(struct rchan_buf *buf, size_t offset, //ust// _ltt_relay_write(buf, offset, src, len, page, pagecpy); //ust// return len; - size_t cpy; - cpy = min_t(size_t, len, buf->buf_size - offset); - ltt_relay_do_copy(buf->buf_data + offset, src, cpy); + size_t buf_offset = BUFFER_OFFSET(offset, buf->chan); + + assert(buf_offset < buf->chan->subbuf_size*buf->chan->n_subbufs); + + cpy = min_t(size_t, len, buf->buf_size - buf_offset); + ltt_relay_do_copy(buf->buf_data + buf_offset, src, cpy); if (unlikely(len != cpy)) - _ltt_relay_write(buf, offset, src, len, cpy); + _ltt_relay_write(buf, buf_offset, src, len, cpy); return len; } @@ -303,7 +317,7 @@ static inline int ltt_relay_write(struct rchan_buf *buf, size_t offset, * CONFIG_LTT_RELAY kernel API, ltt/ltt-relay-alloc.c */ -struct rchan *ltt_relay_open(const char *base_filename, +extern struct rchan *ltt_relay_open(const char *base_filename, struct dentry *parent, size_t subbuf_size, size_t n_subbufs, @@ -320,7 +334,7 @@ extern const struct file_operations ltt_relay_file_operations; struct ltt_channel_buf_struct { /* First 32 bytes cache-hot cacheline */ local_t offset; /* Current offset in the buffer */ -//ust// local_t *commit_count; /* Commit count per sub-buffer */ + local_t *commit_count; /* Commit count per sub-buffer */ atomic_long_t consumed; /* * Current offset in the buffer * standard atomic access (shared) @@ -329,6 +343,9 @@ struct ltt_channel_buf_struct { * Last timestamp written in the buffer. */ /* End of first 32 bytes cacheline */ +//ust// #ifdef CONFIG_LTT_VMCORE +//ust// local_t *commit_seq; /* Consecutive commits */ +//ust// #endif atomic_long_t active_readers; /* * Active readers count * standard atomic access (shared) @@ -355,13 +372,18 @@ struct ltt_channel_buf_struct { int data_ready_fd_read; /* commit count per subbuffer; must be at end of struct */ - local_t commit_count[0] ____cacheline_aligned; + local_t commit_seq[0] ____cacheline_aligned; } ____cacheline_aligned; -int ltt_do_get_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, long *pconsumed_old); +extern int ltt_do_get_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, long *pconsumed_old); -int ltt_do_put_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, u32 uconsumed_old); +extern int ltt_do_put_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, u32 uconsumed_old); +extern void init_ustrelay_transport(void); -#endif /* _LINUX_LTT_RELAY_H */ +/*static*/ /* inline */ notrace void ltt_commit_slot( + struct ltt_channel_struct *ltt_channel, + void **transport_data, long buf_offset, + size_t data_size, size_t slot_size); +#endif /* _LINUX_LTT_RELAY_H */