diff --git a/drivers/md/md.c b/drivers/md/md.c index 9c94190769b8b9a659aeb117b9a0e6eaf653bf95..ac2bdb4665b8c2a5ff90982aac22ebbc8ddb15e0 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -66,6 +66,7 @@ #include <linux/raid/md_u.h> #include <linux/slab.h> #include <linux/percpu-refcount.h> +#include <linux/arch_topology.h> #include <trace/events/block.h> #include "md.h" @@ -5543,6 +5544,16 @@ static void md_safemode_timeout(struct timer_list *t) static int start_dirty_degraded; +#define MIN_DISPATCH_ASYNC_CPUS 16 +static void queue_init_dispatch_async_cpus(struct request_queue *q, int node) +{ + arch_get_preferred_sibling_cpumask(node, &q->dispatch_async_cpus); + if (cpumask_weight(&q->dispatch_async_cpus) >= MIN_DISPATCH_ASYNC_CPUS) + blk_queue_flag_set(QUEUE_FLAG_DISPATCH_ASYNC, q); + else + cpumask_setall(&q->dispatch_async_cpus); +} + int md_run(struct mddev *mddev) { int err; @@ -5786,6 +5797,8 @@ int md_run(struct mddev *mddev) if (mddev->sb_flags) md_update_sb(mddev, 0); + if (mddev->queue && pers->level == 10) + queue_init_dispatch_async_cpus(mddev->queue, 1); md_new_event(mddev); return 0;