qtest/migration/rdma: Enforce RLIMIT_MEMLOCK >= 128MB requirement

Ensure successful migration over RDMA by verifying that RLIMIT_MEMLOCK is
set to at least 128MB. This allocation is necessary due to the requirement
to pin significant portions of guest memory, typically exceeding 100MB
in this test, while the remainder is transmitted as compressed zero pages.

Otherwise, it will fail with:
stderr:
qemu-system-x86_64: cannot get rkey
qemu-system-x86_64: error while loading state section id 2(ram)
qemu-system-x86_64: load of migration failed: Operation not permitted
qemu-system-x86_64: rdma migration: recv polling control error!
qemu-system-x86_64: RDMA is in an error state waiting migration to abort!
qemu-system-x86_64: failed to save SaveStateEntry with id(name): 2(ram): -1
qemu-system-x86_64: Channel error: Operation not permitted

Reported-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Li Zhijian <lizhijian@fujitsu.com>
Link: https://lore.kernel.org/r/20250509014211.1272640-1-lizhijian@fujitsu.com
Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
Li Zhijian 2025-05-09 09:42:10 +08:00 committed by Peter Xu
parent c4f88b7136
commit 7b2e4f788d

View File

@ -101,6 +101,35 @@ static void test_precopy_unix_dirty_ring(void)
#ifdef CONFIG_RDMA
#include <sys/resource.h>
/*
* During migration over RDMA, it will try to pin portions of guest memory,
* typically exceeding 100MB in this test, while the remainder will be
* transmitted as compressed zero pages.
*
* REQUIRED_MEMLOCK_SZ indicates the minimal mlock size in the current context.
*/
#define REQUIRED_MEMLOCK_SZ (128 << 20) /* 128MB */
/* check 'ulimit -l' */
static bool mlock_check(void)
{
uid_t uid;
struct rlimit rlim;
uid = getuid();
if (uid == 0) {
return true;
}
if (getrlimit(RLIMIT_MEMLOCK, &rlim) != 0) {
return false;
}
return rlim.rlim_cur >= REQUIRED_MEMLOCK_SZ;
}
#define RDMA_MIGRATION_HELPER "scripts/rdma-migration-helper.sh"
static int new_rdma_link(char *buffer)
{
@ -136,6 +165,11 @@ static void test_precopy_rdma_plain(void)
{
char buffer[128] = {};
if (!mlock_check()) {
g_test_skip("'ulimit -l' is too small, require >=128M");
return;
}
if (new_rdma_link(buffer)) {
g_test_skip("No rdma link available\n"
"# To enable the test:\n"