//ust// #include <linux/kref.h>
//ust// #include <linux/mm.h>
//ust// #include <linux/ltt-core.h>
-#include "kref.h"
-#include "list.h"
+#include <assert.h>
+#include <kcompat/kref.h>
+//#include "list.h"
#include "channels.h"
+#include "buffer.h"
/* Needs a _much_ better name... */
#define FIX_SIZE(x) ((((x) - 1) & PAGE_MASK) + PAGE_SIZE)
}
//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:
//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;
}
* 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,
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);
+
+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);
-int ltt_do_put_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, u32 uconsumed_old);
+/*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 */