From patchwork Mon Mar 10 12:03:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Ryabinin X-Patchwork-Id: 14009710 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9F7DFC282DE for ; Mon, 10 Mar 2025 12:04:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 125C428000B; Mon, 10 Mar 2025 08:04:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0AEBB280001; Mon, 10 Mar 2025 08:04:18 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DF4E828000B; Mon, 10 Mar 2025 08:04:18 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id BBB9A280001 for ; Mon, 10 Mar 2025 08:04:18 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 8E412C0EA7 for ; Mon, 10 Mar 2025 12:04:20 +0000 (UTC) X-FDA: 83205508680.01.45A9D67 Received: from forwardcorp1a.mail.yandex.net (forwardcorp1a.mail.yandex.net [178.154.239.72]) by imf08.hostedemail.com (Postfix) with ESMTP id 7B07016001B for ; Mon, 10 Mar 2025 12:04:18 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=yandex-team.com header.s=default header.b=3N8MAR+n; dmarc=pass (policy=none) header.from=yandex-team.com; spf=pass (imf08.hostedemail.com: domain of arbn@yandex-team.com designates 178.154.239.72 as permitted sender) smtp.mailfrom=arbn@yandex-team.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741608258; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=yQbSR/IJoyQ0CM0slHnQK+Nqd9vWCYt9LC8hjrwd9hg=; b=p8kMd33LAj0TOywa0qj63g9HBTnDzz/2K4s6PZVBtQW6xYnkVLCwUAIxVPqICxBVdiJA/s /AytgosG97wbl+QWAoxwgEXtBCmZIRsBwJc4+Iqy+EWkttezXzxfqJVLFg/lYuZdSYJaIM 7HoRycceil12X6FLvPNy7tk3HU7aB3o= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741608258; a=rsa-sha256; cv=none; b=hAumWROwbqiJQkm+hFYSzNHJs4tk6k70ICe2hk84lhs++I1ildcw7e78woani8+9KH6/ZN bhX9aEyzrCVBoMs+jV3D6f9BgSt7r2IBPfoNMOPiaTvX9yuKvbJ5Wvu1P3earTsR4it8Ug o81/xOj6eolT0B0ZvoANcNU/uhZ8X8U= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=yandex-team.com header.s=default header.b=3N8MAR+n; dmarc=pass (policy=none) header.from=yandex-team.com; spf=pass (imf08.hostedemail.com: domain of arbn@yandex-team.com designates 178.154.239.72 as permitted sender) smtp.mailfrom=arbn@yandex-team.com Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c1f:600c:0:640:a431:0]) by forwardcorp1a.mail.yandex.net (Yandex) with ESMTPS id 1ED3460EB2; Mon, 10 Mar 2025 15:04:17 +0300 (MSK) Received: from dellarbn.yandex.net (unknown [10.214.35.248]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id s3o0lL2FT0U0-HnZRPCd1; Mon, 10 Mar 2025 15:04:16 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.com; s=default; t=1741608256; bh=yQbSR/IJoyQ0CM0slHnQK+Nqd9vWCYt9LC8hjrwd9hg=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=3N8MAR+n+0LltwNhIsUCsS4z9ZdlN3mVjT3YjhVxhQapXN9CB0W8hACTOOcCmQHqZ mfYcPKoqXadSjs+nvISkRWgKPHTOWWT9SOuKc3vWVBZnWWdW6b1pj0AUVYfILPIgOg 7txAX17EwUCueYGi5I8why2gQaWxCynL+viNswMM= From: Andrey Ryabinin To: linux-kernel@vger.kernel.org Cc: Alexander Graf , James Gowans , Mike Rapoport , Andrew Morton , linux-mm@kvack.org, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H . Peter Anvin" , Eric Biederman , kexec@lists.infradead.org, Pratyush Yadav , Jason Gunthorpe , Pasha Tatashin , David Rientjes , Andrey Ryabinin Subject: [PATCH v2 7/7] kstate, test: add test module for testing kstate subsystem. Date: Mon, 10 Mar 2025 13:03:18 +0100 Message-ID: <20250310120318.2124-8-arbn@yandex-team.com> X-Mailer: git-send-email 2.45.3 In-Reply-To: <20250310120318.2124-1-arbn@yandex-team.com> References: <20250310120318.2124-1-arbn@yandex-team.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: 7B07016001B X-Rspamd-Server: rspam08 X-Stat-Signature: iy99gredieog9ioqg86aoirqmj5453ke X-HE-Tag: 1741608258-676211 X-HE-Meta: U2FsdGVkX1+JYgqx4uJJKZTzmW9TWSwI8jpvotT5dcon7y/wMbb3aWYEDNnGyqWo6eJnEItwwIVDoGo75QvLIXxiv6DP36qn/Zvyd26JNvkXBHH66PEf85Rh7hDk5JcwjKdZoUyoi0hICADoELJzttjGUMBC/++tkDPUK89SC5TalrJBXynXa+7szmp65M8B63ei+lEJgWNJRu24K93T41pIsxfe/llcIz6hvWSTeS1JDAVvwARwQjcmLXdP6XcSHlQ+bZIitVX8fUYn7FLjCDGxHWbOjIYqlQvwVowBH41/WLO56HDHyfQrJkX5hMDL5I+6EqufzdCkF2HaK3frpiBUOqzwcCp7vDM3h1mDo97UiNbwtvRMb917CosO4ns2dcXGbjEYXr9kT2B8NV8dniwgrqhHxNIH8GHkJ220Rw90H+lMfA+I4rzA4QpJs6iAKB2csgZWGmckLEF/h37syhuhSYInCyWuyLW7neTWklTjccsx7Q5d2Wqa33NgUrwwzmR3V0XW30KGHc+gK48Ni36w9jAYAhE8mjO0OPorZJmJYZNXEL1OEOOqUHP1IAjso5H1q5y0en/mL42T+ID/ql/4q/bVkXLz/cRlieWux7qsbranZNiKDvCZ9kQlc70NchwJLWNg+yeDu8tJS2ZnXJePM7sx3We0yPl/rj/9Z7O6JOriHx1sS2Rk7E4fkgn19DdZuXBZ/Tscx8BUw4Yayr59xUzBv+2dbQ2g8GQSQsjMNMUqZCl5xtUxqvXpldPu47S9zmxHksNMrFbyqaNiVwLJ3Fxm5pqVikznAPCVanR2iKUPbIYiIr4D3BY093OElVe7zCTCxNT1vzU7sUynOMPi7REo4eLBreReOFNDYN1tMfD6S8GN+cViUcTxWBeyYnJJzr5FK6rOZpcCLsbdUDKXhKBg4pkHu8Il7ejTTOLrOYWgYRbmNA/ci21yTR2VdT/iFOww5eqj/Rbo8XE dsr46JDE ovYKkuljxny97F9WXyXH4rlCGuHCUIPHw2HL0zUaKYWL0UEtWTy3QAPBG6k5pD+wNXtDU4zncBUTh5u73WE1xqW9p8RGbCrYSwtL6ZQwjPAiplxrcaRMfRFbQ6r8py5FBKcCChfyLOqp2VZAPxdnCcSso70QjuHCzjVC3iYDUm2Nm/epzJJ3I0qPkEFD8ozbA6bcODRUY8PUglTxYKbCvzr2QQ24QrBFucP3HNB6R00vCfaoPf69c9iylbNc/r2FqvMkmEjU0tOyObAD4NjfPP0fNTItarV25ZG0f6ClnUfXuq+cRkfzD/RnIYWx4IRUZLoi9gXoxOLMopIJQsLkj1/QA0FB9PIDj8aCd X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: This is simple test and playground useful kstate subsystem development. It contains some structure with different kind of data which migrated across kexec to the new kernel using kstate. Signed-off-by: Andrey Ryabinin --- include/linux/kstate.h | 3 ++ kernel/kstate.c | 5 +++ lib/Makefile | 2 + lib/test_kstate.c | 86 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 lib/test_kstate.c diff --git a/include/linux/kstate.h b/include/linux/kstate.h index 36cfefd87572..0bde76aa4d8f 100644 --- a/include/linux/kstate.h +++ b/include/linux/kstate.h @@ -90,6 +90,7 @@ struct kstate_field { enum kstate_ids { KSTATE_RSVD_MEM_ID = 1, KSTATE_STRUCT_PAGE_ID, + KSTATE_TEST_ID, KSTATE_LAST_ID = -1, }; @@ -132,6 +133,8 @@ extern struct kstate_description page_state; void kstate_init(void); +bool is_kstate_kernel(void); + int kstate_save_state(void); void free_kstate_stream(void); diff --git a/kernel/kstate.c b/kernel/kstate.c index 68a1272abceb..3d9b786da72a 100644 --- a/kernel/kstate.c +++ b/kernel/kstate.c @@ -287,6 +287,11 @@ static void restore_migrate_state(unsigned long kstate_data, static unsigned long kstate_stream_addr = -1; static unsigned long kstate_size; +bool is_kstate_kernel(void) +{ + return kstate_stream_addr != -1; +} + static void __kstate_register(struct kstate_description *state, void *obj, struct state_entry *se) { diff --git a/lib/Makefile b/lib/Makefile index d5cfc7afbbb8..1395b852b58d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -356,6 +356,8 @@ obj-$(CONFIG_PARMAN) += parman.o obj-y += group_cpus.o +obj-$(CONFIG_KSTATE) += test_kstate.o + # GCC library routines obj-$(CONFIG_GENERIC_LIB_ASHLDI3) += ashldi3.o obj-$(CONFIG_GENERIC_LIB_ASHRDI3) += ashrdi3.o diff --git a/lib/test_kstate.c b/lib/test_kstate.c new file mode 100644 index 000000000000..1d9feb017415 --- /dev/null +++ b/lib/test_kstate.c @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include + +static unsigned long ulong_val; +struct kstate_test_data { + int i; + unsigned long *p_ulong; + char s[10]; + struct page *page; +}; + +struct kstate_description test_state = { + .name = "test", + .version_id = 1, + .id = KSTATE_TEST_ID, + .state_list = LIST_HEAD_INIT(test_state.state_list), + .fields = (const struct kstate_field[]) { + KSTATE_BASE_TYPE(i, struct kstate_test_data, int), + KSTATE_BASE_TYPE(s, struct kstate_test_data, char [10]), + KSTATE_POINTER(p_ulong, struct kstate_test_data), + KSTATE_PAGE(page, struct kstate_test_data), + KSTATE_END_OF_LIST() + }, +}; + +static struct kstate_test_data test_data; + +static int init_test_data(void) +{ + struct page *page; + int i; + + test_data.i = 10; + ulong_val = 20; + memcpy(test_data.s, "abcdefghk", sizeof(test_data.s)); + page = alloc_page(GFP_KERNEL); + if (!page) + return -ENOMEM; + + for (i = 0; i < PAGE_SIZE/4; i += 4) + *((u32 *)page_address(page) + i) = 0xdeadbeef; + test_data.page = page; + return 0; +} + +static void validate_test_data(void) +{ + int i; + + if (WARN_ON(test_data.i != 10)) + return; + if (WARN_ON(*test_data.p_ulong != 20)) + return; + if (WARN_ON(strcmp(test_data.s, "abcdefghk") != 0)) + return; + + for (i = 0; i < PAGE_SIZE/4; i += 4) { + u32 val = *((u32 *)page_address(test_data.page) + i); + + WARN_ON(val != 0xdeadbeef); + } +} + +static int __init test_kstate_init(void) +{ + int ret = 0; + + test_data.p_ulong = &ulong_val; + + if (!is_kstate_kernel()) { + ret = init_test_data(); + if (ret) + goto out; + } + + kstate_register(&test_state, &test_data); + + validate_test_data(); + +out: + return ret; +} +__initcall(test_kstate_init);