Andrew Geissler | 1548c07 | 2019-02-22 16:03:50 -0600 | [diff] [blame] | 1 | From e00d3f52ccc6496a60992ac5a9d771b1d067eceb Mon Sep 17 00:00:00 2001 |
| 2 | From: Haiqing Bai <Haiqing.Bai@windriver.com> |
| 3 | Date: Thu, 22 Nov 2018 08:42:48 +0000 |
| 4 | Subject: [PATCH] Fixed 100% CPU using issue by adding minimum POSIX timer |
| 5 | interval |
| 6 | |
| 7 | Added minimum POSIX timer interval to prevent from timers firing |
| 8 | to quickly for the process to handle, resulting in 100% CPU and |
| 9 | endless signal queue. |
| 10 | |
| 11 | Upstream-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 | |
| 17 | Signed-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 | |
| 24 | diff --git a/src/dep/eventtimer.h b/src/dep/eventtimer.h |
| 25 | index 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 | |
| 38 | diff --git a/src/dep/eventtimer_itimer.c b/src/dep/eventtimer_itimer.c |
| 39 | index 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 | |
| 51 | diff --git a/src/dep/eventtimer_posix.c b/src/dep/eventtimer_posix.c |
| 52 | index 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 | -- |
| 67 | 2.11.0 |
| 68 | |