X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-events.c;h=a0bd232228c8dd6a3120134bce7cd16d2c5db33e;hb=ff024e6646f0d75935e8eb277cce508c593a23ad;hp=9d1861160936638d44e7f9134c37639f4b9e0901;hpb=13a2dfcad5568021ae18f60c1ef05ebc16005ed2;p=lttng-modules.git diff --git a/src/lttng-events.c b/src/lttng-events.c index 9d186116..a0bd2322 100644 --- a/src/lttng-events.c +++ b/src/lttng-events.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -47,7 +46,13 @@ #include #include #include -#include + +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,16,0) \ + || LTTNG_RHEL_KERNEL_RANGE(5,14,0,162,0,0, 5,15,0,0,0,0)) +#include +#else +#include +#endif #define METADATA_CACHE_DEFAULT_SIZE 4096 @@ -71,7 +76,7 @@ static void lttng_event_enabler_sync(struct lttng_event_enabler_common *event_en static void _lttng_event_destroy(struct lttng_kernel_event_common *event); static void _lttng_channel_destroy(struct lttng_kernel_channel_buffer *chan); -static int _lttng_event_unregister(struct lttng_kernel_event_common *event); +static void _lttng_event_unregister(struct lttng_kernel_event_common *event); static int _lttng_event_recorder_metadata_statedump(struct lttng_kernel_event_common *event); static @@ -97,15 +102,9 @@ void synchronize_trace(void) synchronize_sched(); #endif -#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,4,0)) #ifdef CONFIG_PREEMPT_RT_FULL synchronize_rcu(); #endif -#else /* (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,4,0)) */ -#ifdef CONFIG_PREEMPT_RT - synchronize_rcu(); -#endif -#endif /* (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,4,0)) */ } void lttng_lock_sessions(void) @@ -360,10 +359,8 @@ void lttng_session_destroy(struct lttng_kernel_session *session) ret = lttng_syscalls_unregister_syscall_table(&chan_priv->parent.syscall_table); WARN_ON(ret); } - list_for_each_entry(event_recorder_priv, &session->priv->events, parent.node) { - ret = _lttng_event_unregister(&event_recorder_priv->pub->parent); - WARN_ON(ret); - } + list_for_each_entry(event_recorder_priv, &session->priv->events, parent.node) + _lttng_event_unregister(&event_recorder_priv->pub->parent); synchronize_trace(); /* Wait for in-flight events to complete */ list_for_each_entry(chan_priv, &session->priv->chan, node) { ret = lttng_syscalls_destroy_syscall_table(&chan_priv->parent.syscall_table); @@ -410,10 +407,8 @@ void lttng_event_notifier_group_destroy( WARN_ON(ret); list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv, - &event_notifier_group->event_notifiers_head, parent.node) { - ret = _lttng_event_unregister(&event_notifier_priv->pub->parent); - WARN_ON(ret); - } + &event_notifier_group->event_notifiers_head, parent.node) + _lttng_event_unregister(&event_notifier_priv->pub->parent); /* Wait for in-flight event notifier to complete */ synchronize_trace(); @@ -1268,10 +1263,6 @@ struct lttng_kernel_event_common *_lttng_kernel_event_create(struct lttng_event_ WARN_ON_ONCE(!ret); break; - case LTTNG_KERNEL_ABI_FUNCTION: - lttng_fallthrough; - case LTTNG_KERNEL_ABI_NOOP: - lttng_fallthrough; default: WARN_ON_ONCE(1); ret = -EINVAL; @@ -1337,20 +1328,19 @@ int lttng_kernel_counter_clear(struct lttng_counter *counter, return counter->ops->counter_clear(counter->counter, dim_indexes); } -/* Only used for tracepoints for now. */ +/* Only used for tracepoints and system calls for now. */ static void register_event(struct lttng_kernel_event_common *event) { const struct lttng_kernel_event_desc *desc; int ret = -EINVAL; - if (event->priv->registered) - return; + WARN_ON_ONCE(event->priv->registered); desc = event->priv->desc; switch (event->priv->instrumentation) { case LTTNG_KERNEL_ABI_TRACEPOINT: - ret = lttng_wrapper_tracepoint_probe_register(desc->event_kname, + ret = lttng_tracepoint_probe_register(desc->event_kname, desc->tp_class->probe_callback, event); break; @@ -1383,23 +1373,24 @@ void register_event(struct lttng_kernel_event_common *event) default: WARN_ON_ONCE(1); } + WARN_ON_ONCE(ret); if (!ret) event->priv->registered = 1; } -int _lttng_event_unregister(struct lttng_kernel_event_common *event) +static +void unregister_event(struct lttng_kernel_event_common *event) { struct lttng_kernel_event_common_private *event_priv = event->priv; const struct lttng_kernel_event_desc *desc; int ret = -EINVAL; - if (!event_priv->registered) - return 0; + WARN_ON_ONCE(!event->priv->registered); desc = event_priv->desc; switch (event_priv->instrumentation) { case LTTNG_KERNEL_ABI_TRACEPOINT: - ret = lttng_wrapper_tracepoint_probe_unregister(event_priv->desc->event_kname, + ret = lttng_tracepoint_probe_unregister(event_priv->desc->event_kname, event_priv->desc->tp_class->probe_callback, event); break; @@ -1446,9 +1437,16 @@ int _lttng_event_unregister(struct lttng_kernel_event_common *event) default: WARN_ON_ONCE(1); } + WARN_ON_ONCE(ret); if (!ret) event_priv->registered = 0; - return ret; +} + +static +void _lttng_event_unregister(struct lttng_kernel_event_common *event) +{ + if (event->priv->registered) + unregister_event(event); } /* @@ -1764,7 +1762,7 @@ int lttng_session_list_tracker_ids(struct lttng_kernel_session *session, struct seq_file *m; int file_fd, ret; - file_fd = lttng_get_unused_fd(); + file_fd = get_unused_fd_flags(0); if (file_fd < 0) { ret = file_fd; goto fd_error; @@ -2063,7 +2061,7 @@ struct lttng_enabler_ref *lttng_enabler_ref( } static -void lttng_create_tracepoint_event_if_missing(struct lttng_event_enabler_common *event_enabler) +void lttng_event_enabler_create_tracepoint_events_if_missing(struct lttng_event_enabler_common *event_enabler) { struct lttng_event_ht *events_ht = lttng_get_event_ht_from_enabler(event_enabler); struct lttng_kernel_probe_desc *probe_desc; @@ -2079,7 +2077,7 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_enabler_common */ list_for_each_entry(probe_desc, probe_list, head) { for (i = 0; i < probe_desc->nr_events; i++) { - int found = 0; + bool found = false; struct hlist_head *head; struct lttng_kernel_event_common *event; struct lttng_kernel_event_common_private *event_priv; @@ -2093,8 +2091,10 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_enabler_common */ head = utils_borrow_hash_table_bucket(events_ht->table, LTTNG_EVENT_HT_SIZE, desc->event_name); lttng_hlist_for_each_entry(event_priv, head, hlist_node) { - if (lttng_event_enabler_desc_match_event(event_enabler, desc, event_priv->pub)) - found = 1; + if (lttng_event_enabler_desc_match_event(event_enabler, desc, event_priv->pub)) { + found = true; + break; + } } if (found) continue; @@ -2103,7 +2103,7 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_enabler_common * We need to create an event for this event probe. */ event = _lttng_kernel_event_create(event_enabler, desc); - if (!event) { + if (IS_ERR(event)) { printk(KERN_INFO "LTTng: Unable to create event %s\n", probe_desc->event_desc[i]->event_name); } @@ -2111,29 +2111,23 @@ void lttng_create_tracepoint_event_if_missing(struct lttng_event_enabler_common } } -static -void lttng_create_syscall_event_if_missing(struct lttng_event_enabler_common *event_enabler) -{ - int ret; - - ret = lttng_syscalls_register_event(event_enabler); - WARN_ON_ONCE(ret); -} - /* * Create event if it is missing and present in the list of tracepoint probes. * Should be called with sessions mutex held. */ static -void lttng_create_event_if_missing(struct lttng_event_enabler_common *event_enabler) +void lttng_event_enabler_create_events_if_missing(struct lttng_event_enabler_common *event_enabler) { + int ret; + switch (event_enabler->event_param.instrumentation) { case LTTNG_KERNEL_ABI_TRACEPOINT: - lttng_create_tracepoint_event_if_missing(event_enabler); + lttng_event_enabler_create_tracepoint_events_if_missing(event_enabler); break; case LTTNG_KERNEL_ABI_SYSCALL: - lttng_create_syscall_event_if_missing(event_enabler); + ret = lttng_event_enabler_create_syscall_events_if_missing(event_enabler); + WARN_ON_ONCE(ret); break; default: @@ -2191,7 +2185,7 @@ int lttng_event_enabler_ref_events(struct lttng_event_enabler_common *event_enab lttng_syscall_table_set_wildcard_all(event_enabler); /* First ensure that probe events are created for this enabler. */ - lttng_create_event_if_missing(event_enabler); + lttng_event_enabler_create_events_if_missing(event_enabler); /* Link the created event with its associated enabler. */ list_for_each_entry(event_priv, event_list_head, node) { @@ -2656,9 +2650,11 @@ void lttng_sync_event_list(struct list_head *event_enabler_list, * Sync tracepoint registration with event enabled state. */ if (enabled) { - register_event(event); + if (!event_priv->registered) + register_event(event); } else { - _lttng_event_unregister(event); + if (event_priv->registered) + unregister_event(event); } lttng_event_sync_filter_state(event); @@ -3686,20 +3682,12 @@ int64_t measure_clock_offset(void) uint64_t tcf = trace_clock_freq(); int64_t offset; unsigned long flags; -#ifdef LTTNG_KERNEL_HAS_TIMESPEC64 struct timespec64 rts = { 0, 0 }; -#else - struct timespec rts = { 0, 0 }; -#endif /* Disable interrupts to increase correlation precision. */ local_irq_save(flags); monotonic[0] = trace_clock_read64(); -#ifdef LTTNG_KERNEL_HAS_TIMESPEC64 ktime_get_real_ts64(&rts); -#else - getnstimeofday(&rts); -#endif monotonic[1] = trace_clock_read64(); local_irq_restore(flags); @@ -4159,13 +4147,7 @@ static int __init lttng_events_init(void) { int ret; - ret = wrapper_lttng_fixup_sig(THIS_MODULE); - if (ret) - return ret; ret = wrapper_get_pfnblock_flags_mask_init(); - if (ret) - return ret; - ret = wrapper_get_pageblock_flags_mask_init(); if (ret) return ret; ret = lttng_probes_init();