To keep the %TICK and %SYS_TICK code aligned with the Hummingbird
%STICK code, let's pull the retry logic out of tickcmpr_set() and
sys_tickcmpr_set() into tick_rearm() and sys_tick_rearm(),
respectively.

As far as I know, the retry logic in these assembly routines is not
defective, but keeping equivalent code similar is good and it doesn't
hurt to have less assembly code where it isn't strictly necessary.

With this complete, we can then rebase and retry the clockintr switch
patch for sparc64.

ok?

Index: clock.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/sparc64/clock.c,v
retrieving revision 1.73
diff -u -p -r1.73 clock.c
--- clock.c     22 Dec 2022 19:51:11 -0000      1.73
+++ clock.c     22 Dec 2022 23:04:49 -0000
@@ -150,6 +150,8 @@ void        tick_start(void);
 void   sys_tick_start(void);
 void   stick_start(void);
 
+void   tick_rearm(uint64_t);
+void   sys_tick_rearm(uint64_t);
 void   stick_rearm(uint64_t);
 
 int    tickintr(void *);
@@ -766,7 +768,7 @@ tickintr(void *cap)
 
        /* Reset the interrupt. */
        s = intr_disable();
-       tickcmpr_set(ci->ci_tick);
+       tick_rearm(ci->ci_tick);
        intr_restore(s);
 
        return (1);
@@ -789,7 +791,7 @@ sys_tickintr(void *cap)
 
        /* Reset the interrupt. */
        s = intr_disable();
-       sys_tickcmpr_set(ci->ci_tick);
+       sys_tick_rearm(ci->ci_tick);
        intr_restore(s);
 
        return (1);
@@ -875,18 +877,28 @@ tick_start(void)
 
        tick_enable();
 
-       /*
-        * Try to make the tick interrupts as synchronously as possible on
-        * all CPUs to avoid inaccuracies for migrating processes.
-        */
-
        s = intr_disable();
-       ci->ci_tick = roundup(tick(), tick_increment);
-       tickcmpr_set(ci->ci_tick);
+       ci->ci_tick = tick();
+       tick_rearm(ci->ci_tick);
        intr_restore(s);
 }
 
 void
+tick_rearm(uint64_t cmp)
+{
+       uint64_t now, off = 8;
+
+       tickcmpr_set(cmp);
+       now = tick();
+       while (cmp <= now) {
+               cmp += off;
+               tickcmpr_set(cmp);
+               now = tick();
+               off *= 2;
+       }
+}
+
+void
 sys_tick_start(void)
 {
        struct cpu_info *ci = curcpu();
@@ -897,29 +909,34 @@ sys_tick_start(void)
                sys_tick_enable();
        }
 
-       /*
-        * Try to make the tick interrupts as synchronously as possible on
-        * all CPUs to avoid inaccuracies for migrating processes.
-        */
-
        s = intr_disable();
-       ci->ci_tick = roundup(sys_tick(), tick_increment);
-       sys_tickcmpr_set(ci->ci_tick);
+       ci->ci_tick = sys_tick();
+       sys_tick_rearm(ci->ci_tick);
        intr_restore(s);
 }
 
 void
+sys_tick_rearm(uint64_t cmp)
+{
+       uint64_t now, off = 8;
+
+       sys_tickcmpr_set(cmp);
+       now = sys_tick();
+       while (cmp <= now) {
+               cmp += off;
+               sys_tickcmpr_set(cmp);
+               now = sys_tick();
+               off *= 2;
+       }
+}
+
+void
 stick_start(void)
 {
        struct cpu_info *ci = curcpu();
        u_int64_t s;
 
        tick_enable();
-
-       /*
-        * Try to make the tick interrupts as synchronously as possible on
-        * all CPUs to avoid inaccuracies for migrating processes.
-        */
 
        s = intr_disable();
        ci->ci_tick = stick();
Index: locore.s
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/sparc64/locore.s,v
retrieving revision 1.195
diff -u -p -r1.195 locore.s
--- locore.s    22 Dec 2022 19:51:11 -0000      1.195
+++ locore.s    22 Dec 2022 23:04:51 -0000
@@ -7477,22 +7477,9 @@ END(tick_enable)
  * sure those two instructions are in the same cache line.
  */
 ENTRY(tickcmpr_set)
-       ba      1f
-        mov    8, %o2                  ! Initial step size
        .align  64
-1:     wr      %o0, 0, %tick_cmpr
+       wr      %o0, 0, %tick_cmpr
        rd      %tick_cmpr, %g0
-
-       rd      %tick, %o1              ! Read current %tick
-       sllx    %o1, 1, %o1
-       srlx    %o1, 1, %o1
-
-       cmp     %o0, %o1                ! Make sure the value we wrote to
-       bg,pt   %xcc, 2f                !   %tick_cmpr was in the future.
-        add    %o0, %o2, %o0           ! If not, add the step size, double
-       ba,pt   %xcc, 1b                !   the step size and try again.
-        sllx   %o2, 1, %o2
-2:
        retl
         nop
 END(tickcmpr_set)
@@ -7518,22 +7505,9 @@ ENTRY(sys_tick_enable)
 END(sys_tick_enable)
 
 ENTRY(sys_tickcmpr_set)
-       ba      1f
-        mov    8, %o2                  ! Initial step size
        .align  64
-1:     wr      %o0, 0, %sys_tick_cmpr
+       wr      %o0, 0, %sys_tick_cmpr
        rd      %sys_tick_cmpr, %g0
-
-       rd      %sys_tick, %o1          ! Read current %sys_tick
-       sllx    %o1, 1, %o1
-       srlx    %o1, 1, %o1
-
-       cmp     %o0, %o1                ! Make sure the value we wrote to
-       bg,pt   %xcc, 2f                !   %sys_tick_cmpr was in the future.
-        add    %o0, %o2, %o0           ! If not, add the step size, double
-       ba,pt   %xcc, 1b                !   the step size and try again.
-        sllx   %o2, 1, %o2
-2:
        retl
         nop
 END(sys_tickcmpr_set)

Reply via email to