Merged! Thanks FIN David
On 11-08-12 10:50 AM, Mathieu Desnoyers wrote: > * Julien Desfossez ([email protected]) wrote: >> Only one mmap call per buffer, once the first mmap is done, we use the >> offset to know where to start consuming the data. >> When we receive the FD and its output mode is mmap, we mmap the buffer, >> when it is closing, we munmap it. >> Removed the manual padding handling because the kernel already exposes a >> padded subbuffer. >> Also updated the check of the return code of >> kconsumerd_consumerd_recv_fd to be consistent with the rest of the code, >> we are in error when it's < 0 not <= 0. >> >> Signed-off-by: Julien Desfossez <[email protected]> > > Acked-by: Mathieu Desnoyers <[email protected]> > > Thanks! > > Mathieu > >> --- >> include/lttng-sessiond-comm.h | 1 + >> liblttkconsumerd/lttkconsumerd.c | 69 >> +++++++++++++++++--------------------- >> liblttkconsumerd/lttkconsumerd.h | 3 ++ >> ltt-kconsumerd/ltt-kconsumerd.c | 2 +- >> ltt-sessiond/main.c | 2 + >> 5 files changed, 38 insertions(+), 39 deletions(-) >> >> diff --git a/include/lttng-sessiond-comm.h b/include/lttng-sessiond-comm.h >> index be903a6..f57b0cd 100644 >> --- a/include/lttng-sessiond-comm.h >> +++ b/include/lttng-sessiond-comm.h >> @@ -193,6 +193,7 @@ struct lttcomm_kconsumerd_msg { >> int fd; >> uint32_t state; /* enum lttcomm_kconsumerd_fd_state */ >> unsigned long max_sb_size; /* the subbuffer size for this channel */ >> + enum lttng_event_output output; /* use splice or mmap to consume this >> fd */ >> }; >> >> extern int lttcomm_create_unix_sock(const char *pathname); >> diff --git a/liblttkconsumerd/lttkconsumerd.c >> b/liblttkconsumerd/lttkconsumerd.c >> index d4908d1..29f1f95 100644 >> --- a/liblttkconsumerd/lttkconsumerd.c >> +++ b/liblttkconsumerd/lttkconsumerd.c >> @@ -127,11 +127,18 @@ static int kconsumerd_find_session_fd(int fd) >> */ >> static void kconsumerd_del_fd(struct kconsumerd_fd *lcf) >> { >> + int ret; >> pthread_mutex_lock(&kconsumerd_data.lock); >> cds_list_del(&lcf->list); >> if (kconsumerd_data.fds_count > 0) { >> kconsumerd_data.fds_count--; >> if (lcf != NULL) { >> + if (lcf->mmap_base != NULL) { >> + ret = munmap(lcf->mmap_base, lcf->mmap_len); >> + if (ret != 0) { >> + perror("munmap"); >> + } >> + } >> if (lcf->out_fd != 0) { >> close(lcf->out_fd); >> } >> @@ -168,6 +175,9 @@ static int kconsumerd_add_fd(struct >> lttcomm_kconsumerd_msg *buf, int consumerd_f >> tmp_fd->max_sb_size = buf->max_sb_size; >> tmp_fd->out_fd = 0; >> tmp_fd->out_fd_offset = 0; >> + tmp_fd->mmap_len = 0; >> + tmp_fd->mmap_base = NULL; >> + tmp_fd->output = buf->output; >> strncpy(tmp_fd->path_name, buf->path_name, PATH_MAX); >> tmp_fd->path_name[PATH_MAX - 1] = '\0'; >> >> @@ -185,6 +195,24 @@ static int kconsumerd_add_fd(struct >> lttcomm_kconsumerd_msg *buf, int consumerd_f >> tmp_fd->sessiond_fd, tmp_fd->consumerd_fd, >> tmp_fd->out_fd); >> } >> >> + if (tmp_fd->output == LTTNG_EVENT_MMAP) { >> + /* get the len of the mmap region */ >> + ret = kernctl_get_mmap_len(tmp_fd->consumerd_fd, >> &tmp_fd->mmap_len); >> + if (ret != 0) { >> + ret = errno; >> + perror("kernctl_get_mmap_len"); >> + goto end; >> + } >> + >> + tmp_fd->mmap_base = mmap(NULL, tmp_fd->mmap_len, >> + PROT_READ, MAP_PRIVATE, tmp_fd->consumerd_fd, >> 0); >> + if (tmp_fd->mmap_base == MAP_FAILED) { >> + perror("Error mmaping"); >> + ret = -1; >> + goto end; >> + } >> + } >> + >> cds_list_add(&tmp_fd->list, &kconsumerd_data.fd_list.head); >> kconsumerd_data.fds_count++; >> kconsumerd_data.need_update = 1; >> @@ -259,33 +287,13 @@ static int kconsumerd_update_poll_array(struct >> kconsumerd_local_data *ctx, >> int kconsumerd_on_read_subbuffer_mmap(struct kconsumerd_local_data *ctx, >> struct kconsumerd_fd *kconsumerd_fd, unsigned long len) >> { >> - unsigned long mmap_len, mmap_offset, padded_len, padding_len; >> - char *mmap_base; >> + unsigned long mmap_offset; >> char *padding = NULL; >> long ret = 0; >> off_t orig_offset = kconsumerd_fd->out_fd_offset; >> int fd = kconsumerd_fd->consumerd_fd; >> int outfd = kconsumerd_fd->out_fd; >> >> - /* get the padded subbuffer size to know the padding required */ >> - ret = kernctl_get_padded_subbuf_size(fd, &padded_len); >> - if (ret != 0) { >> - ret = errno; >> - perror("kernctl_get_padded_subbuf_size"); >> - goto end; >> - } >> - padding_len = padded_len - len; >> - padding = malloc(padding_len * sizeof(char)); >> - memset(padding, '\0', padding_len); >> - >> - /* get the len of the mmap region */ >> - ret = kernctl_get_mmap_len(fd, &mmap_len); >> - if (ret != 0) { >> - ret = errno; >> - perror("kernctl_get_mmap_len"); >> - goto end; >> - } >> - >> /* get the offset inside the fd to mmap */ >> ret = kernctl_get_mmap_read_offset(fd, &mmap_offset); >> if (ret != 0) { >> @@ -294,15 +302,8 @@ int kconsumerd_on_read_subbuffer_mmap(struct >> kconsumerd_local_data *ctx, >> goto end; >> } >> >> - mmap_base = mmap(NULL, mmap_len, PROT_READ, MAP_PRIVATE, fd, >> mmap_offset); >> - if (mmap_base == MAP_FAILED) { >> - perror("Error mmaping"); >> - ret = -1; >> - goto end; >> - } >> - >> while (len > 0) { >> - ret = write(outfd, mmap_base, len); >> + ret = write(outfd, kconsumerd_fd->mmap_base + mmap_offset, len); >> if (ret >= len) { >> len = 0; >> } else if (ret < 0) { >> @@ -316,14 +317,6 @@ int kconsumerd_on_read_subbuffer_mmap(struct >> kconsumerd_local_data *ctx, >> kconsumerd_fd->out_fd_offset += ret; >> } >> >> - /* once all the data is written, write the padding to disk */ >> - ret = write(outfd, padding, padding_len); >> - if (ret < 0) { >> - ret = errno; >> - perror("Error writing padding to file"); >> - goto end; >> - } >> - >> /* >> * This does a blocking write-and-wait on any page that belongs to the >> * subbuffer prior to the one we just wrote. >> @@ -914,7 +907,7 @@ void *kconsumerd_thread_receive_fds(void *data) >> /* we received a command to add or update fds */ >> ret = kconsumerd_consumerd_recv_fd(ctx, sock, >> kconsumerd_sockpoll, >> tmp.payload_size, tmp.cmd_type); >> - if (ret <= 0) { >> + if (ret < 0) { >> ERR("Receiving the FD, exiting"); >> goto end; >> } >> diff --git a/liblttkconsumerd/lttkconsumerd.h >> b/liblttkconsumerd/lttkconsumerd.h >> index 10e4a55..1dd85d5 100644 >> --- a/liblttkconsumerd/lttkconsumerd.h >> +++ b/liblttkconsumerd/lttkconsumerd.h >> @@ -55,6 +55,9 @@ struct kconsumerd_fd { >> char path_name[PATH_MAX]; /* tracefile name */ >> enum kconsumerd_fd_state state; >> unsigned long max_sb_size; /* the subbuffer size for this channel */ >> + void *mmap_base; >> + size_t mmap_len; >> + enum lttng_event_output output; /* splice or mmap */ >> }; >> >> struct kconsumerd_local_data { >> diff --git a/ltt-kconsumerd/ltt-kconsumerd.c >> b/ltt-kconsumerd/ltt-kconsumerd.c >> index 64c5ccf..ceaee71 100644 >> --- a/ltt-kconsumerd/ltt-kconsumerd.c >> +++ b/ltt-kconsumerd/ltt-kconsumerd.c >> @@ -237,7 +237,7 @@ static int read_subbuffer(struct kconsumerd_fd >> *kconsumerd_fd) >> break; >> case LTTNG_EVENT_MMAP: >> /* read the used subbuffer size */ >> - err = kernctl_get_subbuf_size(infd, &len); >> + err = kernctl_get_padded_subbuf_size(infd, &len); >> if (err != 0) { >> ret = errno; >> perror("Getting sub-buffer len failed."); >> diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c >> index b1dbc8f..746cdd0 100644 >> --- a/ltt-sessiond/main.c >> +++ b/ltt-sessiond/main.c >> @@ -288,6 +288,7 @@ static int send_kconsumerd_channel_fds(int sock, struct >> ltt_kernel_channel *chan >> lkm.fd = stream->fd; >> lkm.state = stream->state; >> lkm.max_sb_size = channel->channel->attr.subbuf_size; >> + lkm.output = DEFAULT_KERNEL_CHANNEL_OUTPUT; >> strncpy(lkm.path_name, stream->pathname, PATH_MAX); >> lkm.path_name[PATH_MAX - 1] = '\0'; >> >> @@ -338,6 +339,7 @@ static int send_kconsumerd_fds(int sock, struct >> ltt_kernel_session *session) >> lkm.fd = session->metadata_stream_fd; >> lkm.state = ACTIVE_FD; >> lkm.max_sb_size = session->metadata->conf->attr.subbuf_size; >> + lkm.output = DEFAULT_KERNEL_CHANNEL_OUTPUT; >> strncpy(lkm.path_name, session->metadata->pathname, PATH_MAX); >> lkm.path_name[PATH_MAX - 1] = '\0'; >> >> -- >> 1.7.4.1 >> > _______________________________________________ ltt-dev mailing list [email protected] http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
