]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
Add support for ADJ_OFFSET_SS_READ mode
authorMiroslav Lichvar <mlichvar@redhat.com>
Wed, 20 May 2009 15:43:09 +0000 (17:43 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Wed, 20 May 2009 15:43:09 +0000 (17:43 +0200)
Also assume that kernels >= 2.6.27 don't need frequency scaling.

chrony_timex.h
sys_linux.c
wrap_adjtimex.c
wrap_adjtimex.h

index 348d01f3bedc27511f0ca9009b9a8cf2b6ed27c5..38e1146138ce714b19b058f9d3928b979d39b263 100644 (file)
@@ -39,6 +39,7 @@ struct timex {
 #define ADJ_STATUS             0x0010  /* clock status */
 #define ADJ_TICK               0x4000  /* tick value */
 #define ADJ_OFFSET_SINGLESHOT  0x8001  /* old-fashioned adjtime */
+#define ADJ_OFFSET_SS_READ     0xa001  /* read-only adjtime */
 
 #define SHIFT_USEC 16          /* frequency offset scale (shift) */
 
index 969229f7704fd2b73621979e6eb571a9b030c420..2da7ed517a403f4ec6ead55b613f1fd873efb718 100644 (file)
@@ -103,10 +103,11 @@ static int version_major;
 static int version_minor;
 static int version_patchlevel;
 
-/* Flag indicating whether adjtimex() with txc.modes equal to zero
-returns the remaining time adjustment or not.  If not we have to read
-the outstanding adjustment by setting it to zero, examining the return
-value and setting the outstanding adjustment back again. */
+/* Flag indicating whether adjtimex() returns the remaining time adjustment
+or not.  If not we have to read the outstanding adjustment by setting it to
+zero, examining the return value and setting the outstanding adjustment back
+again.  If 1, txc.modes equal to zero is used to read the time.  If 2,
+txc.modes is set to ADJ_OFFSET_SS_READ. */
 
 static int have_readonly_adjtime;
 
@@ -532,11 +533,20 @@ get_offset_correction(struct timeval *raw,
   double fast_slew_remaining;
   long offset;
 
-  if (have_readonly_adjtime) {
-    if (TMX_GetOffsetLeft(&offset) < 0) {
+again:
+  if (have_readonly_adjtime == 1) {
+    if (TMX_GetOffsetLeftOld(&offset) < 0) {
       CROAK("adjtimex() failed in get_offset_correction");
     }
     
+    adjtime_left = (double)offset / 1.0e6;
+  } else if (have_readonly_adjtime == 2) {
+    if (TMX_GetOffsetLeft(&offset) < 0) {
+      LOG(LOGS_INFO, LOGF_SysLinux, "adjtimex() doesn't support ADJ_OFFSET_SS_READ");
+      have_readonly_adjtime = 0;
+      goto again;
+    }
+    
     adjtime_left = (double)offset / 1.0e6;
   } else {
     offset = 0;
@@ -796,13 +806,19 @@ get_version_specific_details(void)
         case 4:
         case 5:
         case 6:
+          if (minor < 6 || patch < 27) {
+            /* These seem to be like 2.0.32 */
+            freq_scale = (hz==100) ? (128.0 / 128.125) : basic_freq_scale;
+            have_readonly_adjtime = 0;
+            break;
+          }
           /* Let's be optimistic that these will be the same until proven
              otherwise :-) */
         case 7:
         case 8:
-          /* These seem to be like 2.0.32 */
-          freq_scale = (hz==100) ? (128.0 / 128.125) : basic_freq_scale;
-          have_readonly_adjtime = 0;
+          /* These don't need scaling */
+          freq_scale = 1.0;
+          have_readonly_adjtime = 2;
           break;
         default:
           LOG_FATAL(LOGF_SysLinux, "Kernel version not supported yet, sorry.");
index 66e45b3a5b6fc341154a1f5fac1d29f6463c49ea..991a8e9b4a97864d0753c25b5a07543bc85c9122 100644 (file)
@@ -93,7 +93,7 @@ TMX_GetFrequency(double *freq)
 }
 
 int
-TMX_GetOffsetLeft(long *offset)
+TMX_GetOffsetLeftOld(long *offset)
 {
   struct timex txc;
   int result;
@@ -103,6 +103,17 @@ TMX_GetOffsetLeft(long *offset)
   return result;
 }
 
+int
+TMX_GetOffsetLeft(long *offset)
+{
+  struct timex txc;
+  int result;
+  txc.modes = ADJ_OFFSET_SS_READ;
+  result = adjtimex(&txc);
+  *offset = txc.offset;
+  return result;
+}
+
 int
 TMX_ReadCurrentParams(struct tmx_params *params)
 {
index d7d59b16b8c63c9c18a695b182f273006293112e..187c8fb3c052a8a9226f07c642ba141a71a691fb 100644 (file)
@@ -72,6 +72,7 @@ int TMX_SetTick(long tick);
 int TMX_ApplyOffset(long *offset);
 int TMX_SetFrequency(double freq, long tick);
 int TMX_GetFrequency(double *freq);
+int TMX_GetOffsetLeftOld(long *offset);
 int TMX_GetOffsetLeft(long *offset);
 int TMX_ReadCurrentParams(struct tmx_params *params);
 int TMX_SetLeap(int leap);