From: Mathieu Desnoyers Date: Thu, 14 Feb 2019 20:47:34 +0000 (-0500) Subject: Cleanup vtid/vpid context caches X-Git-Tag: v2.12.0-rc1~57 X-Git-Url: http://git.lttng.org/?p=lttng-ust.git;a=commitdiff_plain;h=98357ffd0125c23387d42d4b706c56077392326d Cleanup vtid/vpid context caches Signed-off-by: Mathieu Desnoyers --- diff --git a/liblttng-ust/lttng-context-vpid.c b/liblttng-ust/lttng-context-vpid.c index 53fb314b..11978e6e 100644 --- a/liblttng-ust/lttng-context-vpid.c +++ b/liblttng-ust/lttng-context-vpid.c @@ -34,11 +34,16 @@ static pid_t cached_vpid; static inline -pid_t wrapper_getpid(void) +pid_t wrapper_getvpid(void) { - if (caa_unlikely(!cached_vpid)) - cached_vpid = getpid(); - return cached_vpid; + pid_t vpid; + + vpid = CMM_LOAD_SHARED(cached_vpid); + if (caa_unlikely(!vpid)) { + vpid = getpid(); + CMM_STORE_SHARED(cached_vpid, vpid); + } + return vpid; } /* @@ -47,7 +52,7 @@ pid_t wrapper_getpid(void) */ void lttng_context_vpid_reset(void) { - cached_vpid = 0; + CMM_STORE_SHARED(cached_vpid, 0); } static @@ -65,21 +70,17 @@ void vpid_record(struct lttng_ctx_field *field, struct lttng_ust_lib_ring_buffer_ctx *ctx, struct lttng_channel *chan) { - pid_t pid; + pid_t vpid = wrapper_getvpid(); - pid = wrapper_getpid(); - lib_ring_buffer_align_ctx(ctx, lttng_alignof(pid)); - chan->ops->event_write(ctx, &pid, sizeof(pid)); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vpid)); + chan->ops->event_write(ctx, &vpid, sizeof(vpid)); } static void vpid_get_value(struct lttng_ctx_field *field, struct lttng_ctx_value *value) { - pid_t pid; - - pid = wrapper_getpid(); - value->u.s64 = pid; + value->u.s64 = wrapper_getvpid(); } int lttng_add_vpid_to_ctx(struct lttng_ctx **ctx) diff --git a/liblttng-ust/lttng-context-vtid.c b/liblttng-ust/lttng-context-vtid.c index f28e470a..5cefe953 100644 --- a/liblttng-ust/lttng-context-vtid.c +++ b/liblttng-ust/lttng-context-vtid.c @@ -43,7 +43,7 @@ static DEFINE_URCU_TLS(pid_t, cached_vtid); */ void lttng_context_vtid_reset(void) { - URCU_TLS(cached_vtid) = 0; + CMM_STORE_SHARED(URCU_TLS(cached_vtid), 0); } static @@ -56,25 +56,35 @@ size_t vtid_get_size(struct lttng_ctx_field *field, size_t offset) return size; } +static inline +pid_t wrapper_getvtid(void) +{ + pid_t vtid; + + vtid = CMM_LOAD_SHARED(URCU_TLS(cached_vtid)); + if (caa_unlikely(!vtid)) { + vtid = getpid(); + CMM_STORE_SHARED(URCU_TLS(cached_vtid), vtid); + } + return vtid; +} + static void vtid_record(struct lttng_ctx_field *field, struct lttng_ust_lib_ring_buffer_ctx *ctx, struct lttng_channel *chan) { - if (caa_unlikely(!URCU_TLS(cached_vtid))) - URCU_TLS(cached_vtid) = gettid(); - lib_ring_buffer_align_ctx(ctx, lttng_alignof(URCU_TLS(cached_vtid))); - chan->ops->event_write(ctx, &URCU_TLS(cached_vtid), - sizeof(URCU_TLS(cached_vtid))); + pid_t vtid = wrapper_getvtid(); + + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vtid)); + chan->ops->event_write(ctx, &vtid, sizeof(vtid)); } static void vtid_get_value(struct lttng_ctx_field *field, struct lttng_ctx_value *value) { - if (caa_unlikely(!URCU_TLS(cached_vtid))) - URCU_TLS(cached_vtid) = gettid(); - value->u.s64 = URCU_TLS(cached_vtid); + value->u.s64 = wrapper_getvtid(); } int lttng_add_vtid_to_ctx(struct lttng_ctx **ctx)