1From e00d3f52ccc6496a60992ac5a9d771b1d067eceb Mon Sep 17 00:00:00 2001 2From: Haiqing Bai <Haiqing.Bai@windriver.com> 3Date: Thu, 22 Nov 2018 08:42:48 +0000 4Subject: [PATCH] Fixed 100% CPU using issue by adding minimum POSIX timer 5 interval 6 7Added minimum POSIX timer interval to prevent from timers firing 8to quickly for the process to handle, resulting in 100% CPU and 9endless signal queue. 10 11Upstream-status: Backport 12[From commit 1f0baae98a7b23e85f2bfd8f5de64795421c270e: 13 - critical: added minimum POSIX timer interval to prevent from 14 timers firing to quickly for the process to handle, 15 resulting in 100% CPU and endless signal queue] 16 17Signed-off-by: Haiqing Bai <Haiqing.Bai@windriver.com> 18--- 19 src/dep/eventtimer.h | 3 ++- 20 src/dep/eventtimer_itimer.c | 2 +- 21 src/dep/eventtimer_posix.c | 4 ++++ 22 3 files changed, 7 insertions(+), 2 deletions(-) 23 24diff --git a/src/dep/eventtimer.h b/src/dep/eventtimer.h 25index 64e483a..0a21318 100644 26--- a/src/dep/eventtimer.h 27+++ b/src/dep/eventtimer.h 28@@ -30,7 +30,8 @@ 29 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32-#define EVENTTIMER_MAX_DESC 20 33+#define EVENTTIMER_MAX_DESC 20 34+#define EVENTTIMER_MIN_INTERVAL_US 250 /* 4000/sec */ 35 36 typedef struct EventTimer EventTimer; 37 38diff --git a/src/dep/eventtimer_itimer.c b/src/dep/eventtimer_itimer.c 39index cf3c6db..3bb7ec6 100644 40--- a/src/dep/eventtimer_itimer.c 41+++ b/src/dep/eventtimer_itimer.c 42@@ -53,7 +53,7 @@ 43 44 #include "../ptpd.h" 45 46-#define US_TIMER_INTERVAL (62500) 47+#define US_TIMER_INTERVAL (31250) 48 49 static volatile unsigned int elapsed; 50 51diff --git a/src/dep/eventtimer_posix.c b/src/dep/eventtimer_posix.c 52index 637eef3..f4a702d 100644 53--- a/src/dep/eventtimer_posix.c 54+++ b/src/dep/eventtimer_posix.c 55@@ -100,6 +100,10 @@ eventTimerStart_posix(EventTimer *timer, double interval) 56 ts.tv_sec = interval; 57 ts.tv_nsec = (interval - ts.tv_sec) * 1E9; 58 59+ if(!ts.tv_sec && ts.tv_nsec < EVENTTIMER_MIN_INTERVAL_US * 1000) { 60+ ts.tv_nsec = EVENTTIMER_MIN_INTERVAL_US * 1000; 61+ } 62+ 63 DBGV("Timer %s start requested at %d.%4d sec interval\n", timer->id, ts.tv_sec, ts.tv_nsec); 64 65 its.it_interval = ts; 66-- 672.11.0 68 69