From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0D8AC346774; Mon, 6 Apr 2026 06:06:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775455599; cv=none; b=q++wcayRNGB57oveZrvrioChAMiGVuQFeNZg0KBD0rZxR+dqSkQ6tnQdym3Akv9c24V8OPudRS1ae7T0lzFAxlL5aqKiiiF8BSdysFDMXMB642zTscP9gwnfb45WL7WrVNObG1JSRgLQNbxjzZBfexBFCoaApsbrh2r2L/rLrAk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775455599; c=relaxed/simple; bh=VjbAdFTsnKeOS2ZkuShQeNDDTokULi2/AolFTG1NbWs=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=DASsGkLL8CO6EYunz0FtijJBR7Pn2cFGg7kJd9gTnJv8Nb+IQOF6s9g7SrMcEyz+J9Lwt0GKR0Gvy9Gt93zfl/WaafFdpdv8C/5PrupMXHgJqco+aj3DmsCX0e3FTsvlKN3blayMKuxY1einblGfc37bOWglTaiKSfOQB6/mE/A= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BCL3KlEK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BCL3KlEK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 39E35C4CEF7; Mon, 6 Apr 2026 06:06:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1775455598; bh=VjbAdFTsnKeOS2ZkuShQeNDDTokULi2/AolFTG1NbWs=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=BCL3KlEKveO1wJFNbSx81Kf6Il6GAwVKnw6iz4VpFifzFRNW4R2bhbx8A90ph+bUT FwlH+9yUj0HD9H6jMX4vc18gwRRfT0wA+7epnRjmAEc1l/eFkgAaK2o3Mk5lLAnENH JTesn0B/1Tfuh4Dz+R815DGs+/6zuS5UYfFpxtPyEfCrdQRO5tF3j8fTxUjBhLK/kt LP0M1WTsoCd4naz7UOjRvjd4ois51dLvlWev0H8WFyOsIioDiYFKCxq2WNvf/CpiXq SjBoSfyavhpNANDiHnXjHuCWtr5xuS+vvsIDxS7HbAnLXDKcHQMwZTgSjW2oBSF2OC VZ3RK3m6946Fg== Date: Sun, 5 Apr 2026 23:06:35 -0700 From: Namhyung Kim To: Ian Rogers Cc: acme@kernel.org, adrian.hunter@intel.com, ajones@ventanamicro.com, ak@linux.intel.com, alex@ghiti.fr, alexander.shishkin@linux.intel.com, anup@brainfault.org, aou@eecs.berkeley.edu, atrajeev@linux.ibm.com, blakejones@google.com, ctshao@google.com, dapeng1.mi@linux.intel.com, derek.foreman@collabora.com, dvyukov@google.com, howardchu95@gmail.com, hrishikesh123s@gmail.com, james.clark@linaro.org, jolsa@kernel.org, krzysztof.m.lopatowski@gmail.com, leo.yan@arm.com, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux@treblig.org, mingo@redhat.com, nichen@iscas.ac.cn, palmer@dabbelt.com, peterz@infradead.org, pjw@kernel.org, ravi.bangoria@amd.com, swapnil.sapkal@amd.com, tanze@kylinos.cn, thomas.falcon@intel.com, tianyou.li@intel.com, yujie.liu@intel.com, zhouquan@iscas.ac.cn Subject: Re: [PATCH v6 06/25] perf evsel: Refactor evsel tracepoint sample accessors perf_sample Message-ID: References: <20260403204017.2919994-1-irogers@google.com> <20260404034325.3172592-1-irogers@google.com> <20260404034325.3172592-7-irogers@google.com> Precedence: bulk X-Mailing-List: linux-perf-users@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20260404034325.3172592-7-irogers@google.com> On Fri, Apr 03, 2026 at 08:43:06PM -0700, Ian Rogers wrote: > The evsel argument to evsel__intval, evsel__rawptr, and similar > functions, is unnecessary as it can be read from the sample. Remove > the evsel and rename the function to match that the data is coming > from the sample. > > Add bounds checks to a number read values from review feedback. Make > perf_sample__strval avoid returning NULL pointers, return an empty > string instead. Fix the function type to reflect this, catching a bug > in kwork where the string wasn't being duplicated. I'm not sure if it's a bug... the string was never freed and duplicating it would create a lot of memory leaks. Also it seems you still check the return value of perf_sample__strval() if it's NULL. Thanks, Namhyung > > Signed-off-by: Ian Rogers > --- > tools/perf/builtin-inject.c | 2 +- > tools/perf/builtin-kmem.c | 49 ++++++--- > tools/perf/builtin-kvm.c | 2 +- > tools/perf/builtin-kwork.c | 29 +++-- > tools/perf/builtin-lock.c | 32 +++--- > tools/perf/builtin-sched.c | 97 ++++++++-------- > tools/perf/builtin-timechart.c | 104 ++++++++++-------- > tools/perf/builtin-trace.c | 12 +- > tools/perf/tests/openat-syscall-tp-fields.c | 2 +- > tools/perf/tests/switch-tracking.c | 4 +- > tools/perf/util/evsel.c | 33 ++++-- > tools/perf/util/evsel.h | 12 +- > tools/perf/util/intel-pt.c | 2 +- > .../perf/util/kvm-stat-arch/kvm-stat-arm64.c | 6 +- > .../util/kvm-stat-arch/kvm-stat-loongarch.c | 2 +- > .../util/kvm-stat-arch/kvm-stat-powerpc.c | 2 +- > .../perf/util/kvm-stat-arch/kvm-stat-riscv.c | 3 +- > tools/perf/util/kvm-stat-arch/kvm-stat-s390.c | 8 +- > tools/perf/util/kvm-stat-arch/kvm-stat-x86.c | 16 +-- > tools/perf/util/kvm-stat.c | 2 +- > 20 files changed, 230 insertions(+), 189 deletions(-) > > diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c > index a958ac7cec9d..237ee708d689 100644 > --- a/tools/perf/builtin-inject.c > +++ b/tools/perf/builtin-inject.c > @@ -1082,7 +1082,7 @@ static int perf_inject__sched_stat(const struct perf_tool *tool, > union perf_event *event_sw; > struct perf_sample sample_sw; > struct perf_inject *inject = container_of(tool, struct perf_inject, tool); > - u32 pid = evsel__intval(evsel, sample, "pid"); > + u32 pid = perf_sample__intval(sample, "pid"); > int ret; > > list_for_each_entry(ent, &inject->samples, node) { > diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c > index 34852a4c3fc8..4f3ff29d2a9f 100644 > --- a/tools/perf/builtin-kmem.c > +++ b/tools/perf/builtin-kmem.c > @@ -173,10 +173,10 @@ static int insert_caller_stat(unsigned long call_site, > > static int evsel__process_alloc_event(struct evsel *evsel, struct perf_sample *sample) > { > - unsigned long ptr = evsel__intval(evsel, sample, "ptr"), > - call_site = evsel__intval(evsel, sample, "call_site"); > - int bytes_req = evsel__intval(evsel, sample, "bytes_req"), > - bytes_alloc = evsel__intval(evsel, sample, "bytes_alloc"); > + unsigned long ptr = perf_sample__intval(sample, "ptr"), > + call_site = perf_sample__intval(sample, "call_site"); > + int bytes_req = perf_sample__intval(sample, "bytes_req"), > + bytes_alloc = perf_sample__intval(sample, "bytes_alloc"); > > if (insert_alloc_stat(call_site, ptr, bytes_req, bytes_alloc, sample->cpu) || > insert_caller_stat(call_site, bytes_req, bytes_alloc)) > @@ -202,7 +202,7 @@ static int evsel__process_alloc_event(struct evsel *evsel, struct perf_sample *s > int node1, node2; > > node1 = cpu__get_node((struct perf_cpu){.cpu = sample->cpu}); > - node2 = evsel__intval(evsel, sample, "node"); > + node2 = perf_sample__intval(sample, "node"); > > /* > * If the field "node" is NUMA_NO_NODE (-1), we don't take it > @@ -243,9 +243,9 @@ static struct alloc_stat *search_alloc_stat(unsigned long ptr, > return NULL; > } > > -static int evsel__process_free_event(struct evsel *evsel, struct perf_sample *sample) > +static int evsel__process_free_event(struct evsel *evsel __maybe_unused, struct perf_sample *sample) > { > - unsigned long ptr = evsel__intval(evsel, sample, "ptr"); > + unsigned long ptr = perf_sample__intval(sample, "ptr"); > struct alloc_stat *s_alloc, *s_caller; > > s_alloc = search_alloc_stat(ptr, 0, &root_alloc_stat, ptr_cmp); > @@ -808,10 +808,9 @@ static int parse_gfp_flags(struct evsel *evsel, struct perf_sample *sample, > static int evsel__process_page_alloc_event(struct evsel *evsel, struct perf_sample *sample) > { > u64 page; > - unsigned int order = evsel__intval(evsel, sample, "order"); > - unsigned int gfp_flags = evsel__intval(evsel, sample, "gfp_flags"); > - unsigned int migrate_type = evsel__intval(evsel, sample, > - "migratetype"); > + unsigned int order = perf_sample__intval(sample, "order"); > + unsigned int gfp_flags = perf_sample__intval(sample, "gfp_flags"); > + unsigned int migrate_type = perf_sample__intval(sample, "migratetype"); > u64 bytes = kmem_page_size << order; > u64 callsite; > struct page_stat *pstat; > @@ -821,10 +820,20 @@ static int evsel__process_page_alloc_event(struct evsel *evsel, struct perf_samp > .migrate_type = migrate_type, > }; > > + if (order >= MAX_PAGE_ORDER) { > + pr_debug("Out-of-bounds order %u\n", order); > + return -1; > + } > + > + if (migrate_type >= MAX_MIGRATE_TYPES) { > + pr_debug("Out-of-bounds migratetype %u\n", migrate_type); > + return -1; > + } > + > if (use_pfn) > - page = evsel__intval(evsel, sample, "pfn"); > + page = perf_sample__intval(sample, "pfn"); > else > - page = evsel__intval(evsel, sample, "page"); > + page = perf_sample__intval(sample, "page"); > > nr_page_allocs++; > total_page_alloc_bytes += bytes; > @@ -877,20 +886,26 @@ static int evsel__process_page_alloc_event(struct evsel *evsel, struct perf_samp > return 0; > } > > -static int evsel__process_page_free_event(struct evsel *evsel, struct perf_sample *sample) > +static int evsel__process_page_free_event(struct evsel *evsel __maybe_unused, > + struct perf_sample *sample) > { > u64 page; > - unsigned int order = evsel__intval(evsel, sample, "order"); > + unsigned int order = perf_sample__intval(sample, "order"); > u64 bytes = kmem_page_size << order; > struct page_stat *pstat; > struct page_stat this = { > .order = order, > }; > > + if (order >= MAX_PAGE_ORDER) { > + pr_debug("Out-of-bounds order %u\n", order); > + return -1; > + } > + > if (use_pfn) > - page = evsel__intval(evsel, sample, "pfn"); > + page = perf_sample__intval(sample, "pfn"); > else > - page = evsel__intval(evsel, sample, "page"); > + page = perf_sample__intval(sample, "page"); > > nr_page_frees++; > total_page_free_bytes += bytes; > diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c > index d9b9792894a8..dd2ed21596aa 100644 > --- a/tools/perf/builtin-kvm.c > +++ b/tools/perf/builtin-kvm.c > @@ -930,7 +930,7 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread, > return NULL; > } > > - vcpu_record->vcpu_id = evsel__intval(sample->evsel, sample, vcpu_id_str(e_machine)); > + vcpu_record->vcpu_id = perf_sample__intval(sample, vcpu_id_str(e_machine)); > thread__set_priv(thread, vcpu_record); > } > > diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c > index e34a1f35439e..dceb9b79aa6a 100644 > --- a/tools/perf/builtin-kwork.c > +++ b/tools/perf/builtin-kwork.c > @@ -1006,7 +1006,7 @@ static void irq_work_init(struct perf_kwork *kwork, > struct kwork_class *class, > struct kwork_work *work, > enum kwork_trace_type src_type __maybe_unused, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > struct machine *machine __maybe_unused) > { > @@ -1014,11 +1014,11 @@ static void irq_work_init(struct perf_kwork *kwork, > work->cpu = sample->cpu; > > if (kwork->report == KWORK_REPORT_TOP) { > - work->id = evsel__intval_common(evsel, sample, "common_pid"); > + work->id = perf_sample__intval_common(sample, "common_pid"); > work->name = NULL; > } else { > - work->id = evsel__intval(evsel, sample, "irq"); > - work->name = evsel__strval(evsel, sample, "name"); > + work->id = perf_sample__intval(sample, "irq"); > + work->name = strdup(perf_sample__strval(sample, "name") ?: ""); > } > } > > @@ -1144,10 +1144,10 @@ static void softirq_work_init(struct perf_kwork *kwork, > work->cpu = sample->cpu; > > if (kwork->report == KWORK_REPORT_TOP) { > - work->id = evsel__intval_common(evsel, sample, "common_pid"); > + work->id = perf_sample__intval_common(sample, "common_pid"); > work->name = NULL; > } else { > - num = evsel__intval(evsel, sample, "vec"); > + num = perf_sample__intval(sample, "vec"); > work->id = num; > work->name = evsel__softirq_name(evsel, num); > } > @@ -1234,17 +1234,16 @@ static void workqueue_work_init(struct perf_kwork *kwork __maybe_unused, > struct kwork_class *class, > struct kwork_work *work, > enum kwork_trace_type src_type __maybe_unused, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > struct machine *machine) > { > char *modp = NULL; > - unsigned long long function_addr = evsel__intval(evsel, > - sample, "function"); > + unsigned long long function_addr = perf_sample__intval(sample, "function"); > > work->class = class; > work->cpu = sample->cpu; > - work->id = evsel__intval(evsel, sample, "work"); > + work->id = perf_sample__intval(sample, "work"); > work->name = function_addr == 0 ? NULL : > machine__resolve_kernel_addr(machine, &function_addr, &modp); > } > @@ -1302,7 +1301,7 @@ static void sched_work_init(struct perf_kwork *kwork __maybe_unused, > struct kwork_class *class, > struct kwork_work *work, > enum kwork_trace_type src_type, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > struct machine *machine __maybe_unused) > { > @@ -1310,11 +1309,11 @@ static void sched_work_init(struct perf_kwork *kwork __maybe_unused, > work->cpu = sample->cpu; > > if (src_type == KWORK_TRACE_EXIT) { > - work->id = evsel__intval(evsel, sample, "prev_pid"); > - work->name = strdup(evsel__strval(evsel, sample, "prev_comm")); > + work->id = perf_sample__intval(sample, "prev_pid"); > + work->name = strdup(perf_sample__strval(sample, "prev_comm") ?: ""); > } else if (src_type == KWORK_TRACE_ENTRY) { > - work->id = evsel__intval(evsel, sample, "next_pid"); > - work->name = strdup(evsel__strval(evsel, sample, "next_comm")); > + work->id = perf_sample__intval(sample, "next_pid"); > + work->name = strdup(perf_sample__strval(sample, "next_comm") ?: ""); > } > } > > diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c > index 4d8ddf6391e8..cbf3a39c7837 100644 > --- a/tools/perf/builtin-lock.c > +++ b/tools/perf/builtin-lock.c > @@ -563,15 +563,15 @@ static int get_key_by_aggr_mode(u64 *key, u64 addr, struct evsel *evsel, > return get_key_by_aggr_mode_simple(key, addr, sample->tid); > } > > -static int report_lock_acquire_event(struct evsel *evsel, > +static int report_lock_acquire_event(struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > struct lock_stat *ls; > struct thread_stat *ts; > struct lock_seq_stat *seq; > - const char *name = evsel__strval(evsel, sample, "name"); > - u64 addr = evsel__intval(evsel, sample, "lockdep_addr"); > - int flag = evsel__intval(evsel, sample, "flags"); > + const char *name = perf_sample__strval(sample, "name"); > + u64 addr = perf_sample__intval(sample, "lockdep_addr"); > + int flag = perf_sample__intval(sample, "flags"); > u64 key; > int ret; > > @@ -638,15 +638,15 @@ static int report_lock_acquire_event(struct evsel *evsel, > return 0; > } > > -static int report_lock_acquired_event(struct evsel *evsel, > +static int report_lock_acquired_event(struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > struct lock_stat *ls; > struct thread_stat *ts; > struct lock_seq_stat *seq; > u64 contended_term; > - const char *name = evsel__strval(evsel, sample, "name"); > - u64 addr = evsel__intval(evsel, sample, "lockdep_addr"); > + const char *name = perf_sample__strval(sample, "name"); > + u64 addr = perf_sample__intval(sample, "lockdep_addr"); > u64 key; > int ret; > > @@ -704,14 +704,14 @@ static int report_lock_acquired_event(struct evsel *evsel, > return 0; > } > > -static int report_lock_contended_event(struct evsel *evsel, > +static int report_lock_contended_event(struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > struct lock_stat *ls; > struct thread_stat *ts; > struct lock_seq_stat *seq; > - const char *name = evsel__strval(evsel, sample, "name"); > - u64 addr = evsel__intval(evsel, sample, "lockdep_addr"); > + const char *name = perf_sample__strval(sample, "name"); > + u64 addr = perf_sample__intval(sample, "lockdep_addr"); > u64 key; > int ret; > > @@ -762,14 +762,14 @@ static int report_lock_contended_event(struct evsel *evsel, > return 0; > } > > -static int report_lock_release_event(struct evsel *evsel, > +static int report_lock_release_event(struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > struct lock_stat *ls; > struct thread_stat *ts; > struct lock_seq_stat *seq; > - const char *name = evsel__strval(evsel, sample, "name"); > - u64 addr = evsel__intval(evsel, sample, "lockdep_addr"); > + const char *name = perf_sample__strval(sample, "name"); > + u64 addr = perf_sample__intval(sample, "lockdep_addr"); > u64 key; > int ret; > > @@ -969,8 +969,8 @@ static int report_lock_contention_begin_event(struct evsel *evsel, > struct lock_stat *ls; > struct thread_stat *ts; > struct lock_seq_stat *seq; > - u64 addr = evsel__intval(evsel, sample, "lock_addr"); > - unsigned int flags = evsel__intval(evsel, sample, "flags"); > + u64 addr = perf_sample__intval(sample, "lock_addr"); > + unsigned int flags = perf_sample__intval(sample, "flags"); > u64 key; > int i, ret; > static bool kmap_loaded; > @@ -1134,7 +1134,7 @@ static int report_lock_contention_end_event(struct evsel *evsel, > struct thread_stat *ts; > struct lock_seq_stat *seq; > u64 contended_term; > - u64 addr = evsel__intval(evsel, sample, "lock_addr"); > + u64 addr = perf_sample__intval(sample, "lock_addr"); > u64 key; > int ret; > > diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c > index 296b9837278a..3e7e8ad0bc13 100644 > --- a/tools/perf/builtin-sched.c > +++ b/tools/perf/builtin-sched.c > @@ -829,8 +829,8 @@ replay_wakeup_event(struct perf_sched *sched, > struct evsel *evsel, struct perf_sample *sample, > struct machine *machine __maybe_unused) > { > - const char *comm = evsel__strval(evsel, sample, "comm"); > - const u32 pid = evsel__intval(evsel, sample, "pid"); > + const char *comm = perf_sample__strval(sample, "comm"); > + const u32 pid = perf_sample__intval(sample, "pid"); > struct task_desc *waker, *wakee; > > if (verbose > 0) { > @@ -851,10 +851,10 @@ static int replay_switch_event(struct perf_sched *sched, > struct perf_sample *sample, > struct machine *machine __maybe_unused) > { > - const char *prev_comm = evsel__strval(evsel, sample, "prev_comm"), > - *next_comm = evsel__strval(evsel, sample, "next_comm"); > - const u32 prev_pid = evsel__intval(evsel, sample, "prev_pid"), > - next_pid = evsel__intval(evsel, sample, "next_pid"); > + const char *prev_comm = perf_sample__strval(sample, "prev_comm"), > + *next_comm = perf_sample__strval(sample, "next_comm"); > + const u32 prev_pid = perf_sample__intval(sample, "prev_pid"), > + next_pid = perf_sample__intval(sample, "next_pid"); > struct task_desc *prev, __maybe_unused *next; > u64 timestamp0, timestamp = sample->time; > int cpu = sample->cpu; > @@ -1134,13 +1134,13 @@ static void free_work_atoms(struct work_atoms *atoms) > } > > static int latency_switch_event(struct perf_sched *sched, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > struct machine *machine) > { > - const u32 prev_pid = evsel__intval(evsel, sample, "prev_pid"), > - next_pid = evsel__intval(evsel, sample, "next_pid"); > - const char prev_state = evsel__taskstate(evsel, sample, "prev_state"); > + const u32 prev_pid = perf_sample__intval(sample, "prev_pid"), > + next_pid = perf_sample__intval(sample, "next_pid"); > + const char prev_state = perf_sample__taskstate(sample, "prev_state"); > struct work_atoms *out_events, *in_events; > struct thread *sched_out, *sched_in; > u64 timestamp0, timestamp = sample->time; > @@ -1204,12 +1204,12 @@ static int latency_switch_event(struct perf_sched *sched, > } > > static int latency_runtime_event(struct perf_sched *sched, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > struct machine *machine) > { > - const u32 pid = evsel__intval(evsel, sample, "pid"); > - const u64 runtime = evsel__intval(evsel, sample, "runtime"); > + const u32 pid = perf_sample__intval(sample, "pid"); > + const u64 runtime = perf_sample__intval(sample, "runtime"); > struct thread *thread = machine__findnew_thread(machine, -1, pid); > struct work_atoms *atoms = thread_atoms_search(&sched->atom_root, thread, &sched->cmp_pid); > u64 timestamp = sample->time; > @@ -1239,11 +1239,11 @@ static int latency_runtime_event(struct perf_sched *sched, > } > > static int latency_wakeup_event(struct perf_sched *sched, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > struct machine *machine) > { > - const u32 pid = evsel__intval(evsel, sample, "pid"); > + const u32 pid = perf_sample__intval(sample, "pid"); > struct work_atoms *atoms; > struct work_atom *atom; > struct thread *wakee; > @@ -1300,11 +1300,11 @@ static int latency_wakeup_event(struct perf_sched *sched, > } > > static int latency_migrate_task_event(struct perf_sched *sched, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > struct machine *machine) > { > - const u32 pid = evsel__intval(evsel, sample, "pid"); > + const u32 pid = perf_sample__intval(sample, "pid"); > u64 timestamp = sample->time; > struct work_atoms *atoms; > struct work_atom *atom; > @@ -1626,11 +1626,11 @@ static void print_sched_map(struct perf_sched *sched, struct perf_cpu this_cpu, > } > } > > -static int map_switch_event(struct perf_sched *sched, struct evsel *evsel, > +static int map_switch_event(struct perf_sched *sched, struct evsel *evsel __maybe_unused, > struct perf_sample *sample, struct machine *machine) > { > - const u32 next_pid = evsel__intval(evsel, sample, "next_pid"); > - const u32 prev_pid = evsel__intval(evsel, sample, "prev_pid"); > + const u32 next_pid = perf_sample__intval(sample, "next_pid"); > + const u32 prev_pid = perf_sample__intval(sample, "prev_pid"); > struct thread *sched_in, *sched_out; > struct thread_runtime *tr; > int new_shortname; > @@ -1797,8 +1797,13 @@ static int process_sched_switch_event(const struct perf_tool *tool, > { > struct perf_sched *sched = container_of(tool, struct perf_sched, tool); > int this_cpu = sample->cpu, err = 0; > - u32 prev_pid = evsel__intval(evsel, sample, "prev_pid"), > - next_pid = evsel__intval(evsel, sample, "next_pid"); > + u32 prev_pid = perf_sample__intval(sample, "prev_pid"), > + next_pid = perf_sample__intval(sample, "next_pid"); > + > + if (this_cpu < 0 || this_cpu >= MAX_CPUS) { > + pr_debug("Out-of-bound sample CPU %d\n", this_cpu); > + return -1; > + } > > if (sched->curr_pid[this_cpu] != (u32)-1) { > /* > @@ -2068,12 +2073,11 @@ static char *timehist_get_commstr(struct thread *thread) > > /* prio field format: xxx or xxx->yyy */ > #define MAX_PRIO_STR_LEN 8 > -static char *timehist_get_priostr(struct evsel *evsel, > - struct thread *thread, > +static char *timehist_get_priostr(struct thread *thread, > struct perf_sample *sample) > { > static char prio_str[16]; > - int prev_prio = (int)evsel__intval(evsel, sample, "prev_prio"); > + int prev_prio = (int)perf_sample__intval(sample, "prev_prio"); > struct thread_runtime *tr = thread__priv(thread); > > if (tr->prio != prev_prio && tr->prio != -1) > @@ -2161,15 +2165,14 @@ static void timehist_header(struct perf_sched *sched) > } > > static void timehist_print_sample(struct perf_sched *sched, > - struct evsel *evsel, > struct perf_sample *sample, > struct addr_location *al, > struct thread *thread, > u64 t, const char state) > { > struct thread_runtime *tr = thread__priv(thread); > - const char *next_comm = evsel__strval(evsel, sample, "next_comm"); > - const u32 next_pid = evsel__intval(evsel, sample, "next_pid"); > + const char *next_comm = perf_sample__strval(sample, "next_comm"); > + const u32 next_pid = perf_sample__intval(sample, "next_pid"); > u32 max_cpus = sched->max_cpu.cpu + 1; > char tstr[64]; > char nstr[30]; > @@ -2198,14 +2201,15 @@ static void timehist_print_sample(struct perf_sched *sched, > } > > if (!thread__comm_set(thread)) { > - const char *prev_comm = evsel__strval(evsel, sample, "prev_comm"); > - thread__set_comm(thread, prev_comm, sample->time); > + const char *prev_comm = perf_sample__strval(sample, "prev_comm"); > + > + thread__set_comm(thread, prev_comm, sample->time); > } > > printf(" %-*s ", comm_width, timehist_get_commstr(thread)); > > if (sched->show_prio) > - printf(" %-*s ", MAX_PRIO_STR_LEN, timehist_get_priostr(evsel, thread, sample)); > + printf(" %-*s ", MAX_PRIO_STR_LEN, timehist_get_priostr(thread, sample)); > > wait_time = tr->dt_sleep + tr->dt_iowait + tr->dt_preempt; > print_sched_time(wait_time, 6); > @@ -2319,7 +2323,7 @@ static bool is_idle_sample(struct perf_sample *sample, > { > /* pid 0 == swapper == idle task */ > if (evsel__name_is(evsel, "sched:sched_switch")) > - return evsel__intval(evsel, sample, "prev_pid") == 0; > + return perf_sample__intval(sample, "prev_pid") == 0; > > return sample->pid == 0; > } > @@ -2539,7 +2543,7 @@ static struct thread *timehist_get_thread(struct perf_sched *sched, > itr->last_thread = thread__get(thread); > > /* copy task callchain when entering to idle */ > - if (evsel__intval(evsel, sample, "next_pid") == 0) > + if (perf_sample__intval(sample, "next_pid") == 0) > save_idle_callchain(sched, itr, sample); > } > } > @@ -2572,7 +2576,7 @@ static bool timehist_skip_sample(struct perf_sched *sched, > if (tr && tr->prio != -1) > prio = tr->prio; > else if (evsel__name_is(evsel, "sched:sched_switch")) > - prio = evsel__intval(evsel, sample, "prev_prio"); > + prio = perf_sample__intval(sample, "prev_prio"); > > if (prio != -1 && !test_bit(prio, sched->prio_bitmap)) { > rc = true; > @@ -2583,8 +2587,8 @@ static bool timehist_skip_sample(struct perf_sched *sched, > if (sched->idle_hist) { > if (!evsel__name_is(evsel, "sched:sched_switch")) > rc = true; > - else if (evsel__intval(evsel, sample, "prev_pid") != 0 && > - evsel__intval(evsel, sample, "next_pid") != 0) > + else if (perf_sample__intval(sample, "prev_pid") != 0 && > + perf_sample__intval(sample, "next_pid") != 0) > rc = true; > } > > @@ -2647,7 +2651,7 @@ static int timehist_sched_wakeup_event(const struct perf_tool *tool, > struct thread *thread; > struct thread_runtime *tr = NULL; > /* want pid of awakened task not pid in sample */ > - const u32 pid = evsel__intval(evsel, sample, "pid"); > + const u32 pid = perf_sample__intval(sample, "pid"); > > thread = machine__findnew_thread(machine, 0, pid); > if (thread == NULL) > @@ -2686,8 +2690,8 @@ static void timehist_print_migration_event(struct perf_sched *sched, > return; > > max_cpus = sched->max_cpu.cpu + 1; > - ocpu = evsel__intval(evsel, sample, "orig_cpu"); > - dcpu = evsel__intval(evsel, sample, "dest_cpu"); > + ocpu = perf_sample__intval(sample, "orig_cpu"); > + dcpu = perf_sample__intval(sample, "dest_cpu"); > > thread = machine__findnew_thread(machine, sample->pid, sample->tid); > if (thread == NULL) > @@ -2736,7 +2740,7 @@ static int timehist_migrate_task_event(const struct perf_tool *tool, > struct thread *thread; > struct thread_runtime *tr = NULL; > /* want pid of migrated task not pid in sample */ > - const u32 pid = evsel__intval(evsel, sample, "pid"); > + const u32 pid = perf_sample__intval(sample, "pid"); > > thread = machine__findnew_thread(machine, 0, pid); > if (thread == NULL) > @@ -2761,14 +2765,13 @@ static int timehist_migrate_task_event(const struct perf_tool *tool, > return 0; > } > > -static void timehist_update_task_prio(struct evsel *evsel, > - struct perf_sample *sample, > +static void timehist_update_task_prio(struct perf_sample *sample, > struct machine *machine) > { > struct thread *thread; > struct thread_runtime *tr = NULL; > - const u32 next_pid = evsel__intval(evsel, sample, "next_pid"); > - const u32 next_prio = evsel__intval(evsel, sample, "next_prio"); > + const u32 next_pid = perf_sample__intval(sample, "next_pid"); > + const u32 next_prio = perf_sample__intval(sample, "next_prio"); > > if (next_pid == 0) > thread = get_idle_thread(sample->cpu); > @@ -2798,7 +2801,7 @@ static int timehist_sched_change_event(const struct perf_tool *tool, > struct thread_runtime *tr = NULL; > u64 tprev, t = sample->time; > int rc = 0; > - const char state = evsel__taskstate(evsel, sample, "prev_state"); > + const char state = perf_sample__taskstate(sample, "prev_state"); > > addr_location__init(&al); > if (machine__resolve(machine, &al, sample) < 0) { > @@ -2809,7 +2812,7 @@ static int timehist_sched_change_event(const struct perf_tool *tool, > } > > if (sched->show_prio || sched->prio_str) > - timehist_update_task_prio(evsel, sample, machine); > + timehist_update_task_prio(sample, machine); > > thread = timehist_get_thread(sched, sample, machine, evsel); > if (thread == NULL) { > @@ -2891,7 +2894,7 @@ static int timehist_sched_change_event(const struct perf_tool *tool, > } > > if (!sched->summary_only) > - timehist_print_sample(sched, evsel, sample, &al, thread, t, state); > + timehist_print_sample(sched, sample, &al, thread, t, state); > } > > out: > diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c > index 8692d11ccd29..782ede4258a2 100644 > --- a/tools/perf/builtin-timechart.c > +++ b/tools/perf/builtin-timechart.c > @@ -597,13 +597,17 @@ static int process_sample_event(const struct perf_tool *tool, > > static int > process_sample_cpu_idle(struct timechart *tchart __maybe_unused, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > const char *backtrace __maybe_unused) > { > - u32 state = evsel__intval(evsel, sample, "state"); > - u32 cpu_id = evsel__intval(evsel, sample, "cpu_id"); > + u32 state = perf_sample__intval(sample, "state"); > + u32 cpu_id = perf_sample__intval(sample, "cpu_id"); > > + if (cpu_id >= MAX_CPUS) { > + pr_debug("Out-of-bounds cpu_id %u\n", cpu_id); > + return -1; > + } > if (state == (u32)PWR_EVENT_EXIT) > c_state_end(tchart, cpu_id, sample->time); > else > @@ -613,26 +617,30 @@ process_sample_cpu_idle(struct timechart *tchart __maybe_unused, > > static int > process_sample_cpu_frequency(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > const char *backtrace __maybe_unused) > { > - u32 state = evsel__intval(evsel, sample, "state"); > - u32 cpu_id = evsel__intval(evsel, sample, "cpu_id"); > + u32 state = perf_sample__intval(sample, "state"); > + u32 cpu_id = perf_sample__intval(sample, "cpu_id"); > > + if (cpu_id >= MAX_CPUS) { > + pr_debug("Out-of-bounds cpu_id %u\n", cpu_id); > + return -1; > + } > p_state_change(tchart, cpu_id, sample->time, state); > return 0; > } > > static int > process_sample_sched_wakeup(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > const char *backtrace) > { > - u8 flags = evsel__intval(evsel, sample, "common_flags"); > - int waker = evsel__intval(evsel, sample, "common_pid"); > - int wakee = evsel__intval(evsel, sample, "pid"); > + u8 flags = perf_sample__intval(sample, "common_flags"); > + int waker = perf_sample__intval(sample, "common_pid"); > + int wakee = perf_sample__intval(sample, "pid"); > > sched_wakeup(tchart, sample->cpu, sample->time, waker, wakee, flags, backtrace); > return 0; > @@ -640,13 +648,13 @@ process_sample_sched_wakeup(struct timechart *tchart, > > static int > process_sample_sched_switch(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > const char *backtrace) > { > - int prev_pid = evsel__intval(evsel, sample, "prev_pid"); > - int next_pid = evsel__intval(evsel, sample, "next_pid"); > - u64 prev_state = evsel__intval(evsel, sample, "prev_state"); > + int prev_pid = perf_sample__intval(sample, "prev_pid"); > + int next_pid = perf_sample__intval(sample, "next_pid"); > + u64 prev_state = perf_sample__intval(sample, "prev_state"); > > sched_switch(tchart, sample->cpu, sample->time, prev_pid, next_pid, > prev_state, backtrace); > @@ -656,13 +664,17 @@ process_sample_sched_switch(struct timechart *tchart, > #ifdef SUPPORT_OLD_POWER_EVENTS > static int > process_sample_power_start(struct timechart *tchart __maybe_unused, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > const char *backtrace __maybe_unused) > { > - u64 cpu_id = evsel__intval(evsel, sample, "cpu_id"); > - u64 value = evsel__intval(evsel, sample, "value"); > + u64 cpu_id = perf_sample__intval(sample, "cpu_id"); > + u64 value = perf_sample__intval(sample, "value"); > > + if (cpu_id >= MAX_CPUS) { > + pr_debug("Out-of-bounds cpu_id %llu\n", (unsigned long long)cpu_id); > + return -1; > + } > c_state_start(cpu_id, sample->time, value); > return 0; > } > @@ -679,13 +691,17 @@ process_sample_power_end(struct timechart *tchart, > > static int > process_sample_power_frequency(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample, > const char *backtrace __maybe_unused) > { > - u64 cpu_id = evsel__intval(evsel, sample, "cpu_id"); > - u64 value = evsel__intval(evsel, sample, "value"); > + u64 cpu_id = perf_sample__intval(sample, "cpu_id"); > + u64 value = perf_sample__intval(sample, "value"); > > + if (cpu_id >= MAX_CPUS) { > + pr_debug("Out-of-bounds cpu_id %llu\n", (unsigned long long)cpu_id); > + return -1; > + } > p_state_change(tchart, cpu_id, sample->time, value); > return 0; > } > @@ -849,120 +865,120 @@ static int pid_end_io_sample(struct timechart *tchart, int pid, int type, > > static int > process_enter_read(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long fd = evsel__intval(evsel, sample, "fd"); > + long fd = perf_sample__intval(sample, "fd"); > return pid_begin_io_sample(tchart, sample->tid, IOTYPE_READ, > sample->time, fd); > } > > static int > process_exit_read(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long ret = evsel__intval(evsel, sample, "ret"); > + long ret = perf_sample__intval(sample, "ret"); > return pid_end_io_sample(tchart, sample->tid, IOTYPE_READ, > sample->time, ret); > } > > static int > process_enter_write(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long fd = evsel__intval(evsel, sample, "fd"); > + long fd = perf_sample__intval(sample, "fd"); > return pid_begin_io_sample(tchart, sample->tid, IOTYPE_WRITE, > sample->time, fd); > } > > static int > process_exit_write(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long ret = evsel__intval(evsel, sample, "ret"); > + long ret = perf_sample__intval(sample, "ret"); > return pid_end_io_sample(tchart, sample->tid, IOTYPE_WRITE, > sample->time, ret); > } > > static int > process_enter_sync(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long fd = evsel__intval(evsel, sample, "fd"); > + long fd = perf_sample__intval(sample, "fd"); > return pid_begin_io_sample(tchart, sample->tid, IOTYPE_SYNC, > sample->time, fd); > } > > static int > process_exit_sync(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long ret = evsel__intval(evsel, sample, "ret"); > + long ret = perf_sample__intval(sample, "ret"); > return pid_end_io_sample(tchart, sample->tid, IOTYPE_SYNC, > sample->time, ret); > } > > static int > process_enter_tx(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long fd = evsel__intval(evsel, sample, "fd"); > + long fd = perf_sample__intval(sample, "fd"); > return pid_begin_io_sample(tchart, sample->tid, IOTYPE_TX, > sample->time, fd); > } > > static int > process_exit_tx(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long ret = evsel__intval(evsel, sample, "ret"); > + long ret = perf_sample__intval(sample, "ret"); > return pid_end_io_sample(tchart, sample->tid, IOTYPE_TX, > sample->time, ret); > } > > static int > process_enter_rx(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long fd = evsel__intval(evsel, sample, "fd"); > + long fd = perf_sample__intval(sample, "fd"); > return pid_begin_io_sample(tchart, sample->tid, IOTYPE_RX, > sample->time, fd); > } > > static int > process_exit_rx(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long ret = evsel__intval(evsel, sample, "ret"); > + long ret = perf_sample__intval(sample, "ret"); > return pid_end_io_sample(tchart, sample->tid, IOTYPE_RX, > sample->time, ret); > } > > static int > process_enter_poll(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long fd = evsel__intval(evsel, sample, "fd"); > + long fd = perf_sample__intval(sample, "fd"); > return pid_begin_io_sample(tchart, sample->tid, IOTYPE_POLL, > sample->time, fd); > } > > static int > process_exit_poll(struct timechart *tchart, > - struct evsel *evsel, > + struct evsel *evsel __maybe_unused, > struct perf_sample *sample) > { > - long ret = evsel__intval(evsel, sample, "ret"); > + long ret = perf_sample__intval(sample, "ret"); > return pid_end_io_sample(tchart, sample->tid, IOTYPE_POLL, > sample->time, ret); > } > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c > index cf26edcd35fe..b7c1e3803307 100644 > --- a/tools/perf/builtin-trace.c > +++ b/tools/perf/builtin-trace.c > @@ -3063,7 +3063,7 @@ errno_print: { > return err; > } > > -static int trace__vfs_getname(struct trace *trace, struct evsel *evsel, > +static int trace__vfs_getname(struct trace *trace, struct evsel *evsel __maybe_unused, > union perf_event *event __maybe_unused, > struct perf_sample *sample) > { > @@ -3072,7 +3072,7 @@ static int trace__vfs_getname(struct trace *trace, struct evsel *evsel, > size_t filename_len, entry_str_len, to_move; > ssize_t remaining_space; > char *pos; > - const char *filename = evsel__rawptr(evsel, sample, "pathname"); > + const char *filename = perf_sample__strval(sample, "pathname"); > > if (!thread) > goto out; > @@ -3128,7 +3128,7 @@ static int trace__sched_stat_runtime(struct trace *trace, struct evsel *evsel, > union perf_event *event __maybe_unused, > struct perf_sample *sample) > { > - u64 runtime = evsel__intval(evsel, sample, "runtime"); > + u64 runtime = perf_sample__intval(sample, "runtime"); > double runtime_ms = (double)runtime / NSEC_PER_MSEC; > struct thread *thread = machine__findnew_thread(trace->host, > sample->pid, > @@ -3147,10 +3147,10 @@ static int trace__sched_stat_runtime(struct trace *trace, struct evsel *evsel, > out_dump: > fprintf(trace->output, "%s: comm=%s,pid=%u,runtime=%" PRIu64 ",vruntime=%" PRIu64 ")\n", > evsel->name, > - evsel__strval(evsel, sample, "comm"), > - (pid_t)evsel__intval(evsel, sample, "pid"), > + perf_sample__strval(sample, "comm"), > + (pid_t)perf_sample__intval(sample, "pid"), > runtime, > - evsel__intval(evsel, sample, "vruntime")); > + perf_sample__intval(sample, "vruntime")); > goto out_put; > } > > diff --git a/tools/perf/tests/openat-syscall-tp-fields.c b/tools/perf/tests/openat-syscall-tp-fields.c > index 2a139d2781a8..97550b349418 100644 > --- a/tools/perf/tests/openat-syscall-tp-fields.c > +++ b/tools/perf/tests/openat-syscall-tp-fields.c > @@ -118,7 +118,7 @@ static int test__syscall_openat_tp_fields(struct test_suite *test __maybe_unused > goto out_delete_evlist; > } > > - tp_flags = evsel__intval(evsel, &sample, "flags"); > + tp_flags = perf_sample__intval(&sample, "flags"); > perf_sample__exit(&sample); > if (flags != tp_flags) { > pr_debug("%s: Expected flags=%#x, got %#x\n", > diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c > index 72a8289e846d..22b0302252db 100644 > --- a/tools/perf/tests/switch-tracking.c > +++ b/tools/perf/tests/switch-tracking.c > @@ -140,8 +140,8 @@ static int process_sample_event(struct evlist *evlist, > > evsel = evlist__id2evsel(evlist, sample.id); > if (evsel == switch_tracking->switch_evsel) { > - next_tid = evsel__intval(evsel, &sample, "next_pid"); > - prev_tid = evsel__intval(evsel, &sample, "prev_pid"); > + next_tid = perf_sample__intval(&sample, "next_pid"); > + prev_tid = perf_sample__intval(&sample, "prev_pid"); > cpu = sample.cpu; > pr_debug3("sched_switch: cpu: %d prev_tid %d next_tid %d\n", > cpu, prev_tid, next_tid); > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c > index 2ee87fd84d3e..b653e683d7a1 100644 > --- a/tools/perf/util/evsel.c > +++ b/tools/perf/util/evsel.c > @@ -3687,15 +3687,20 @@ struct tep_format_field *evsel__common_field(struct evsel *evsel, const char *na > return tp_format ? tep_find_common_field(tp_format, name) : NULL; > } > > -void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name) > +void *perf_sample__rawptr(struct perf_sample *sample, const char *name) > { > - struct tep_format_field *field = evsel__field(evsel, name); > + struct tep_format_field *field = evsel__field(sample->evsel, name); > int offset; > > if (!field) > return NULL; > > offset = field->offset; > + if ((u32)(offset + field->size) > sample->raw_size) { > + pr_warning("Invalid trace point field offset %d for field of length %d in sample raw data of size %u\n", > + offset, field->size, sample->raw_size); > + return NULL; > + } > > if (field->flags & TEP_FIELD_IS_DYNAMIC) { > offset = *(int *)(sample->raw_data + field->offset); > @@ -3713,6 +3718,12 @@ u64 format_field__intval(struct tep_format_field *field, struct perf_sample *sam > u64 value; > void *ptr = sample->raw_data + field->offset; > > + if ((u32)(field->offset + field->size) > sample->raw_size) { > + pr_warning("Invalid trace point field offset %d for field of length %d in sample raw data of size %u\n", > + field->offset, field->size, sample->raw_size); > + return 0; > + } > + > switch (field->size) { > case 1: > return *(u8 *)ptr; > @@ -3746,21 +3757,21 @@ u64 format_field__intval(struct tep_format_field *field, struct perf_sample *sam > return 0; > } > > -u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name) > +u64 perf_sample__intval(struct perf_sample *sample, const char *name) > { > - struct tep_format_field *field = evsel__field(evsel, name); > + struct tep_format_field *field = evsel__field(sample->evsel, name); > > - return field ? format_field__intval(field, sample, evsel->needs_swap) : 0; > + return field ? format_field__intval(field, sample, sample->evsel->needs_swap) : 0; > } > > -u64 evsel__intval_common(struct evsel *evsel, struct perf_sample *sample, const char *name) > +u64 perf_sample__intval_common(struct perf_sample *sample, const char *name) > { > - struct tep_format_field *field = evsel__common_field(evsel, name); > + struct tep_format_field *field = evsel__common_field(sample->evsel, name); > > - return field ? format_field__intval(field, sample, evsel->needs_swap) : 0; > + return field ? format_field__intval(field, sample, sample->evsel->needs_swap) : 0; > } > > -char evsel__taskstate(struct evsel *evsel, struct perf_sample *sample, const char *name) > +char perf_sample__taskstate(struct perf_sample *sample, const char *name) > { > static struct tep_format_field *prev_state_field; > static const char *states; > @@ -3769,7 +3780,7 @@ char evsel__taskstate(struct evsel *evsel, struct perf_sample *sample, const cha > unsigned int bit; > char state = '?'; /* '?' denotes unknown task state */ > > - field = evsel__field(evsel, name); > + field = evsel__field(sample->evsel, name); > > if (!field) > return state; > @@ -3788,7 +3799,7 @@ char evsel__taskstate(struct evsel *evsel, struct perf_sample *sample, const cha > * > * We can change this if we have a good reason in the future. > */ > - val = evsel__intval(evsel, sample, name); > + val = perf_sample__intval(sample, name); > bit = val ? ffs(val) : 0; > state = (!bit || bit > strlen(states)) ? 'R' : states[bit-1]; > return state; > diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h > index 339b5c08a33d..cf495829dbb0 100644 > --- a/tools/perf/util/evsel.h > +++ b/tools/perf/util/evsel.h > @@ -371,14 +371,14 @@ bool evsel__precise_ip_fallback(struct evsel *evsel); > struct perf_sample; > > #ifdef HAVE_LIBTRACEEVENT > -void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name); > -u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name); > -u64 evsel__intval_common(struct evsel *evsel, struct perf_sample *sample, const char *name); > -char evsel__taskstate(struct evsel *evsel, struct perf_sample *sample, const char *name); > +void *perf_sample__rawptr(struct perf_sample *sample, const char *name); > +u64 perf_sample__intval(struct perf_sample *sample, const char *name); > +u64 perf_sample__intval_common(struct perf_sample *sample, const char *name); > +char perf_sample__taskstate(struct perf_sample *sample, const char *name); > > -static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sample, const char *name) > +static inline const char *perf_sample__strval(struct perf_sample *sample, const char *name) > { > - return evsel__rawptr(evsel, sample, name); > + return perf_sample__rawptr(sample, name); > } > #endif > > diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c > index fc9eec8b54b8..dab23a96b1d8 100644 > --- a/tools/perf/util/intel-pt.c > +++ b/tools/perf/util/intel-pt.c > @@ -3426,7 +3426,7 @@ static int intel_pt_process_switch(struct intel_pt *pt, > if (evsel != pt->switch_evsel) > return 0; > > - tid = evsel__intval(evsel, sample, "next_pid"); > + tid = perf_sample__intval(sample, "next_pid"); > cpu = sample->cpu; > > intel_pt_log("sched_switch: cpu %d tid %d time %"PRIu64" tsc %#"PRIx64"\n", > diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c b/tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c > index 1e76906f719c..018b0db0e6e7 100644 > --- a/tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c > +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c > @@ -20,10 +20,8 @@ static const char * const __kvm_events_tp[] = { > static void event_get_key(struct perf_sample *sample, > struct event_key *key) > { > - struct evsel *evsel = sample->evsel; > - > key->info = 0; > - key->key = evsel__intval(evsel, sample, kvm_exit_reason(EM_AARCH64)); > + key->key = perf_sample__intval(sample, kvm_exit_reason(EM_AARCH64)); > key->exit_reasons = arm64_exit_reasons; > > /* > @@ -32,7 +30,7 @@ static void event_get_key(struct perf_sample *sample, > * properly decode event's est_ec. > */ > if (key->key == ARM_EXCEPTION_TRAP) { > - key->key = evsel__intval(evsel, sample, kvm_trap_exit_reason); > + key->key = perf_sample__intval(sample, kvm_trap_exit_reason); > key->exit_reasons = arm64_trap_exit_reasons; > } > } > diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c b/tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c > index 9d6265290f6d..a04cd09e3361 100644 > --- a/tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c > +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c > @@ -78,7 +78,7 @@ static void event_gspr_get_key(struct perf_sample *sample, struct event_key *key > unsigned int insn; > > key->key = LOONGARCH_EXCEPTION_OTHERS; > - insn = evsel__intval(sample->evsel, sample, "inst_word"); > + insn = perf_sample__intval(sample, "inst_word"); > > switch (insn >> 24) { > case 0: > diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c b/tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c > index 5158d7e88ee6..96d9c4ae0209 100644 > --- a/tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c > +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c > @@ -32,7 +32,7 @@ static void hcall_event_get_key(struct perf_sample *sample, > struct event_key *key) > { > key->info = 0; > - key->key = evsel__intval(sample->evsel, sample, "req"); > + key->key = perf_sample__intval(sample, "req"); > } > > static const char *get_hcall_exit_reason(u64 exit_code) > diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c b/tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c > index e8db8b4f8e2e..967bba261a47 100644 > --- a/tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c > +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c > @@ -26,8 +26,7 @@ static void event_get_key(struct perf_sample *sample, > int xlen = 64; // TODO: 32-bit support. > > key->info = 0; > - key->key = evsel__intval(sample->evsel, sample, > - kvm_exit_reason(EM_RISCV)) & ~CAUSE_IRQ_FLAG(xlen); > + key->key = perf_sample__intval(sample, kvm_exit_reason(EM_RISCV)) & ~CAUSE_IRQ_FLAG(xlen); > key->exit_reasons = riscv_exit_reasons; > } > > diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-s390.c b/tools/perf/util/kvm-stat-arch/kvm-stat-s390.c > index 158372ba0205..4771fc69fa39 100644 > --- a/tools/perf/util/kvm-stat-arch/kvm-stat-s390.c > +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-s390.c > @@ -23,7 +23,7 @@ static void event_icpt_insn_get_key(struct perf_sample *sample, > { > u64 insn; > > - insn = evsel__intval(sample->evsel, sample, "instruction"); > + insn = perf_sample__intval(sample, "instruction"); > key->key = icpt_insn_decoder(insn); > key->exit_reasons = sie_icpt_insn_codes; > } > @@ -31,21 +31,21 @@ static void event_icpt_insn_get_key(struct perf_sample *sample, > static void event_sigp_get_key(struct perf_sample *sample, > struct event_key *key) > { > - key->key = evsel__intval(sample->evsel, sample, "order_code"); > + key->key = perf_sample__intval(sample, "order_code"); > key->exit_reasons = sie_sigp_order_codes; > } > > static void event_diag_get_key(struct perf_sample *sample, > struct event_key *key) > { > - key->key = evsel__intval(sample->evsel, sample, "code"); > + key->key = perf_sample__intval(sample, "code"); > key->exit_reasons = sie_diagnose_codes; > } > > static void event_icpt_prog_get_key(struct perf_sample *sample, > struct event_key *key) > { > - key->key = evsel__intval(sample->evsel, sample, "code"); > + key->key = perf_sample__intval(sample, "code"); > key->exit_reasons = sie_icpt_prog_codes; > } > > diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-x86.c b/tools/perf/util/kvm-stat-arch/kvm-stat-x86.c > index 0ce543d82850..788d216f0852 100644 > --- a/tools/perf/util/kvm-stat-arch/kvm-stat-x86.c > +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-x86.c > @@ -27,8 +27,8 @@ static const struct kvm_events_ops exit_events = { > static void mmio_event_get_key(struct perf_sample *sample, > struct event_key *key) > { > - key->key = evsel__intval(sample->evsel, sample, "gpa"); > - key->info = evsel__intval(sample->evsel, sample, "type"); > + key->key = perf_sample__intval(sample, "gpa"); > + key->info = perf_sample__intval(sample, "type"); > } > > #define KVM_TRACE_MMIO_READ_UNSATISFIED 0 > @@ -43,7 +43,7 @@ static bool mmio_event_begin(struct perf_sample *sample, struct event_key *key) > > /* MMIO write begin event in kernel. */ > if (evsel__name_is(sample->evsel, "kvm:kvm_mmio") && > - evsel__intval(sample->evsel, sample, "type") == KVM_TRACE_MMIO_WRITE) { > + perf_sample__intval(sample, "type") == KVM_TRACE_MMIO_WRITE) { > mmio_event_get_key(sample, key); > return true; > } > @@ -59,7 +59,7 @@ static bool mmio_event_end(struct perf_sample *sample, struct event_key *key) > > /* MMIO read end event in kernel.*/ > if (evsel__name_is(sample->evsel, "kvm:kvm_mmio") && > - evsel__intval(sample->evsel, sample, "type") == KVM_TRACE_MMIO_READ) { > + perf_sample__intval(sample, "type") == KVM_TRACE_MMIO_READ) { > mmio_event_get_key(sample, key); > return true; > } > @@ -87,8 +87,8 @@ static const struct kvm_events_ops mmio_events = { > static void ioport_event_get_key(struct perf_sample *sample, > struct event_key *key) > { > - key->key = evsel__intval(sample->evsel, sample, "port"); > - key->info = evsel__intval(sample->evsel, sample, "rw"); > + key->key = perf_sample__intval(sample, "port"); > + key->info = perf_sample__intval(sample, "rw"); > } > > static bool ioport_event_begin(struct perf_sample *sample, > @@ -126,8 +126,8 @@ static const struct kvm_events_ops ioport_events = { > /* The time of emulation msr is from kvm_msr to kvm_entry. */ > static void msr_event_get_key(struct perf_sample *sample, struct event_key *key) > { > - key->key = evsel__intval(sample->evsel, sample, "ecx"); > - key->info = evsel__intval(sample->evsel, sample, "write"); > + key->key = perf_sample__intval(sample, "ecx"); > + key->info = perf_sample__intval(sample, "write"); > } > > static bool msr_event_begin(struct perf_sample *sample, struct event_key *key) > diff --git a/tools/perf/util/kvm-stat.c b/tools/perf/util/kvm-stat.c > index f17a6132958d..755ab659a05c 100644 > --- a/tools/perf/util/kvm-stat.c > +++ b/tools/perf/util/kvm-stat.c > @@ -17,7 +17,7 @@ void exit_event_get_key(struct perf_sample *sample, > uint16_t e_machine = evsel__e_machine(sample->evsel, /*e_flags=*/NULL); > > key->info = 0; > - key->key = evsel__intval(sample->evsel, sample, kvm_exit_reason(e_machine)); > + key->key = perf_sample__intval(sample, kvm_exit_reason(e_machine)); > } > > > -- > 2.53.0.1213.gd9a14994de-goog >