projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: ambiguous ownership of kernel context by multiple channels
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
kernel.c
diff --git
a/src/bin/lttng-sessiond/kernel.c
b/src/bin/lttng-sessiond/kernel.c
index 381b83e6366c120128d9e6a639a081a24c54b684..8dc3f86314d5aab8b94bf623942ec1ee404ad959 100644
(file)
--- a/
src/bin/lttng-sessiond/kernel.c
+++ b/
src/bin/lttng-sessiond/kernel.c
@@
-15,7
+15,6
@@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
#define _LGPL_SOURCE
#include <errno.h>
#include <fcntl.h>
#define _LGPL_SOURCE
#include <errno.h>
#include <fcntl.h>
@@
-38,6
+37,8
@@
/*
* Add context on a kernel channel.
/*
* Add context on a kernel channel.
+ *
+ * Assumes the ownership of ctx.
*/
int kernel_add_channel_context(struct ltt_kernel_channel *chan,
struct ltt_kernel_context *ctx)
*/
int kernel_add_channel_context(struct ltt_kernel_channel *chan,
struct ltt_kernel_context *ctx)
@@
-50,20
+51,29
@@
int kernel_add_channel_context(struct ltt_kernel_channel *chan,
DBG("Adding context to channel %s", chan->channel->name);
ret = kernctl_add_context(chan->fd, &ctx->ctx);
if (ret < 0) {
DBG("Adding context to channel %s", chan->channel->name);
ret = kernctl_add_context(chan->fd, &ctx->ctx);
if (ret < 0) {
- if (errno != EEXIST) {
- PERROR("add context ioctl");
- } else {
+ switch (errno) {
+ case ENOSYS:
+ /* Exists but not available for this kernel */
+ ret = LTTNG_ERR_KERN_CONTEXT_UNAVAILABLE;
+ goto error;
+ case EEXIST:
/* If EEXIST, we just ignore the error */
ret = 0;
/* If EEXIST, we just ignore the error */
ret = 0;
+ goto end;
+ default:
+ PERROR("add context ioctl");
+ ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
+ goto error;
}
}
- goto error;
}
}
+end:
cds_list_add_tail(&ctx->list, &chan->ctx_list);
cds_list_add_tail(&ctx->list, &chan->ctx_list);
-
- return 0;
-
+ ctx = NULL;
error:
error:
+ if (ctx) {
+ trace_kernel_destroy_context(ctx);
+ }
return ret;
}
return ret;
}
@@
-660,17
+670,22
@@
error:
* Open stream of channel, register it to the kernel tracer and add it
* to the stream list of the channel.
*
* Open stream of channel, register it to the kernel tracer and add it
* to the stream list of the channel.
*
+ * Note: given that the streams may appear in random order wrt CPU
+ * number (e.g. cpu hotplug), the index value of the stream number in
+ * the stream name is not necessarily linked to the CPU number.
+ *
* Return the number of created stream. Else, a negative value.
*/
int kernel_open_channel_stream(struct ltt_kernel_channel *channel)
{
* Return the number of created stream. Else, a negative value.
*/
int kernel_open_channel_stream(struct ltt_kernel_channel *channel)
{
- int ret
, count = 0
;
+ int ret;
struct ltt_kernel_stream *lks;
assert(channel);
while ((ret = kernctl_create_stream(channel->fd)) >= 0) {
struct ltt_kernel_stream *lks;
assert(channel);
while ((ret = kernctl_create_stream(channel->fd)) >= 0) {
- lks = trace_kernel_create_stream(channel->channel->name, count);
+ lks = trace_kernel_create_stream(channel->channel->name,
+ channel->stream_count);
if (lks == NULL) {
ret = close(ret);
if (ret) {
if (lks == NULL) {
ret = close(ret);
if (ret) {
@@
-689,13
+704,10
@@
int kernel_open_channel_stream(struct ltt_kernel_channel *channel)
lks->tracefile_size = channel->channel->attr.tracefile_size;
lks->tracefile_count = channel->channel->attr.tracefile_count;
lks->tracefile_size = channel->channel->attr.tracefile_size;
lks->tracefile_count = channel->channel->attr.tracefile_count;
- /* Add stream to channe stream list */
+ /* Add stream to channe
l
stream list */
cds_list_add(&lks->list, &channel->stream_list.head);
channel->stream_count++;
cds_list_add(&lks->list, &channel->stream_list.head);
channel->stream_count++;
- /* Increment counter which represent CPU number. */
- count++;
-
DBG("Kernel stream %s created (fd: %d, state: %d)", lks->name, lks->fd,
lks->state);
}
DBG("Kernel stream %s created (fd: %d, state: %d)", lks->name, lks->fd,
lks->state);
}
@@
-830,7
+842,7
@@
int kernel_validate_version(int tracer_fd)
ret = kernctl_tracer_version(tracer_fd, &version);
if (ret < 0) {
ret = kernctl_tracer_version(tracer_fd, &version);
if (ret < 0) {
- ERR("Failed
at getting
the lttng-modules version");
+ ERR("Failed
to retrieve
the lttng-modules version");
goto error;
}
goto error;
}
@@
-842,11
+854,11
@@
int kernel_validate_version(int tracer_fd)
}
ret = kernctl_tracer_abi_version(tracer_fd, &abi_version);
if (ret < 0) {
}
ret = kernctl_tracer_abi_version(tracer_fd, &abi_version);
if (ret < 0) {
- ERR("Failed
at getting
lttng-modules ABI version");
+ ERR("Failed
to retrieve
lttng-modules ABI version");
goto error;
}
if (abi_version.major != LTTNG_MODULES_ABI_MAJOR_VERSION) {
goto error;
}
if (abi_version.major != LTTNG_MODULES_ABI_MAJOR_VERSION) {
- ERR("Kernel tracer ABI version (%d.%d)
is not compatible with
expected ABI major version (%d.*)",
+ ERR("Kernel tracer ABI version (%d.%d)
does not match the
expected ABI major version (%d.*)",
abi_version.major, abi_version.minor,
LTTNG_MODULES_ABI_MAJOR_VERSION);
goto error;
abi_version.major, abi_version.minor,
LTTNG_MODULES_ABI_MAJOR_VERSION);
goto error;
@@
-860,6
+872,7
@@
error_version:
ret = -1;
error:
ret = -1;
error:
+ ERR("Kernel tracer version check failed; kernel tracing will not be available");
return ret;
}
return ret;
}
This page took
0.025578 seconds
and
4
git commands to generate.