All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bruce Ashfield <bruce.ashfield@gmail.com>
To: guocai.he.cn@windriver.com
Cc: meta-virtualization@lists.yoctoproject.org
Subject: Re: [meta-virtualization][carthgap][PATCH 1/1] criu: Adjust to glibc __rseq_size semantic change
Date: Wed, 2 Apr 2025 02:21:11 +0000	[thread overview]
Message-ID: <Z-yfF0ZdirCQvT9e@gmail.com> (raw)
In-Reply-To: <20250325084039.294966-1-guocai.he.cn@windriver.com>


merged.

Bruce

In message: [meta-virtualization][carthgap][PATCH 1/1] criu: Adjust to glibc __rseq_size semantic change
on 25/03/2025 guocai he via lists.yoctoproject.org wrote:

> From: Guocai He <guocai.he.cn@windriver.com>
> 
> On criu version 3.19.0:
> When use "criu restore -d -D checkpoint" to restore, the error is:
> 1272: Error (criu/cr-restore.c:1498): 1295 killed by signal 11: Segmentation fault
> 
> The root casue is that the glibc updated and criu should adjust to glibc __rseq_size semantic change.
> 
> Signed-off-by: Guocai He <guocai.he.cn@windriver.com>
> ---
>  recipes-containers/criu/criu_git.bb           |  3 +-
>  ...to-glibc-__rseq_size-semantic-change.patch | 94 +++++++++++++++++++
>  2 files changed, 96 insertions(+), 1 deletion(-)
>  create mode 100644 recipes-containers/criu/files/0006-criu-Adjust-to-glibc-__rseq_size-semantic-change.patch
> 
> diff --git a/recipes-containers/criu/criu_git.bb b/recipes-containers/criu/criu_git.bb
> index 09503624..cccd3e3c 100644
> --- a/recipes-containers/criu/criu_git.bb
> +++ b/recipes-containers/criu/criu_git.bb
> @@ -21,7 +21,8 @@ SRC_URI = "git://github.com/checkpoint-restore/criu.git;branch=master;protocol=h
>             file://0002-criu-Change-libraries-install-directory.patch \
>             file://0003-crit-pycriu-build-and-install-wheels.patch \
>             file://0004-pycriu-attr-pycriu.version.__version__.patch \
> -	   file://0005-pycriu-skip-dependency-check-during-build.patch \
> +           file://0005-pycriu-skip-dependency-check-during-build.patch \
> +           file://0006-criu-Adjust-to-glibc-__rseq_size-semantic-change.patch \
>             "
>  
>  COMPATIBLE_HOST = "(x86_64|arm|aarch64).*-linux"
> diff --git a/recipes-containers/criu/files/0006-criu-Adjust-to-glibc-__rseq_size-semantic-change.patch b/recipes-containers/criu/files/0006-criu-Adjust-to-glibc-__rseq_size-semantic-change.patch
> new file mode 100644
> index 00000000..29715614
> --- /dev/null
> +++ b/recipes-containers/criu/files/0006-criu-Adjust-to-glibc-__rseq_size-semantic-change.patch
> @@ -0,0 +1,94 @@
> +From 123e558a4bfa8964f9e55d0c0ecc080e6c3a38f3 Mon Sep 17 00:00:00 2001
> +From: Florian Weimer <fweimer@redhat.com>
> +Date: Wed, 10 Jul 2024 18:34:50 +0200
> +Subject: [PATCH] criu: Adjust to glibc __rseq_size semantic change
> +
> +In commit 2e456ccf0c34a056e3ccafac4a0c7effef14d918 ("Linux: Make
> +__rseq_size useful for feature detection (bug 31965)") glibc 2.40
> +changed the meaning of __rseq_size slightly: it is now the size
> +of the active/feature area (20 bytes initially), and not the size
> +of the entire initially defined struct (32 bytes including padding).
> +The reason for the change is that the size including padding does not
> +allow detection of newly added features while previously unused
> +padding is consumed.
> +
> +The prep_libc_rseq_info change in criu/cr-restore.c is not necessary
> +on kernels which have full ptrace support for obtaining rseq
> +information because the code is not used.  On older kernels, it is
> +a correctness fix because with size 20 (the new value), rseq
> +registeration would fail.
> +
> +The two other changes are required to make rseq unregistration work
> +in tests.
> +
> +Upstream-Status: Backport [https://github.com/checkpoint-restore/criu/commit/
> +089345f77a34d1bc7ef146d650636afcd3cdda21]
> +
> +Signed-off-by: Florian Weimer <fweimer@redhat.com>
> +Signed-off-by: Guocai He <guocai.he.cn@windriver.com>
> +---
> + criu/cr-restore.c             | 8 ++++++++
> + test/zdtm/static/rseq00.c     | 5 ++++-
> + test/zdtm/transition/rseq01.c | 5 ++++-
> + 3 files changed, 16 insertions(+), 2 deletions(-)
> +
> +diff --git a/criu/cr-restore.c b/criu/cr-restore.c
> +index 270049721..80eb13743 100644
> +--- a/criu/cr-restore.c
> ++++ b/criu/cr-restore.c
> +@@ -3103,7 +3103,15 @@ static void prep_libc_rseq_info(struct rst_rseq_param *rseq)
> + 	if (!kdat.has_ptrace_get_rseq_conf) {
> + #if defined(__GLIBC__) && defined(RSEQ_SIG)
> + 		rseq->rseq_abi_pointer = encode_pointer(__criu_thread_pointer() + __rseq_offset);
> ++		/*
> ++		 * Current glibc reports the feature/active size in
> ++		 * __rseq_size, not the size passed to the kernel.
> ++		 * This could be 20, but older kernels expect 32 for
> ++		 * the size argument even if only 20 bytes are used.
> ++		 */
> + 		rseq->rseq_abi_size = __rseq_size;
> ++		if (rseq->rseq_abi_size < 32)
> ++			rseq->rseq_abi_size = 32;
> + 		rseq->signature = RSEQ_SIG;
> + #else
> + 		rseq->rseq_abi_pointer = 0;
> +diff --git a/test/zdtm/static/rseq00.c b/test/zdtm/static/rseq00.c
> +index 471ad6a43..7add7801e 100644
> +--- a/test/zdtm/static/rseq00.c
> ++++ b/test/zdtm/static/rseq00.c
> +@@ -46,12 +46,15 @@ static inline void *__criu_thread_pointer(void)
> + static inline void unregister_glibc_rseq(void)
> + {
> + 	struct rseq *rseq = (struct rseq *)((char *)__criu_thread_pointer() + __rseq_offset);
> ++	unsigned int size = __rseq_size;
> + 
> + 	/* hack: mark glibc rseq structure as failed to register */
> + 	rseq->cpu_id = RSEQ_CPU_ID_REGISTRATION_FAILED;
> + 
> + 	/* unregister rseq */
> +-	syscall(__NR_rseq, (void *)rseq, __rseq_size, 1, RSEQ_SIG);
> ++	if (__rseq_size < 32)
> ++		size = 32;
> ++	syscall(__NR_rseq, (void *)rseq, size, 1, RSEQ_SIG);
> + }
> + #else
> + static inline void unregister_glibc_rseq(void)
> +diff --git a/test/zdtm/transition/rseq01.c b/test/zdtm/transition/rseq01.c
> +index 0fbcc2dca..08a7a8e1a 100644
> +--- a/test/zdtm/transition/rseq01.c
> ++++ b/test/zdtm/transition/rseq01.c
> +@@ -33,7 +33,10 @@ static inline void *thread_pointer(void)
> + static inline void unregister_old_rseq(void)
> + {
> + 	/* unregister rseq */
> +-	syscall(__NR_rseq, (void *)((char *)thread_pointer() + __rseq_offset), __rseq_size, 1, RSEQ_SIG);
> ++	unsigned int size = __rseq_size;
> ++	if (__rseq_size < 32)
> ++		size = 32;
> ++	syscall(__NR_rseq, (void *)((char *)thread_pointer() + __rseq_offset), size, 1, RSEQ_SIG);
> + }
> + #else
> + static inline void unregister_old_rseq(void)
> +-- 
> +2.34.1
> +
> -- 
> 2.34.1
> 

> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#9173): https://lists.yoctoproject.org/g/meta-virtualization/message/9173
> Mute This Topic: https://lists.yoctoproject.org/mt/111893502/1050810
> Group Owner: meta-virtualization+owner@lists.yoctoproject.org
> Unsubscribe: https://lists.yoctoproject.org/g/meta-virtualization/unsub [bruce.ashfield@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
> 



      reply	other threads:[~2025-04-02  2:21 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-25  8:40 [meta-virtualization][carthgap][PATCH 1/1] criu: Adjust to glibc __rseq_size semantic change guocai.he.cn
2025-04-02  2:21 ` Bruce Ashfield [this message]

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=Z-yfF0ZdirCQvT9e@gmail.com \
    --to=bruce.ashfield@gmail.com \
    --cc=guocai.he.cn@windriver.com \
    --cc=meta-virtualization@lists.yoctoproject.org \
    /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.