Commit f82e6973 authored by Daniel Black's avatar Daniel Black

io_liburing: ENOMEM handling - use io_uring_mlock_size

This gives the user the size required and how to set
memlock limits for the process.

Thanks Jens Axboe for providing this requested interface

ref: https://github.com/axboe/liburing/issues/246

Also don't put \n on my_printf_error, its implicit.
parent f46536e7
......@@ -17,6 +17,16 @@ ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
LINK_LIBRARIES(${URING_LIBRARIES})
INCLUDE_DIRECTORIES(${URING_INCLUDE_DIR})
SET(EXTRA_SOURCES aio_liburing.cc)
SET(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})
SET(CMAKE_REQUIRED_LIBRARIES_SAVE ${CMAKE_REQUIRED_LIBRARIES})
SET(CMAKE_REQUIRED_INCLUDES ${URING_INCLUDE_DIR})
SET(CMAKE_REQUIRED_LIBRARIES ${URING_LIBRARIES})
CHECK_SYMBOL_EXISTS(io_uring_mlock_size "liburing.h" HAVE_IO_URING_MLOCK_SIZE)
SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})
SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES_SAVE})
IF(HAVE_IO_URING_MLOCK_SIZE)
SET_SOURCE_FILES_PROPERTIES(aio_liburing.cc PROPERTIES COMPILE_FLAGS "-DHAVE_IO_URING_MLOCK_SIZE")
ENDIF()
ELSE()
FIND_PACKAGE(LIBAIO QUIET ${LIBAIO_REQUIRED})
IF(LIBAIO_FOUND)
......
......@@ -37,17 +37,27 @@ class aio_uring final : public tpool::aio
{
switch (const auto e= errno) {
case ENOMEM:
my_printf_error(ER_UNKNOWN_ERROR,
"io_uring_queue_init() failed with ENOMEM:"
" try larger memory locked limit, ulimit -l"
", or https://mariadb.com/kb/en/systemd/#configuring-limitmemlock"
" under systemd"
#ifdef HAVE_IO_URING_MLOCK_SIZE
" (%zd bytes required)", ME_ERROR_LOG | ME_WARNING,
io_uring_mlock_size(max_aio, 0));
#else
, ME_ERROR_LOG | ME_WARNING);
#endif
break;
case ENOSYS:
my_printf_error(ER_UNKNOWN_ERROR, e == ENOMEM
? "io_uring_queue_init() failed with ENOMEM:"
" try larger ulimit -l\n"
: "io_uring_queue_init() failed with ENOSYS:"
" try uprading the kernel\n",
my_printf_error(ER_UNKNOWN_ERROR,
"io_uring_queue_init() failed with ENOSYS:"
" try uprading the kernel",
ME_ERROR_LOG | ME_WARNING);
break;
default:
my_printf_error(ER_UNKNOWN_ERROR,
"io_uring_queue_init() failed with errno %d\n",
"io_uring_queue_init() failed with errno %d",
ME_ERROR_LOG | ME_WARNING, e);
}
throw std::runtime_error("aio_uring()");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment