projects
/
lttng-modules.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: handle concurrent flush vs get_next_subbuf on metadata cache
[lttng-modules.git]
/
lttng-events.c
diff --git
a/lttng-events.c
b/lttng-events.c
index 0512a3f3ddfda66a72cf468f8f8c4730e2e4d4a1..98992f9f7943047f967233edffb4083df39585b8 100644
(file)
--- a/
lttng-events.c
+++ b/
lttng-events.c
@@
-597,16
+597,20
@@
int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
/*
* Ensure we support mutiple get_next / put sequences followed
/*
* Ensure we support mutiple get_next / put sequences followed
- * by put_next.
+ * by put_next. The metadata stream lock internally protects
+ * reading the metadata cache. It can indeed be read
+ * concurrently by "get_next_subbuf" and "flush" operations on
+ * the buffer invoked by different processes.
*/
*/
+ mutex_lock(&stream->lock);
WARN_ON(stream->metadata_in < stream->metadata_out);
if (stream->metadata_in != stream->metadata_out)
WARN_ON(stream->metadata_in < stream->metadata_out);
if (stream->metadata_in != stream->metadata_out)
-
return 0
;
+
goto end
;
len = stream->metadata_cache->metadata_written -
stream->metadata_in;
if (!len)
len = stream->metadata_cache->metadata_written -
stream->metadata_in;
if (!len)
-
return 0
;
+
goto end
;
reserve_len = min_t(size_t,
stream->transport->ops.packet_avail_size(chan),
len);
reserve_len = min_t(size_t,
stream->transport->ops.packet_avail_size(chan),
len);
@@
-628,6
+632,7
@@
int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
ret = reserve_len;
end:
ret = reserve_len;
end:
+ mutex_unlock(&stream->lock);
return ret;
}
return ret;
}
This page took
0.023449 seconds
and
4
git commands to generate.