projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: add missing rcu lock for UST lookup
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
trace-ust.c
diff --git
a/src/bin/lttng-sessiond/trace-ust.c
b/src/bin/lttng-sessiond/trace-ust.c
index 1fda555ea0e987bdcc11565b43ffea84b1d85765..e07d27e678b93c718ff3dee1378706b3382a3692 100644
(file)
--- a/
src/bin/lttng-sessiond/trace-ust.c
+++ b/
src/bin/lttng-sessiond/trace-ust.c
@@
-116,7
+116,8
@@
no_match:
}
/*
}
/*
- * Find the channel in the hashtable.
+ * Find the channel in the hashtable and return channel pointer. RCU read side
+ * lock MUST be acquired before calling this.
*/
struct ltt_ust_channel *trace_ust_find_channel_by_name(struct lttng_ht *ht,
char *name)
*/
struct ltt_ust_channel *trace_ust_find_channel_by_name(struct lttng_ht *ht,
char *name)
@@
-124,14
+125,11
@@
struct ltt_ust_channel *trace_ust_find_channel_by_name(struct lttng_ht *ht,
struct lttng_ht_node_str *node;
struct lttng_ht_iter iter;
struct lttng_ht_node_str *node;
struct lttng_ht_iter iter;
- rcu_read_lock();
lttng_ht_lookup(ht, (void *)name, &iter);
node = lttng_ht_iter_get_node_str(&iter);
if (node == NULL) {
lttng_ht_lookup(ht, (void *)name, &iter);
node = lttng_ht_iter_get_node_str(&iter);
if (node == NULL) {
- rcu_read_unlock();
goto error;
}
goto error;
}
- rcu_read_unlock();
DBG2("Trace UST channel %s found by name", name);
DBG2("Trace UST channel %s found by name", name);
@@
-143,7
+141,8
@@
error:
}
/*
}
/*
- * Find the event in the hashtable.
+ * Find the event in the hashtable and return event pointer. RCU read side lock
+ * MUST be acquired before calling this.
*/
struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht,
char *name, struct lttng_filter_bytecode *filter, int loglevel)
*/
struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht,
char *name, struct lttng_filter_bytecode *filter, int loglevel)
@@
-181,9
+180,8
@@
error:
* Return pointer to structure or NULL.
*/
struct ltt_ust_session *trace_ust_create_session(char *path,
* Return pointer to structure or NULL.
*/
struct ltt_ust_session *trace_ust_create_session(char *path,
- unsigned int session_id
, struct lttng_domain *domain
)
+ unsigned int session_id)
{
{
- int ret;
struct ltt_ust_session *lus;
/* Allocate a new ltt ust session */
struct ltt_ust_session *lus;
/* Allocate a new ltt ust session */
@@
-219,6
+217,8
@@
struct ltt_ust_session *trace_ust_create_session(char *path,
/* Use the default consumer output which is the tracing session path. */
if (path && strlen(path) > 0) {
/* Use the default consumer output which is the tracing session path. */
if (path && strlen(path) > 0) {
+ int ret;
+
ret = snprintf(lus->consumer->dst.trace_path, PATH_MAX,
"%s" DEFAULT_UST_TRACE_DIR, path);
if (ret < 0) {
ret = snprintf(lus->consumer->dst.trace_path, PATH_MAX,
"%s" DEFAULT_UST_TRACE_DIR, path);
if (ret < 0) {
@@
-261,6
+261,9
@@
struct ltt_ust_channel *trace_ust_create_channel(struct lttng_channel *chan,
int ret;
struct ltt_ust_channel *luc;
int ret;
struct ltt_ust_channel *luc;
+ assert(chan);
+ assert(path);
+
luc = zmalloc(sizeof(struct ltt_ust_channel));
if (luc == NULL) {
PERROR("ltt_ust_channel zmalloc");
luc = zmalloc(sizeof(struct ltt_ust_channel));
if (luc == NULL) {
PERROR("ltt_ust_channel zmalloc");
@@
-321,6
+324,8
@@
struct ltt_ust_event *trace_ust_create_event(struct lttng_event *ev,
{
struct ltt_ust_event *lue;
{
struct ltt_ust_event *lue;
+ assert(ev);
+
lue = zmalloc(sizeof(struct ltt_ust_event));
if (lue == NULL) {
PERROR("ust event zmalloc");
lue = zmalloc(sizeof(struct ltt_ust_event));
if (lue == NULL) {
PERROR("ust event zmalloc");
@@
-395,6
+400,8
@@
struct ltt_ust_metadata *trace_ust_create_metadata(char *path)
int ret;
struct ltt_ust_metadata *lum;
int ret;
struct ltt_ust_metadata *lum;
+ assert(path);
+
lum = zmalloc(sizeof(struct ltt_ust_metadata));
if (lum == NULL) {
PERROR("ust metadata zmalloc");
lum = zmalloc(sizeof(struct ltt_ust_metadata));
if (lum == NULL) {
PERROR("ust metadata zmalloc");
@@
-436,6
+443,8
@@
struct ltt_ust_context *trace_ust_create_context(
struct ltt_ust_context *uctx;
enum lttng_ust_context_type utype;
struct ltt_ust_context *uctx;
enum lttng_ust_context_type utype;
+ assert(ctx);
+
switch (ctx->ctx) {
case LTTNG_EVENT_CONTEXT_VTID:
utype = LTTNG_UST_CONTEXT_VTID;
switch (ctx->ctx) {
case LTTNG_EVENT_CONTEXT_VTID:
utype = LTTNG_UST_CONTEXT_VTID;
@@
-491,6
+500,8
@@
static void destroy_contexts(struct lttng_ht *ht)
struct lttng_ht_node_ulong *node;
struct lttng_ht_iter iter;
struct lttng_ht_node_ulong *node;
struct lttng_ht_iter iter;
+ assert(ht);
+
cds_lfht_for_each_entry(ht->ht, &iter.iter, node, node) {
ret = lttng_ht_del(ht, &iter);
if (!ret) {
cds_lfht_for_each_entry(ht->ht, &iter.iter, node, node) {
ret = lttng_ht_del(ht, &iter);
if (!ret) {
@@
-506,6
+517,8
@@
static void destroy_contexts(struct lttng_ht *ht)
*/
void trace_ust_destroy_event(struct ltt_ust_event *event)
{
*/
void trace_ust_destroy_event(struct ltt_ust_event *event)
{
+ assert(event);
+
DBG2("Trace destroy UST event %s", event->attr.name);
free(event->filter);
free(event);
DBG2("Trace destroy UST event %s", event->attr.name);
free(event->filter);
free(event);
@@
-533,6
+546,8
@@
static void destroy_events(struct lttng_ht *events)
struct lttng_ht_node_str *node;
struct lttng_ht_iter iter;
struct lttng_ht_node_str *node;
struct lttng_ht_iter iter;
+ assert(events);
+
cds_lfht_for_each_entry(events->ht, &iter.iter, node, node) {
ret = lttng_ht_del(events, &iter);
assert(!ret);
cds_lfht_for_each_entry(events->ht, &iter.iter, node, node) {
ret = lttng_ht_del(events, &iter);
assert(!ret);
@@
-547,6
+562,8
@@
static void destroy_events(struct lttng_ht *events)
*/
void trace_ust_destroy_channel(struct ltt_ust_channel *channel)
{
*/
void trace_ust_destroy_channel(struct ltt_ust_channel *channel)
{
+ assert(channel);
+
DBG2("Trace destroy UST channel %s", channel->name);
rcu_read_lock();
DBG2("Trace destroy UST channel %s", channel->name);
rcu_read_lock();
@@
-579,6
+596,8
@@
static void destroy_channel_rcu(struct rcu_head *head)
*/
void trace_ust_destroy_metadata(struct ltt_ust_metadata *metadata)
{
*/
void trace_ust_destroy_metadata(struct ltt_ust_metadata *metadata)
{
+ assert(metadata);
+
if (!metadata->handle) {
return;
}
if (!metadata->handle) {
return;
}
@@
-595,6
+614,8
@@
static void destroy_channels(struct lttng_ht *channels)
struct lttng_ht_node_str *node;
struct lttng_ht_iter iter;
struct lttng_ht_node_str *node;
struct lttng_ht_iter iter;
+ assert(channels);
+
rcu_read_lock();
cds_lfht_for_each_entry(channels->ht, &iter.iter, node, node) {
rcu_read_lock();
cds_lfht_for_each_entry(channels->ht, &iter.iter, node, node) {
@@
-617,6
+638,8
@@
static void destroy_domain_pid(struct lttng_ht *ht)
struct lttng_ht_iter iter;
struct ltt_ust_domain_pid *dpid;
struct lttng_ht_iter iter;
struct ltt_ust_domain_pid *dpid;
+ assert(ht);
+
cds_lfht_for_each_entry(ht->ht, &iter.iter, dpid, node.node) {
ret = lttng_ht_del(ht , &iter);
assert(!ret);
cds_lfht_for_each_entry(ht->ht, &iter.iter, dpid, node.node) {
ret = lttng_ht_del(ht , &iter);
assert(!ret);
@@
-635,6
+658,8
@@
static void destroy_domain_exec(struct lttng_ht *ht)
struct lttng_ht_iter iter;
struct ltt_ust_domain_exec *dexec;
struct lttng_ht_iter iter;
struct ltt_ust_domain_exec *dexec;
+ assert(ht);
+
cds_lfht_for_each_entry(ht->ht, &iter.iter, dexec, node.node) {
ret = lttng_ht_del(ht , &iter);
assert(!ret);
cds_lfht_for_each_entry(ht->ht, &iter.iter, dexec, node.node) {
ret = lttng_ht_del(ht , &iter);
assert(!ret);
@@
-649,6
+674,8
@@
static void destroy_domain_exec(struct lttng_ht *ht)
*/
static void destroy_domain_global(struct ltt_ust_domain_global *dom)
{
*/
static void destroy_domain_global(struct ltt_ust_domain_global *dom)
{
+ assert(dom);
+
destroy_channels(dom->channels);
}
destroy_channels(dom->channels);
}
@@
-657,10
+684,7
@@
static void destroy_domain_global(struct ltt_ust_domain_global *dom)
*/
void trace_ust_destroy_session(struct ltt_ust_session *session)
{
*/
void trace_ust_destroy_session(struct ltt_ust_session *session)
{
- /* Extra protection */
- if (session == NULL) {
- return;
- }
+ assert(session);
rcu_read_lock();
rcu_read_lock();
This page took
0.026466 seconds
and
4
git commands to generate.