X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=lib%2Fringbuffer%2Fring_buffer_backend.c;h=8207f764377a34f5cb0fda0e41da8e56985dbd45;hb=60f9ca274a6227337f13d8f5379468f6258a645e;hp=9d199e516aacbaf009538faf394671113e18bf70;hpb=9837fedce98e9cf83b1ffc0ec8ecd90d7c070c07;p=lttng-modules.git diff --git a/lib/ringbuffer/ring_buffer_backend.c b/lib/ringbuffer/ring_buffer_backend.c index 9d199e51..8207f764 100644 --- a/lib/ringbuffer/ring_buffer_backend.c +++ b/lib/ringbuffer/ring_buffer_backend.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,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; @@ -137,6 +155,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; @@ -153,6 +172,8 @@ depopulate: array_error: vfree(pages); pages_error: + clear_current_oom_origin(); +not_enough_pages: return -ENOMEM; }