@@ -118,42 +118,64 @@ static inline void disable_dirty_logging(struct kvm_vm *vm, int slots)
118
118
toggle_dirty_logging (vm , slots , false);
119
119
}
120
120
121
- static void get_dirty_log (struct kvm_vm * vm , int slots , unsigned long * bitmap ,
122
- uint64_t nr_pages )
121
+ static void get_dirty_log (struct kvm_vm * vm , unsigned long * bitmaps [], int slots )
123
122
{
124
- uint64_t slot_pages = nr_pages / slots ;
125
123
int i ;
126
124
127
125
for (i = 0 ; i < slots ; i ++ ) {
128
126
int slot = PERF_TEST_MEM_SLOT_INDEX + i ;
129
- unsigned long * slot_bitmap = bitmap + i * slot_pages ;
130
127
131
- kvm_vm_get_dirty_log (vm , slot , slot_bitmap );
128
+ kvm_vm_get_dirty_log (vm , slot , bitmaps [ i ] );
132
129
}
133
130
}
134
131
135
- static void clear_dirty_log (struct kvm_vm * vm , int slots , unsigned long * bitmap ,
136
- uint64_t nr_pages )
132
+ static void clear_dirty_log (struct kvm_vm * vm , unsigned long * bitmaps [] ,
133
+ int slots , uint64_t pages_per_slot )
137
134
{
138
- uint64_t slot_pages = nr_pages / slots ;
139
135
int i ;
140
136
141
137
for (i = 0 ; i < slots ; i ++ ) {
142
138
int slot = PERF_TEST_MEM_SLOT_INDEX + i ;
143
- unsigned long * slot_bitmap = bitmap + i * slot_pages ;
144
139
145
- kvm_vm_clear_dirty_log (vm , slot , slot_bitmap , 0 , slot_pages );
140
+ kvm_vm_clear_dirty_log (vm , slot , bitmaps [ i ] , 0 , pages_per_slot );
146
141
}
147
142
}
148
143
144
+ static unsigned long * * alloc_bitmaps (int slots , uint64_t pages_per_slot )
145
+ {
146
+ unsigned long * * bitmaps ;
147
+ int i ;
148
+
149
+ bitmaps = malloc (slots * sizeof (bitmaps [0 ]));
150
+ TEST_ASSERT (bitmaps , "Failed to allocate bitmaps array." );
151
+
152
+ for (i = 0 ; i < slots ; i ++ ) {
153
+ bitmaps [i ] = bitmap_zalloc (pages_per_slot );
154
+ TEST_ASSERT (bitmaps [i ], "Failed to allocate slot bitmap." );
155
+ }
156
+
157
+ return bitmaps ;
158
+ }
159
+
160
+ static void free_bitmaps (unsigned long * bitmaps [], int slots )
161
+ {
162
+ int i ;
163
+
164
+ for (i = 0 ; i < slots ; i ++ )
165
+ free (bitmaps [i ]);
166
+
167
+ free (bitmaps );
168
+ }
169
+
149
170
static void run_test (enum vm_guest_mode mode , void * arg )
150
171
{
151
172
struct test_params * p = arg ;
152
173
pthread_t * vcpu_threads ;
153
174
struct kvm_vm * vm ;
154
- unsigned long * bmap ;
175
+ unsigned long * * bitmaps ;
155
176
uint64_t guest_num_pages ;
156
177
uint64_t host_num_pages ;
178
+ uint64_t pages_per_slot ;
157
179
int vcpu_id ;
158
180
struct timespec start ;
159
181
struct timespec ts_diff ;
@@ -171,7 +193,9 @@ static void run_test(enum vm_guest_mode mode, void *arg)
171
193
guest_num_pages = (nr_vcpus * guest_percpu_mem_size ) >> vm_get_page_shift (vm );
172
194
guest_num_pages = vm_adjust_num_guest_pages (mode , guest_num_pages );
173
195
host_num_pages = vm_num_host_pages (mode , guest_num_pages );
174
- bmap = bitmap_zalloc (host_num_pages );
196
+ pages_per_slot = host_num_pages / p -> slots ;
197
+
198
+ bitmaps = alloc_bitmaps (p -> slots , pages_per_slot );
175
199
176
200
if (dirty_log_manual_caps ) {
177
201
cap .cap = KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 ;
@@ -239,7 +263,7 @@ static void run_test(enum vm_guest_mode mode, void *arg)
239
263
iteration , ts_diff .tv_sec , ts_diff .tv_nsec );
240
264
241
265
clock_gettime (CLOCK_MONOTONIC , & start );
242
- get_dirty_log (vm , p -> slots , bmap , host_num_pages );
266
+ get_dirty_log (vm , bitmaps , p -> slots );
243
267
ts_diff = timespec_elapsed (start );
244
268
get_dirty_log_total = timespec_add (get_dirty_log_total ,
245
269
ts_diff );
@@ -248,7 +272,7 @@ static void run_test(enum vm_guest_mode mode, void *arg)
248
272
249
273
if (dirty_log_manual_caps ) {
250
274
clock_gettime (CLOCK_MONOTONIC , & start );
251
- clear_dirty_log (vm , p -> slots , bmap , host_num_pages );
275
+ clear_dirty_log (vm , bitmaps , p -> slots , pages_per_slot );
252
276
ts_diff = timespec_elapsed (start );
253
277
clear_dirty_log_total = timespec_add (clear_dirty_log_total ,
254
278
ts_diff );
@@ -281,7 +305,7 @@ static void run_test(enum vm_guest_mode mode, void *arg)
281
305
clear_dirty_log_total .tv_nsec , avg .tv_sec , avg .tv_nsec );
282
306
}
283
307
284
- free ( bmap );
308
+ free_bitmaps ( bitmaps , p -> slots );
285
309
free (vcpu_threads );
286
310
perf_test_destroy_vm (vm );
287
311
}
0 commit comments