From: Pratyush Yadav <pratyush@kernel.org>
To: Pasha Tatashin <pasha.tatashin@soleen.com>,
Mike Rapoport <rppt@kernel.org>,
Pratyush Yadav <pratyush@kernel.org>,
Shuah Khan <shuah@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Usama Arif <usama.arif@linux.dev>
Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-mm@kvack.org
Subject: [PATCH v3 3/6] selftests/liveupdate: add test for memfd content preservation
Date: Sat, 4 Apr 2026 10:24:46 +0000 [thread overview]
Message-ID: <20260404102452.4091740-4-pratyush@kernel.org> (raw)
In-Reply-To: <20260404102452.4091740-1-pratyush@kernel.org>
From: "Pratyush Yadav (Google)" <pratyush@kernel.org>
Add a selftest that makes sure the contents of a memfd are correctly
preserved across a live update. In stage 1, create a memfd and fill it
with random data, and preserve it. Save the random data to the file
system. This will be used by stage 2 to verify the contents are correct.
In stage 2, retrieve the memfd and compare its contents with the
contents saved on the file system.
Signed-off-by: Pratyush Yadav <ptyadav@amazon.de>
Signed-off-by: Pratyush Yadav (Google) <pratyush@kernel.org>
---
tools/testing/selftests/liveupdate/Makefile | 1 +
.../testing/selftests/liveupdate/luo_memfd.c | 80 +++++++++++++++++++
2 files changed, 81 insertions(+)
diff --git a/tools/testing/selftests/liveupdate/Makefile b/tools/testing/selftests/liveupdate/Makefile
index 051daae55eec..8e2eb6500c07 100644
--- a/tools/testing/selftests/liveupdate/Makefile
+++ b/tools/testing/selftests/liveupdate/Makefile
@@ -13,6 +13,7 @@ TEST_FILES += do_kexec.sh
include ../lib.mk
CFLAGS += $(KHDR_INCLUDES)
+CFLAGS += -I$(top_srcdir)/tools/include
CFLAGS += -Wall -O2 -Wno-unused-function
CFLAGS += -MD
diff --git a/tools/testing/selftests/liveupdate/luo_memfd.c b/tools/testing/selftests/liveupdate/luo_memfd.c
index c1f3275963dc..068c7f30c4de 100644
--- a/tools/testing/selftests/liveupdate/luo_memfd.c
+++ b/tools/testing/selftests/liveupdate/luo_memfd.c
@@ -3,6 +3,9 @@
/*
* Copyright (c) 2026, Google LLC.
* Pratyush Yadav (Google) <pratyush@kernel.org>
+ *
+ * Copyright (C) 2025 Amazon.com Inc. or its affiliates.
+ * Pratyush Yadav <ptyadav@amazon.de>
*/
/*
@@ -11,11 +14,14 @@
#include <errno.h>
#include <fcntl.h>
+#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
+#include <sys/mman.h>
#include <unistd.h>
#include <linux/liveupdate.h>
+#include <linux/sizes.h>
#include "../kselftest.h"
#include "../kselftest_harness.h"
@@ -25,9 +31,83 @@
#define STATE_SESSION_NAME "luo-state"
#define STATE_MEMFD_TOKEN 1
+#define MEMFD_DATA_SESSION_NAME "memfd_data_session"
+#define MEMFD_DATA_TOKEN 1
+#define MEMFD_DATA_BUFFER_SIZE SZ_1M
+#define MEMFD_DATA_FS_COPY "memfd_data_fs_copy.bin"
+
static int luo_fd = -1;
static int stage;
+static void memfd_data_stage_1(struct __test_metadata *_metadata)
+{
+ int fd, session;
+ char *buffer;
+ struct liveupdate_session_preserve_fd preserve_arg = { .size = sizeof(preserve_arg) };
+
+ buffer = malloc(MEMFD_DATA_BUFFER_SIZE);
+ ASSERT_NE(buffer, NULL);
+
+ session = luo_create_session(luo_fd, MEMFD_DATA_SESSION_NAME);
+ ASSERT_GE(session, 0);
+
+ fd = create_random_memfd("memfd_data", buffer, MEMFD_DATA_BUFFER_SIZE);
+ ASSERT_GE(fd, 0);
+
+ ASSERT_EQ(save_test_data(MEMFD_DATA_FS_COPY, buffer, MEMFD_DATA_BUFFER_SIZE), 0);
+
+ preserve_arg.fd = fd;
+ preserve_arg.token = MEMFD_DATA_TOKEN;
+ ASSERT_GE(ioctl(session, LIVEUPDATE_SESSION_PRESERVE_FD, &preserve_arg), 0);
+
+ daemonize_and_wait();
+}
+
+static void memfd_data_stage_2(struct __test_metadata *_metadata)
+{
+ int fd, session;
+ char *buffer;
+ struct liveupdate_session_retrieve_fd retrieve_arg = { .size = sizeof(retrieve_arg) };
+
+ buffer = malloc(MEMFD_DATA_BUFFER_SIZE);
+ ASSERT_NE(buffer, NULL);
+
+ session = luo_retrieve_session(luo_fd, MEMFD_DATA_SESSION_NAME);
+ ASSERT_GE(session, 0);
+
+ ASSERT_EQ(load_test_data(MEMFD_DATA_FS_COPY, buffer, MEMFD_DATA_BUFFER_SIZE), 0);
+
+ retrieve_arg.token = MEMFD_DATA_TOKEN;
+ ASSERT_GE(ioctl(session, LIVEUPDATE_SESSION_RETRIEVE_FD, &retrieve_arg), 0);
+ fd = retrieve_arg.fd;
+ ASSERT_GE(fd, 0);
+
+ ASSERT_EQ(verify_fd_content_read(fd, buffer, MEMFD_DATA_BUFFER_SIZE), 0);
+
+ ASSERT_EQ(luo_session_finish(session), 0);
+}
+
+/*
+ * Test that a memfd with its data is preserved across live update.
+ */
+TEST(memfd_data)
+{
+ if (cwd_is_tmpfs())
+ SKIP(return, "test saves data to rootfs, cannot run on tmpfs");
+
+ switch (stage) {
+ case 1:
+ memfd_data_stage_1(_metadata);
+ break;
+ case 2:
+ memfd_data_stage_2(_metadata);
+ break;
+ default:
+ TH_LOG("Unknown stage %d\n", stage);
+ ASSERT_FALSE(true);
+ }
+}
+
int main(int argc, char *argv[])
{
int expected_stage = 0;
--
2.53.0.1213.gd9a14994de-goog
next prev parent reply other threads:[~2026-04-04 10:25 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-04 10:24 [PATCH v3 0/6] selftests/liveupdate: add memfd tests Pratyush Yadav
2026-04-04 10:24 ` [PATCH v3 1/6] selftests/liveupdate: add framework for " Pratyush Yadav
2026-04-04 10:24 ` [PATCH v3 2/6] selftests/liveupdate: add helper functions " Pratyush Yadav
2026-04-04 17:53 ` Zhu Yanjun
2026-04-05 7:34 ` Pratyush Yadav
2026-04-05 16:30 ` Zhu Yanjun
2026-04-07 10:30 ` Pratyush Yadav
2026-04-04 10:24 ` Pratyush Yadav [this message]
2026-04-04 10:24 ` [PATCH v3 4/6] selftests/liveupdate: add test for zero-size memfd preservation Pratyush Yadav
2026-04-04 10:24 ` [PATCH v3 5/6] selftests/liveupdate: add test for operations on a preserved memfd Pratyush Yadav
2026-04-04 10:24 ` [PATCH v3 6/6] selftests/liveupdate: add fallocate test for memfd Pratyush Yadav
2026-04-28 19:31 ` [PATCH v3 0/6] selftests/liveupdate: add memfd tests Pasha Tatashin
2026-04-29 13:20 ` Pratyush Yadav
2026-05-01 19:08 ` Pasha Tatashin
2026-05-05 16:32 ` Pasha Tatashin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260404102452.4091740-4-pratyush@kernel.org \
--to=pratyush@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=pasha.tatashin@soleen.com \
--cc=rppt@kernel.org \
--cc=shuah@kernel.org \
--cc=usama.arif@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.