diff --git a/criu.spec b/criu.spec index bebed95..2d555bf 100644 --- a/criu.spec +++ b/criu.spec @@ -6,7 +6,7 @@ %global _lto_cflags %%{nil} Name: criu -Version: 3.17.1 +Version: 3.18 Release: 1%{?dist} Provides: crtools = %{version}-%{release} Obsoletes: crtools <= 1.0-2 @@ -15,11 +15,15 @@ License: GPLv2 URL: http://criu.org/ Source0: https://github.com/checkpoint-restore/criu/archive/v%{version}/criu-%{version}.tar.gz Source1: criu-tmpfiles.conf +Source2: pycriu-setup-py BuildRequires: gcc BuildRequires: systemd BuildRequires: libnet-devel BuildRequires: protobuf-devel protobuf-c-devel %{py_prefix}-devel libnl3-devel libcap-devel BuildRequires: asciidoc xmlto +BuildRequires: %{py_prefix}-pip +BuildRequires: %{py_prefix}-setuptools +BuildRequires: %{py_prefix}-wheel BuildRequires: perl-interpreter BuildRequires: libselinux-devel BuildRequires: gnutls-devel @@ -29,6 +33,8 @@ Recommends: tar Patch0: 0001-Fix-building-with-annobin.patch Patch1: criu.pc.patch +# Fix to work on CPUs with larger XSAVE area (Sapphire Rapids) +Patch2: https://github.com/checkpoint-restore/criu/commit/d739260c57576c636759afb312340fa3827312f6.patch # user-space and kernel changes are only available for x86_64, arm, # ppc64le, aarch64 and s390x @@ -74,8 +80,9 @@ their content in human-readable form. %prep %setup -q -%patch0 -p1 -%patch1 -p1 +%patch -P 0 -p1 +%patch -P 1 -p1 +%patch -P 2 -p1 %build # %{?_smp_mflags} does not work @@ -84,6 +91,10 @@ CFLAGS+=`echo %{optflags} | sed -e 's,-fstack-protector\S*,,g'` make V=1 WERROR= make docs V=1 %install +cp %{SOURCE2} lib/py/setup.py +sed -e "s,--upgrade --force-reinstall,--disable-pip-version-check --progress-bar off --verbose,g; + s,\./crit,./crit lib/py,g;" -i lib/Makefile +rm -f crit/pyproject.toml make install-criu DESTDIR=$RPM_BUILD_ROOT PREFIX=%{_prefix} LIBDIR=%{_libdir} make install-lib DESTDIR=$RPM_BUILD_ROOT PREFIX=%{_prefix} LIBDIR=%{_libdir} PYTHON=%{py_binary} make install-man DESTDIR=$RPM_BUILD_ROOT PREFIX=%{_prefix} LIBDIR=%{_libdir} @@ -119,13 +130,18 @@ rm $RPM_BUILD_ROOT%{_mandir}/man1/criu-ns.1* %files -n %{py_prefix}-%{name} %{python3_sitelib}/pycriu/* -%{python3_sitelib}/*egg-info +%{python3_sitelib}/pycriu-%{version}.dist-info %files -n crit %{_bindir}/crit +%{python3_sitelib}/crit-%{version}.dist-info %doc %{_mandir}/man1/crit.1* %changelog +* Tue Apr 25 2034 Adrian Reber - 3.18-1 +- Update to 3.18 +- Apply patch from upstream to support newer CPUs + * Fri Mar 31 2023 Jindrich Novy - 3.17.1-1 - update to https://github.com/checkpoint-restore/criu/releases/tag/v3.17.1 - Related: #2176063 diff --git a/d739260c57576c636759afb312340fa3827312f6.patch b/d739260c57576c636759afb312340fa3827312f6.patch new file mode 100644 index 0000000..7847bb5 --- /dev/null +++ b/d739260c57576c636759afb312340fa3827312f6.patch @@ -0,0 +1,74 @@ +From d739260c57576c636759afb312340fa3827312f6 Mon Sep 17 00:00:00 2001 +From: Adrian Reber +Date: Mon, 24 Apr 2023 09:28:19 +0200 +Subject: [PATCH] compel: support XSAVE on newer Intel CPUs + +Newer Intel CPUs (Sapphire Rapids) have a much larger xsave area than +before. Looking at older CPUs I see 2440 bytes. + + # cpuid -1 -l 0xd -s 0 + ... + bytes required by XSAVE/XRSTOR area = 0x00000988 (2440) + +On newer CPUs (Sapphire Rapids) it grows to 11008 bytes. + + # cpuid -1 -l 0xd -s 0 + ... + bytes required by XSAVE/XRSTOR area = 0x00002b00 (11008) + +This increase the xsave area from one page to four pages. + +Without this patch the fpu03 test fails, with this patch it works again. + +Signed-off-by: Adrian Reber +--- + .../arch/x86/src/lib/include/uapi/asm/fpu.h | 28 +++++++++++++++++-- + 1 file changed, 26 insertions(+), 2 deletions(-) + +diff --git a/compel/arch/x86/src/lib/include/uapi/asm/fpu.h b/compel/arch/x86/src/lib/include/uapi/asm/fpu.h +index bd3b0cbd5c..8c83dd9ae4 100644 +--- a/compel/arch/x86/src/lib/include/uapi/asm/fpu.h ++++ b/compel/arch/x86/src/lib/include/uapi/asm/fpu.h +@@ -21,7 +21,28 @@ + #define XSTATE_YMM 0x4 + + #define FXSAVE_SIZE 512 +-#define XSAVE_SIZE 4096 ++/* ++ * This used to be 4096 (one page). There is a comment below concerning ++ * this size: ++ * "One page should be enough for the whole xsave state ;-)" ++ * Which is kind of funny as it is no longer enough ;-) ++ * ++ * Older CPUs: ++ * # cpuid -1 -l 0xd -s 0 ++ * ... ++ * bytes required by XSAVE/XRSTOR area = 0x00000988 (2440) ++ * ++ * Newer CPUs (Sapphire Rapids): ++ * # cpuid -1 -l 0xd -s 0 ++ * ... ++ * bytes required by XSAVE/XRSTOR area = 0x00002b00 (11008) ++ * ++ * So one page is no longer enough... But: ++ * ++ * Four pages should be enough for the whole xsave state ;-) ++ */ ++ ++#define XSAVE_SIZE 4*4096 + + #define XSAVE_HDR_SIZE 64 + #define XSAVE_HDR_OFFSET FXSAVE_SIZE +@@ -235,8 +256,11 @@ struct pkru_state { + * + * + * One page should be enough for the whole xsave state ;-) ++ * ++ * Of course it was not ;-) Now using four pages... ++ * + */ +-#define EXTENDED_STATE_AREA_SIZE (4096 - sizeof(struct i387_fxsave_struct) - sizeof(struct xsave_hdr_struct)) ++#define EXTENDED_STATE_AREA_SIZE (XSAVE_SIZE - sizeof(struct i387_fxsave_struct) - sizeof(struct xsave_hdr_struct)) + + /* + * cpu requires it to be 64 byte aligned diff --git a/pycriu-setup-py b/pycriu-setup-py new file mode 100644 index 0000000..6bfe3b1 --- /dev/null +++ b/pycriu-setup-py @@ -0,0 +1,30 @@ +import os +from setuptools import setup, find_packages + +print(find_packages('.')) + +def get_version(): + version = '0.0.1' + env = os.environ + if 'CRIU_VERSION_MAJOR' in env and 'CRIU_VERSION_MINOR' in env: + version = '{}.{}'.format( + env['CRIU_VERSION_MAJOR'], + env['CRIU_VERSION_MINOR'] + ) + if 'CRIU_VERSION_SUBLEVEL' in env and env['CRIU_VERSION_SUBLEVEL']: + version += '.' + env['CRIU_VERSION_SUBLEVEL'] + return version + + +setup( + name='pycriu', + version=get_version(), + description='CRiu Image Tool', + author='CRIU team', + author_email='criu@openvz.org', + license='GPLv2', + url='https://github.com/checkpoint-restore/criu', + packages=['pycriu','pycriu.images'], + package_dir = {'pycriu': '.', 'pycriu.images':'images'} + +) diff --git a/sources b/sources index 7a3abcc..045b206 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (criu-3.17.1.tar.gz) = cd093fad266ad29f1d8001b38762acb46d975b3fb94a19cd40c00a6c62d4a9cbc9ababddfc7b3cfed14e4d7ffbbd982eca05932ef4884c2c3ad4deb330bcccd0 +SHA512 (criu-3.18.tar.gz) = 3d15554ebd2d08c8904c23b0aba00d505891c14caa4790c2fd12ad6b20bf4058fd210f1d03fd63aacc5ad8bc47e341396b48abbeb474f1fd43c3023fd1ff9171 diff --git a/tests/run-podman-checkpoint-restore.sh b/tests/run-podman-checkpoint-restore.sh index b606d9b..395b64d 100755 --- a/tests/run-podman-checkpoint-restore.sh +++ b/tests/run-podman-checkpoint-restore.sh @@ -9,6 +9,8 @@ if ! crun checkpoint --help; then exit 0 fi +rpm -q crun podman criu + echo "Start container" podman --log-level debug run -d quay.io/adrianreber/counter @@ -18,12 +20,14 @@ podman ps echo "Connect to the container" curl `podman inspect -l | jq -r '.[0].NetworkSettings.IPAddress'`:8088 +CTR_ID=$(podman inspect -l --format '{{.Id}}') + echo "Checkpoint container" podman --log-level debug container checkpoint -l podman ps -a echo "Restore container" -podman --log-level debug container restore -l +podman --log-level debug container restore "$CTR_ID" podman ps -a echo "Check if we can connect to the restored container"