Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 292639
b: refs/heads/master
c: 28073b0
h: refs/heads/master
i:
  292637: 425f7c5
  292635: ebe428c
  292631: 98df1c1
  292623: 04ea745
  292607: e60f2ba
v: v3
  • Loading branch information
Hillf Danton authored and Linus Torvalds committed Mar 22, 2012
1 parent 81ecac2 commit 4e9062d
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cc715d99e529d470dde2f33a6614f255adea71f3
refs/heads/master: 28073b02bfaaed1e3278acfb8e6e7c9f76d9f2b6
30 changes: 17 additions & 13 deletions trunk/mm/hugetlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -852,6 +852,7 @@ static int gather_surplus_pages(struct hstate *h, int delta)
struct page *page, *tmp;
int ret, i;
int needed, allocated;
bool alloc_ok = true;

needed = (h->resv_huge_pages + delta) - h->free_huge_pages;
if (needed <= 0) {
Expand All @@ -867,17 +868,13 @@ static int gather_surplus_pages(struct hstate *h, int delta)
spin_unlock(&hugetlb_lock);
for (i = 0; i < needed; i++) {
page = alloc_buddy_huge_page(h, NUMA_NO_NODE);
if (!page)
/*
* We were not able to allocate enough pages to
* satisfy the entire reservation so we free what
* we've allocated so far.
*/
goto free;

if (!page) {
alloc_ok = false;
break;
}
list_add(&page->lru, &surplus_list);
}
allocated += needed;
allocated += i;

/*
* After retaking hugetlb_lock, we need to recalculate 'needed'
Expand All @@ -886,9 +883,16 @@ static int gather_surplus_pages(struct hstate *h, int delta)
spin_lock(&hugetlb_lock);
needed = (h->resv_huge_pages + delta) -
(h->free_huge_pages + allocated);
if (needed > 0)
goto retry;

if (needed > 0) {
if (alloc_ok)
goto retry;
/*
* We were not able to allocate enough pages to
* satisfy the entire reservation so we free what
* we've allocated so far.
*/
goto free;
}
/*
* The surplus_list now contains _at_least_ the number of extra pages
* needed to accommodate the reservation. Add the appropriate number
Expand All @@ -914,10 +918,10 @@ static int gather_surplus_pages(struct hstate *h, int delta)
VM_BUG_ON(page_count(page));
enqueue_huge_page(h, page);
}
free:
spin_unlock(&hugetlb_lock);

/* Free unnecessary surplus pages to the buddy allocator */
free:
if (!list_empty(&surplus_list)) {
list_for_each_entry_safe(page, tmp, &surplus_list, lru) {
list_del(&page->lru);
Expand Down

0 comments on commit 4e9062d

Please sign in to comment.