X-Git-Url: http://git.lttng.org/?p=lttng-modules.git;a=blobdiff_plain;f=lib%2Fringbuffer%2Fring_buffer_backend.c;h=8207f764377a34f5cb0fda0e41da8e56985dbd45;hp=9d199e516aacbaf009538faf394671113e18bf70;hb=1f0ab1eb0409d23de5f67cc588c3ea4cee4d10e0;hpb=426eff93d09b3e6709d6e6d29a285ef4bcdf60c6 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; }