if (strcmp(param->filename, "") == 0)
sprintf(param->filename, "stdio");
bm_pid = getpid();
/* Taskset benchmark to specified cpu */
ret = taskset_benchmark(bm_pid, uparams->cpu, &old_affinity); if (ret) return ret;
/* Write benchmark to specified con_mon grp, mon_grp in resctrl FS*/
ret = write_bm_pid_to_resctrl(bm_pid, param->ctrlgrp, param->mongrp); if (ret) goto reset_affinity;
perf_event_attr_initialize(&pea, PERF_COUNT_HW_CACHE_MISSES);
perf_event_initialize_read_format(&pe_read);
pe_fd = perf_open(&pea, bm_pid, uparams->cpu); if (pe_fd < 0) {
ret = -1; goto reset_affinity;
}
buf = alloc_buffer(span, 1); if (!buf) {
ret = -1; goto pe_close;
}
while (current_mask) {
snprintf(schemata, sizeof(schemata), "%lx", param->mask & ~current_mask);
ret = write_schemata("", schemata, uparams->cpu, test->resource); if (ret) goto free_buf;
snprintf(schemata, sizeof(schemata), "%lx", current_mask);
ret = write_schemata(param->ctrlgrp, schemata, uparams->cpu, test->resource); if (ret) goto free_buf;
for (i = 0; i < NUM_OF_RUNS; i++) {
mem_flush(buf, span);
fill_cache_read(buf, span, true);
ret = perf_event_reset_enable(pe_fd); if (ret) goto free_buf;
fill_cache_read(buf, span, true);
ret = perf_event_measure(pe_fd, &pe_read, param->filename, bm_pid); if (ret) goto free_buf;
}
current_mask = next_mask(current_mask);
}
staticint cat_run_test(conststruct resctrl_test *test, conststruct user_params *uparams)
{ unsignedlong long_mask, start_mask, full_cache_mask; unsignedlong cache_total_size = 0; int n = uparams->bits; unsignedint start; int count_of_bits;
size_t span; int ret;
ret = get_full_cbm(test->resource, &full_cache_mask); if (ret) return ret; /* Get the largest contiguous exclusive portion of the cache */
ret = get_mask_no_shareable(test->resource, &long_mask); if (ret) return ret;
/* Get L3/L2 cache size */
ret = get_cache_size(uparams->cpu, test->resource, &cache_total_size); if (ret) return ret;
ksft_print_msg("Cache size :%lu\n", cache_total_size);
if (n > count_of_bits - 1) {
ksft_print_msg("Invalid input value for no_of_bits n!\n");
ksft_print_msg("Please enter value in range 1 to %d\n",
count_of_bits - 1); return -1;
}
start_mask = create_bit_mask(start, n);
/* Check to compare sparse_masks content to CPUID output. */
ret = resource_info_unsigned_get(test->resource, "sparse_masks", &sparse_masks); if (ret) return ret;
if (arch_supports_noncont_cat(test) != sparse_masks) {
ksft_print_msg("Hardware and kernel differ on non-contiguous CBM support!\n"); return1;
}
/* Write checks initialization. */
ret = get_full_cbm(test->resource, &full_cache_mask); if (ret < 0) return ret;
bit_center = count_bits(full_cache_mask) / 2;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.