meta-virtualization.lists.yoctoproject.org archive mirror
 help / color / mirror / Atom feed
* [meta-virtualization][carthgap][PATCH 1/1] criu: Adjust to glibc __rseq_size semantic change
@ 2025-03-25  8:40 guocai.he.cn
  2025-04-02  2:21 ` Bruce Ashfield
  0 siblings, 1 reply; 2+ messages in thread
From: guocai.he.cn @ 2025-03-25  8:40 UTC (permalink / raw)
  To: meta-virtualization

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



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [meta-virtualization][carthgap][PATCH 1/1] criu: Adjust to glibc __rseq_size semantic change
  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
  0 siblings, 0 replies; 2+ messages in thread
From: Bruce Ashfield @ 2025-04-02  2:21 UTC (permalink / raw)
  To: guocai.he.cn; +Cc: meta-virtualization


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]
> -=-=-=-=-=-=-=-=-=-=-=-
> 



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-04-02  2:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).