hugetlb: remove duplicated code
Subsystems (2)
[email protected]
maintainerPATCH 130/158 hugetlb: remove duplicated code
From: Mina Almasry <[email protected]>
Subject: hugetlb: remove duplicated code
Remove duplicated code between region_chg and region_add, and refactor it into a common function, add_reservation_in_range. This is mostly done because there is a follow up change in another series that disables region coalescing in region_add, and I want to make that change in one place only. It should improve maintainability anyway on its own.
[[email protected]: coding style fixes]
Signed-off-by Mina Almasry <[email protected]>
Reviewed-by Mike Kravetz <[email protected]>
Cc David Rientjes <[email protected]>
Cc Shakeel Butt <[email protected]>
Cc Greg Thelen <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
mm/hugetlb.c | 119 +++++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 62 deletions(-)
mm/hugetlb.c renamed from mm/hugetlb.c~hugetlb-remove-duplicated-code +57 -62
@@ -244,6 +244,60 @@ struct file_region {long to; }; +/* Must be called with resv->lock held. Calling this with count_only == true +* will count the number of pages to be added but will not modify the linked +* list. +*/ +static long add_reservation_in_range (struct resv_map *resv,long f,long t, +bool count_only) +{ +long chg =0 ; +struct list_head *head = &resv->regions; +struct file_region *rg =NULL , *trg =NULL , *nrg =NULL ; + +/* Locate the region we are before or in. */ +list_for_each_entry (rg, head, link) +if (f <= rg->to) +break ; + +/* Round our left edge to the current segment if it encloses us. */ +if (f > rg->from) + f = rg->from; + + chg = t - f; + +/* Check for and consume any regions we now overlap with. */ + nrg = rg; +list_for_each_entry_safe (rg, trg, rg->link.prev, link) { +if (&rg->link == head) +break ; +if (rg->from > t) +break ; + +/* We overlap with this area, if it extends further than +* us then we must extend ourselves. Account for its +* existing reservation. +*/ +if (rg->to > t) { + chg += rg->to - t; + t = rg->to; + } + chg -= rg->to - rg->from; + +if (!count_only && rg != nrg) { +list_del (&rg->link); +kfree (rg); + } + } + +if (!count_only) { + nrg->from = f; + nrg->to = t; + } + +return chg; +} +/* * Add the huge page range represented by [f, t) to the reserve * map. Existing regions will be expanded to accommodate the specified
@@ -257,7 +311,7 @@ struct file_region {static long region_add (struct resv_map *resv,long f,long t) {struct list_head *head = &resv->regions; -struct file_region *rg, *nrg, *trg; +struct file_region *rg, *nrg;long add =0 ;spin_lock (&resv->lock);
@@ -287,38 +341,7 @@ static long region_add(struct resv_map * goto out_locked; } -/* Round our left edge to the current segment if it encloses us. */ -if (f > rg->from) - f = rg->from; - -/* Check for and consume any regions we now overlap with. */ - nrg = rg; -list_for_each_entry_safe (rg, trg, rg->link.prev, link) { -if (&rg->link == head) -break ; -if (rg->from > t) -break ; - -/* If this area reaches higher then extend our area to -* include it completely. If this is not the first area -* which we intend to reuse, free it. */ -if (rg->to > t) - t = rg->to; -if (rg != nrg) { -/* Decrement return value by the deleted range. -* Another range will span this area so that by -* end of routine add will be >= zero -*/ - add -= (rg->to - rg->from); -list_del (&rg->link); -kfree (rg); - } - } - - add += (nrg->from - f);/* Added to beginning of region */ - nrg->from = f; - add += t - nrg->to;/* Added to end of region */ - nrg->to = t; + add =add_reservation_in_range (resv, f, t, false); out_locked: resv->adds_in_progress--;
@@ -345,8 +368,6 @@ out_locked:*/ static long region_chg (struct resv_map *resv,long f,long t) { -struct list_head *head = &resv->regions; -struct file_region *rg;long chg =0 ;spin_lock (&resv->lock);
@@ -375,34 +396,8 @@ retry_locked: goto retry_locked; } -/* Locate the region we are before or in. */ -list_for_each_entry (rg, head, link) -if (f <= rg->to) -break ; - -/* Round our left edge to the current segment if it encloses us. */ -if (f > rg->from) - f = rg->from; - chg = t - f; - -/* Check for and consume any regions we now overlap with. */ -list_for_each_entry (rg, rg->link.prev, link) { -if (&rg->link == head) -break ; -if (rg->from > t) - goto out; - -/* We overlap with this area, if it extends further than -* us then we must extend ourselves. Account for its -* existing reservation. */ -if (rg->to > t) { - chg += rg->to - t; - t = rg->to; - } - chg -= rg->to - rg->from; - } + chg =add_reservation_in_range (resv, f, t, true); -out:spin_unlock (&resv->lock);return chg; }
_