mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
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: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Tested-by: Hans Holmberg <hans.holmberg@wdc.com> Tested-by: Dennis Maisenbacher <dennis.maisenbacher@wdc.com> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Link: https://lore.kernel.org/r/20240408014128.205141-23-dlemoal@kernel.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
fde02699c2
commit
e4eb37cc0f
4 changed files with 5 additions and 68 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
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)
|
||||||
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
|
||||||
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 {
|
||||||
|
|
||||||
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);
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue