/* * POWER Data Stream Control Register (DSCR) * * This header file contains helper functions and macros * required for all the DSCR related test cases. * * Copyright 2012, Anton Blanchard, IBM Corporation. * Copyright 2015, Anshuman Khandual, IBM Corporation. * * 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. */ #ifndef _SELFTESTS_POWERPC_DSCR_DSCR_H #define _SELFTESTS_POWERPC_DSCR_DSCR_H #include #include #include #include #include #include #include #include #include #include #include #include "utils.h" #define THREADS 100 /* Max threads */ #define COUNT 100 /* Max iterations */ #define DSCR_MAX 16 /* Max DSCR value */ #define LEN_MAX 100 /* Max name length */ #define DSCR_DEFAULT "/sys/devices/system/cpu/dscr_default" #define CPU_PATH "/sys/devices/system/cpu/" #define rmb() asm volatile("lwsync":::"memory") #define wmb() asm volatile("lwsync":::"memory") #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) /* Prilvilege state DSCR access */ inline unsigned long get_dscr(void) { unsigned long ret; asm volatile("mfspr %0,%1" : "=r" (ret) : "i" (SPRN_DSCR_PRIV)); return ret; } inline void set_dscr(unsigned long val) { asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR_PRIV)); } /* Problem state DSCR access */ inline unsigned long get_dscr_usr(void) { unsigned long ret; asm volatile("mfspr %0,%1" : "=r" (ret) : "i" (SPRN_DSCR)); return ret; } inline void set_dscr_usr(unsigned long val) { asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR)); } /* Default DSCR access */ unsigned long get_default_dscr(void) { int fd = -1, ret; char buf[16]; unsigned long val; if (fd == -1) { fd = open(DSCR_DEFAULT, O_RDONLY); if (fd == -1) { perror("open() failed"); exit(1); } } memset(buf, 0, sizeof(buf)); lseek(fd, 0, SEEK_SET); ret = read(fd, buf, sizeof(buf)); if (ret == -1) { perror("read() failed"); exit(1); } sscanf(buf, "%lx", &val); close(fd); return val; } void set_default_dscr(unsigned long val) { int fd = -1, ret; char buf[16]; if (fd == -1) { fd = open(DSCR_DEFAULT, O_RDWR); if (fd == -1) { perror("open() failed"); exit(1); } } sprintf(buf, "%lx\n", val); ret = write(fd, buf, strlen(buf)); if (ret == -1) { perror("write() failed"); exit(1); } close(fd); } double uniform_deviate(int seed) { return seed * (1.0 / (RAND_MAX + 1.0)); } #endif /* _SELFTESTS_POWERPC_DSCR_DSCR_H */ h' size='10' name='q' value=''/>
diff options
context:
space:
mode:
authorSteven Rostedt (VMware) <rostedt@goodmis.org>2017-01-30 19:27:10 -0500
committerSteven Rostedt (VMware) <rostedt@goodmis.org>2017-01-31 09:13:49 -0500
commit79c6f448c8b79c321e4a1f31f98194e4f6b6cae7 (patch)
tree370efda701f03cccf21e02bb1fdd3b852547d75c /kernel/rcu
parent0c744ea4f77d72b3dcebb7a8f2684633ec79be88 (diff)
tracing: Fix hwlat kthread migration
The hwlat tracer creates a kernel thread at start of the tracer. It is pinned to a single CPU and will move to the next CPU after each period of running. If the user modifies the migration thread's affinity, it will not change after that happens. The original code created the thread at the first instance it was called, but later was changed to destroy the thread after the tracer was finished, and would not be created until the next instance of the tracer was established. The code that initialized the affinity was only called on the initial instantiation of the tracer. After that, it was not initialized, and the previous affinity did not match the current newly created one, making it appear that the user modified the thread's affinity when it did not, and the thread failed to migrate again. Cc: stable@vger.kernel.org Fixes: 0330f7aa8ee6 ("tracing: Have hwlat trace migrate across tracing_cpumask CPUs") Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Diffstat (limited to 'kernel/rcu')