123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /* ADJ_FREQ Skew change test
- * by: john stultz ([email protected])
- * (C) Copyright IBM 2012
- * Licensed under the GPLv2
- *
- * NOTE: This is a meta-test which cranks the ADJ_FREQ knob and
- * then uses other tests to detect problems. Thus this test requires
- * that the raw_skew, inconsistency-check and nanosleep tests be
- * present in the same directory it is run from.
- *
- * To build:
- * $ gcc change_skew.c -o change_skew -lrt
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/time.h>
- #include <sys/timex.h>
- #include <time.h>
- #include "../kselftest.h"
- #define NSEC_PER_SEC 1000000000LL
- int change_skew_test(int ppm)
- {
- struct timex tx;
- int ret;
- tx.modes = ADJ_FREQUENCY;
- tx.freq = ppm << 16;
- ret = adjtimex(&tx);
- if (ret < 0) {
- printf("Error adjusting freq\n");
- return ret;
- }
- ret = system("./raw_skew");
- ret |= system("./inconsistency-check");
- ret |= system("./nanosleep");
- return ret;
- }
- int main(int argc, char **argv)
- {
- struct timex tx;
- int i, ret;
- int ppm[5] = {0, 250, 500, -250, -500};
- /* Kill ntpd */
- ret = system("killall -9 ntpd");
- /* Make sure there's no offset adjustment going on */
- tx.modes = ADJ_OFFSET;
- tx.offset = 0;
- ret = adjtimex(&tx);
- if (ret < 0) {
- printf("Maybe you're not running as root?\n");
- return -1;
- }
- for (i = 0; i < 5; i++) {
- printf("Using %i ppm adjustment\n", ppm[i]);
- ret = change_skew_test(ppm[i]);
- if (ret)
- break;
- }
- /* Set things back */
- tx.modes = ADJ_FREQUENCY;
- tx.offset = 0;
- adjtimex(&tx);
- if (ret) {
- printf("[FAIL]");
- return ksft_exit_fail();
- }
- printf("[OK]");
- return ksft_exit_pass();
- }
|