On 30/04/2025 16:48, Zhijian Li (Fujitsu) via wrote:
>>> 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
>>> **
>>> ERROR:../tests/qtest/migration/migration-qmp.c:200:check_migration_status: 
>>> assertion failed (current_status != "failed"): ("failed" != "failed")
>>> qemu-system-x86_64: warning: Early error. Sending error.
>>> qemu-system-x86_64: warning: rdma migration: send polling control error
>>> ../tests/qtest/libqtest.c:199: kill_qemu() tried to terminate QEMU process 
>>> but encountered exit status 1 (expected 0)
>>>
>>> So running the test also needs root?  Is it possible we fix the test so it
>>> can also be smart enough to skip if it knows it'll hit the "cannot get
>>> rkey" error (even if it sees the rdma link setup)?  Not something urgent
>>> but definitely good to have.
> It seems it's a security problem, I have no a good idea yet.
> 
> Let me see see...

Another workaround is update the 'ulimit -l' to >=128M for a non-root user(in 
practice
this value works well on fedora40)

So we would have something like this:

diff --git a/tests/qtest/migration/precopy-tests.c 
b/tests/qtest/migration/precopy-tests.c
index 9f7236dc59f..1f24753c5a5 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -101,6 +101,26 @@ static void test_precopy_unix_dirty_ring(void)
  
  #ifdef CONFIG_RDMA
  
+#include <sys/resource.h>
+#define REQUIRED_MEMLOCK (128 * 1024 * 1024) // 128MB
+
+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;
+}
+
  #define RDMA_MIGRATION_HELPER "scripts/rdma-migration-helper.sh"
  static int new_rdma_link(char *buffer, bool ipv6)
  {
@@ -137,6 +157,11 @@ static void test_precopy_rdma_plain_ip(bool ipv6)
  {
      char buffer[128] = {};
  
+    if (!mlock_check()) {
+        g_test_skip("'ulimit -l' is too small, require 128M");
+        return;
+    }
+
      if (new_rdma_link(buffer, ipv6)) {
          g_test_skip("No rdma link available\n"
                      "# To enable the test:\n"

Reply via email to