Skip to content

Commit d37977f

Browse files
committed
Merge tag 'md-6.9-20240306' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md into for-6.9/block
Pull MD atomic queue limits changes from Song. * tag 'md-6.9-20240306' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md: block: remove disk_stack_limits md: remove mddev->queue md: don't initialize queue limits md/raid10: use the atomic queue limit update APIs md/raid5: use the atomic queue limit update APIs md/raid1: use the atomic queue limit update APIs md/raid0: use the atomic queue limit update APIs md: add queue limit helpers md: add a mddev_is_dm helper md: add a mddev_add_trace_msg helper md: add a mddev_trace_remap helper
2 parents 34a2cf3 + dd27a84 commit d37977f

File tree

10 files changed

+265
-242
lines changed

10 files changed

+265
-242
lines changed

block/blk-settings.c

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -916,30 +916,6 @@ void queue_limits_stack_bdev(struct queue_limits *t, struct block_device *bdev,
916916
}
917917
EXPORT_SYMBOL_GPL(queue_limits_stack_bdev);
918918

919-
/**
920-
* disk_stack_limits - adjust queue limits for stacked drivers
921-
* @disk: MD/DM gendisk (top)
922-
* @bdev: the underlying block device (bottom)
923-
* @offset: offset to beginning of data within component device
924-
*
925-
* Description:
926-
* Merges the limits for a top level gendisk and a bottom level
927-
* block_device.
928-
*/
929-
void disk_stack_limits(struct gendisk *disk, struct block_device *bdev,
930-
sector_t offset)
931-
{
932-
struct request_queue *t = disk->queue;
933-
934-
if (blk_stack_limits(&t->limits, &bdev_get_queue(bdev)->limits,
935-
get_start_sect(bdev) + (offset >> 9)) < 0)
936-
pr_notice("%s: Warning: Device %pg is misaligned\n",
937-
disk->disk_name, bdev);
938-
939-
disk_update_readahead(disk);
940-
}
941-
EXPORT_SYMBOL(disk_stack_limits);
942-
943919
/**
944920
* blk_queue_update_dma_pad - update pad mask
945921
* @q: the request queue for the device

drivers/md/md-bitmap.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,9 +1046,8 @@ void md_bitmap_unplug(struct bitmap *bitmap)
10461046
if (dirty || need_write) {
10471047
if (!writing) {
10481048
md_bitmap_wait_writes(bitmap);
1049-
if (bitmap->mddev->queue)
1050-
blk_add_trace_msg(bitmap->mddev->queue,
1051-
"md bitmap_unplug");
1049+
mddev_add_trace_msg(bitmap->mddev,
1050+
"md bitmap_unplug");
10521051
}
10531052
clear_page_attr(bitmap, i, BITMAP_PAGE_PENDING);
10541053
filemap_write_page(bitmap, i, false);
@@ -1319,9 +1318,7 @@ void md_bitmap_daemon_work(struct mddev *mddev)
13191318
}
13201319
bitmap->allclean = 1;
13211320

1322-
if (bitmap->mddev->queue)
1323-
blk_add_trace_msg(bitmap->mddev->queue,
1324-
"md bitmap_daemon_work");
1321+
mddev_add_trace_msg(bitmap->mddev, "md bitmap_daemon_work");
13251322

13261323
/* Any file-page which is PENDING now needs to be written.
13271324
* So set NEEDWRITE now, then after we make any last-minute changes

drivers/md/md.c

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
#include <linux/percpu-refcount.h>
6666
#include <linux/part_stat.h>
6767

68-
#include <trace/events/block.h>
6968
#include "md.h"
7069
#include "md-bitmap.h"
7170
#include "md-cluster.h"
@@ -2411,7 +2410,7 @@ int md_integrity_register(struct mddev *mddev)
24112410

24122411
if (list_empty(&mddev->disks))
24132412
return 0; /* nothing to do */
2414-
if (!mddev->gendisk || blk_get_integrity(mddev->gendisk))
2413+
if (mddev_is_dm(mddev) || blk_get_integrity(mddev->gendisk))
24152414
return 0; /* shouldn't register, or already is */
24162415
rdev_for_each(rdev, mddev) {
24172416
/* skip spares and non-functional disks */
@@ -2464,7 +2463,7 @@ int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
24642463
{
24652464
struct blk_integrity *bi_mddev;
24662465

2467-
if (!mddev->gendisk)
2466+
if (mddev_is_dm(mddev))
24682467
return 0;
24692468

24702469
bi_mddev = blk_get_integrity(mddev->gendisk);
@@ -2857,8 +2856,7 @@ void md_update_sb(struct mddev *mddev, int force_change)
28572856
pr_debug("md: updating %s RAID superblock on device (in sync %d)\n",
28582857
mdname(mddev), mddev->in_sync);
28592858

2860-
if (mddev->queue)
2861-
blk_add_trace_msg(mddev->queue, "md md_update_sb");
2859+
mddev_add_trace_msg(mddev, "md md_update_sb");
28622860
rewrite:
28632861
md_bitmap_update_sb(mddev->bitmap);
28642862
rdev_for_each(rdev, mddev) {
@@ -4166,7 +4164,6 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
41664164
mddev->in_sync = 1;
41674165
del_timer_sync(&mddev->safemode_timer);
41684166
}
4169-
blk_set_stacking_limits(&mddev->queue->limits);
41704167
pers->run(mddev);
41714168
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
41724169
if (!mddev->thread)
@@ -5753,6 +5750,51 @@ static const struct kobj_type md_ktype = {
57535750

57545751
int mdp_major = 0;
57555752

5753+
/* stack the limit for all rdevs into lim */
5754+
void mddev_stack_rdev_limits(struct mddev *mddev, struct queue_limits *lim)
5755+
{
5756+
struct md_rdev *rdev;
5757+
5758+
rdev_for_each(rdev, mddev) {
5759+
queue_limits_stack_bdev(lim, rdev->bdev, rdev->data_offset,
5760+
mddev->gendisk->disk_name);
5761+
}
5762+
}
5763+
EXPORT_SYMBOL_GPL(mddev_stack_rdev_limits);
5764+
5765+
/* apply the extra stacking limits from a new rdev into mddev */
5766+
int mddev_stack_new_rdev(struct mddev *mddev, struct md_rdev *rdev)
5767+
{
5768+
struct queue_limits lim;
5769+
5770+
if (mddev_is_dm(mddev))
5771+
return 0;
5772+
5773+
lim = queue_limits_start_update(mddev->gendisk->queue);
5774+
queue_limits_stack_bdev(&lim, rdev->bdev, rdev->data_offset,
5775+
mddev->gendisk->disk_name);
5776+
return queue_limits_commit_update(mddev->gendisk->queue, &lim);
5777+
}
5778+
EXPORT_SYMBOL_GPL(mddev_stack_new_rdev);
5779+
5780+
/* update the optimal I/O size after a reshape */
5781+
void mddev_update_io_opt(struct mddev *mddev, unsigned int nr_stripes)
5782+
{
5783+
struct queue_limits lim;
5784+
5785+
if (mddev_is_dm(mddev))
5786+
return;
5787+
5788+
/* don't bother updating io_opt if we can't suspend the array */
5789+
if (mddev_suspend(mddev, false) < 0)
5790+
return;
5791+
lim = queue_limits_start_update(mddev->gendisk->queue);
5792+
lim.io_opt = lim.io_min * nr_stripes;
5793+
queue_limits_commit_update(mddev->gendisk->queue, &lim);
5794+
mddev_resume(mddev);
5795+
}
5796+
EXPORT_SYMBOL_GPL(mddev_update_io_opt);
5797+
57565798
static void mddev_delayed_delete(struct work_struct *ws)
57575799
{
57585800
struct mddev *mddev = container_of(ws, struct mddev, del_work);
@@ -5835,9 +5877,7 @@ struct mddev *md_alloc(dev_t dev, char *name)
58355877
disk->fops = &md_fops;
58365878
disk->private_data = mddev;
58375879

5838-
mddev->queue = disk->queue;
5839-
blk_set_stacking_limits(&mddev->queue->limits);
5840-
blk_queue_write_cache(mddev->queue, true, true);
5880+
blk_queue_write_cache(disk->queue, true, true);
58415881
disk->events |= DISK_EVENT_MEDIA_CHANGE;
58425882
mddev->gendisk = disk;
58435883
error = add_disk(disk);
@@ -5979,7 +6019,7 @@ int md_run(struct mddev *mddev)
59796019
invalidate_bdev(rdev->bdev);
59806020
if (mddev->ro != MD_RDONLY && rdev_read_only(rdev)) {
59816021
mddev->ro = MD_RDONLY;
5982-
if (mddev->gendisk)
6022+
if (!mddev_is_dm(mddev))
59836023
set_disk_ro(mddev->gendisk, 1);
59846024
}
59856025

@@ -6141,7 +6181,8 @@ int md_run(struct mddev *mddev)
61416181
}
61426182
}
61436183

6144-
if (mddev->queue) {
6184+
if (!mddev_is_dm(mddev)) {
6185+
struct request_queue *q = mddev->gendisk->queue;
61456186
bool nonrot = true;
61466187

61476188
rdev_for_each(rdev, mddev) {
@@ -6153,14 +6194,14 @@ int md_run(struct mddev *mddev)
61536194
if (mddev->degraded)
61546195
nonrot = false;
61556196
if (nonrot)
6156-
blk_queue_flag_set(QUEUE_FLAG_NONROT, mddev->queue);
6197+
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
61576198
else
6158-
blk_queue_flag_clear(QUEUE_FLAG_NONROT, mddev->queue);
6159-
blk_queue_flag_set(QUEUE_FLAG_IO_STAT, mddev->queue);
6199+
blk_queue_flag_clear(QUEUE_FLAG_NONROT, q);
6200+
blk_queue_flag_set(QUEUE_FLAG_IO_STAT, q);
61606201

61616202
/* Set the NOWAIT flags if all underlying devices support it */
61626203
if (nowait)
6163-
blk_queue_flag_set(QUEUE_FLAG_NOWAIT, mddev->queue);
6204+
blk_queue_flag_set(QUEUE_FLAG_NOWAIT, q);
61646205
}
61656206
if (pers->sync_request) {
61666207
if (mddev->kobj.sd &&
@@ -6406,8 +6447,10 @@ static void mddev_detach(struct mddev *mddev)
64066447
mddev->pers->quiesce(mddev, 0);
64076448
}
64086449
md_unregister_thread(mddev, &mddev->thread);
6409-
if (mddev->queue)
6410-
blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
6450+
6451+
/* the unplug fn references 'conf' */
6452+
if (!mddev_is_dm(mddev))
6453+
blk_sync_queue(mddev->gendisk->queue);
64116454
}
64126455

64136456
static void __md_stop(struct mddev *mddev)
@@ -7125,7 +7168,7 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev)
71257168
if (!bdev_nowait(rdev->bdev)) {
71267169
pr_info("%s: Disabling nowait because %pg does not support nowait\n",
71277170
mdname(mddev), rdev->bdev);
7128-
blk_queue_flag_clear(QUEUE_FLAG_NOWAIT, mddev->queue);
7171+
blk_queue_flag_clear(QUEUE_FLAG_NOWAIT, mddev->gendisk->queue);
71297172
}
71307173
/*
71317174
* Kick recovery, maybe this spare has to be added to the
@@ -7362,10 +7405,9 @@ static int update_size(struct mddev *mddev, sector_t num_sectors)
73627405
if (!rv) {
73637406
if (mddev_is_clustered(mddev))
73647407
md_cluster_ops->update_size(mddev, old_dev_sectors);
7365-
else if (mddev->queue) {
7408+
else if (!mddev_is_dm(mddev))
73667409
set_capacity_and_notify(mddev->gendisk,
73677410
mddev->array_sectors);
7368-
}
73697411
}
73707412
return rv;
73717413
}
@@ -8686,10 +8728,7 @@ void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
86868728

86878729
bio_chain(discard_bio, bio);
86888730
bio_clone_blkg_association(discard_bio, bio);
8689-
if (mddev->gendisk)
8690-
trace_block_bio_remap(discard_bio,
8691-
disk_devt(mddev->gendisk),
8692-
bio->bi_iter.bi_sector);
8731+
mddev_trace_remap(mddev, discard_bio, bio->bi_iter.bi_sector);
86938732
submit_bio_noacct(discard_bio);
86948733
}
86958734
EXPORT_SYMBOL_GPL(md_submit_discard_bio);
@@ -9182,7 +9221,7 @@ void md_do_sync(struct md_thread *thread)
91829221
mddev->delta_disks > 0 &&
91839222
mddev->pers->finish_reshape &&
91849223
mddev->pers->size &&
9185-
mddev->queue) {
9224+
!mddev_is_dm(mddev)) {
91869225
mddev_lock_nointr(mddev);
91879226
md_set_array_sectors(mddev, mddev->pers->size(mddev, 0, 0));
91889227
mddev_unlock(mddev);

drivers/md/md.h

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <linux/timer.h>
1919
#include <linux/wait.h>
2020
#include <linux/workqueue.h>
21+
#include <trace/events/block.h>
2122
#include "md-cluster.h"
2223

2324
#define MaxSector (~(sector_t)0)
@@ -479,7 +480,6 @@ struct mddev {
479480
struct timer_list safemode_timer;
480481
struct percpu_ref writes_pending;
481482
int sync_checkers; /* # of threads checking writes_pending */
482-
struct request_queue *queue; /* for plugging ... */
483483

484484
struct bitmap *bitmap; /* the bitmap for the device */
485485
struct {
@@ -868,7 +868,7 @@ static inline void mddev_check_write_zeroes(struct mddev *mddev, struct bio *bio
868868
{
869869
if (bio_op(bio) == REQ_OP_WRITE_ZEROES &&
870870
!bio->bi_bdev->bd_disk->queue->limits.max_write_zeroes_sectors)
871-
mddev->queue->limits.max_write_zeroes_sectors = 0;
871+
mddev->gendisk->queue->limits.max_write_zeroes_sectors = 0;
872872
}
873873

874874
static inline int mddev_suspend_and_lock(struct mddev *mddev)
@@ -907,7 +907,31 @@ void md_autostart_arrays(int part);
907907
int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info);
908908
int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info);
909909
int do_md_run(struct mddev *mddev);
910+
void mddev_stack_rdev_limits(struct mddev *mddev, struct queue_limits *lim);
911+
int mddev_stack_new_rdev(struct mddev *mddev, struct md_rdev *rdev);
912+
void mddev_update_io_opt(struct mddev *mddev, unsigned int nr_stripes);
910913

911914
extern const struct block_device_operations md_fops;
912915

916+
/*
917+
* MD devices can be used undeneath by DM, in which case ->gendisk is NULL.
918+
*/
919+
static inline bool mddev_is_dm(struct mddev *mddev)
920+
{
921+
return !mddev->gendisk;
922+
}
923+
924+
static inline void mddev_trace_remap(struct mddev *mddev, struct bio *bio,
925+
sector_t sector)
926+
{
927+
if (!mddev_is_dm(mddev))
928+
trace_block_bio_remap(bio, disk_devt(mddev->gendisk), sector);
929+
}
930+
931+
#define mddev_add_trace_msg(mddev, fmt, args...) \
932+
do { \
933+
if (!mddev_is_dm(mddev)) \
934+
blk_add_trace_msg((mddev)->gendisk->queue, fmt, ##args); \
935+
} while (0)
936+
913937
#endif /* _MD_MD_H */

drivers/md/raid0.c

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,19 @@ static void raid0_free(struct mddev *mddev, void *priv)
379379
free_conf(mddev, conf);
380380
}
381381

382+
static int raid0_set_limits(struct mddev *mddev)
383+
{
384+
struct queue_limits lim;
385+
386+
blk_set_stacking_limits(&lim);
387+
lim.max_hw_sectors = mddev->chunk_sectors;
388+
lim.max_write_zeroes_sectors = mddev->chunk_sectors;
389+
lim.io_min = mddev->chunk_sectors << 9;
390+
lim.io_opt = lim.io_min * mddev->raid_disks;
391+
mddev_stack_rdev_limits(mddev, &lim);
392+
return queue_limits_set(mddev->gendisk->queue, &lim);
393+
}
394+
382395
static int raid0_run(struct mddev *mddev)
383396
{
384397
struct r0conf *conf;
@@ -399,20 +412,10 @@ static int raid0_run(struct mddev *mddev)
399412
mddev->private = conf;
400413
}
401414
conf = mddev->private;
402-
if (mddev->queue) {
403-
struct md_rdev *rdev;
404-
405-
blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors);
406-
blk_queue_max_write_zeroes_sectors(mddev->queue, mddev->chunk_sectors);
407-
408-
blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9);
409-
blk_queue_io_opt(mddev->queue,
410-
(mddev->chunk_sectors << 9) * mddev->raid_disks);
411-
412-
rdev_for_each(rdev, mddev) {
413-
disk_stack_limits(mddev->gendisk, rdev->bdev,
414-
rdev->data_offset << 9);
415-
}
415+
if (!mddev_is_dm(mddev)) {
416+
ret = raid0_set_limits(mddev);
417+
if (ret)
418+
goto out_free_conf;
416419
}
417420

418421
/* calculate array device size */
@@ -426,8 +429,10 @@ static int raid0_run(struct mddev *mddev)
426429

427430
ret = md_integrity_register(mddev);
428431
if (ret)
429-
free_conf(mddev, conf);
430-
432+
goto out_free_conf;
433+
return 0;
434+
out_free_conf:
435+
free_conf(mddev, conf);
431436
return ret;
432437
}
433438

@@ -578,10 +583,7 @@ static void raid0_map_submit_bio(struct mddev *mddev, struct bio *bio)
578583
bio_set_dev(bio, tmp_dev->bdev);
579584
bio->bi_iter.bi_sector = sector + zone->dev_start +
580585
tmp_dev->data_offset;
581-
582-
if (mddev->gendisk)
583-
trace_block_bio_remap(bio, disk_devt(mddev->gendisk),
584-
bio_sector);
586+
mddev_trace_remap(mddev, bio, bio_sector);
585587
mddev_check_write_zeroes(mddev, bio);
586588
submit_bio_noacct(bio);
587589
}

0 commit comments

Comments
 (0)