Hi Reinette,
On 4/23/2026 12:02 AM, Reinette Chatre wrote:
Hi Yifan,
On 4/10/26 2:33 AM, Yifan Wu wrote:
@@ -113,6 +115,7 @@ static int parse_imc_read_bw_events(char *imc_dir, unsigned
int type,
unsigned int *count)
{
char imc_events_dir[PATH_MAX], imc_counter_cfg[PATH_MAX];
+ struct imc_counter_config *imc_counter;
unsigned int orig_count = *count;
char cas_count_cfg[1024];
struct dirent *ep;
@@ -167,11 +170,17 @@ static int parse_imc_read_bw_events(char *imc_dir,
unsigned int type,
ksft_print_msg("Maximum iMC count exceeded\n");
goto out_close;
}
+ imc_counter = calloc(1, sizeof(*imc_counter));
+ if (!imc_counter) {
+ ksft_perror("Unable to allocate memory for iMC
counters\n");
+ goto out_close;
+ }
imc_counters_config[*count].type = type;
get_read_event_and_umask(cas_count_cfg, *count);
/* Do not fail after incrementing *count. */
*count += 1;
+ list_add(&imc_counter->entry, &imc_counters_list);
}
if (*count == orig_count) {
ksft_print_msg("Unable to find events in %s\n", imc_events_dir);
Should cleanup_read_mem_bw_imc() be called on error exit path?
Thank you for your suggestion. When parse_imc_read_bw_events() exits with an
error, the linked list imc_counters_list will be cleaned up in
test_cleanup().
main()
└── run_single_test()
├── mbm_run_test()
│ └── resctrl_val()
│ └── mbm_init()
│ └── initialize_read_mem_bw_imc()
│ └── enumerate_imcs()
│ └── read_from_imc_dir()
│ └── parse_imc_read_bw_events()
│ └── calloc()
└── test_cleanup()
└── mbm_test_cleanup()
└── cleanup_read_mem_bw_imc()
Calling cleanup_read_mem_bw_imc() in the error exit path may be intended
to prevent resource leaks. However, this results in the function being
called
repeatedly in both the error exit branch and test_cleanup().
Is there any specific intention behind calling it in
parse_imc_read_bw_events()?
Or should the cleanup be uniformly handled in test_cleanup()?
Yifan