Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf mem: Clean up perf_mem_events__record_args()

The current code iterates all memory PMUs. It doesn't matter if the
system has only one memory PMU or multiple PMUs. The check of
perf_pmus__num_mem_pmus() is not required anymore.

The rec_tmp is not used in c2c and mem. Removing them as well.

Suggested-by: Leo Yan <leo.yan@linaro.org>
Tested-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Cc: ravi.bangoria@amd.com
Cc: james.clark@arm.com
Cc: will@kernel.org
Cc: mike.leach@linaro.org
Cc: renyu.zj@linux.alibaba.com
Cc: yuhaixin.yhx@linux.alibaba.com
Cc: tmricht@linux.ibm.com
Cc: atrajeev@linux.vnet.ibm.com
Cc: linux-arm-kernel@lists.infradead.org
Cc: john.g.garry@oracle.com
Link: https://lore.kernel.org/r/20240123185036.3461837-7-kan.liang@linux.intel.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>

authored by

Kan Liang and committed by
Namhyung Kim
70f4b20d 8ea9dfb9

+17 -53
+2 -13
tools/perf/builtin-c2c.c
··· 3245 3245 3246 3246 static int perf_c2c__record(int argc, const char **argv) 3247 3247 { 3248 - int rec_argc, i = 0, j, rec_tmp_nr = 0; 3248 + int rec_argc, i = 0, j; 3249 3249 const char **rec_argv; 3250 - char **rec_tmp; 3251 3250 int ret; 3252 3251 bool all_user = false, all_kernel = false; 3253 3252 bool event_set = false; ··· 3284 3285 if (!rec_argv) 3285 3286 return -1; 3286 3287 3287 - rec_tmp = calloc(rec_argc + 1, sizeof(char *)); 3288 - if (!rec_tmp) { 3289 - free(rec_argv); 3290 - return -1; 3291 - } 3292 - 3293 3288 rec_argv[i++] = "record"; 3294 3289 3295 3290 if (!event_set) { ··· 3312 3319 rec_argv[i++] = "--phys-data"; 3313 3320 rec_argv[i++] = "--sample-cpu"; 3314 3321 3315 - ret = perf_mem_events__record_args(rec_argv, &i, rec_tmp, &rec_tmp_nr); 3322 + ret = perf_mem_events__record_args(rec_argv, &i); 3316 3323 if (ret) 3317 3324 goto out; 3318 3325 ··· 3339 3346 3340 3347 ret = cmd_record(i, rec_argv); 3341 3348 out: 3342 - for (i = 0; i < rec_tmp_nr; i++) 3343 - free(rec_tmp[i]); 3344 - 3345 - free(rec_tmp); 3346 3349 free(rec_argv); 3347 3350 return ret; 3348 3351 }
+2 -16
tools/perf/builtin-mem.c
··· 72 72 73 73 static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) 74 74 { 75 - int rec_argc, i = 0, j, tmp_nr = 0; 75 + int rec_argc, i = 0, j; 76 76 int start, end; 77 77 const char **rec_argv; 78 - char **rec_tmp; 79 78 int ret; 80 79 bool all_user = false, all_kernel = false; 81 80 struct perf_mem_event *e; ··· 115 116 if (!rec_argv) 116 117 return -1; 117 118 118 - /* 119 - * Save the allocated event name strings. 120 - */ 121 - rec_tmp = calloc(rec_argc + 1, sizeof(char *)); 122 - if (!rec_tmp) { 123 - free(rec_argv); 124 - return -1; 125 - } 126 - 127 119 rec_argv[i++] = "record"; 128 120 129 121 e = perf_pmu__mem_events_ptr(pmu, PERF_MEM_EVENTS__LOAD_STORE); ··· 153 163 rec_argv[i++] = "--data-page-size"; 154 164 155 165 start = i; 156 - ret = perf_mem_events__record_args(rec_argv, &i, rec_tmp, &tmp_nr); 166 + ret = perf_mem_events__record_args(rec_argv, &i); 157 167 if (ret) 158 168 goto out; 159 169 end = i; ··· 183 193 184 194 ret = cmd_record(i, rec_argv); 185 195 out: 186 - for (i = 0; i < tmp_nr; i++) 187 - free(rec_tmp[i]); 188 - 189 - free(rec_tmp); 190 196 free(rec_argv); 191 197 return ret; 192 198 }
+12 -22
tools/perf/util/mem-events.c
··· 218 218 } 219 219 } 220 220 221 - int perf_mem_events__record_args(const char **rec_argv, int *argv_nr, 222 - char **rec_tmp, int *tmp_nr) 221 + int perf_mem_events__record_args(const char **rec_argv, int *argv_nr) 223 222 { 224 223 const char *mnt = sysfs__mount(); 225 224 struct perf_pmu *pmu = NULL; 226 - int i = *argv_nr, k = 0; 227 225 struct perf_mem_event *e; 228 - 226 + int i = *argv_nr; 227 + const char *s; 228 + char *copy; 229 229 230 230 while ((pmu = perf_pmus__scan_mem(pmu)) != NULL) { 231 231 for (int j = 0; j < PERF_MEM_EVENTS__MAX; j++) { ··· 240 240 return -1; 241 241 } 242 242 243 - if (perf_pmus__num_mem_pmus() == 1) { 244 - rec_argv[i++] = "-e"; 245 - rec_argv[i++] = perf_pmu__mem_events_name(j, pmu); 246 - } else { 247 - const char *s = perf_pmu__mem_events_name(j, pmu); 243 + s = perf_pmu__mem_events_name(j, pmu); 244 + if (!s || !perf_pmu__mem_events_supported(mnt, pmu, e)) 245 + continue; 248 246 249 - if (!perf_pmu__mem_events_supported(mnt, pmu, e)) 250 - continue; 247 + copy = strdup(s); 248 + if (!copy) 249 + return -1; 251 250 252 - rec_argv[i++] = "-e"; 253 - if (s) { 254 - char *copy = strdup(s); 255 - if (!copy) 256 - return -1; 257 - 258 - rec_argv[i++] = copy; 259 - rec_tmp[k++] = copy; 260 - } 261 - } 251 + rec_argv[i++] = "-e"; 252 + rec_argv[i++] = copy; 262 253 } 263 254 } 264 255 265 256 *argv_nr = i; 266 - *tmp_nr = k; 267 257 return 0; 268 258 } 269 259
+1 -2
tools/perf/util/mem-events.h
··· 46 46 bool is_mem_loads_aux_event(struct evsel *leader); 47 47 48 48 void perf_pmu__mem_events_list(struct perf_pmu *pmu); 49 - int perf_mem_events__record_args(const char **rec_argv, int *argv_nr, 50 - char **rec_tmp, int *tmp_nr); 49 + int perf_mem_events__record_args(const char **rec_argv, int *argv_nr); 51 50 52 51 int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info); 53 52 int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);