All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] md/raid5: play nice with PREEMPT_RT
@ 2021-11-16  1:23 Davidlohr Bueso
  2021-11-17  7:35 ` Song Liu
  0 siblings, 1 reply; 2+ messages in thread
From: Davidlohr Bueso @ 2021-11-16  1:23 UTC (permalink / raw)
  To: song; +Cc: linux-raid, linux-kernel, dave, Davidlohr Bueso

raid_run_ops() relies on the implicitly disabled preemption for
its percpu ops, although this is really about CPU locality. This
breaks RT semantics as it can take regular (and thus sleeping)
spinlocks, such as stripe_lock.

Add a local_lock such that non-RT does not change and continues
to be just map to preempt_disable/enable, but makes RT happy as
the region will use a per-CPU spinlock and thus be preemptible
and still guarantee CPU locality.

Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
---
 drivers/md/raid5.c | 11 ++++++-----
 drivers/md/raid5.h |  4 +++-
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 9c1a5877cf9f..1240a5c16af8 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -2215,10 +2215,9 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request)
 	struct r5conf *conf = sh->raid_conf;
 	int level = conf->level;
 	struct raid5_percpu *percpu;
-	unsigned long cpu;
 
-	cpu = get_cpu();
-	percpu = per_cpu_ptr(conf->percpu, cpu);
+	local_lock(&conf->percpu->lock);
+	percpu = this_cpu_ptr(conf->percpu);
 	if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) {
 		ops_run_biofill(sh);
 		overlap_clear++;
@@ -2271,13 +2270,14 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request)
 			BUG();
 	}
 
-	if (overlap_clear && !sh->batch_head)
+	if (overlap_clear && !sh->batch_head) {
 		for (i = disks; i--; ) {
 			struct r5dev *dev = &sh->dev[i];
 			if (test_and_clear_bit(R5_Overlap, &dev->flags))
 				wake_up(&sh->raid_conf->wait_for_overlap);
 		}
-	put_cpu();
+	}
+	local_unlock(&conf->percpu->lock);
 }
 
 static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh)
@@ -7052,6 +7052,7 @@ static int alloc_scratch_buffer(struct r5conf *conf, struct raid5_percpu *percpu
 		return -ENOMEM;
 	}
 
+	local_lock_init(&percpu->lock);
 	return 0;
 }
 
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h
index 5c05acf20e1f..9e8486a9e445 100644
--- a/drivers/md/raid5.h
+++ b/drivers/md/raid5.h
@@ -4,6 +4,7 @@
 
 #include <linux/raid/xor.h>
 #include <linux/dmaengine.h>
+#include <linux/local_lock.h>
 
 /*
  *
@@ -640,7 +641,8 @@ struct r5conf {
 					     * lists and performing address
 					     * conversions
 					     */
-		int scribble_obj_size;
+		int             scribble_obj_size;
+		local_lock_t    lock;
 	} __percpu *percpu;
 	int scribble_disks;
 	int scribble_sectors;
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] md/raid5: play nice with PREEMPT_RT
  2021-11-16  1:23 [PATCH] md/raid5: play nice with PREEMPT_RT Davidlohr Bueso
@ 2021-11-17  7:35 ` Song Liu
  0 siblings, 0 replies; 2+ messages in thread
From: Song Liu @ 2021-11-17  7:35 UTC (permalink / raw)
  To: Davidlohr Bueso; +Cc: linux-raid, open list, Davidlohr Bueso

On Mon, Nov 15, 2021 at 5:23 PM Davidlohr Bueso <dave@stgolabs.net> wrote:
>
> raid_run_ops() relies on the implicitly disabled preemption for
> its percpu ops, although this is really about CPU locality. This
> breaks RT semantics as it can take regular (and thus sleeping)
> spinlocks, such as stripe_lock.
>
> Add a local_lock such that non-RT does not change and continues
> to be just map to preempt_disable/enable, but makes RT happy as
> the region will use a per-CPU spinlock and thus be preemptible
> and still guarantee CPU locality.
>
> Signed-off-by: Davidlohr Bueso <dbueso@suse.de>

Applied to md-next.

Thanks,
Song

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-11-17  7:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-16  1:23 [PATCH] md/raid5: play nice with PREEMPT_RT Davidlohr Bueso
2021-11-17  7:35 ` Song Liu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.