X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=bf9f8b623288eb2e7eb58652bb5f26493ecf399e;hb=d0ae4ea864f84fa2456563abb20fe42e5cc29625;hp=4bb418949d3ea330b60397ed2352f5541c7fcbdc;hpb=ccf10263bcd2ca4667b9e1fc4dab64a3c8d8c4d8;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index 4bb418949..bf9f8b623 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -209,19 +209,7 @@ int kernel_create_event(struct lttng_event *ev, goto free_event; } - /* - * LTTNG_KERNEL_SYSCALL event creation will return 0 on success. - */ - if (ret == 0 && event->event->instrumentation == LTTNG_KERNEL_SYSCALL) { - DBG2("Kernel event syscall creation success"); - /* - * We use fd == -1 to ensure that we never trigger a close of fd - * 0. - */ - event->fd = -1; - goto add_list; - } - + event->type = ev->type; event->fd = ret; /* Prevent fd duplication after execlp() */ ret = fcntl(event->fd, F_SETFD, FD_CLOEXEC); @@ -229,7 +217,6 @@ int kernel_create_event(struct lttng_event *ev, PERROR("fcntl session fd"); } -add_list: /* Add event to event list */ cds_list_add(&event->list, &channel->events_list.head); channel->event_count++; @@ -355,17 +342,6 @@ error: return ret; } -int kernel_enable_syscall(const char *syscall_name, - struct ltt_kernel_channel *channel) -{ - return kernctl_enable_syscall(channel->fd, syscall_name); -} - -int kernel_disable_syscall(const char *syscall_name, - struct ltt_kernel_channel *channel) -{ - return kernctl_disable_syscall(channel->fd, syscall_name); -} int kernel_track_pid(struct ltt_kernel_session *session, int pid) { @@ -381,6 +357,77 @@ int kernel_untrack_pid(struct ltt_kernel_session *session, int pid) return kernctl_untrack_pid(session->fd, pid); } +ssize_t kernel_list_tracker_pids(struct ltt_kernel_session *session, + int **_pids) +{ + int fd, ret; + int pid; + ssize_t nbmem, count = 0; + FILE *fp; + int *pids; + + fd = kernctl_list_tracker_pids(session->fd); + if (fd < 0) { + PERROR("kernel tracker pids list"); + goto error; + } + + fp = fdopen(fd, "r"); + if (fp == NULL) { + PERROR("kernel tracker pids list fdopen"); + goto error_fp; + } + + nbmem = KERNEL_TRACKER_PIDS_INIT_LIST_SIZE; + pids = zmalloc(sizeof(*pids) * nbmem); + if (pids == NULL) { + PERROR("alloc list pids"); + count = -ENOMEM; + goto end; + } + + while (fscanf(fp, "process { pid = %u; };\n", &pid) == 1) { + if (count >= nbmem) { + int *new_pids; + size_t new_nbmem; + + new_nbmem = nbmem << 1; + DBG("Reallocating pids list from %zu to %zu entries", + nbmem, new_nbmem); + new_pids = realloc(pids, new_nbmem * sizeof(*new_pids)); + if (new_pids == NULL) { + PERROR("realloc list events"); + free(pids); + count = -ENOMEM; + goto end; + } + /* Zero the new memory */ + memset(new_pids + nbmem, 0, + (new_nbmem - nbmem) * sizeof(*new_pids)); + nbmem = new_nbmem; + pids = new_pids; + } + pids[count++] = pid; + } + + *_pids = pids; + DBG("Kernel list tracker pids done (%zd pids)", count); +end: + ret = fclose(fp); /* closes both fp and fd */ + if (ret) { + PERROR("fclose"); + } + return count; + +error_fp: + ret = close(fd); + if (ret) { + PERROR("close"); + } +error: + return -1; +} + /* * Create kernel metadata, open from the kernel tracer and add it to the * kernel session.