linux/tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c
<<
>>
Prefs
   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
  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