/*
* Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; only version 2
- * of the License.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2 only,
+ * as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include <inttypes.h>
#include <common/common.h>
#include <common/kernel-ctl/kernel-ctl.h>
+#include <common/sessiond-comm/sessiond-comm.h>
+#include "consumer.h"
#include "kernel.h"
#include "kern-modules.h"
PERROR("fcntl session fd");
}
+ lks->id = session->id;
lks->consumer_fds_sent = 0;
session->kernel_session = lks;
goto error;
}
+ DBG3("Kernel create channel %s in %s with attr: %d, %" PRIu64 ", %" PRIu64 ", %u, %u, %d",
+ chan->name, path, lkc->channel->attr.overwrite,
+ lkc->channel->attr.subbuf_size, lkc->channel->attr.num_subbuf,
+ lkc->channel->attr.switch_timer_interval, lkc->channel->attr.read_timer_interval,
+ lkc->channel->attr.output);
+
/* Kernel tracer channel creation */
ret = kernctl_create_channel(session->fd, &lkc->channel->attr);
if (ret < 0) {
cds_list_add(&lkc->list, &session->channel_list.head);
session->channel_count++;
- DBG("Kernel channel %s created (fd: %d and path: %s)",
- lkc->channel->name, lkc->fd, lkc->pathname);
+ DBG("Kernel channel %s created (fd: %d)", lkc->channel->name, lkc->fd);
return 0;
ret = kernctl_create_event(channel->fd, event->event);
if (ret < 0) {
- if (errno != EEXIST) {
+ switch (errno) {
+ case EEXIST:
+ break;
+ case ENOSYS:
+ WARN("Event type not implemented");
+ break;
+ default:
PERROR("create event ioctl");
}
ret = -errno;
int ret;
ret = kernctl_enable(event->fd);
- if (ret < 0 && errno != EEXIST) {
- PERROR("enable kernel event");
+ if (ret < 0) {
+ switch (errno) {
+ case EEXIST:
+ ret = LTTNG_ERR_KERN_EVENT_EXIST;
+ break;
+ default:
+ PERROR("enable kernel event");
+ break;
+ }
goto error;
}
int ret;
ret = kernctl_disable(event->fd);
- if (ret < 0 && errno != EEXIST) {
- PERROR("disable kernel event");
+ if (ret < 0) {
+ switch (errno) {
+ case EEXIST:
+ ret = LTTNG_ERR_KERN_EVENT_EXIST;
+ break;
+ default:
+ PERROR("disable kernel event");
+ break;
+ }
goto error;
}
* Create kernel metadata, open from the kernel tracer and add it to the
* kernel session.
*/
-int kernel_open_metadata(struct ltt_kernel_session *session, char *path)
+int kernel_open_metadata(struct ltt_kernel_session *session)
{
int ret;
struct ltt_kernel_metadata *lkm;
/* Allocate kernel metadata */
- lkm = trace_kernel_create_metadata(path);
+ lkm = trace_kernel_create_metadata();
if (lkm == NULL) {
goto error;
}
session->metadata = lkm;
- DBG("Kernel metadata opened (fd: %d and path: %s)", lkm->fd, lkm->pathname);
+ DBG("Kernel metadata opened (fd: %d)", lkm->fd);
return 0;
ret = kernctl_buffer_flush(fd);
if (ret < 0) {
- ERR("Fail to flush metadata buffers %d (ret: %d", fd, ret);
+ ERR("Fail to flush metadata buffers %d (ret: %d)", fd, ret);
}
return 0;
*/
int kernel_open_channel_stream(struct ltt_kernel_channel *channel)
{
- int ret;
+ int ret, count = 0;
struct ltt_kernel_stream *lks;
while ((ret = kernctl_create_stream(channel->fd)) >= 0) {
- lks = trace_kernel_create_stream();
+ lks = trace_kernel_create_stream(channel->channel->name, count);
if (lks == NULL) {
ret = close(ret);
if (ret) {
PERROR("fcntl session fd");
}
- ret = asprintf(&lks->pathname, "%s/%s_%d",
- channel->pathname, channel->channel->name, channel->stream_count);
- if (ret < 0) {
- PERROR("asprintf kernel create stream");
- goto error;
- }
-
/* Add stream to channe stream list */
cds_list_add(&lks->list, &channel->stream_list.head);
channel->stream_count++;
- DBG("Kernel stream %d created (fd: %d, state: %d, path: %s)",
- channel->stream_count, lks->fd, lks->state, lks->pathname);
+ /* Increment counter which represent CPU number. */
+ count++;
+
+ DBG("Kernel stream %s created (fd: %d, state: %d)", lks->name, lks->fd,
+ lks->state);
}
return channel->stream_count;
*/
nbmem = KERNEL_EVENT_INIT_LIST_SIZE;
elist = zmalloc(sizeof(struct lttng_event) * nbmem);
+ if (elist == NULL) {
+ PERROR("alloc list events");
+ count = -ENOMEM;
+ goto end;
+ }
while ((size = fscanf(fp, "event { name = %m[^;]; };%n\n", &event, &pos)) == 1) {
if (count >= nbmem) {
+ struct lttng_event *new_elist;
+
DBG("Reallocating event list from %zu to %zu bytes", nbmem,
nbmem * 2);
/* Double the size */
nbmem <<= 1;
- elist = realloc(elist, nbmem * sizeof(struct lttng_event));
- if (elist == NULL) {
+ new_elist = realloc(elist, nbmem * sizeof(struct lttng_event));
+ if (new_elist == NULL) {
PERROR("realloc list events");
+ free(event);
+ free(elist);
count = -ENOMEM;
goto end;
}
+ elist = new_elist;
}
strncpy(elist[count].name, event, LTTNG_SYMBOL_NAME_LEN);
elist[count].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
elist[count].enabled = -1;
count++;
+ free(event);
}
*events = elist;
end_boot_id:
return 0;
}
+
+/*
+ * Complete teardown of a kernel session.
+ */
+void kernel_destroy_session(struct ltt_kernel_session *ksess)
+{
+ if (ksess == NULL) {
+ DBG3("No kernel session when tearing down session");
+ return;
+ }
+
+ DBG("Tearing down kernel session");
+
+ /* Close any relayd session */
+ consumer_output_send_destroy_relayd(ksess->consumer);
+
+ trace_kernel_destroy_session(ksess);
+}