summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorVitaly Wool <vitalywool@gmail.com>2019-05-13 20:22:46 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-05-14 12:47:50 -0400
commit351618b203acef13946a03ecf18fbe328c3cdb58 (patch)
treed50a6a22e0674d460c73acac7a03ab3d696bd9b6 /mm
parent9050cce104c04982fb7b5dea9aee4f66f245d6d3 (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.c36
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