scale=0 define gcd(a,b) { auto t; while (b) { t = b; b = a % b; a = t; } return a; } /* Division by reciprocal multiplication. */ define fmul(b,n,d) { return (2^b*n+d-1)/d; } /* Adjustment factor when a ceiling value is used. Use as: (imul * n) + (fmulxx * n + fadjxx) >> xx) */ define fadj(b,n,d) { auto v; d = d/gcd(n,d); v = 2^b*(d-1)/d; return v; } /* Compute the appropriate mul/adj values as well as a shift count, which brings the mul value into the range 2^b-1 <= x < 2^b. Such a shift value will be correct in the signed integer range and off by at most one in the upper half of the unsigned range. */ define fmuls(b,n,d) { auto s, m; for (s = 0; 1; s++) { m = fmul(s,n,d); if (m >= 2^(b-1)) return s; } return 0; } define timeconst(hz) { print "/* Automatically generated by kernel/time/timeconst.bc */\n" print "/* Time conversion constants for HZ == ", hz, " */\n" print "\n" print "#ifndef KERNEL_TIMECONST_H\n" print "#define KERNEL_TIMECONST_H\n\n" print "#include \n" print "#include \n\n" print "#if HZ != ", hz, "\n" print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n" print "#endif\n\n" if (hz < 2) { print "#error Totally bogus HZ value!\n" } else { s=fmuls(32,1000,hz) obase=16 print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n" print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n" obase=10 print "#define HZ_TO_MSEC_SHR32\t", s, "\n" s=fmuls(32,hz,1000) obase=16 print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n" print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n" obase=10 print "#define MSEC_TO_HZ_SHR32\t", s, "\n" obase=10 cd=gcd(hz,1000) print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n" print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n" print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n" print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n" print "\n" s=fmuls(32,1000000,hz) obase=16 print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n" print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n" obase=10 print "#define HZ_TO_USEC_SHR32\t", s, "\n" s=fmuls(32,hz,1000000) obase=16 print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n" print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n" obase=10 print "#define USEC_TO_HZ_SHR32\t", s, "\n" obase=10 cd=gcd(hz,1000000) print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n" print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n" print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n" print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n" print "\n" print "#endif /* KERNEL_TIMECONST_H */\n" } halt } hz = read(); timeconst(hz) pe='submit' value='search'/>
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/power/autosleep.c
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/power/autosleep.c')