From 9a45d754bfec8458d5f5a0bf42e5fb358d0975a7 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Sun, 23 Jun 2024 05:57:01 -0700 Subject: [PATCH] chore(xenplatform): elf loader should async load the file (#197) * fix(build): remove unused environment variables * chore(xenplatform): elf loader should async load the file --- .github/workflows/nightly.yml | 6 ----- crates/xen/xenplatform/src/elfloader.rs | 29 ++++++++++++++++--------- crates/xen/xenplatform/src/error.rs | 2 ++ hack/dist/bundle.sh | 5 ----- resources/bundle/install.sh | 2 +- resources/openrc/kratad | 2 +- resources/systemd/kratad.service | 2 +- resources/systemd/kratanet.service | 2 +- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index e8ca09c..d783116 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -27,16 +27,12 @@ jobs: targets: "${{ matrix.arch }}-unknown-linux-gnu,${{ matrix.arch }}-unknown-linux-musl" - run: ./hack/ci/install-linux-deps.sh - run: ./hack/dist/bundle.sh - env: - KRATA_KERNEL_BUILD_JOBS: "5" - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: krata-bundle-systemd-${{ matrix.arch }} path: "target/dist/bundle-systemd-${{ matrix.arch }}.tgz" compression-level: 0 - run: ./hack/dist/deb.sh - env: - KRATA_KERNEL_BUILD_SKIP: "1" - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: krata-debian-${{ matrix.arch }} @@ -51,8 +47,6 @@ jobs: path: "target/dist/*_${{ matrix.arch }}.apk" compression-level: 0 - run: ./hack/os/build.sh - env: - KRATA_KERNEL_BUILD_SKIP: "1" - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: krata-os-${{ matrix.arch }} diff --git a/crates/xen/xenplatform/src/elfloader.rs b/crates/xen/xenplatform/src/elfloader.rs index 8b2509e..354d6cb 100644 --- a/crates/xen/xenplatform/src/elfloader.rs +++ b/crates/xen/xenplatform/src/elfloader.rs @@ -16,10 +16,12 @@ use slice_copy::copy; use std::collections::HashMap; use std::io::{BufReader, Read}; use std::mem::size_of; +use std::sync::Arc; use xz2::bufread::XzDecoder; +#[derive(Clone)] pub struct ElfImageLoader { - data: Vec, + data: Arc>, } fn xen_note_value_as_u64(endian: AnyEndian, value: &[u8]) -> Option { @@ -59,7 +61,9 @@ fn xen_note_value_as_u64(endian: AnyEndian, value: &[u8]) -> Option { impl ElfImageLoader { pub fn new(data: Vec) -> ElfImageLoader { - ElfImageLoader { data } + ElfImageLoader { + data: Arc::new(data), + } } pub fn load_gz(data: &[u8]) -> Result { @@ -122,15 +126,8 @@ impl ElfImageLoader { Err(Error::ElfCompressionUnknown) } -} -struct ElfNoteValue { - value: u64, -} - -#[async_trait::async_trait] -impl BootImageLoader for ElfImageLoader { - async fn parse(&self, hvm: bool) -> Result { + fn parse_sync(&self, hvm: bool) -> Result { let elf = ElfBytes::::minimal_parse(self.data.as_slice())?; let headers = elf.section_headers().ok_or(Error::ElfInvalidImage)?; let mut linux_notes: HashMap> = HashMap::new(); @@ -250,6 +247,18 @@ impl BootImageLoader for ElfImageLoader { }; Ok(image_info) } +} + +struct ElfNoteValue { + value: u64, +} + +#[async_trait::async_trait] +impl BootImageLoader for ElfImageLoader { + async fn parse(&self, hvm: bool) -> Result { + let loader = self.clone(); + tokio::task::spawn_blocking(move || loader.parse_sync(hvm)).await? + } async fn load(&self, image_info: &BootImageInfo, dst: &mut [u8]) -> Result<()> { let elf = ElfBytes::::minimal_parse(self.data.as_slice())?; diff --git a/crates/xen/xenplatform/src/error.rs b/crates/xen/xenplatform/src/error.rs index 72d85f7..a90e697 100644 --- a/crates/xen/xenplatform/src/error.rs +++ b/crates/xen/xenplatform/src/error.rs @@ -38,6 +38,8 @@ pub enum Error { GenericError(String), #[error("failed to parse int: {0}")] ParseIntError(#[from] std::num::ParseIntError), + #[error("failed to join async task: {0}")] + AsyncJoinError(#[from] tokio::task::JoinError), } pub type Result = std::result::Result; diff --git a/hack/dist/bundle.sh b/hack/dist/bundle.sh index b3838b4..4988919 100755 --- a/hack/dist/bundle.sh +++ b/hack/dist/bundle.sh @@ -4,11 +4,6 @@ set -e # shellcheck source-path=SCRIPTDIR source=common.sh . "$(dirname "${0}")/common.sh" -if [ -z "${KRATA_KERNEL_BUILD_JOBS}" ] -then - KRATA_KERNEL_BUILD_JOBS="2" -fi - TARGET_ARCH="$("${KRATA_DIR}/hack/build/arch.sh")" BUNDLE_TAR="${OUTPUT_DIR}/bundle-systemd-${TARGET_ARCH}.tgz" rm -f "${BUNDLE_TAR}" diff --git a/resources/bundle/install.sh b/resources/bundle/install.sh index 82ab839..32946a1 100755 --- a/resources/bundle/install.sh +++ b/resources/bundle/install.sh @@ -7,7 +7,7 @@ remove_service_if_exists() { UNIT_PATH="$(systemctl show -P FragmentPath "${1}")" if [ -f "${UNIT_PATH}" ] then - echo "[WARN] disabling removing systemd unit ${UNIT_PATH}" > /dev/stderr + echo "[WARN] disabling and removing systemd unit ${UNIT_PATH}" > /dev/stderr systemctl disable --now "${1}" || true rm "${UNIT_PATH}" fi diff --git a/resources/openrc/kratad b/resources/openrc/kratad index de3920a..4c480ee 100644 --- a/resources/openrc/kratad +++ b/resources/openrc/kratad @@ -1,5 +1,5 @@ #!/sbin/openrc-run -description="Krata Control Daemon" +description="Krata Isolation Engine" command="/usr/libexec/kratad" supervisor="supervise-daemon" output_log="/var/log/kratad.log" diff --git a/resources/systemd/kratad.service b/resources/systemd/kratad.service index 4ea46d6..e9e2b49 100644 --- a/resources/systemd/kratad.service +++ b/resources/systemd/kratad.service @@ -1,5 +1,5 @@ [Unit] -Description=Krata Control Daemon +Description=Krata Isolation Engine [Service] Restart=on-failure diff --git a/resources/systemd/kratanet.service b/resources/systemd/kratanet.service index a546158..54fd6f4 100644 --- a/resources/systemd/kratanet.service +++ b/resources/systemd/kratanet.service @@ -1,5 +1,5 @@ [Unit] -Description=Krata Networking Daemon +Description=Krata Networking Engine [Service] Wants=kratad.service