From 1f271fcf4843352917f17b2a7501dfe299fcdf5c Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sun, 16 Sep 2018 13:21:39 +0100 Subject: [PATCH] tickless: fix dumb bug propogated across multiple platforms This makes things work far better than before. --- Kernel/platform-rc2014-tiny/main.c | 2 +- Kernel/platform-rc2014/main.c | 2 +- Kernel/platform-sbcv2/main.c | 2 +- Kernel/platform-sc108/main.c | 33 +++++++++++++++--------------- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Kernel/platform-rc2014-tiny/main.c b/Kernel/platform-rc2014-tiny/main.c index 143c20ee..c3a21199 100644 --- a/Kernel/platform-rc2014-tiny/main.c +++ b/Kernel/platform-rc2014-tiny/main.c @@ -105,8 +105,8 @@ void sync_clock(void) timer_interrupt(); } } - re_enter--; } + re_enter--; irqrestore(irq); } } diff --git a/Kernel/platform-rc2014/main.c b/Kernel/platform-rc2014/main.c index 2b3636ee..ea81b6f0 100644 --- a/Kernel/platform-rc2014/main.c +++ b/Kernel/platform-rc2014/main.c @@ -115,8 +115,8 @@ void sync_clock(void) /* FIXME: need to cover ACIA option.. */ tty_pollirq_sio(); } - re_enter--; } + re_enter--; irqrestore(irq); } } diff --git a/Kernel/platform-sbcv2/main.c b/Kernel/platform-sbcv2/main.c index 53ceb442..3e5d5105 100644 --- a/Kernel/platform-sbcv2/main.c +++ b/Kernel/platform-sbcv2/main.c @@ -134,8 +134,8 @@ void sync_clock(void) /* Poll the PropIOv2 */ platform_interrupt(); } - re_enter--; } + re_enter--; irqrestore(irq); } } diff --git a/Kernel/platform-sc108/main.c b/Kernel/platform-sc108/main.c index a27ea784..64925183 100644 --- a/Kernel/platform-sc108/main.c +++ b/Kernel/platform-sc108/main.c @@ -9,7 +9,6 @@ extern unsigned char irqvector; struct blkbuf *bufpool_end = bufpool + NBUFS; /* minimal for boot -- expanded after we're done with _DISCARD */ -uint8_t timermsr = 0; uint16_t swap_dev = 0xFFFF; uint16_t ramtop = 0xF000; uint8_t need_resched = 0; @@ -35,7 +34,7 @@ void platform_idle(void) /* Check the clock. We try and reduce the impact of the clock on latency by not doing it so often. 256 may be too small a divide need t see what 1/10th sec looks like in poll loops */ - if (!idlect++) + if (!++idlect) sync_clock(); } @@ -94,24 +93,24 @@ static void sync_clock_read(void) */ void sync_clock(void) { - if (!timermsr) { - irqflags_t irq = di(); - int16_t tmp; - if (!re_enter++) { - sync_clock_read(); - if (oldticks != 0xFF) { - tmp = newticks - oldticks; - if (tmp < 0) - tmp += 60; - tmp *= 10; - while(tmp--) { - timer_interrupt(); - } + irqflags_t irq = di(); + int16_t tmp; + if (!re_enter++) { + sync_clock_read(); + if (oldticks != 0xFF) { + tmp = newticks - oldticks; + if (tmp < 0) + tmp += 60; + tmp *= 10; + while(tmp--) { + timer_interrupt(); } - re_enter--; } - irqrestore(irq); } + re_enter--; + if (re_enter > 1) + kputs("oops"); + irqrestore(irq); } /* -- 2.34.1