mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
perf kwork: Overwrite original atom in the list when a new atom is pushed.
work_push_atom() supports nesting. Currently, all supported kworks are not nested. A `overwrite` parameter is added to overwrite the original atom in the list. Reviewed-by: Ian Rogers <irogers@google.com> Signed-off-by: Yang Jihong <yangjihong1@huawei.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: Sandipan Das <sandipan.das@amd.com> Link: https://lore.kernel.org/r/20230812084917.169338-6-yangjihong1@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
95064b3352
commit
86c67c8af4
@ -392,9 +392,10 @@ static int work_push_atom(struct perf_kwork *kwork,
|
|||||||
struct evsel *evsel,
|
struct evsel *evsel,
|
||||||
struct perf_sample *sample,
|
struct perf_sample *sample,
|
||||||
struct machine *machine,
|
struct machine *machine,
|
||||||
struct kwork_work **ret_work)
|
struct kwork_work **ret_work,
|
||||||
|
bool overwrite)
|
||||||
{
|
{
|
||||||
struct kwork_atom *atom, *dst_atom;
|
struct kwork_atom *atom, *dst_atom, *last_atom;
|
||||||
struct kwork_work *work, key;
|
struct kwork_work *work, key;
|
||||||
|
|
||||||
BUG_ON(class->work_init == NULL);
|
BUG_ON(class->work_init == NULL);
|
||||||
@ -427,6 +428,17 @@ static int work_push_atom(struct perf_kwork *kwork,
|
|||||||
if (ret_work != NULL)
|
if (ret_work != NULL)
|
||||||
*ret_work = work;
|
*ret_work = work;
|
||||||
|
|
||||||
|
if (overwrite) {
|
||||||
|
last_atom = list_last_entry_or_null(&work->atom_list[src_type],
|
||||||
|
struct kwork_atom, list);
|
||||||
|
if (last_atom) {
|
||||||
|
atom_del(last_atom);
|
||||||
|
|
||||||
|
kwork->nr_skipped_events[src_type]++;
|
||||||
|
kwork->nr_skipped_events[KWORK_TRACE_MAX]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
list_add_tail(&atom->list, &work->atom_list[src_type]);
|
list_add_tail(&atom->list, &work->atom_list[src_type]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -502,7 +514,7 @@ static int report_entry_event(struct perf_kwork *kwork,
|
|||||||
{
|
{
|
||||||
return work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
|
return work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
|
||||||
KWORK_TRACE_MAX, evsel, sample,
|
KWORK_TRACE_MAX, evsel, sample,
|
||||||
machine, NULL);
|
machine, NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int report_exit_event(struct perf_kwork *kwork,
|
static int report_exit_event(struct perf_kwork *kwork,
|
||||||
@ -557,7 +569,7 @@ static int latency_raise_event(struct perf_kwork *kwork,
|
|||||||
{
|
{
|
||||||
return work_push_atom(kwork, class, KWORK_TRACE_RAISE,
|
return work_push_atom(kwork, class, KWORK_TRACE_RAISE,
|
||||||
KWORK_TRACE_MAX, evsel, sample,
|
KWORK_TRACE_MAX, evsel, sample,
|
||||||
machine, NULL);
|
machine, NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int latency_entry_event(struct perf_kwork *kwork,
|
static int latency_entry_event(struct perf_kwork *kwork,
|
||||||
@ -716,7 +728,7 @@ static int timehist_raise_event(struct perf_kwork *kwork,
|
|||||||
{
|
{
|
||||||
return work_push_atom(kwork, class, KWORK_TRACE_RAISE,
|
return work_push_atom(kwork, class, KWORK_TRACE_RAISE,
|
||||||
KWORK_TRACE_MAX, evsel, sample,
|
KWORK_TRACE_MAX, evsel, sample,
|
||||||
machine, NULL);
|
machine, NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int timehist_entry_event(struct perf_kwork *kwork,
|
static int timehist_entry_event(struct perf_kwork *kwork,
|
||||||
@ -730,7 +742,7 @@ static int timehist_entry_event(struct perf_kwork *kwork,
|
|||||||
|
|
||||||
ret = work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
|
ret = work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
|
||||||
KWORK_TRACE_RAISE, evsel, sample,
|
KWORK_TRACE_RAISE, evsel, sample,
|
||||||
machine, &work);
|
machine, &work, true);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user