Fix: ext3 was completely removed from the kernel in v4.3
[lttng-modules.git] / lttng-events.c
index 6b74f6e850ac0868c6f3373dffeb2df88a369b7b..e91caf9fb08c70cc4a421d147c5c33818b72cbea 100644 (file)
@@ -240,8 +240,10 @@ int lttng_session_enable(struct lttng_session *session)
        lttng_session_sync_enablers(session);
 
        /* Clear each stream's quiescent state. */
-       list_for_each_entry(chan, &session->chan, list)
-               lib_ring_buffer_clear_quiescent_channel(chan->chan);
+       list_for_each_entry(chan, &session->chan, list) {
+               if (chan->channel_type != METADATA_CHANNEL)
+                       lib_ring_buffer_clear_quiescent_channel(chan->chan);
+       }
 
        ACCESS_ONCE(session->active) = 1;
        ACCESS_ONCE(session->been_active) = 1;
@@ -275,8 +277,10 @@ int lttng_session_disable(struct lttng_session *session)
        lttng_session_sync_enablers(session);
 
        /* Set each stream's quiescent state. */
-       list_for_each_entry(chan, &session->chan, list)
-               lib_ring_buffer_set_quiescent_channel(chan->chan);
+       list_for_each_entry(chan, &session->chan, list) {
+               if (chan->channel_type != METADATA_CHANNEL)
+                       lib_ring_buffer_set_quiescent_channel(chan->chan);
+       }
 end:
        mutex_unlock(&sessions_mutex);
        return ret;
@@ -2273,6 +2277,133 @@ void lttng_transport_unregister(struct lttng_transport *transport)
 }
 EXPORT_SYMBOL_GPL(lttng_transport_unregister);
 
+#if (defined(CONFIG_HOTPLUG_CPU) && (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)))
+
+enum cpuhp_state lttng_hp_prepare;
+enum cpuhp_state lttng_hp_online;
+
+static int lttng_hotplug_prepare(unsigned int cpu, struct hlist_node *node)
+{
+       struct lttng_cpuhp_node *lttng_node;
+
+       lttng_node = container_of(node, struct lttng_cpuhp_node, node);
+       switch (lttng_node->component) {
+       case LTTNG_RING_BUFFER_FRONTEND:
+               return 0;
+       case LTTNG_RING_BUFFER_BACKEND:
+               return lttng_cpuhp_rb_backend_prepare(cpu, lttng_node);
+       case LTTNG_RING_BUFFER_ITER:
+               return 0;
+       case LTTNG_CONTEXT_PERF_COUNTERS:
+               return 0;
+       default:
+               return -EINVAL;
+       }
+}
+
+static int lttng_hotplug_dead(unsigned int cpu, struct hlist_node *node)
+{
+       struct lttng_cpuhp_node *lttng_node;
+
+       lttng_node = container_of(node, struct lttng_cpuhp_node, node);
+       switch (lttng_node->component) {
+       case LTTNG_RING_BUFFER_FRONTEND:
+               return lttng_cpuhp_rb_frontend_dead(cpu, lttng_node);
+       case LTTNG_RING_BUFFER_BACKEND:
+               return 0;
+       case LTTNG_RING_BUFFER_ITER:
+               return 0;
+       case LTTNG_CONTEXT_PERF_COUNTERS:
+               return lttng_cpuhp_perf_counter_dead(cpu, lttng_node);
+       default:
+               return -EINVAL;
+       }
+}
+
+static int lttng_hotplug_online(unsigned int cpu, struct hlist_node *node)
+{
+       struct lttng_cpuhp_node *lttng_node;
+
+       lttng_node = container_of(node, struct lttng_cpuhp_node, node);
+       switch (lttng_node->component) {
+       case LTTNG_RING_BUFFER_FRONTEND:
+               return lttng_cpuhp_rb_frontend_online(cpu, lttng_node);
+       case LTTNG_RING_BUFFER_BACKEND:
+               return 0;
+       case LTTNG_RING_BUFFER_ITER:
+               return lttng_cpuhp_rb_iter_online(cpu, lttng_node);
+       case LTTNG_CONTEXT_PERF_COUNTERS:
+               return lttng_cpuhp_perf_counter_online(cpu, lttng_node);
+       default:
+               return -EINVAL;
+       }
+}
+
+static int lttng_hotplug_offline(unsigned int cpu, struct hlist_node *node)
+{
+       struct lttng_cpuhp_node *lttng_node;
+
+       lttng_node = container_of(node, struct lttng_cpuhp_node, node);
+       switch (lttng_node->component) {
+       case LTTNG_RING_BUFFER_FRONTEND:
+               return lttng_cpuhp_rb_frontend_offline(cpu, lttng_node);
+       case LTTNG_RING_BUFFER_BACKEND:
+               return 0;
+       case LTTNG_RING_BUFFER_ITER:
+               return 0;
+       case LTTNG_CONTEXT_PERF_COUNTERS:
+               return 0;
+       default:
+               return -EINVAL;
+       }
+}
+
+static int __init lttng_init_cpu_hotplug(void)
+{
+       int ret;
+
+       ret = cpuhp_setup_state_multi(CPUHP_BP_PREPARE_DYN, "lttng:prepare",
+                       lttng_hotplug_prepare,
+                       lttng_hotplug_dead);
+       if (ret < 0) {
+               return ret;
+       }
+       lttng_hp_prepare = ret;
+       lttng_rb_set_hp_prepare(ret);
+
+       ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "lttng:online",
+                       lttng_hotplug_online,
+                       lttng_hotplug_offline);
+       if (ret < 0) {
+               cpuhp_remove_multi_state(lttng_hp_prepare);
+               lttng_hp_prepare = 0;
+               return ret;
+       }
+       lttng_hp_online = ret;
+       lttng_rb_set_hp_online(ret);
+
+       return 0;
+}
+
+static void __exit lttng_exit_cpu_hotplug(void)
+{
+       lttng_rb_set_hp_online(0);
+       cpuhp_remove_multi_state(lttng_hp_online);
+       lttng_rb_set_hp_prepare(0);
+       cpuhp_remove_multi_state(lttng_hp_prepare);
+}
+
+#else /* #if (CONFIG_HOTPLUG_CPU && (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0))) */
+static int lttng_init_cpu_hotplug(void)
+{
+       return 0;
+}
+static void lttng_exit_cpu_hotplug(void)
+{
+}
+#endif /* #else #if (CONFIG_HOTPLUG_CPU && (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0))) */
+
+
 static int __init lttng_events_init(void)
 {
        int ret;
@@ -2303,8 +2434,13 @@ static int __init lttng_events_init(void)
        ret = lttng_logger_init();
        if (ret)
                goto error_logger;
+       ret = lttng_init_cpu_hotplug();
+       if (ret)
+               goto error_hotplug;
        return 0;
 
+error_hotplug:
+       lttng_logger_exit();
 error_logger:
        lttng_abi_exit();
 error_abi:
@@ -2322,6 +2458,7 @@ static void __exit lttng_events_exit(void)
 {
        struct lttng_session *session, *tmpsession;
 
+       lttng_exit_cpu_hotplug();
        lttng_logger_exit();
        lttng_abi_exit();
        list_for_each_entry_safe(session, tmpsession, &sessions, list)
This page took 0.026703 seconds and 4 git commands to generate.