From 6d8fe6e847bb43cf7db5eee4cf58fd490f12be47 Mon Sep 17 00:00:00 2001 From: Shin'ichiro Kawasaki Date: Thu, 1 Dec 2022 11:44:25 +0900 Subject: [PATCH] backend: respect return value of init_io_u_buffers When workloads require large buffer for I/O, fio fails to allocate I/O buffer but does not report meaningful error message. It just accesses to null pointer and fail with signal 11. This symptom is observed with the command line below: $ fio --name=job --filename=/tmp/fio --rw=write --bs=1g --size=1g \ --iodepth=128 --ioengine=libaio The I/O buffer allocation is done in function init_io_u_buffers. The allocation failure is not reported because return value of the function is ignored. Check the return value and report to the higher layer. Fixes: 71e6e5a2fd5c ("iolog replay: Realloc io_u buffers to adapt to operation size.") Signed-off-by: Shin'ichiro Kawasaki Link: https://lore.kernel.org/r/20221201024425.2340442-1-shinichiro.kawasaki@wdc.com Signed-off-by: Jens Axboe --- backend.c | 3 ++- blktrace.c | 3 ++- iolog.c | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend.c b/backend.c index ba954a6b..928e524a 100644 --- a/backend.c +++ b/backend.c @@ -1301,7 +1301,8 @@ static int init_io_u(struct thread_data *td) } } - init_io_u_buffers(td); + if (init_io_u_buffers(td)) + return 1; if (init_file_completion_logging(td, max_units)) return 1; diff --git a/blktrace.c b/blktrace.c index 00e5f9a9..d5c8aee7 100644 --- a/blktrace.c +++ b/blktrace.c @@ -545,7 +545,8 @@ bool read_blktrace(struct thread_data* td) td->o.max_bs[DDIR_TRIM] = max(td->o.max_bs[DDIR_TRIM], rw_bs[DDIR_TRIM]); io_u_quiesce(td); free_io_mem(td); - init_io_u_buffers(td); + if (init_io_u_buffers(td)) + return false; } return true; } diff --git a/iolog.c b/iolog.c index aa9c3bb1..62f2f524 100644 --- a/iolog.c +++ b/iolog.c @@ -620,7 +620,8 @@ static bool read_iolog(struct thread_data *td) { io_u_quiesce(td); free_io_mem(td); - init_io_u_buffers(td); + if (init_io_u_buffers(td)) + return false; } return true; } -- 2.25.1