80 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * POWER Data Stream Control Register (DSCR) sysfs thread test4 *5 * This test updates the system wide DSCR default value through6 * sysfs interface which should then update all the CPU specific7 * DSCR default values which must also be then visible to threads8 * executing on individual CPUs on the system.9 *10 * Copyright 2015, Anshuman Khandual, IBM Corporation.11 */12#define _GNU_SOURCE13#include "dscr.h"14 15static int test_thread_dscr(unsigned long val)16{17 unsigned long cur_dscr, cur_dscr_usr;18 19 cur_dscr = get_dscr();20 cur_dscr_usr = get_dscr_usr();21 22 if (val != cur_dscr) {23 printf("[cpu %d] Kernel DSCR should be %ld but is %ld\n",24 sched_getcpu(), val, cur_dscr);25 return 1;26 }27 28 if (val != cur_dscr_usr) {29 printf("[cpu %d] User DSCR should be %ld but is %ld\n",30 sched_getcpu(), val, cur_dscr_usr);31 return 1;32 }33 return 0;34}35 36static int check_cpu_dscr_thread(unsigned long val)37{38 cpu_set_t mask;39 int cpu;40 41 for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {42 CPU_ZERO(&mask);43 CPU_SET(cpu, &mask);44 if (sched_setaffinity(0, sizeof(mask), &mask))45 continue;46 47 if (test_thread_dscr(val))48 return 1;49 }50 return 0;51 52}53 54int dscr_sysfs_thread(void)55{56 unsigned long orig_dscr_default;57 int i, j;58 59 SKIP_IF(!have_hwcap2(PPC_FEATURE2_DSCR));60 61 orig_dscr_default = get_default_dscr();62 for (i = 0; i < COUNT; i++) {63 for (j = 0; j < DSCR_MAX; j++) {64 set_default_dscr(j);65 if (check_cpu_dscr_thread(j))66 goto fail;67 }68 }69 set_default_dscr(orig_dscr_default);70 return 0;71fail:72 set_default_dscr(orig_dscr_default);73 return 1;74}75 76int main(int argc, char *argv[])77{78 return test_harness(dscr_sysfs_thread, "dscr_sysfs_thread_test");79}80