LCOV - code coverage report
Current view: top level - include/linux - elevator.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 20 20 100.0 %
Date: 2017-01-25 Functions: 0 0 -

          Line data    Source code
       1             : #ifndef _LINUX_ELEVATOR_H
       2             : #define _LINUX_ELEVATOR_H
       3             : 
       4             : #include <linux/percpu.h>
       5             : 
       6             : #ifdef CONFIG_BLOCK
       7             : 
       8           1 : typedef int (elevator_merge_fn) (struct request_queue *, struct request **,
       9             :                                  struct bio *);
      10             : 
      11           1 : typedef void (elevator_merge_req_fn) (struct request_queue *, struct request *, struct request *);
      12             : 
      13           1 : typedef void (elevator_merged_fn) (struct request_queue *, struct request *, int);
      14             : 
      15           1 : typedef int (elevator_allow_merge_fn) (struct request_queue *, struct request *, struct bio *);
      16             : 
      17           1 : typedef int (elevator_dispatch_fn) (struct request_queue *, int);
      18             : 
      19           1 : typedef void (elevator_add_req_fn) (struct request_queue *, struct request *);
      20           1 : typedef int (elevator_queue_empty_fn) (struct request_queue *);
      21           1 : typedef struct request *(elevator_request_list_fn) (struct request_queue *, struct request *);
      22           1 : typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *);
      23           1 : typedef int (elevator_may_queue_fn) (struct request_queue *, int);
      24             : 
      25           1 : typedef int (elevator_set_req_fn) (struct request_queue *, struct request *, gfp_t);
      26           1 : typedef void (elevator_put_req_fn) (struct request *);
      27           1 : typedef void (elevator_activate_req_fn) (struct request_queue *, struct request *);
      28           1 : typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct request *);
      29             : 
      30           1 : typedef void *(elevator_init_fn) (struct request_queue *);
      31           1 : typedef void (elevator_exit_fn) (struct elevator_queue *);
      32           1 : 
      33             : struct elevator_ops
      34             : {
      35             :         elevator_merge_fn *elevator_merge_fn;
      36             :         elevator_merged_fn *elevator_merged_fn;
      37             :         elevator_merge_req_fn *elevator_merge_req_fn;
      38             :         elevator_allow_merge_fn *elevator_allow_merge_fn;
      39             : 
      40             :         elevator_dispatch_fn *elevator_dispatch_fn;
      41             :         elevator_add_req_fn *elevator_add_req_fn;
      42             :         elevator_activate_req_fn *elevator_activate_req_fn;
      43             :         elevator_deactivate_req_fn *elevator_deactivate_req_fn;
      44             : 
      45             :         elevator_queue_empty_fn *elevator_queue_empty_fn;
      46             :         elevator_completed_req_fn *elevator_completed_req_fn;
      47             : 
      48             :         elevator_request_list_fn *elevator_former_req_fn;
      49             :         elevator_request_list_fn *elevator_latter_req_fn;
      50             : 
      51             :         elevator_set_req_fn *elevator_set_req_fn;
      52             :         elevator_put_req_fn *elevator_put_req_fn;
      53             : 
      54             :         elevator_may_queue_fn *elevator_may_queue_fn;
      55             : 
      56             :         elevator_init_fn *elevator_init_fn;
      57             :         elevator_exit_fn *elevator_exit_fn;
      58             :         void (*trim)(struct io_context *);
      59             : };
      60           1 : 
      61             : #define ELV_NAME_MAX    (16)
      62             : 
      63             : struct elv_fs_entry {
      64             :         struct attribute attr;
      65             :         ssize_t (*show)(struct elevator_queue *, char *);
      66             :         ssize_t (*store)(struct elevator_queue *, const char *, size_t);
      67             : };
      68           1 : 
      69             : /*
      70             :  * identifies an elevator type, such as AS or deadline
      71             :  */
      72             : struct elevator_type
      73             : {
      74             :         struct list_head list;
      75             :         struct elevator_ops ops;
      76             :         struct elv_fs_entry *elevator_attrs;
      77             :         char elevator_name[ELV_NAME_MAX];
      78             :         struct module *elevator_owner;
      79             : };
      80           1 : 
      81             : /*
      82             :  * each queue has an elevator_queue associated with it
      83             :  */
      84             : struct elevator_queue
      85             : {
      86             :         struct elevator_ops *ops;
      87             :         void *elevator_data;
      88             :         struct kobject kobj;
      89             :         struct elevator_type *elevator_type;
      90             :         struct mutex sysfs_lock;
      91             :         struct hlist_head *hash;
      92             : };
      93             : 
      94             : /*
      95             :  * block elevator interface
      96             :  */
      97             : extern void elv_dispatch_sort(struct request_queue *, struct request *);
      98             : extern void elv_dispatch_add_tail(struct request_queue *, struct request *);
      99             : extern void elv_add_request(struct request_queue *, struct request *, int, int);
     100             : extern void __elv_add_request(struct request_queue *, struct request *, int, int);
     101             : extern void elv_insert(struct request_queue *, struct request *, int);
     102             : extern int elv_merge(struct request_queue *, struct request **, struct bio *);
     103             : extern void elv_merge_requests(struct request_queue *, struct request *,
     104             :                                struct request *);
     105             : extern void elv_merged_request(struct request_queue *, struct request *, int);
     106             : extern void elv_requeue_request(struct request_queue *, struct request *);
     107             : extern int elv_queue_empty(struct request_queue *);
     108             : extern struct request *elv_former_request(struct request_queue *, struct request *);
     109             : extern struct request *elv_latter_request(struct request_queue *, struct request *);
     110             : extern int elv_register_queue(struct request_queue *q);
     111             : extern void elv_unregister_queue(struct request_queue *q);
     112             : extern int elv_may_queue(struct request_queue *, int);
     113             : extern void elv_abort_queue(struct request_queue *);
     114             : extern void elv_completed_request(struct request_queue *, struct request *);
     115             : extern int elv_set_request(struct request_queue *, struct request *, gfp_t);
     116             : extern void elv_put_request(struct request_queue *, struct request *);
     117             : extern void elv_drain_elevator(struct request_queue *);
     118             : 
     119             : /*
     120             :  * io scheduler registration
     121             :  */
     122             : extern void elv_register(struct elevator_type *);
     123             : extern void elv_unregister(struct elevator_type *);
     124             : 
     125             : /*
     126             :  * io scheduler sysfs switching
     127             :  */
     128             : extern ssize_t elv_iosched_show(struct request_queue *, char *);
     129             : extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t);
     130             : 
     131             : extern int elevator_init(struct request_queue *, char *);
     132             : extern void elevator_exit(struct elevator_queue *);
     133             : extern int elv_rq_merge_ok(struct request *, struct bio *);
     134             : 
     135             : /*
     136             :  * Helper functions.
     137             :  */
     138             : extern struct request *elv_rb_former_request(struct request_queue *, struct request *);
     139             : extern struct request *elv_rb_latter_request(struct request_queue *, struct request *);
     140             : 
     141             : /*
     142             :  * rb support functions.
     143             :  */
     144             : extern struct request *elv_rb_add(struct rb_root *, struct request *);
     145             : extern void elv_rb_del(struct rb_root *, struct request *);
     146             : extern struct request *elv_rb_find(struct rb_root *, sector_t);
     147             : 
     148             : /*
     149             :  * Return values from elevator merger
     150             :  */
     151             : #define ELEVATOR_NO_MERGE       0
     152             : #define ELEVATOR_FRONT_MERGE    1
     153             : #define ELEVATOR_BACK_MERGE     2
     154             : 
     155             : /*
     156             :  * Insertion selection
     157             :  */
     158             : #define ELEVATOR_INSERT_FRONT   1
     159             : #define ELEVATOR_INSERT_BACK    2
     160             : #define ELEVATOR_INSERT_SORT    3
     161             : #define ELEVATOR_INSERT_REQUEUE 4
     162             : 
     163             : /*
     164             :  * return values from elevator_may_queue_fn
     165             :  */
     166             : enum {
     167             :         ELV_MQUEUE_MAY,
     168             :         ELV_MQUEUE_NO,
     169             :         ELV_MQUEUE_MUST,
     170             : };
     171             : 
     172             : #define rq_end_sector(rq)       (blk_rq_pos(rq) + blk_rq_sectors(rq))
     173             : #define rb_entry_rq(node)       rb_entry((node), struct request, rb_node)
     174             : 
     175             : /*
     176             :  * Hack to reuse the csd.list list_head as the fifo time holder while
     177             :  * the request is in the io scheduler. Saves an unsigned long in rq.
     178             :  */
     179             : #define rq_fifo_time(rq)        ((unsigned long) (rq)->csd.list.next)
     180             : #define rq_set_fifo_time(rq,exp)        ((rq)->csd.list.next = (void *) (exp))
     181             : #define rq_entry_fifo(ptr)      list_entry((ptr), struct request, queuelist)
     182             : #define rq_fifo_clear(rq)       do {            \
     183             :         list_del_init(&(rq)->queuelist); \
     184             :         INIT_LIST_HEAD(&(rq)->csd.list); \
     185             :         } while (0)
     186             : 
     187             : /*
     188             :  * io context count accounting
     189             :  */
     190             : #define elv_ioc_count_mod(name, __val)                          \
     191             :         do {                                                    \
     192             :                 preempt_disable();                              \
     193             :                 __get_cpu_var(name) += (__val);                 \
     194             :                 preempt_enable();                               \
     195             :         } while (0)
     196             : 
     197             : #define elv_ioc_count_inc(name) elv_ioc_count_mod(name, 1)
     198             : #define elv_ioc_count_dec(name) elv_ioc_count_mod(name, -1)
     199             : 
     200             : #define elv_ioc_count_read(name)                                \
     201             : ({                                                              \
     202             :         unsigned long __val = 0;                                \
     203             :         int __cpu;                                              \
     204             :         smp_wmb();                                              \
     205             :         for_each_possible_cpu(__cpu)                            \
     206             :                 __val += per_cpu(name, __cpu);                  \
     207             :         __val;                                                  \
     208             : })
     209             : 
     210             : #endif /* CONFIG_BLOCK */
     211             : #endif

Generated by: LCOV version 1.10