| 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 |
| |