From 4cc5c32ec9b8286095fb34d07b1d43aefdd8541b Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 13 Apr 2021 20:54:37 +1000 Subject: 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. Also don't put \n on my_printf_error, its implicit. --- tpool/CMakeLists.txt | 10 ++++++++++ tpool/aio_liburing.cc | 22 ++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/tpool/CMakeLists.txt b/tpool/CMakeLists.txt index 69440d09490..3a49ea22837 100644 --- a/tpool/CMakeLists.txt +++ b/tpool/CMakeLists.txt @@ -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) diff --git a/tpool/aio_liburing.cc b/tpool/aio_liburing.cc index 14219f1d499..bdc3601ae35 100644 --- a/tpool/aio_liburing.cc +++ b/tpool/aio_liburing.cc @@ -37,17 +37,27 @@ public: { 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()"); -- cgit v1.2.1