root/tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. test_thread_dscr
  2. check_cpu_dscr_thread
  3. dscr_sysfs_thread
  4. main

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * POWER Data Stream Control Register (DSCR) sysfs thread test
   4  *
   5  * This test updates the system wide DSCR default value through
   6  * sysfs interface which should then update all the CPU specific
   7  * DSCR default values which must also be then visible to threads
   8  * executing on individual CPUs on the system.
   9  *
  10  * Copyright 2015, Anshuman Khandual, IBM Corporation.
  11  */
  12 #define _GNU_SOURCE
  13 #include "dscr.h"
  14 
  15 static 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 
  36 static 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 
  54 int dscr_sysfs_thread(void)
  55 {
  56         unsigned long orig_dscr_default;
  57         int i, j;
  58 
  59         orig_dscr_default = get_default_dscr();
  60         for (i = 0; i < COUNT; i++) {
  61                 for (j = 0; j < DSCR_MAX; j++) {
  62                         set_default_dscr(j);
  63                         if (check_cpu_dscr_thread(j))
  64                                 goto fail;
  65                 }
  66         }
  67         set_default_dscr(orig_dscr_default);
  68         return 0;
  69 fail:
  70         set_default_dscr(orig_dscr_default);
  71         return 1;
  72 }
  73 
  74 int main(int argc, char *argv[])
  75 {
  76         return test_harness(dscr_sysfs_thread, "dscr_sysfs_thread_test");
  77 }

/* [<][>][^][v][top][bottom][index][help] */