diff options
author | Vitaly Wool <vitalywool@gmail.com> | 2019-05-13 20:22:46 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-14 12:47:50 -0400 |
commit | 351618b203acef13946a03ecf18fbe328c3cdb58 (patch) | |
tree | d50a6a22e0674d460c73acac7a03ab3d696bd9b6 /mm | |
parent | 9050cce104c04982fb7b5dea9aee4f66f245d6d3 (diff) |
mm/z3fold.c: improve compression by extending search
The current z3fold implementation only searches this CPU's page lists for
a fitting page to put a new object into. This patch adds quick search for
very well fitting pages (i. e. those having exactly the required number
of free space) on other CPUs too, before allocating a new page for that
object.
Link: http://lkml.kernel.org/r/20190417103733.72ae81abe1552397c95a008e@gmail.com
Signed-off-by: Vitaly Wool <vitaly.vul@sony.com>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Cc: Dan Streetman <ddstreet@ieee.org>
Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Cc: Oleksiy Avramchenko <oleksiy.avramchenko@sonymobile.com>
Cc: Uladzislau Rezki <urezki@gmail.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 | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/mm/z3fold.c b/mm/z3fold.c index 7a59875d880c..29a4f1249bef 100644 --- a/mm/z3fold.c +++ b/mm/z3fold.c | |||
@@ -522,6 +522,42 @@ lookup: | |||
522 | } | 522 | } |
523 | put_cpu_ptr(pool->unbuddied); | 523 | put_cpu_ptr(pool->unbuddied); |
524 | 524 | ||
525 | if (!zhdr) { | ||
526 | int cpu; | ||
527 | |||
528 | /* look for _exact_ match on other cpus' lists */ | ||
529 | for_each_online_cpu(cpu) { | ||
530 | struct list_head *l; | ||
531 | |||
532 | unbuddied = per_cpu_ptr(pool->unbuddied, cpu); | ||
533 | spin_lock(&pool->lock); | ||
534 | l = &unbuddied[chunks]; | ||
535 | |||
536 | zhdr = list_first_entry_or_null(READ_ONCE(l), | ||
537 | struct z3fold_header, buddy); | ||
538 | |||
539 | if (!zhdr || !z3fold_page_trylock(zhdr)) { | ||
540 | spin_unlock(&pool->lock); | ||
541 | zhdr = NULL; | ||
542 | continue; | ||
543 | } | ||
544 | list_del_init(&zhdr->buddy); | ||
545 | zhdr->cpu = -1; | ||
546 | spin_unlock(&pool->lock); | ||
547 | |||
548 | page = virt_to_page(zhdr); | ||
549 | if (test_bit(NEEDS_COMPACTING, &page->private)) { | ||
550 | z3fold_page_unlock(zhdr); | ||
551 | zhdr = NULL; | ||
552 | if (can_sleep) | ||
553 | cond_resched(); | ||
554 | continue; | ||
555 | } | ||
556 | kref_get(&zhdr->refcount); | ||
557 | break; | ||
558 | } | ||
559 | } | ||
560 | |||
525 | return zhdr; | 561 | return zhdr; |
526 | } | 562 | } |
527 | 563 | ||