Fix: Mutex and RCU lock nesting in consumer
authorDavid Goulet <dgoulet@efficios.com>
Mon, 22 Oct 2012 21:16:38 +0000 (17:16 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Mon, 22 Oct 2012 21:16:38 +0000 (17:16 -0400)
Signed-off-by: David Goulet <dgoulet@efficios.com>
src/common/consumer.c

index 132e3ec6891f925006b8b43910b2a24b3e22f468..295e7be5dab1b533143e4ce2fa6a5be16ddb1c5d 100644 (file)
@@ -1266,11 +1266,11 @@ ssize_t lttng_consumer_on_read_subbuffer_mmap(
        lttng_consumer_sync_trace_file(stream, orig_offset);
 
 end:
        lttng_consumer_sync_trace_file(stream, orig_offset);
 
 end:
-       pthread_mutex_unlock(&stream->lock);
        /* Unlock only if ctrl socket used */
        if (relayd && stream->metadata_flag) {
                pthread_mutex_unlock(&relayd->ctrl_sock_mutex);
        }
        /* Unlock only if ctrl socket used */
        if (relayd && stream->metadata_flag) {
                pthread_mutex_unlock(&relayd->ctrl_sock_mutex);
        }
+       pthread_mutex_unlock(&stream->lock);
 
        rcu_read_unlock();
        return written;
 
        rcu_read_unlock();
        return written;
@@ -1451,10 +1451,10 @@ splice_error:
        }
 
 end:
        }
 
 end:
-       pthread_mutex_unlock(&stream->lock);
        if (relayd && stream->metadata_flag) {
                pthread_mutex_unlock(&relayd->ctrl_sock_mutex);
        }
        if (relayd && stream->metadata_flag) {
                pthread_mutex_unlock(&relayd->ctrl_sock_mutex);
        }
+       pthread_mutex_unlock(&stream->lock);
 
        rcu_read_unlock();
        return written;
 
        rcu_read_unlock();
        return written;
@@ -2462,6 +2462,7 @@ int consumer_data_available(uint64_t id)
 
        DBG("Consumer data available command on session id %" PRIu64, id);
 
 
        DBG("Consumer data available command on session id %" PRIu64, id);
 
+       rcu_read_lock();
        pthread_mutex_lock(&consumer_data.lock);
 
        switch (consumer_data.type) {
        pthread_mutex_lock(&consumer_data.lock);
 
        switch (consumer_data.type) {
@@ -2477,8 +2478,6 @@ int consumer_data_available(uint64_t id)
                assert(0);
        }
 
                assert(0);
        }
 
-       rcu_read_lock();
-
        /* Ease our life a bit */
        ht = consumer_data.stream_list_ht;
 
        /* Ease our life a bit */
        ht = consumer_data.stream_list_ht;
 
This page took 0.028127 seconds and 4 git commands to generate.