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 <shinichiro.kawasaki@xxxxxxx> --- 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.37.1