z3fold: remove preempt disabled sections for RT
authorVitaly Wool <vitaly.wool@konsulko.com>
Tue, 15 Dec 2020 03:12:36 +0000 (19:12 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 15 Dec 2020 20:13:45 +0000 (12:13 -0800)
Replace get_cpu_ptr() with migrate_disable()+this_cpu_ptr() so RT can take
spinlocks that become sleeping locks.

Signed-off-by Mike Galbraith <efault@gmx.de>

Link: https://lkml.kernel.org/r/20201209145151.18994-3-vitaly.wool@konsulko.com
Signed-off-by: Vitaly Wool <vitaly.wool@konsulko.com>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/z3fold.c

index 0152ad9..dacb0d7 100644 (file)
@@ -623,14 +623,16 @@ static inline void add_to_unbuddied(struct z3fold_pool *pool,
 {
        if (zhdr->first_chunks == 0 || zhdr->last_chunks == 0 ||
                        zhdr->middle_chunks == 0) {
-               struct list_head *unbuddied = get_cpu_ptr(pool->unbuddied);
-
+               struct list_head *unbuddied;
                int freechunks = num_free_chunks(zhdr);
+
+               migrate_disable();
+               unbuddied = this_cpu_ptr(pool->unbuddied);
                spin_lock(&pool->lock);
                list_add(&zhdr->buddy, &unbuddied[freechunks]);
                spin_unlock(&pool->lock);
                zhdr->cpu = smp_processor_id();
-               put_cpu_ptr(pool->unbuddied);
+               migrate_enable();
        }
 }
 
@@ -880,8 +882,9 @@ static inline struct z3fold_header *__z3fold_alloc(struct z3fold_pool *pool,
        int chunks = size_to_chunks(size), i;
 
 lookup:
+       migrate_disable();
        /* First, try to find an unbuddied z3fold page. */
-       unbuddied = get_cpu_ptr(pool->unbuddied);
+       unbuddied = this_cpu_ptr(pool->unbuddied);
        for_each_unbuddied_list(i, chunks) {
                struct list_head *l = &unbuddied[i];
 
@@ -899,7 +902,7 @@ lookup:
                    !z3fold_page_trylock(zhdr)) {
                        spin_unlock(&pool->lock);
                        zhdr = NULL;
-                       put_cpu_ptr(pool->unbuddied);
+                       migrate_enable();
                        if (can_sleep)
                                cond_resched();
                        goto lookup;
@@ -913,7 +916,7 @@ lookup:
                    test_bit(PAGE_CLAIMED, &page->private)) {
                        z3fold_page_unlock(zhdr);
                        zhdr = NULL;
-                       put_cpu_ptr(pool->unbuddied);
+                       migrate_enable();
                        if (can_sleep)
                                cond_resched();
                        goto lookup;
@@ -928,7 +931,7 @@ lookup:
                kref_get(&zhdr->refcount);
                break;
        }
-       put_cpu_ptr(pool->unbuddied);
+       migrate_enable();
 
        if (!zhdr) {
                int cpu;