X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=libtracing%2Frelay.c;h=16f5322e1b7b7f42c7268c3374782ce7e3ea6926;hb=1ae7f0744f280e97ab1a2adc548b8fd9f2cb21a4;hp=d78fa72a7ae2ac248cc07e309ba1c48236fcfbc2;hpb=c1dea0b3d1312d0e3747da93eb949145c487eeba;p=lttng-ust.git diff --git a/libtracing/relay.c b/libtracing/relay.c index d78fa72a..16f5322e 100644 --- a/libtracing/relay.c +++ b/libtracing/relay.c @@ -22,8 +22,10 @@ //ust// #include //ust// #include //ust// #include -#include #include "kernelcompat.h" +#include +#include +#include #include "list.h" #include "relay.h" #include "channels.h" @@ -93,21 +95,45 @@ static int relay_alloc_buf(struct rchan_buf *buf, size_t *size) unsigned int n_pages; struct buf_page *buf_page, *n; - void *result; + void *ptr; + int result; + int shmid; *size = PAGE_ALIGN(*size); - /* Maybe do read-ahead */ - result = mmap(NULL, *size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if(result == MAP_FAILED) { - PERROR("mmap"); + result = shmid = shmget(getpid(), *size, IPC_CREAT | IPC_EXCL | 0700); + if(shmid == -1) { + PERROR("shmget"); return -1; } - buf->buf_data = result; + ptr = shmat(shmid, NULL, 0); + if(ptr == (void *) -1) { + perror("shmat"); + goto destroy_shmem; + } + + /* Already mark the shared memory for destruction. This will occur only + * when all users have detached. + */ + result = shmctl(shmid, IPC_RMID, NULL); + if(result == -1) { + perror("shmctl"); + return -1; + } + + buf->buf_data = ptr; buf->buf_size = *size; return 0; + + destroy_shmem: + result = shmctl(shmid, IPC_RMID, NULL); + if(result == -1) { + perror("shmctl"); + } + + return -1; } /** @@ -181,7 +207,7 @@ static void relay_destroy_buf(struct rchan_buf *buf) static void relay_remove_buf(struct kref *kref) { struct rchan_buf *buf = container_of(kref, struct rchan_buf, kref); - buf->chan->cb->remove_buf_file(buf); +//ust// buf->chan->cb->remove_buf_file(buf); relay_destroy_buf(buf); } @@ -748,37 +774,6 @@ void *ltt_relay_offset_address(struct rchan_buf *buf, size_t offset) #define printk_dbg(fmt, args...) #endif -/* LTTng lockless logging buffer info */ -struct ltt_channel_buf_struct { - /* First 32 bytes cache-hot cacheline */ - local_t offset; /* Current offset in the buffer */ - local_t *commit_count; /* Commit count per sub-buffer */ - atomic_long_t consumed; /* - * Current offset in the buffer - * standard atomic access (shared) - */ - unsigned long last_tsc; /* - * Last timestamp written in the buffer. - */ - /* End of first 32 bytes cacheline */ - atomic_long_t active_readers; /* - * Active readers count - * standard atomic access (shared) - */ - local_t events_lost; - local_t corrupted_subbuffers; - spinlock_t full_lock; /* - * buffer full condition spinlock, only - * for userspace tracing blocking mode - * synchronization with reader. - */ -//ust// wait_queue_head_t write_wait; /* -//ust// * Wait queue for blocking user space -//ust// * writers -//ust// */ - atomic_t wakeup_readers; /* Boolean : wakeup readers waiting ? */ -} ____cacheline_aligned; - /* * Last TSC comparison functions. Check if the current TSC overflows * LTT_TSC_BITS bits from the last TSC read. Reads and writes last_tsc @@ -1041,7 +1036,7 @@ static notrace void ltt_buf_unfull(struct rchan_buf *buf, //ust// return mask; //ust// } -static int ltt_do_get_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, long *pconsumed_old) +int ltt_do_get_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, long *pconsumed_old) { struct ltt_channel_struct *ltt_channel = (struct ltt_channel_struct *)buf->chan->private_data; long consumed_old, consumed_idx, commit_count, write_offset; @@ -1081,7 +1076,7 @@ static int ltt_do_get_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struc return 0; } -static int ltt_do_put_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, u32 uconsumed_old) +int ltt_do_put_subbuf(struct rchan_buf *buf, struct ltt_channel_buf_struct *ltt_buf, u32 uconsumed_old) { long consumed_new, consumed_old; @@ -2375,9 +2370,14 @@ static struct ltt_transport ust_relay_transport = { //ust// return 0; //ust// } -void init_ustrelay_transport(void) +static char initialized = 0; + +void __attribute__((constructor)) init_ustrelay_transport(void) { - ltt_transport_register(&ust_relay_transport); + if(!initialized) { + ltt_transport_register(&ust_relay_transport); + initialized = 1; + } } static void __exit ltt_relay_exit(void)