diff options
author | Vitaly Wool <vitalywool@gmail.com> | 2016-06-03 17:55:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-06-03 19:02:55 -0400 |
commit | 43afc19417ca92cf237095947f597f21d86fd2a7 (patch) | |
tree | a9976414d5dab53237a8b283aa5030b16a44adcb /mm | |
parent | 3a06bb78ceeceacc86a1e31133a7944013f9775b (diff) |
mm/z3fold.c: avoid modifying HEADLESS page and minor cleanup
Fix erroneous z3fold header access in a HEADLESS page in reclaim
function, and change one remaining direct handle-to-buddy conversion to
use the appropriate helper.
Link: http://lkml.kernel.org/r/5748706F.9020208@gmail.com
Signed-off-by: Vitaly Wool <vitalywool@gmail.com>
Reviewed-by: Dan Streetman <ddstreet@ieee.org>
Cc: Seth Jennings <sjenning@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/z3fold.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/mm/z3fold.c b/mm/z3fold.c index 34917d55d311..8f9e89ca1d31 100644 --- a/mm/z3fold.c +++ b/mm/z3fold.c | |||
@@ -412,7 +412,7 @@ static void z3fold_free(struct z3fold_pool *pool, unsigned long handle) | |||
412 | /* HEADLESS page stored */ | 412 | /* HEADLESS page stored */ |
413 | bud = HEADLESS; | 413 | bud = HEADLESS; |
414 | } else { | 414 | } else { |
415 | bud = (handle - zhdr->first_num) & BUDDY_MASK; | 415 | bud = handle_to_buddy(handle); |
416 | 416 | ||
417 | switch (bud) { | 417 | switch (bud) { |
418 | case FIRST: | 418 | case FIRST: |
@@ -572,15 +572,19 @@ next: | |||
572 | pool->pages_nr--; | 572 | pool->pages_nr--; |
573 | spin_unlock(&pool->lock); | 573 | spin_unlock(&pool->lock); |
574 | return 0; | 574 | return 0; |
575 | } else if (zhdr->first_chunks != 0 && | 575 | } else if (!test_bit(PAGE_HEADLESS, &page->private)) { |
576 | zhdr->last_chunks != 0 && zhdr->middle_chunks != 0) { | 576 | if (zhdr->first_chunks != 0 && |
577 | /* Full, add to buddied list */ | 577 | zhdr->last_chunks != 0 && |
578 | list_add(&zhdr->buddy, &pool->buddied); | 578 | zhdr->middle_chunks != 0) { |
579 | } else if (!test_bit(PAGE_HEADLESS, &page->private)) { | 579 | /* Full, add to buddied list */ |
580 | z3fold_compact_page(zhdr); | 580 | list_add(&zhdr->buddy, &pool->buddied); |
581 | /* add to unbuddied list */ | 581 | } else { |
582 | freechunks = num_free_chunks(zhdr); | 582 | z3fold_compact_page(zhdr); |
583 | list_add(&zhdr->buddy, &pool->unbuddied[freechunks]); | 583 | /* add to unbuddied list */ |
584 | freechunks = num_free_chunks(zhdr); | ||
585 | list_add(&zhdr->buddy, | ||
586 | &pool->unbuddied[freechunks]); | ||
587 | } | ||
584 | } | 588 | } |
585 | 589 | ||
586 | /* add to beginning of LRU */ | 590 | /* add to beginning of LRU */ |