cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

top.c (3822B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
      4 *
      5 * Refactored from builtin-top.c, see that files for further copyright notes.
      6 */
      7
      8#include "event.h"
      9#include "evlist.h"
     10#include "evsel.h"
     11#include "parse-events.h"
     12#include "symbol.h"
     13#include "top.h"
     14#include "../perf.h"
     15#include <inttypes.h>
     16
     17#define SNPRINTF(buf, size, fmt, args...) \
     18({ \
     19	size_t r = snprintf(buf, size, fmt, ## args); \
     20	r > size ?  size : r; \
     21})
     22
     23size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size)
     24{
     25	float samples_per_sec;
     26	float ksamples_per_sec;
     27	float esamples_percent;
     28	struct record_opts *opts = &top->record_opts;
     29	struct target *target = &opts->target;
     30	size_t ret = 0;
     31
     32	if (top->samples) {
     33		samples_per_sec = top->samples / top->delay_secs;
     34		ksamples_per_sec = top->kernel_samples / top->delay_secs;
     35		esamples_percent = (100.0 * top->exact_samples) / top->samples;
     36	} else {
     37		samples_per_sec = ksamples_per_sec = esamples_percent = 0.0;
     38	}
     39
     40	if (!perf_guest) {
     41		float ksamples_percent = 0.0;
     42
     43		if (samples_per_sec)
     44			ksamples_percent = (100.0 * ksamples_per_sec) /
     45							samples_per_sec;
     46		ret = SNPRINTF(bf, size,
     47			       "   PerfTop:%8.0f irqs/sec  kernel:%4.1f%%"
     48			       "  exact: %4.1f%% lost: %" PRIu64 "/%" PRIu64 " drop: %" PRIu64 "/%" PRIu64 " [",
     49			       samples_per_sec, ksamples_percent, esamples_percent,
     50			       top->lost, top->lost_total, top->drop, top->drop_total);
     51	} else {
     52		float us_samples_per_sec = top->us_samples / top->delay_secs;
     53		float guest_kernel_samples_per_sec = top->guest_kernel_samples / top->delay_secs;
     54		float guest_us_samples_per_sec = top->guest_us_samples / top->delay_secs;
     55
     56		ret = SNPRINTF(bf, size,
     57			       "   PerfTop:%8.0f irqs/sec  kernel:%4.1f%% us:%4.1f%%"
     58			       " guest kernel:%4.1f%% guest us:%4.1f%%"
     59			       " exact: %4.1f%% [", samples_per_sec,
     60			       100.0 - (100.0 * ((samples_per_sec - ksamples_per_sec) /
     61						 samples_per_sec)),
     62			       100.0 - (100.0 * ((samples_per_sec - us_samples_per_sec) /
     63						 samples_per_sec)),
     64			       100.0 - (100.0 * ((samples_per_sec -
     65						  guest_kernel_samples_per_sec) /
     66						 samples_per_sec)),
     67			       100.0 - (100.0 * ((samples_per_sec -
     68						  guest_us_samples_per_sec) /
     69						 samples_per_sec)),
     70			       esamples_percent);
     71	}
     72
     73	if (top->evlist->core.nr_entries == 1) {
     74		struct evsel *first = evlist__first(top->evlist);
     75		ret += SNPRINTF(bf + ret, size - ret, "%" PRIu64 "%s ",
     76				(uint64_t)first->core.attr.sample_period,
     77				opts->freq ? "Hz" : "");
     78	}
     79
     80	ret += SNPRINTF(bf + ret, size - ret, "%s", evsel__name(top->sym_evsel));
     81
     82	ret += SNPRINTF(bf + ret, size - ret, "], ");
     83
     84	if (target->pid)
     85		ret += SNPRINTF(bf + ret, size - ret, " (target_pid: %s",
     86				target->pid);
     87	else if (target->tid)
     88		ret += SNPRINTF(bf + ret, size - ret, " (target_tid: %s",
     89				target->tid);
     90	else if (target->uid_str != NULL)
     91		ret += SNPRINTF(bf + ret, size - ret, " (uid: %s",
     92				target->uid_str);
     93	else
     94		ret += SNPRINTF(bf + ret, size - ret, " (all");
     95
     96	if (target->cpu_list)
     97		ret += SNPRINTF(bf + ret, size - ret, ", CPU%s: %s)",
     98				perf_cpu_map__nr(top->evlist->core.user_requested_cpus) > 1
     99				? "s" : "",
    100				target->cpu_list);
    101	else {
    102		if (target->tid)
    103			ret += SNPRINTF(bf + ret, size - ret, ")");
    104		else
    105			ret += SNPRINTF(bf + ret, size - ret, ", %d CPU%s)",
    106					perf_cpu_map__nr(top->evlist->core.user_requested_cpus),
    107					perf_cpu_map__nr(top->evlist->core.user_requested_cpus) > 1
    108					? "s" : "");
    109	}
    110
    111	perf_top__reset_sample_counters(top);
    112	return ret;
    113}
    114
    115void perf_top__reset_sample_counters(struct perf_top *top)
    116{
    117	top->samples = top->us_samples = top->kernel_samples =
    118	top->exact_samples = top->guest_kernel_samples =
    119	top->guest_us_samples = top->lost = top->drop = 0;
    120}