// SPDX-License-Identifier: GPL-2.0/* * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org> */#define _GNU_SOURCE#include<getopt.h>#include<stdlib.h>#include<string.h>#include<signal.h>#include<unistd.h>#include<stdio.h>#include<time.h>#include<sched.h>#include<pthread.h>#include"utils.h"#include"osnoise.h"#include"timerlat.h"#include"timerlat_aa.h"#include"timerlat_u.h"structtimerlat_hist_params{char*cpus;cpu_set_tmonitored_cpus;char*trace_output;char*cgroup_name;unsignedlonglongruntime;longlongstop_us;longlongstop_total_us;longlongtimerlat_period_us;longlongprint_stack;intsleep_time;intoutput_divisor;intduration;intset_sched;intdma_latency;intcgroup;inthk_cpus;intno_aa;intdump_tasks;intuser_workload;intkernel_workload;intuser_hist;cpu_set_thk_cpu_set;structsched_attrsched_param;structtrace_events*events;charno_irq;charno_thread;charno_header;charno_summary;charno_index;charwith_zeros;intbucket_size;intentries;intwarmup;intbuffer_size;};structtimerlat_hist_cpu{int*irq;int*thread;int*user;intirq_count;intthread_count;intuser_count;unsignedlonglongmin_irq;unsignedlonglongsum_irq;unsignedlonglongmax_irq;unsignedlonglongmin_thread;unsignedlonglongsum_thread;unsignedlonglongmax_thread;unsignedlonglongmin_user;unsignedlonglongsum_user;unsignedlonglongmax_user;};structtimerlat_hist_data{structtimerlat_hist_cpu*hist;intentries;intbucket_size;intnr_cpus;};/* * timerlat_free_histogram - free runtime data */staticvoidtimerlat_free_histogram(structtimerlat_hist_data*data){intcpu;/* one histogram for IRQ and one for thread, per CPU */for(cpu=0;cpu<data->nr_cpus;cpu++){if(data->hist[cpu].irq)free(data->hist[cpu].irq);if(data->hist[cpu].thread)free(data->hist[cpu].thread);if(data->hist[cpu].user)free(