[Pdbg] [PATCH 7/7] pdbg/htm: Enforce powersave=off
Michael Neuling
mikey at neuling.org
Fri Mar 16 13:53:15 AEDT 2018
Why not just use the sysfs interface to turn off the cpuidle driver?
Mikey
On Wed, 2018-03-07 at 16:49 +1100, Cyril Bur wrote:
> Core HTM has a nasty habit of not working if the stars haven't aligned
> with the exact polar axis of Mars. To complicate matters if Zeus got up
> on the incorrect side of the bed Core HTM will likely reflect his mood.
>
> Core HTM requires that no threads be in powersave. It isn't clear if
> this restriction only applies to threads on the core being traced on or
> if this is a global thing. In order to be as safe as possible, pdbg
> will enforce that powersave be disabled globally.
>
> Signed-off-by: Cyril Bur <cyrilbur at gmail.com>
> ---
> Initially I thought we would also have to mandate `ppc64_cpu --smt=off`
> because other tools do it. Some thinking later it doesn't make sense to
> enforce that, really the only thing we have to do with respect to Linux
> is powersave=off, having a sleeping thread while core trace is
> guaranteed to do bad things. I have a feeling that other tools got a
> bit confused between powersave and smt (at least the Linux view of both).
>
> It works on a Palmetto with `ppc64_cpu --smt=8`. I am waiting on
> confirmation that the resulting trace is sane but I don't have any
> reason to believe it isn't
> ---
> src/htm.c | 37 ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 36 insertions(+), 1 deletion(-)
>
> diff --git a/src/htm.c b/src/htm.c
> index 1032a5c..4917d1a 100644
> --- a/src/htm.c
> +++ b/src/htm.c
> @@ -259,6 +259,7 @@ static void print_usage(enum htm_type type)
>
> int run_htm(int optind, int argc, char *argv[])
> {
> + struct pdbg_target *target;
> enum htm_type type;
> int i, rc = 0;
>
> @@ -278,9 +279,43 @@ int run_htm(int optind, int argc, char *argv[])
> return 0;
> }
>
> - if (type == HTM_CORE)
> + if (type == HTM_CORE) {
> fprintf(stderr, "Warning: Core HTM is currently
> experimental\n");
>
> + /*
> + * Check that powersave is off.
> + *
> + * This is as easy as checking that every single
> + * thread is "ACTIVE" and hasn't gone into any sleep
> + * state.
> + */
> + pdbg_for_each_class_target("thread", target) {
> + if (pdbg_target_status(target) ==
> PDBG_TARGET_NONEXISTANT)
> + continue;
> +
> + if ((thread_status(target) & THREAD_STATUS_ACTIVE) !=
> THREAD_STATUS_ACTIVE) {
> + fprintf(stderr, "It appears powersave is on
> 0x%" PRIx64 "%p\n", thread_status(target), target);
> + fprintf(stderr, "core HTM needs to run with
> powersave off\n");
> + fprintf(stderr, "Hint: put powersave=off on
> the kernel commandline\n");
> + return 0;
> + }
> + }
> +
> + i = 0;
> + pdbg_for_each_class_target("core", target)
> + if (!target_is_disabled(target))
> + i++;
> + if (i == 0)
> + fprintf(stderr, "You haven't selected any HTM
> Cores\n");
> + if (i > 1) {
> + fprintf(stderr, "It doesn't make sense to core trace
> on"
> + " multiple cores at once. %d\n", i);
> + fprintf(stderr, "What you probably want is -p 0 -c
> x\n");
> + }
> + if (i != 1)
> + return 0;
> + }
> +
> optind++;
> for (i = 0; i < ARRAY_SIZE(actions); i++) {
> if (strcmp(argv[optind], actions[i].name) == 0) {
> --
> 2.16.2
>
More information about the Pdbg
mailing list