From e00d3f52ccc6496a60992ac5a9d771b1d067eceb Mon Sep 17 00:00:00 2001 
 | 
From: Haiqing Bai <Haiqing.Bai@windriver.com> 
 | 
Date: Thu, 22 Nov 2018 08:42:48 +0000 
 | 
Subject: [PATCH] Fixed 100% CPU using issue by adding minimum POSIX timer 
 | 
 interval 
 | 
  
 | 
Added minimum POSIX timer interval to prevent from timers firing 
 | 
to quickly for the process to handle, resulting in 100% CPU and 
 | 
endless signal queue. 
 | 
  
 | 
Upstream-status: Backport 
 | 
[From commit 1f0baae98a7b23e85f2bfd8f5de64795421c270e: 
 | 
  - critical: added minimum POSIX timer interval to prevent from 
 | 
    timers firing to quickly for the process to handle, 
 | 
    resulting in 100% CPU and endless signal queue] 
 | 
  
 | 
Signed-off-by: Haiqing Bai <Haiqing.Bai@windriver.com> 
 | 
--- 
 | 
 src/dep/eventtimer.h        | 3 ++- 
 | 
 src/dep/eventtimer_itimer.c | 2 +- 
 | 
 src/dep/eventtimer_posix.c  | 4 ++++ 
 | 
 3 files changed, 7 insertions(+), 2 deletions(-) 
 | 
  
 | 
diff --git a/src/dep/eventtimer.h b/src/dep/eventtimer.h 
 | 
index 64e483a..0a21318 100644 
 | 
--- a/src/dep/eventtimer.h 
 | 
+++ b/src/dep/eventtimer.h 
 | 
@@ -30,7 +30,8 @@ 
 | 
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 | 
  */ 
 | 
  
 | 
-#define EVENTTIMER_MAX_DESC           20 
 | 
+#define EVENTTIMER_MAX_DESC        20 
 | 
+#define EVENTTIMER_MIN_INTERVAL_US    250 /* 4000/sec */ 
 | 
  
 | 
 typedef struct EventTimer EventTimer; 
 | 
  
 | 
diff --git a/src/dep/eventtimer_itimer.c b/src/dep/eventtimer_itimer.c 
 | 
index cf3c6db..3bb7ec6 100644 
 | 
--- a/src/dep/eventtimer_itimer.c 
 | 
+++ b/src/dep/eventtimer_itimer.c 
 | 
@@ -53,7 +53,7 @@ 
 | 
  
 | 
 #include "../ptpd.h" 
 | 
  
 | 
-#define US_TIMER_INTERVAL (62500) 
 | 
+#define US_TIMER_INTERVAL (31250) 
 | 
  
 | 
 static volatile unsigned int elapsed; 
 | 
  
 | 
diff --git a/src/dep/eventtimer_posix.c b/src/dep/eventtimer_posix.c 
 | 
index 637eef3..f4a702d 100644 
 | 
--- a/src/dep/eventtimer_posix.c 
 | 
+++ b/src/dep/eventtimer_posix.c 
 | 
@@ -100,6 +100,10 @@ eventTimerStart_posix(EventTimer *timer, double interval) 
 | 
     ts.tv_sec = interval; 
 | 
     ts.tv_nsec = (interval - ts.tv_sec) * 1E9; 
 | 
  
 | 
+    if(!ts.tv_sec && ts.tv_nsec < EVENTTIMER_MIN_INTERVAL_US * 1000) { 
 | 
+        ts.tv_nsec = EVENTTIMER_MIN_INTERVAL_US * 1000; 
 | 
+    } 
 | 
+ 
 | 
     DBGV("Timer %s start requested at %d.%4d sec interval\n", timer->id, ts.tv_sec, ts.tv_nsec); 
 | 
  
 | 
     its.it_interval = ts; 
 | 
--  
 | 
2.11.0 
 |