On Fri, Jan 27, 2023 at 08:07:26AM -0600, Scott Cheloha wrote:
> mlarkin@ noted about a month or so ago that setting the lapic timer
> mode, mask, and divisor every time we rearm it is unnecessary. We
> only need to configure those registers once during
> lapic_timer_trigger(). After that, it is sufficient to set the ICR
> when rearming the timer.
>
> While here, add the missing intr_disable/intr_restore wrapper to
> lapic_timer_trigger(). Writing multiple registers is not atomic, so
> we need to disable interrupts for safety. Setting the ICR during
> lapic_timer_rearm() is atomic, so we don't need to disable interrupts
> there.
>
> ok?
>
ok mlarkin if you verified the mode/mask/divisor reset properly after
un-zzz/un-ZZZ (which I think we do but wanted to point it out just in case).
> Index: amd64/amd64/lapic.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/amd64/lapic.c,v
> retrieving revision 1.65
> diff -u -p -r1.65 lapic.c
> --- amd64/amd64/lapic.c 10 Nov 2022 08:26:54 -0000 1.65
> +++ amd64/amd64/lapic.c 27 Jan 2023 13:58:15 -0000
> @@ -431,13 +431,17 @@ lapic_timer_rearm(void *unused, uint64_t
> cycles = (nsecs * lapic_timer_nsec_cycle_ratio) >> 32;
> if (cycles == 0)
> cycles = 1;
> - lapic_timer_oneshot(0, cycles);
> + lapic_writereg(LAPIC_ICR_TIMER, cycles);
> }
>
> void
> lapic_timer_trigger(void *unused)
> {
> + u_long s;
> +
> + s = intr_disable();
> lapic_timer_oneshot(0, 1);
> + intr_restore(s);
> }
>
> /*
> Index: i386/i386/lapic.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/i386/lapic.c,v
> retrieving revision 1.53
> diff -u -p -r1.53 lapic.c
> --- i386/i386/lapic.c 6 Dec 2022 01:56:44 -0000 1.53
> +++ i386/i386/lapic.c 27 Jan 2023 13:58:15 -0000
> @@ -268,13 +268,17 @@ lapic_timer_rearm(void *unused, uint64_t
> cycles = (nsecs * lapic_timer_nsec_cycle_ratio) >> 32;
> if (cycles == 0)
> cycles = 1;
> - lapic_timer_oneshot(0, cycles);
> + i82489_writereg(LAPIC_ICR_TIMER, cycles);
> }
>
> void
> lapic_timer_trigger(void *unused)
> {
> + u_long s;
> +
> + s = intr_disable();
> lapic_timer_oneshot(0, 1);
> + intr_restore(s);
> }
>
> /*