> On 12/31/2025 12:14 PM [email protected] wrote: > > > From: Michael Kelley <[email protected]> > > hv_kmsg_dump() currently skips the panic notification entirely if it > doesn't get any message bytes to pass to Hyper-V due to an error from > kmsg_dump_get_buffer(). Skipping the notification is undesirable because > it leaves the Hyper-V host uncertain about the state of a panic'ed guest. > > Fix this by always doing the panic notification, even if bytes_written > is zero. Also ensure that bytes_written is initialized, which fixes a > kernel test robot warning. The warning is actually bogus because > kmsg_dump_get_buffer() happens to set bytes_written even if it fails, and > in the kernel test robot's CONFIG_PRINTK not set case, hv_kmsg_dump() is > never called. But do the initialization for robustness and to quiet the > static checker. > > Fixes: 9c318a1d9b50 ("Drivers: hv: move panic report code from vmbus to hv > early init code") > Reported-by: kernel test robot <[email protected]> > Reported-by: Dan Carpenter <[email protected]> > Closes: https://lore.kernel.org/all/[email protected]/ > Signed-off-by: Michael Kelley <[email protected]>
Reviewed-by: Roman Kisel <[email protected]> > --- > Changes in v2: > * Reworked patch to focus on always sending the panic message, with > resolving the uninitialized variable report as a side effect. See > discussion on v1 of the patch [1] > > [1] > https://lore.kernel.org/linux-hyperv/[email protected]/ > > drivers/hv/hv_common.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c > index 0a3ab7efed46..f1c17fb60dc1 100644 > --- a/drivers/hv/hv_common.c > +++ b/drivers/hv/hv_common.c > @@ -195,13 +195,15 @@ static void hv_kmsg_dump(struct kmsg_dumper *dumper, > > /* > * Write dump contents to the page. No need to synchronize; panic should > - * be single-threaded. > + * be single-threaded. Ignore failures from kmsg_dump_get_buffer() since > + * panic notification should be done even if there is no message data. > + * Don't assume bytes_written is set in case of failure, so initialize > it. > */ > kmsg_dump_rewind(&iter); > - kmsg_dump_get_buffer(&iter, false, hv_panic_page, HV_HYP_PAGE_SIZE, > + bytes_written = 0; > + (void)kmsg_dump_get_buffer(&iter, false, hv_panic_page, > HV_HYP_PAGE_SIZE, > &bytes_written); > - if (!bytes_written) > - return; > + > /* > * P3 to contain the physical address of the panic page & P4 to > * contain the size of the panic data in that page. Rest of the > @@ -210,7 +212,7 @@ static void hv_kmsg_dump(struct kmsg_dumper *dumper, > hv_set_msr(HV_MSR_CRASH_P0, 0); > hv_set_msr(HV_MSR_CRASH_P1, 0); > hv_set_msr(HV_MSR_CRASH_P2, 0); > - hv_set_msr(HV_MSR_CRASH_P3, virt_to_phys(hv_panic_page)); > + hv_set_msr(HV_MSR_CRASH_P3, bytes_written ? virt_to_phys(hv_panic_page) > : 0); > hv_set_msr(HV_MSR_CRASH_P4, bytes_written); > > /* > -- > 2.25.1
