Fix: Don't nest get online cpus
[lttng-modules.git] / lib / ringbuffer / ring_buffer_frontend.c
index e77d789bb866b99f1ca1e28c652cc2cc50f450d1..35350b6b4eec56b376f3617e0c5c0aa4d9759d99 100644 (file)
@@ -65,6 +65,7 @@
 #include <wrapper/kref.h>
 #include <wrapper/percpu-defs.h>
 #include <wrapper/timer.h>
+#include <wrapper/vmalloc.h>
 
 /*
  * Internal structure representing offsets to use at a sub-buffer switch.
@@ -147,8 +148,8 @@ void lib_ring_buffer_free(struct lib_ring_buffer *buf)
        struct channel *chan = buf->backend.chan;
 
        lib_ring_buffer_print_errors(chan, buf, buf->backend.cpu);
-       kfree(buf->commit_hot);
-       kfree(buf->commit_cold);
+       lttng_kvfree(buf->commit_hot);
+       lttng_kvfree(buf->commit_cold);
 
        lib_ring_buffer_backend_free(&buf->backend);
 }
@@ -245,7 +246,7 @@ int lib_ring_buffer_create(struct lib_ring_buffer *buf,
                return ret;
 
        buf->commit_hot =
-               kzalloc_node(ALIGN(sizeof(*buf->commit_hot)
+               lttng_kvzalloc_node(ALIGN(sizeof(*buf->commit_hot)
                                   * chan->backend.num_subbuf,
                                   1 << INTERNODE_CACHE_SHIFT),
                        GFP_KERNEL | __GFP_NOWARN,
@@ -256,7 +257,7 @@ int lib_ring_buffer_create(struct lib_ring_buffer *buf,
        }
 
        buf->commit_cold =
-               kzalloc_node(ALIGN(sizeof(*buf->commit_cold)
+               lttng_kvzalloc_node(ALIGN(sizeof(*buf->commit_cold)
                                   * chan->backend.num_subbuf,
                                   1 << INTERNODE_CACHE_SHIFT),
                        GFP_KERNEL | __GFP_NOWARN,
@@ -305,9 +306,9 @@ int lib_ring_buffer_create(struct lib_ring_buffer *buf,
 
        /* Error handling */
 free_init:
-       kfree(buf->commit_cold);
+       lttng_kvfree(buf->commit_cold);
 free_commit:
-       kfree(buf->commit_hot);
+       lttng_kvfree(buf->commit_hot);
 free_chanbuf:
        lib_ring_buffer_backend_free(&buf->backend);
        return ret;
@@ -1853,16 +1854,14 @@ static void _lib_ring_buffer_switch_remote(struct lib_ring_buffer *buf,
        }
 
        /*
-        * Taking lock on CPU hotplug to ensure two things: first, that the
+        * Disabling preemption ensures two things: first, that the
         * target cpu is not taken concurrently offline while we are within
-        * smp_call_function_single() (I don't trust that get_cpu() on the
-        * _local_ CPU actually inhibit CPU hotplug for the _remote_ CPU (to be
-        * confirmed)). Secondly, if it happens that the CPU is not online, our
-        * own call to lib_ring_buffer_switch_slow() needs to be protected from
-        * CPU hotplug handlers, which can also perform a remote subbuffer
-        * switch.
+        * smp_call_function_single(). Secondly, if it happens that the
+        * CPU is not online, our own call to lib_ring_buffer_switch_slow()
+        * needs to be protected from CPU hotplug handlers, which can
+        * also perform a remote subbuffer switch.
         */
-       get_online_cpus();
+       preempt_disable();
        param.buf = buf;
        param.mode = mode;
        ret = smp_call_function_single(buf->backend.cpu,
@@ -1871,7 +1870,7 @@ static void _lib_ring_buffer_switch_remote(struct lib_ring_buffer *buf,
                /* Remote CPU is offline, do it ourself. */
                lib_ring_buffer_switch_slow(buf, mode);
        }
-       put_online_cpus();
+       preempt_enable();
 }
 
 /* Switch sub-buffer if current sub-buffer is non-empty. */
This page took 0.024428 seconds and 4 git commands to generate.