Commit e4eb37cc authored by Damien Le Moal's avatar Damien Le Moal Committed by Jens Axboe

block: Remove elevator required features

The only elevator feature ever implemented is ELEVATOR_F_ZBD_SEQ_WRITE
for signaling that a scheduler implements zone write locking to tightly
control the dispatching order of write operations to zoned block
devices. With the removal of zone write locking support in mq-deadline
and the reliance of all block device drivers on the block layer zone
write plugging to control ordering of write operations to zones, the
elevator feature ELEVATOR_F_ZBD_SEQ_WRITE is completely unused.
Remove it, and also remove the now unused code for filtering the
possible schedulers for a block device based on required features.
Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Tested-by: default avatarHans Holmberg <hans.holmberg@wdc.com>
Tested-by: default avatarDennis Maisenbacher <dennis.maisenbacher@wdc.com>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20240408014128.205141-23-dlemoal@kernel.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent fde02699
...@@ -1052,22 +1052,6 @@ void blk_queue_write_cache(struct request_queue *q, bool wc, bool fua) ...@@ -1052,22 +1052,6 @@ void blk_queue_write_cache(struct request_queue *q, bool wc, bool fua)
} }
EXPORT_SYMBOL_GPL(blk_queue_write_cache); EXPORT_SYMBOL_GPL(blk_queue_write_cache);
/**
* blk_queue_required_elevator_features - Set a queue required elevator features
* @q: the request queue for the target device
* @features: Required elevator features OR'ed together
*
* Tell the block layer that for the device controlled through @q, only the
* only elevators that can be used are those that implement at least the set of
* features specified by @features.
*/
void blk_queue_required_elevator_features(struct request_queue *q,
unsigned int features)
{
q->required_elevator_features = features;
}
EXPORT_SYMBOL_GPL(blk_queue_required_elevator_features);
/** /**
* blk_queue_can_use_dma_map_merging - configure queue for merging segments. * blk_queue_can_use_dma_map_merging - configure queue for merging segments.
* @q: the request queue for the device * @q: the request queue for the device
......
...@@ -83,13 +83,6 @@ bool elv_bio_merge_ok(struct request *rq, struct bio *bio) ...@@ -83,13 +83,6 @@ bool elv_bio_merge_ok(struct request *rq, struct bio *bio)
} }
EXPORT_SYMBOL(elv_bio_merge_ok); EXPORT_SYMBOL(elv_bio_merge_ok);
static inline bool elv_support_features(struct request_queue *q,
const struct elevator_type *e)
{
return (q->required_elevator_features & e->elevator_features) ==
q->required_elevator_features;
}
/** /**
* elevator_match - Check whether @e's name or alias matches @name * elevator_match - Check whether @e's name or alias matches @name
* @e: Scheduler to test * @e: Scheduler to test
...@@ -120,7 +113,7 @@ static struct elevator_type *elevator_find_get(struct request_queue *q, ...@@ -120,7 +113,7 @@ static struct elevator_type *elevator_find_get(struct request_queue *q,
spin_lock(&elv_list_lock); spin_lock(&elv_list_lock);
e = __elevator_find(name); e = __elevator_find(name);
if (e && (!elv_support_features(q, e) || !elevator_tryget(e))) if (e && (!elevator_tryget(e)))
e = NULL; e = NULL;
spin_unlock(&elv_list_lock); spin_unlock(&elv_list_lock);
return e; return e;
...@@ -580,34 +573,8 @@ static struct elevator_type *elevator_get_default(struct request_queue *q) ...@@ -580,34 +573,8 @@ static struct elevator_type *elevator_get_default(struct request_queue *q)
} }
/* /*
* Get the first elevator providing the features required by the request queue. * Use the default elevator settings. If the chosen elevator initialization
* Default to "none" if no matching elevator is found. * fails, fall back to the "none" elevator (no elevator).
*/
static struct elevator_type *elevator_get_by_features(struct request_queue *q)
{
struct elevator_type *e, *found = NULL;
spin_lock(&elv_list_lock);
list_for_each_entry(e, &elv_list, list) {
if (elv_support_features(q, e)) {
found = e;
break;
}
}
if (found && !elevator_tryget(found))
found = NULL;
spin_unlock(&elv_list_lock);
return found;
}
/*
* For a device queue that has no required features, use the default elevator
* settings. Otherwise, use the first elevator available matching the required
* features. If no suitable elevator is find or if the chosen elevator
* initialization fails, fall back to the "none" elevator (no elevator).
*/ */
void elevator_init_mq(struct request_queue *q) void elevator_init_mq(struct request_queue *q)
{ {
...@@ -622,10 +589,7 @@ void elevator_init_mq(struct request_queue *q) ...@@ -622,10 +589,7 @@ void elevator_init_mq(struct request_queue *q)
if (unlikely(q->elevator)) if (unlikely(q->elevator))
return; return;
if (!q->required_elevator_features) e = elevator_get_default(q);
e = elevator_get_default(q);
else
e = elevator_get_by_features(q);
if (!e) if (!e)
return; return;
...@@ -781,7 +745,7 @@ ssize_t elv_iosched_show(struct request_queue *q, char *name) ...@@ -781,7 +745,7 @@ ssize_t elv_iosched_show(struct request_queue *q, char *name)
list_for_each_entry(e, &elv_list, list) { list_for_each_entry(e, &elv_list, list) {
if (e == cur) if (e == cur)
len += sprintf(name+len, "[%s] ", e->elevator_name); len += sprintf(name+len, "[%s] ", e->elevator_name);
else if (elv_support_features(q, e)) else
len += sprintf(name+len, "%s ", e->elevator_name); len += sprintf(name+len, "%s ", e->elevator_name);
} }
spin_unlock(&elv_list_lock); spin_unlock(&elv_list_lock);
......
...@@ -74,7 +74,6 @@ struct elevator_type ...@@ -74,7 +74,6 @@ struct elevator_type
struct elv_fs_entry *elevator_attrs; struct elv_fs_entry *elevator_attrs;
const char *elevator_name; const char *elevator_name;
const char *elevator_alias; const char *elevator_alias;
const unsigned int elevator_features;
struct module *elevator_owner; struct module *elevator_owner;
#ifdef CONFIG_BLK_DEBUG_FS #ifdef CONFIG_BLK_DEBUG_FS
const struct blk_mq_debugfs_attr *queue_debugfs_attrs; const struct blk_mq_debugfs_attr *queue_debugfs_attrs;
......
...@@ -453,8 +453,6 @@ struct request_queue { ...@@ -453,8 +453,6 @@ struct request_queue {
atomic_t nr_active_requests_shared_tags; atomic_t nr_active_requests_shared_tags;
unsigned int required_elevator_features;
struct blk_mq_tags *sched_shared_tags; struct blk_mq_tags *sched_shared_tags;
struct list_head icq_list; struct list_head icq_list;
...@@ -958,14 +956,6 @@ disk_alloc_independent_access_ranges(struct gendisk *disk, int nr_ia_ranges); ...@@ -958,14 +956,6 @@ disk_alloc_independent_access_ranges(struct gendisk *disk, int nr_ia_ranges);
void disk_set_independent_access_ranges(struct gendisk *disk, void disk_set_independent_access_ranges(struct gendisk *disk,
struct blk_independent_access_ranges *iars); struct blk_independent_access_ranges *iars);
/*
* Elevator features for blk_queue_required_elevator_features:
*/
/* Supports zoned block devices sequential write constraint */
#define ELEVATOR_F_ZBD_SEQ_WRITE (1U << 0)
extern void blk_queue_required_elevator_features(struct request_queue *q,
unsigned int features);
extern bool blk_queue_can_use_dma_map_merging(struct request_queue *q, extern bool blk_queue_can_use_dma_map_merging(struct request_queue *q,
struct device *dev); struct device *dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment