From 35bb5773a10bb05aa6a85705cb91430f5c0dce44 Mon Sep 17 00:00:00 2001 From: Steven Malis Date: Tue, 15 Jul 2025 17:28:55 -0400 Subject: [PATCH 1/2] kmsg: Log the raw buffer if we fail to parse --- openhcl/ohcldiag-dev/src/main.rs | 8 ++++---- petri/src/tracing.rs | 2 +- support/kmsg/src/lib.rs | 8 ++++---- vmm_tests/vmm_tests/tests/tests/multiarch.rs | 2 +- vmm_tests/vmm_tests/tests/tests/x86_64/openhcl_uefi.rs | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openhcl/ohcldiag-dev/src/main.rs b/openhcl/ohcldiag-dev/src/main.rs index 6276895914..f85334ffa6 100644 --- a/openhcl/ohcldiag-dev/src/main.rs +++ b/openhcl/ohcldiag-dev/src/main.rs @@ -629,10 +629,10 @@ pub fn main() -> anyhow::Result<()> { while let Some(data) = file_stream.next().await { match data { - Ok(data) => { - let message = kmsg::KmsgParsedEntry::new(&data)?; - println!("{}", message.display(is_terminal)); - } + Ok(data) => match kmsg::KmsgParsedEntry::new(&data) { + Ok(message) => println!("{}", message.display(is_terminal)), + Err(e) => println!("Invalid kmsg entry: {e:?}"), + }, Err(err) if reconnect && err.kind() == ErrorKind::ConnectionReset => { if verbose { eprintln!( diff --git a/petri/src/tracing.rs b/petri/src/tracing.rs index e7e5d16fbc..560e157a44 100644 --- a/petri/src/tracing.rs +++ b/petri/src/tracing.rs @@ -344,7 +344,7 @@ pub async fn kmsg_log_task( while let Some(data) = file_stream.next().await { match data { Ok(data) => { - let message = KmsgParsedEntry::new(&data)?; + let message = KmsgParsedEntry::new(&data).unwrap(); let level = kernel_level_to_tracing_level(message.level); log_file.write_entry_fmt(None, level, format_args!("{}", message.display(false))); } diff --git a/support/kmsg/src/lib.rs b/support/kmsg/src/lib.rs index 1c7bde69de..3d92c7c2b2 100644 --- a/support/kmsg/src/lib.rs +++ b/support/kmsg/src/lib.rs @@ -69,12 +69,12 @@ impl Display for EncodedMessage<'_> { /// An error indicating the kmsg entry could not be parsed because it is invalid. #[derive(Debug, Error)] -#[error("invalid kmsg entry")] -pub struct InvalidKmsgEntry; +#[error("invalid kmsg entry: {0:?}")] +pub struct InvalidKmsgEntry<'a>(&'a [u8]); impl<'a> KmsgParsedEntry<'a> { - pub fn new(data: &'a [u8]) -> Result { - Self::new_inner(data).ok_or(InvalidKmsgEntry) + pub fn new(data: &'a [u8]) -> Result> { + Self::new_inner(data).ok_or(InvalidKmsgEntry(data)) } fn new_inner(data: &'a [u8]) -> Option { diff --git a/vmm_tests/vmm_tests/tests/tests/multiarch.rs b/vmm_tests/vmm_tests/tests/tests/multiarch.rs index 895b16c6c9..fb61ab3040 100644 --- a/vmm_tests/vmm_tests/tests/tests/multiarch.rs +++ b/vmm_tests/vmm_tests/tests/tests/multiarch.rs @@ -181,7 +181,7 @@ async fn efi_diagnostics_no_boot( // Search for the message while let Some(data) = kmsg.next().await { let data = data.context("reading kmsg")?; - let msg = kmsg::KmsgParsedEntry::new(&data)?; + let msg = kmsg::KmsgParsedEntry::new(&data).unwrap(); let raw = msg.message.as_raw(); if raw.contains(NO_BOOT_MSG) { return Ok(()); diff --git a/vmm_tests/vmm_tests/tests/tests/x86_64/openhcl_uefi.rs b/vmm_tests/vmm_tests/tests/tests/x86_64/openhcl_uefi.rs index 65d70af197..6a70811e1f 100644 --- a/vmm_tests/vmm_tests/tests/tests/x86_64/openhcl_uefi.rs +++ b/vmm_tests/vmm_tests/tests/tests/x86_64/openhcl_uefi.rs @@ -157,7 +157,7 @@ async fn no_numa_errors(config: PetriVmBuilder) -> Result<( // Search kmsg and make sure we didn't see any errors from the kernel while let Some(data) = kmsg.next().await { let data = data.context("reading kmsg")?; - let msg = kmsg::KmsgParsedEntry::new(&data)?; + let msg = kmsg::KmsgParsedEntry::new(&data).unwrap(); let raw = msg.message.as_raw(); if raw.contains(BAD_PROP) { anyhow::bail!("found bad prop in kmsg"); From 0da600b3fbd775fbf156c4ce0e07ad03fb90cdb4 Mon Sep 17 00:00:00 2001 From: Steven Malis Date: Wed, 16 Jul 2025 11:51:02 -0400 Subject: [PATCH 2/2] Fix windows --- hyperv/tools/hypestv/src/windows/vm.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/hyperv/tools/hypestv/src/windows/vm.rs b/hyperv/tools/hypestv/src/windows/vm.rs index 122be0a881..54c245014c 100644 --- a/hyperv/tools/hypestv/src/windows/vm.rs +++ b/hyperv/tools/hypestv/src/windows/vm.rs @@ -507,9 +507,8 @@ impl VmInner { while let Some(data) = kmsg.next().await { match data { - Ok(data) => { - let message = kmsg::KmsgParsedEntry::new(&data)?; - match &mut target { + Ok(data) => match kmsg::KmsgParsedEntry::new(&data) { + Ok(message) => match &mut target { IoTarget::Printer => { writeln!( self.printer.out(), @@ -522,8 +521,18 @@ impl VmInner { let line = format!("{}\r\n", message.display(true)); console.write_all(line.as_bytes()).await?; } - } - } + }, + Err(e) => match &mut target { + IoTarget::Printer => { + writeln!(self.printer.out(), "[kmsg]: invalid entry: {:?}", e) + .ok(); + } + IoTarget::Console(console) => { + let line = format!("invalid kmsg entry: {:?}\r\n", e); + console.write_all(line.as_bytes()).await?; + } + }, + }, Err(err) if err.kind() == std::io::ErrorKind::ConnectionReset => { break; }