sys: add new log message for kernel status reset after leap second

When a leap second is applied by the kernel, it doesn't actually clear
the STA_INS|STA_DEL bits from the status word, but the state returned
by ntp_adjtime()/adjtimex() is TIME_WAIT until the application clears
the bits.

Add "System clock status reset after leap second" log message for this
case.
This commit is contained in:
Miroslav Lichvar 2015-07-27 12:24:13 +02:00
parent 0fc0f906e1
commit 15932c9d7b
3 changed files with 14 additions and 12 deletions

View file

@ -177,9 +177,9 @@ read_frequency(void)
static void static void
set_leap(int leap) set_leap(int leap)
{ {
int current_leap; int current_leap, applied;
if (TMX_GetLeap(&current_leap) < 0) { if (TMX_GetLeap(&current_leap, &applied) < 0) {
LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap"); LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap");
} }
@ -190,8 +190,9 @@ set_leap(int leap)
LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap"); LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap");
} }
LOG(LOGS_INFO, LOGF_SysLinux, "System clock status set to %s leap second", LOG(LOGS_INFO, LOGF_SysLinux, "System clock status %s leap second",
leap ? (leap > 0 ? "insert" : "delete") : "not insert/delete"); leap ? (leap > 0 ? "set to insert" : "set to delete") :
(applied ? "reset after" : "set to not insert/delete"));
} }
/* ================================================== */ /* ================================================== */

View file

@ -124,24 +124,25 @@ TMX_SetLeap(int leap)
} }
int int
TMX_GetLeap(int *leap) TMX_GetLeap(int *leap, int *applied)
{ {
struct timex txc; struct timex txc;
int state;
txc.modes = 0; txc.modes = 0;
if (adjtimex(&txc) < 0) state = adjtimex(&txc);
if (state < 0)
return -1; return -1;
status &= ~(STA_INS | STA_DEL); if (txc.status & STA_INS)
status |= txc.status & (STA_INS | STA_DEL);
if (status & STA_INS)
*leap = 1; *leap = 1;
else if (status & STA_DEL) else if (txc.status & STA_DEL)
*leap = -1; *leap = -1;
else else
*leap = 0; *leap = 0;
*applied = state == TIME_WAIT;
return 0; return 0;
} }

View file

@ -31,7 +31,7 @@ int TMX_ResetOffset(void);
int TMX_SetFrequency(double *freq, long tick); int TMX_SetFrequency(double *freq, long tick);
int TMX_GetFrequency(double *freq, long *tick); int TMX_GetFrequency(double *freq, long *tick);
int TMX_SetLeap(int leap); int TMX_SetLeap(int leap);
int TMX_GetLeap(int *leap); int TMX_GetLeap(int *leap, int *applied);
int TMX_SetSync(int sync, double est_error, double max_error); int TMX_SetSync(int sync, double est_error, double max_error);
int TMX_TestStepOffset(void); int TMX_TestStepOffset(void);
int TMX_ApplyStepOffset(double offset); int TMX_ApplyStepOffset(double offset);