@@ -331,6 +331,24 @@ static void coalesce_file_region(struct resv_map *resv, struct file_region *rg)
331
331
}
332
332
}
333
333
334
+ static inline long
335
+ hugetlb_resv_map_add (struct resv_map * map , struct file_region * rg , long from ,
336
+ long to , struct hstate * h , struct hugetlb_cgroup * cg ,
337
+ long * regions_needed )
338
+ {
339
+ struct file_region * nrg ;
340
+
341
+ if (!regions_needed ) {
342
+ nrg = get_file_region_entry_from_cache (map , from , to );
343
+ record_hugetlb_cgroup_uncharge_info (cg , h , map , nrg );
344
+ list_add (& nrg -> link , rg -> link .prev );
345
+ coalesce_file_region (map , nrg );
346
+ } else
347
+ * regions_needed += 1 ;
348
+
349
+ return to - from ;
350
+ }
351
+
334
352
/*
335
353
* Must be called with resv->lock held.
336
354
*
@@ -346,7 +364,7 @@ static long add_reservation_in_range(struct resv_map *resv, long f, long t,
346
364
long add = 0 ;
347
365
struct list_head * head = & resv -> regions ;
348
366
long last_accounted_offset = f ;
349
- struct file_region * rg = NULL , * trg = NULL , * nrg = NULL ;
367
+ struct file_region * rg = NULL , * trg = NULL ;
350
368
351
369
if (regions_needed )
352
370
* regions_needed = 0 ;
@@ -375,36 +393,21 @@ static long add_reservation_in_range(struct resv_map *resv, long f, long t,
375
393
/* Add an entry for last_accounted_offset -> rg->from, and
376
394
* update last_accounted_offset.
377
395
*/
378
- if (rg -> from > last_accounted_offset ) {
379
- add += rg -> from - last_accounted_offset ;
380
- if (!regions_needed ) {
381
- nrg = get_file_region_entry_from_cache (
382
- resv , last_accounted_offset , rg -> from );
383
- record_hugetlb_cgroup_uncharge_info (h_cg , h ,
384
- resv , nrg );
385
- list_add (& nrg -> link , rg -> link .prev );
386
- coalesce_file_region (resv , nrg );
387
- } else
388
- * regions_needed += 1 ;
389
- }
396
+ if (rg -> from > last_accounted_offset )
397
+ add += hugetlb_resv_map_add (resv , rg ,
398
+ last_accounted_offset ,
399
+ rg -> from , h , h_cg ,
400
+ regions_needed );
390
401
391
402
last_accounted_offset = rg -> to ;
392
403
}
393
404
394
405
/* Handle the case where our range extends beyond
395
406
* last_accounted_offset.
396
407
*/
397
- if (last_accounted_offset < t ) {
398
- add += t - last_accounted_offset ;
399
- if (!regions_needed ) {
400
- nrg = get_file_region_entry_from_cache (
401
- resv , last_accounted_offset , t );
402
- record_hugetlb_cgroup_uncharge_info (h_cg , h , resv , nrg );
403
- list_add (& nrg -> link , rg -> link .prev );
404
- coalesce_file_region (resv , nrg );
405
- } else
406
- * regions_needed += 1 ;
407
- }
408
+ if (last_accounted_offset < t )
409
+ add += hugetlb_resv_map_add (resv , rg , last_accounted_offset ,
410
+ t , h , h_cg , regions_needed );
408
411
409
412
VM_BUG_ON (add < 0 );
410
413
return add ;
0 commit comments