X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fringbuffer%2Fring_buffer_backend.c;h=d6547d7de9c9cef6f45a6fb426c864a1b8ee3347;hb=2459130397d7e7eecc44a5f06a39d65c78257eef;hp=9d199e516aacbaf009538faf394671113e18bf70;hpb=5f14d8ae2cc0734b007c8770c3b13ff00d830040;p=lttng-modules.git diff --git a/lib/ringbuffer/ring_buffer_backend.c b/lib/ringbuffer/ring_buffer_backend.c index 9d199e51..d6547d7d 100644 --- a/lib/ringbuffer/ring_buffer_backend.c +++ b/lib/ringbuffer/ring_buffer_backend.c @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: (GPL-2.0 OR LGPL-2.1) +/* SPDX-License-Identifier: (GPL-2.0-only OR LGPL-2.1-only) * * ring_buffer_backend.c * @@ -16,10 +16,11 @@ #include #include -#include /* for wrapper_vmalloc_sync_all() */ -#include -#include -#include +#include +#include /* for wrapper_vmalloc_sync_mappings() */ +#include +#include +#include /** * lib_ring_buffer_backend_allocate - allocate a channel buffer @@ -43,6 +44,25 @@ int lib_ring_buffer_backend_allocate(const struct lib_ring_buffer_config *config unsigned long i; num_pages = size >> PAGE_SHIFT; + + /* + * Verify that there is enough free pages available on the system for + * the current allocation request. + * wrapper_check_enough_free_pages uses si_mem_available() if available + * and returns if there should be enough free pages based on the + * current estimate. + */ + if (!wrapper_check_enough_free_pages(num_pages)) + 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. + */ + wrapper_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; @@ -136,7 +156,8 @@ int lib_ring_buffer_backend_allocate(const struct lib_ring_buffer_config *config * If kmalloc ever uses vmalloc underneath, make sure the buffer pages * will not fault. */ - wrapper_vmalloc_sync_all(); + wrapper_vmalloc_sync_mappings(); + wrapper_clear_current_oom_origin(); vfree(pages); return 0; @@ -153,6 +174,8 @@ depopulate: array_error: vfree(pages); pages_error: + wrapper_clear_current_oom_origin(); +not_enough_pages: return -ENOMEM; }