struct elevator_queue

来源:互联网 发布:尼泊尔淘宝 编辑:程序博客网 时间:2024/06/05 08:56
struct elevator_queue{struct elevator_type *type;void *elevator_data;struct kobject kobj;struct mutex sysfs_lock;unsigned int registered:1;DECLARE_HASHTABLE(hash, ELV_HASH_BITS);};
struct elevator_type{/* managed by elevator core */struct kmem_cache *icq_cache;/* fields provided by elevator implementation */struct elevator_ops ops;size_t icq_size;/* see iocontext.h */size_t icq_align;/* ditto */struct elv_fs_entry *elevator_attrs;char elevator_name[ELV_NAME_MAX];struct module *elevator_owner;/* managed by elevator core */char icq_cache_name[ELV_NAME_MAX + 5];/* elvname + "_io_cq" */struct list_head list;};
struct elevator_ops{elevator_merge_fn *elevator_merge_fn;elevator_merged_fn *elevator_merged_fn;elevator_merge_req_fn *elevator_merge_req_fn;elevator_allow_bio_merge_fn *elevator_allow_bio_merge_fn;elevator_allow_rq_merge_fn *elevator_allow_rq_merge_fn;elevator_bio_merged_fn *elevator_bio_merged_fn;elevator_dispatch_fn *elevator_dispatch_fn;elevator_add_req_fn *elevator_add_req_fn;elevator_activate_req_fn *elevator_activate_req_fn;elevator_deactivate_req_fn *elevator_deactivate_req_fn;elevator_completed_req_fn *elevator_completed_req_fn;elevator_request_list_fn *elevator_former_req_fn;elevator_request_list_fn *elevator_latter_req_fn;elevator_init_icq_fn *elevator_init_icq_fn;/* see iocontext.h */elevator_exit_icq_fn *elevator_exit_icq_fn;/* ditto */elevator_set_req_fn *elevator_set_req_fn;elevator_put_req_fn *elevator_put_req_fn;elevator_may_queue_fn *elevator_may_queue_fn;elevator_init_fn *elevator_init_fn;elevator_exit_fn *elevator_exit_fn;elevator_registered_fn *elevator_registered_fn;};
elevator_init()
int elevator_init(struct request_queue *q, char *name){struct elevator_type *e = NULL;int err;/* * q->sysfs_lock must be held to provide mutual exclusion between * elevator_switch() and here. */lockdep_assert_held(&q->sysfs_lock);if (unlikely(q->elevator))return 0;INIT_LIST_HEAD(&q->queue_head);q->last_merge = NULL;q->end_sector = 0;q->boundary_rq = NULL;if (name) {e = elevator_get(name, true);if (!e)return -EINVAL;}/* * Use the default elevator specified by config boot param or * config option.  Don't try to load modules as we could be running * off async and request_module() isn't allowed from async. */if (!e && *chosen_elevator) {e = elevator_get(chosen_elevator, false);if (!e)printk(KERN_ERR "I/O scheduler %s not found\n",chosen_elevator);}if (!e) {e = elevator_get(CONFIG_DEFAULT_IOSCHED, false);if (!e) {printk(KERN_ERR"Default I/O scheduler not found. " \"Using noop.\n");e = elevator_get("noop", false);}}err = e->ops.elevator_init_fn(q, e);if (err)elevator_put(e);return err;}
void __init load_default_elevator_module(void);int elv_register(struct elevator_type *);void elv_unregister(struct elevator_type *);
Cfq-iosched.c  elv_register(&iosched_cfq);Deadline-iosched.c   elv_register(&iosched_deadline);
Noop-iosched.c elv_register(&elevator_noop);
                                             
0 0
原创粉丝点击