linux/tools/testing/selftests/timers/skew_consistency.c
<<
>>
Prefs
   1/* ADJ_FREQ Skew consistency test
   2 *              by: john stultz (johnstul@us.ibm.com)
   3 *              (C) Copyright IBM 2012
   4 *              Licensed under the GPLv2
   5 *
   6 *  NOTE: This is a meta-test which cranks the ADJ_FREQ knob back
   7 *  and forth and watches for consistency problems. Thus this test requires
   8 *  that the inconsistency-check tests be present in the same directory it
   9 *  is run from.
  10 *
  11 *  To build:
  12 *      $ gcc skew_consistency.c -o skew_consistency -lrt
  13 *
  14 *   This program is free software: you can redistribute it and/or modify
  15 *   it under the terms of the GNU General Public License as published by
  16 *   the Free Software Foundation, either version 2 of the License, or
  17 *   (at your option) any later version.
  18 *
  19 *   This program is distributed in the hope that it will be useful,
  20 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  21 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22 *   GNU General Public License for more details.
  23 */
  24
  25
  26#include <stdio.h>
  27#include <stdlib.h>
  28#include <unistd.h>
  29#include <sys/time.h>
  30#include <sys/timex.h>
  31#include <time.h>
  32#include <sys/types.h>
  33#include <sys/stat.h>
  34#include <fcntl.h>
  35#include <string.h>
  36#include <sys/wait.h>
  37#include "../kselftest.h"
  38
  39#define NSEC_PER_SEC 1000000000LL
  40
  41int main(int argv, char **argc)
  42{
  43        struct timex tx;
  44        int ret, ppm;
  45        pid_t pid;
  46
  47
  48        printf("Running Asynchronous Frequency Changing Tests...\n");
  49
  50        pid = fork();
  51        if (!pid)
  52                return system("./inconsistency-check -c 1 -t 600");
  53
  54        ppm = 500;
  55        ret = 0;
  56
  57        while (pid != waitpid(pid, &ret, WNOHANG)) {
  58                ppm = -ppm;
  59                tx.modes = ADJ_FREQUENCY;
  60                tx.freq = ppm << 16;
  61                adjtimex(&tx);
  62                usleep(500000);
  63        }
  64
  65        /* Set things back */
  66        tx.modes = ADJ_FREQUENCY;
  67        tx.offset = 0;
  68        adjtimex(&tx);
  69
  70
  71        if (ret) {
  72                printf("[FAILED]\n");
  73                return ksft_exit_fail();
  74        }
  75        printf("[OK]\n");
  76        return ksft_exit_pass();
  77}
  78