list);
 }
 
+/*
+ * osnoise_instance_registered - check if a tr is already registered
+ */
+static int osnoise_instance_registered(struct trace_array *tr)
+{
+       struct osnoise_instance *inst;
+       int found = 0;
+
+       rcu_read_lock();
+       list_for_each_entry_rcu(inst, &osnoise_instances, list) {
+               if (inst->tr == tr)
+                       found = 1;
+       }
+       rcu_read_unlock();
+
+       return found;
+}
+
 /*
  * osnoise_register_instance - register a new trace instance
  *
 {
        int retval;
 
+       /*
+        * Instances need to be registered after calling workload
+        * start. Hence, if there is already an instance, the
+        * workload was already registered. Otherwise, this
+        * code is on the way to register the first instance,
+        * and the workload will start.
+        */
+       if (osnoise_has_registered_instances())
+               return 0;
+
        osn_var_reset_all();
 
        retval = osnoise_hook_events();
  */
 static void osnoise_workload_stop(void)
 {
+       /*
+        * Instances need to be unregistered before calling
+        * stop. Hence, if there is a registered instance, more
+        * than one instance is running, and the workload will not
+        * yet stop. Otherwise, this code is on the way to disable
+        * the last instance, and the workload can stop.
+        */
        if (osnoise_has_registered_instances())
                return;
 
 {
        int retval;
 
-       if (osnoise_has_registered_instances())
+       /*
+        * If the instance is already registered, there is no need to
+        * register it again.
+        */
+       if (osnoise_instance_registered(tr))
                return;
 
        retval = osnoise_workload_start();
 
 static void osnoise_tracer_stop(struct trace_array *tr)
 {
-       if (!osnoise_has_registered_instances())
-               return;
-
        osnoise_unregister_instance(tr);
        osnoise_workload_stop();
 }
 
 static int osnoise_tracer_init(struct trace_array *tr)
 {
-
-       /* Only allow one instance to enable this */
-       if (osnoise_has_registered_instances())
+       /*
+        * Only allow osnoise tracer if timerlat tracer is not running
+        * already.
+        */
+       if (timerlat_enabled())
                return -EBUSY;
 
        tr->max_latency = 0;
 {
        int retval;
 
-       if (osnoise_has_registered_instances())
+       /*
+        * If the instance is already registered, there is no need to
+        * register it again.
+        */
+       if (osnoise_instance_registered(tr))
                return;
 
-       osnoise_data.timerlat_tracer = 1;
-
        retval = osnoise_workload_start();
        if (retval)
-               goto out_err;
+               pr_err(BANNER "Error starting timerlat tracer\n");
 
        osnoise_register_instance(tr);
 
        return;
-out_err:
-       pr_err(BANNER "Error starting timerlat tracer\n");
 }
 
 static void timerlat_tracer_stop(struct trace_array *tr)
 {
        int cpu;
 
-       if (!osnoise_has_registered_instances())
-               return;
-
-       for_each_online_cpu(cpu)
-               per_cpu(per_cpu_osnoise_var, cpu).sampling = 0;
+       osnoise_unregister_instance(tr);
 
-       osnoise_tracer_stop(tr);
+       /*
+        * Instruct the threads to stop only if this is the last instance.
+        */
+       if (!osnoise_has_registered_instances()) {
+               for_each_online_cpu(cpu)
+                       per_cpu(per_cpu_osnoise_var, cpu).sampling = 0;
+       }
 
-       osnoise_data.timerlat_tracer = 0;
+       osnoise_workload_stop();
 }
 
 static int timerlat_tracer_init(struct trace_array *tr)
 {
-       /* Only allow one instance to enable this */
-       if (osnoise_has_registered_instances())
+       /*
+        * Only allow timerlat tracer if osnoise tracer is not running already.
+        */
+       if (osnoise_has_registered_instances() && !osnoise_data.timerlat_tracer)
                return -EBUSY;
 
-       tr->max_latency = 0;
+       /*
+        * If this is the first instance, set timerlat_tracer to block
+        * osnoise tracer start.
+        */
+       if (!osnoise_has_registered_instances())
+               osnoise_data.timerlat_tracer = 1;
 
+       tr->max_latency = 0;
        timerlat_tracer_start(tr);
 
        return 0;
 static void timerlat_tracer_reset(struct trace_array *tr)
 {
        timerlat_tracer_stop(tr);
+
+       /*
+        * If this is the last instance, reset timerlat_tracer allowing
+        * osnoise to be started.
+        */
+       if (!osnoise_has_registered_instances())
+               osnoise_data.timerlat_tracer = 0;
 }
 
 static struct tracer timerlat_tracer __read_mostly = {