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:
parent
0fc0f906e1
commit
15932c9d7b
3 changed files with 14 additions and 12 deletions
|
@ -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(¤t_leap) < 0) {
|
if (TMX_GetLeap(¤t_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"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue