linux/tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c
Thomas Gleixner d2912cb15b treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500
Based on 2 normalized pattern(s):

  this program is free software you can redistribute it and or modify
  it under the terms of the gnu general public license version 2 as
  published by the free software foundation

  this program is free software you can redistribute it and or modify
  it under the terms of the gnu general public license version 2 as
  published by the free software foundation #

extracted by the scancode license scanner the SPDX license identifier

  GPL-2.0-only

has been chosen to replace the boilerplate/reference in 4122 file(s).

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Enrico Weigelt <info@metux.net>
Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org>
Reviewed-by: Allison Randal <allison@lohutok.net>
Cc: linux-spdx@vger.kernel.org
Link: https://lkml.kernel.org/r/20190604081206.933168790@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-06-19 17:09:55 +02:00

78 lines
1.6 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* POWER Data Stream Control Register (DSCR) sysfs thread test
*
* This test updates the system wide DSCR default value through
* sysfs interface which should then update all the CPU specific
* DSCR default values which must also be then visible to threads
* executing on individual CPUs on the system.
*
* Copyright 2015, Anshuman Khandual, IBM Corporation.
*/
#define _GNU_SOURCE
#include "dscr.h"
static int test_thread_dscr(unsigned long val)
{
unsigned long cur_dscr, cur_dscr_usr;
cur_dscr = get_dscr();
cur_dscr_usr = get_dscr_usr();
if (val != cur_dscr) {
printf("[cpu %d] Kernel DSCR should be %ld but is %ld\n",
sched_getcpu(), val, cur_dscr);
return 1;
}
if (val != cur_dscr_usr) {
printf("[cpu %d] User DSCR should be %ld but is %ld\n",
sched_getcpu(), val, cur_dscr_usr);
return 1;
}
return 0;
}
static int check_cpu_dscr_thread(unsigned long val)
{
cpu_set_t mask;
int cpu;
for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
CPU_ZERO(&mask);
CPU_SET(cpu, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask))
continue;
if (test_thread_dscr(val))
return 1;
}
return 0;
}
int dscr_sysfs_thread(void)
{
unsigned long orig_dscr_default;
int i, j;
orig_dscr_default = get_default_dscr();
for (i = 0; i < COUNT; i++) {
for (j = 0; j < DSCR_MAX; j++) {
set_default_dscr(j);
if (check_cpu_dscr_thread(j))
goto fail;
}
}
set_default_dscr(orig_dscr_default);
return 0;
fail:
set_default_dscr(orig_dscr_default);
return 1;
}
int main(int argc, char *argv[])
{
return test_harness(dscr_sysfs_thread, "dscr_sysfs_thread_test");
}