| /*************************************************************************** |
| HTinterrupt.c - description |
| ------------------- |
| email : sonic,zhang@intel.com |
| ***************************************************************************/ |
| |
| /*************************************************************************** |
| * * |
| * 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. * |
| * * |
| ***************************************************************************/ |
| #include "ht_utils.h" |
| #include <unistd.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include "test.h" |
| |
| char *TCID = "ht_interrupt"; |
| int TST_TOTAL = 1; |
| |
| #define INTERRUPT_NAME "/proc/interrupts" |
| |
| int HT_InterruptDistribution() |
| { |
| FILE *pFile; |
| int ci[32], cj[32]; |
| int cpucount, i; |
| int cmax, cmin, d; |
| |
| tst_resm(TINFO, "Get interrupts distribution with HT."); |
| |
| if ((cpucount = get_cpu_count()) <= 0) { |
| return 0; |
| } |
| |
| if ((pFile = fopen(INTERRUPT_NAME, "r")) == NULL) { |
| return 0; |
| } |
| |
| fgets(buf, 255, pFile); |
| fscanf(pFile, "%s %d %d %d %d %d %d %d %d \ |
| %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \ |
| %d %d %d %d %d %d %d %d", buf, ci, ci + 1, ci + 2, ci + 3, ci + 4, ci + 5, ci + 6, ci + 7, ci + 8, ci + 9, ci + 10, ci + 11, ci + 12, ci + 13, ci + 14, ci + 15, ci + 16, ci + 17, ci + 18, ci + 19, ci + 20, ci + 21, ci + 22, ci + 23, ci + 24, ci + 25, ci + 26, ci + 27, ci + 28, ci + 29, ci + 30, ci + 31); |
| |
| fclose(pFile); |
| |
| for (i = 0; i < 10; i++) { |
| sleep(1); |
| printf("."); |
| } |
| |
| if ((pFile = fopen(INTERRUPT_NAME, "r")) == NULL) { |
| return 0; |
| } |
| |
| fgets(buf, 255, pFile); |
| fscanf(pFile, "%s %d %d %d %d %d %d %d %d \ |
| %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \ |
| %d %d %d %d %d %d %d %d", buf, cj, cj + 1, cj + 2, cj + 3, cj + 4, cj + 5, cj + 6, cj + 7, cj + 8, cj + 9, cj + 10, cj + 11, cj + 12, cj + 13, cj + 14, cj + 15, cj + 16, cj + 17, cj + 18, cj + 19, cj + 20, cj + 21, cj + 22, cj + 23, cj + 24, cj + 25, cj + 26, cj + 27, cj + 28, cj + 29, cj + 30, cj + 31); |
| |
| fclose(pFile); |
| |
| printf("\n\n"); |
| printf("Timer interrupt counts per CPU:\n"); |
| d = cj[0] - ci[0]; |
| printf("%d ", d); |
| cmax = cmin = d; |
| for (i = 1; i < cpucount; i++) { |
| d = cj[i] - ci[i]; |
| printf("%d ", d); |
| if (cmax < d) |
| cmax = d; |
| if (cmin > d) |
| cmin = d; |
| } |
| |
| printf("\n\n"); |
| printf("max value: %d\n", cmax); |
| printf("min value: %d\n", cmin); |
| printf("\n"); |
| |
| if (cmin == 0 || cmax / cmin > 10) { |
| return 0; |
| } else { |
| return 1; |
| } |
| } |
| |
| // return 0 means Pass, return 1 means Fail. |
| int main(int argc, char *argv[]) |
| { |
| tst_resm(TINFO, "Begin: HyperThreading Interrupt"); |
| |
| #if (!defined __i386__ && !defined __x86_64__) |
| tst_brkm(TCONF, NULL, |
| "This test suite can only execute on x86 architecture."); |
| #else |
| if (!check_ht_capability()) { |
| if (HT_InterruptDistribution()) |
| tst_resm(TPASS, |
| "Interrupt distribution is balanceable."); |
| else |
| tst_resm(TFAIL, |
| "Interrupt distribution is not balanceable."); |
| } else { |
| tst_brkm(TCONF, NULL, "HT is not enabled or not supported."); |
| } |
| #endif |
| |
| tst_resm(TINFO, "End: HyperThreading Interrupt"); |
| |
| tst_exit(); |
| } |