brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · 191ed12 Raw
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