[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 4/7] x86/time: introduce probing logic for the wallclock
On 04.09.2024 12:58, Roger Pau Monné wrote: > On Tue, Sep 03, 2024 at 05:32:27PM +0200, Jan Beulich wrote: >> On 03.09.2024 15:03, Roger Pau Monne wrote: >>> @@ -1329,28 +1338,13 @@ static bool cmos_probe(struct rtc_time *rtc_p, bool >>> cmos_rtc_probe) >>> return false; >>> } >>> >>> -static unsigned long get_cmos_time(void) >>> + >>> +static unsigned long cmos_read(void) >>> { >>> - unsigned long res; >>> struct rtc_time rtc; >>> - static bool __read_mostly cmos_rtc_probe; >>> - boolean_param("cmos-rtc-probe", cmos_rtc_probe); >>> + bool success = __get_cmos_time(&rtc); >>> >>> - if ( efi_enabled(EFI_RS) ) >>> - { >>> - res = efi_get_time(); >>> - if ( res ) >>> - return res; >>> - } >>> - >>> - if ( likely(!(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_CMOS_RTC)) ) >>> - cmos_rtc_probe = false; >>> - else if ( system_state < SYS_STATE_smp_boot && !cmos_rtc_probe ) >>> - panic("System with no CMOS RTC advertised must be booted from EFI" >>> - " (or with command line option \"cmos-rtc-probe\")\n"); >>> - >>> - if ( !cmos_probe(&rtc, cmos_rtc_probe) ) >>> - panic("No CMOS RTC found - system must be booted from EFI\n"); >>> + ASSERT(success); >> >> I'm not convinced of this assertion: It's either too much (compared to >> what we had so far) or not enough, considering the behavior ... >> >>> return mktime(rtc.year, rtc.mon, rtc.day, rtc.hour, rtc.min, rtc.sec); >>> } >> >> ... with a release build. > > My reasoning was that on a debug build we want to spot any such > issues (as it's likely a symptom the RTC is misbehaving?) but on a release > build we should rather return an incorrect wallclock time rather than > panicking. I can remove the ASSERT and local variable altogether if > you prefer. I would prefer that, yes, but I also won't insist. >>> @@ -1533,12 +1527,82 @@ void rtc_guest_write(unsigned int port, unsigned >>> int data) >>> } >>> } >>> >>> -static unsigned long get_wallclock_time(void) >>> +static enum { >>> + WALLCLOCK_UNSET, >>> + WALLCLOCK_XEN, >>> + WALLCLOCK_CMOS, >>> + WALLCLOCK_EFI, >>> +} wallclock_source __ro_after_init; >>> + >>> +static const char *wallclock_type_to_string(void) >> >> __init ? >> >>> { >>> + switch ( wallclock_source ) >>> + { >>> + case WALLCLOCK_XEN: >>> + return "XEN"; >>> + >>> + case WALLCLOCK_CMOS: >>> + return "CMOS RTC"; >>> + >>> + case WALLCLOCK_EFI: >>> + return "EFI"; >>> + >>> + case WALLCLOCK_UNSET: >>> + return "UNSET"; >>> + } >>> + >>> + ASSERT_UNREACHABLE(); >>> + return ""; >>> +} >>> + >>> +static void __init probe_wallclock(void) >>> +{ >>> + ASSERT(wallclock_source == WALLCLOCK_UNSET); >>> + >>> if ( xen_guest ) >>> + { >>> + wallclock_source = WALLCLOCK_XEN; >>> + return; >>> + } >>> + if ( efi_enabled(EFI_RS) && efi_get_time() ) >>> + { >>> + wallclock_source = WALLCLOCK_EFI; >>> + return; >>> + } >>> + if ( cmos_probe() ) >>> + { >>> + wallclock_source = WALLCLOCK_CMOS; >>> + return; >>> + } >>> + >>> + panic("No usable wallclock found, probed:%s%s%s\n%s", >>> + !cmos_rtc_probe && !efi_enabled(EFI_RS) ? " None" : "", >>> + cmos_rtc_probe ? " CMOS" : "", >>> + efi_enabled(EFI_RS) ? " EFI" : "", >>> + !cmos_rtc_probe ? "Try with command line option >>> \"cmos-rtc-probe\"\n" >>> + : !efi_enabled(EFI_RS) ? "System must be booted from EFI\n" : >>> ""); >> >> This last argument is sufficiently complex that I think it is pretty >> important for the question marks and colons to respectively align with >> one another, even if this may mean one or two more lines of code. > > I had it that way originally, but then it seemed the extra > indentation made it less readable. Will see how can I adjust it, my > preference would be for: > > panic("No usable wallclock found, probed:%s%s%s\n%s", > !cmos_rtc_probe && !efi_enabled(EFI_RS) ? " None" : "", > cmos_rtc_probe ? " CMOS" : "", > efi_enabled(EFI_RS) ? " EFI" : "", > !cmos_rtc_probe ? "Try with command line option > \"cmos-rtc-probe\"\n" > : !efi_enabled(EFI_RS) ? "System must be booted > from EFI\n" > : ""); > > But that exceeds the 80 columns limit. Right, formally the above would be my preference, too. Here two shorter- lines alternatives: panic("No usable wallclock found, probed:%s%s%s\n%s", !cmos_rtc_probe && !efi_enabled(EFI_RS) ? " None" : "", cmos_rtc_probe ? " CMOS" : "", efi_enabled(EFI_RS) ? " EFI" : "", !cmos_rtc_probe ? "Try with command line option \"cmos-rtc-probe\"\n" : !efi_enabled(EFI_RS) ? "System must be booted from EFI\n" : ""); panic("No usable wallclock found, probed:%s%s%s\n%s", !cmos_rtc_probe && !efi_enabled(EFI_RS) ? " None" : "", cmos_rtc_probe ? " CMOS" : "", efi_enabled(EFI_RS) ? " EFI" : "", !cmos_rtc_probe ? "Try with command line option \"cmos-rtc-probe\"\n" : !efi_enabled(EFI_RS) ? "System must be booted from EFI\n" : ""); Either of these or anything more or less similar will do imo, just as long as the ? vs : alignment is there. One thing I notice only now: The trailing %s will be a little odd if the "" variant is used in the last argument. That'll produce "(XEN) " with nothing following in the log. Which usually is a sign of some strange breakage. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |