X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=lib%2Fringbuffer%2Fring_buffer_backend.c;fp=lib%2Fringbuffer%2Fring_buffer_backend.c;h=d300980dd7fec1204ce8732d0fd0404bdba88c70;hb=1790d63f59538ba7b183c7d6e03470f5d51fe563;hp=7394c86033d24c1f97ff03b80767381e2fabf2b5;hpb=ae8ff4cd689556fb2b4ed3657415e8f8cae5bc0c;p=lttng-modules.git diff --git a/lib/ringbuffer/ring_buffer_backend.c b/lib/ringbuffer/ring_buffer_backend.c index 7394c860..d300980d 100644 --- a/lib/ringbuffer/ring_buffer_backend.c +++ b/lib/ringbuffer/ring_buffer_backend.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -56,6 +57,23 @@ int lib_ring_buffer_backend_allocate(const struct lib_ring_buffer_config *config unsigned long i; num_pages = size >> PAGE_SHIFT; + + /* + * Verify that the number of pages requested for that buffer is smaller + * than the number of available pages on the system. si_mem_available() + * returns an _estimate_ of the number of available pages. + */ + if (num_pages > si_mem_available()) + goto not_enough_pages; + + /* + * Set the current user thread as the first target of the OOM killer. + * If the estimate received by si_mem_available() was off, and we do + * end up running out of memory because of this buffer allocation, we + * want to kill the offending app first. + */ + set_current_oom_origin(); + num_pages_per_subbuf = num_pages >> get_count_order(num_subbuf); subbuf_size = chanb->subbuf_size; num_subbuf_alloc = num_subbuf; @@ -150,6 +168,7 @@ int lib_ring_buffer_backend_allocate(const struct lib_ring_buffer_config *config * will not fault. */ wrapper_vmalloc_sync_all(); + clear_current_oom_origin(); vfree(pages); return 0; @@ -166,6 +185,8 @@ depopulate: array_error: vfree(pages); pages_error: + clear_current_oom_origin(); +not_enough_pages: return -ENOMEM; }