@@ -24,6 +24,11 @@
static unsigned char *startptr;
+void free_buffer(void)
+{
+ free(startptr);
+}
+
static void sb(void)
{
#if defined(__i386) || defined(__x86_64)
@@ -34,7 +39,7 @@ static void sb(void)
static void ctrl_handler(int signo)
{
- free(startptr);
+ free_buffer();
printf("\nEnding\n");
sb();
exit(EXIT_SUCCESS);
@@ -146,36 +151,53 @@ static int fill_cache_write(unsigned char *start_ptr, unsigned char *end_ptr,
return 0;
}
-static int
-fill_cache(unsigned long long buf_size, int memflush, int op, char *resctrl_val)
+int alloc_buffer(unsigned long long buf_size, int memflush)
{
- unsigned char *start_ptr, *end_ptr;
- int ret;
+ unsigned char *start_ptr;
start_ptr = malloc_and_init_memory(buf_size);
if (!start_ptr)
return -1;
startptr = start_ptr;
- end_ptr = start_ptr + buf_size;
/* Flush the memory before using to avoid "cache hot pages" effect */
if (memflush)
mem_flush(start_ptr, buf_size);
+ return 0;
+}
+
+int use_buffer(unsigned long long buf_size, int op, char *resctrl_val)
+{
+ unsigned char *end_ptr;
+ int ret;
+
+ end_ptr = startptr + buf_size;
if (op == 0)
- ret = fill_cache_read(start_ptr, end_ptr, resctrl_val);
+ ret = fill_cache_read(startptr, end_ptr, resctrl_val);
else
- ret = fill_cache_write(start_ptr, end_ptr, resctrl_val);
+ ret = fill_cache_write(startptr, end_ptr, resctrl_val);
- if (ret) {
+ if (ret)
printf("\n Error in fill cache read/write...\n");
- return -1;
- }
- free(startptr);
+ return ret;
+}
- return 0;
+static int
+fill_cache(unsigned long long buf_size, int memflush, int op, char *resctrl_val)
+{
+ int ret;
+
+ ret = alloc_buffer(buf_size, memflush);
+ if (ret)
+ return ret;
+
+ ret = use_buffer(buf_size, op, resctrl_val);
+ free_buffer();
+
+ return ret;
}
int run_fill_buf(unsigned long span, int memflush, int op, char *resctrl_val)
@@ -97,6 +97,9 @@ int write_bm_pid_to_resctrl(pid_t bm_pid, char *ctrlgrp, char *mongrp,
char *resctrl_val);
int perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu,
int group_fd, unsigned long flags);
+void free_buffer(void);
+int alloc_buffer(unsigned long long buf_size, int memflush);
+int use_buffer(unsigned long long buf_size, int op, char *resctrl_val);
int run_fill_buf(unsigned long span, int memflush, int op, char *resctrl_val);
int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param);
int mbm_bw_change(unsigned long span, int cpu_no, char *bw_report, char **benchmark_cmd);