diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-01 22:19:15 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-01 22:19:15 -0400 |
| commit | 7a48837732f87a574ee3e1855927dc250117f565 (patch) | |
| tree | f2e975a347d6d489e9f1932f9864fc978910def0 /include | |
| parent | 1a0b6abaea78f73d9bc0a2f6df2d9e4c917cade1 (diff) | |
| parent | 27fbf4e87c16bb3e40730890169a643a494b7c64 (diff) | |
Merge branch 'for-3.15/core' of git://git.kernel.dk/linux-block
Pull core block layer updates from Jens Axboe:
"This is the pull request for the core block IO bits for the 3.15
kernel. It's a smaller round this time, it contains:
- Various little blk-mq fixes and additions from Christoph and
myself.
- Cleanup of the IPI usage from the block layer, and associated
helper code. From Frederic Weisbecker and Jan Kara.
- Duplicate code cleanup in bio-integrity from Gu Zheng. This will
give you a merge conflict, but that should be easy to resolve.
- blk-mq notify spinlock fix for RT from Mike Galbraith.
- A blktrace partial accounting bug fix from Roman Pen.
- Missing REQ_SYNC detection fix for blk-mq from Shaohua Li"
* 'for-3.15/core' of git://git.kernel.dk/linux-block: (25 commits)
blk-mq: add REQ_SYNC early
rt,blk,mq: Make blk_mq_cpu_notify_lock a raw spinlock
blk-mq: support partial I/O completions
blk-mq: merge blk_mq_insert_request and blk_mq_run_request
blk-mq: remove blk_mq_alloc_rq
blk-mq: don't dump CPU -> hw queue map on driver load
blk-mq: fix wrong usage of hctx->state vs hctx->flags
blk-mq: allow blk_mq_init_commands() to return failure
block: remove old blk_iopoll_enabled variable
blktrace: fix accounting of partially completed requests
smp: Rename __smp_call_function_single() to smp_call_function_single_async()
smp: Remove wait argument from __smp_call_function_single()
watchdog: Simplify a little the IPI call
smp: Move __smp_call_function_single() below its safe version
smp: Consolidate the various smp_call_function_single() declensions
smp: Teach __smp_call_function_single() to check for offline cpus
smp: Remove unused list_head from csd
smp: Iterate functions through llist_for_each_entry_safe()
block: Stop abusing rq->csd.list in blk-softirq
block: Remove useless IPI struct initialization
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/blk-iopoll.h | 2 | ||||
| -rw-r--r-- | include/linux/blk-mq.h | 5 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 1 | ||||
| -rw-r--r-- | include/linux/elevator.h | 11 | ||||
| -rw-r--r-- | include/linux/smp.h | 8 | ||||
| -rw-r--r-- | include/trace/events/block.h | 33 |
6 files changed, 37 insertions, 23 deletions
diff --git a/include/linux/blk-iopoll.h b/include/linux/blk-iopoll.h index 308734d3d4a2..77ae77c0b704 100644 --- a/include/linux/blk-iopoll.h +++ b/include/linux/blk-iopoll.h | |||
| @@ -43,6 +43,4 @@ extern void __blk_iopoll_complete(struct blk_iopoll *); | |||
| 43 | extern void blk_iopoll_enable(struct blk_iopoll *); | 43 | extern void blk_iopoll_enable(struct blk_iopoll *); |
| 44 | extern void blk_iopoll_disable(struct blk_iopoll *); | 44 | extern void blk_iopoll_disable(struct blk_iopoll *); |
| 45 | 45 | ||
| 46 | extern int blk_iopoll_enabled; | ||
| 47 | |||
| 48 | #endif | 46 | #endif |
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 2ff2e8d982be..0120451545d8 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h | |||
| @@ -109,7 +109,7 @@ enum { | |||
| 109 | BLK_MQ_F_SHOULD_SORT = 1 << 1, | 109 | BLK_MQ_F_SHOULD_SORT = 1 << 1, |
| 110 | BLK_MQ_F_SHOULD_IPI = 1 << 2, | 110 | BLK_MQ_F_SHOULD_IPI = 1 << 2, |
| 111 | 111 | ||
| 112 | BLK_MQ_S_STOPPED = 1 << 0, | 112 | BLK_MQ_S_STOPPED = 0, |
| 113 | 113 | ||
| 114 | BLK_MQ_MAX_DEPTH = 2048, | 114 | BLK_MQ_MAX_DEPTH = 2048, |
| 115 | }; | 115 | }; |
| @@ -117,7 +117,8 @@ enum { | |||
| 117 | struct request_queue *blk_mq_init_queue(struct blk_mq_reg *, void *); | 117 | struct request_queue *blk_mq_init_queue(struct blk_mq_reg *, void *); |
| 118 | int blk_mq_register_disk(struct gendisk *); | 118 | int blk_mq_register_disk(struct gendisk *); |
| 119 | void blk_mq_unregister_disk(struct gendisk *); | 119 | void blk_mq_unregister_disk(struct gendisk *); |
| 120 | void blk_mq_init_commands(struct request_queue *, void (*init)(void *data, struct blk_mq_hw_ctx *, struct request *, unsigned int), void *data); | 120 | int blk_mq_init_commands(struct request_queue *, int (*init)(void *data, struct blk_mq_hw_ctx *, struct request *, unsigned int), void *data); |
| 121 | void blk_mq_free_commands(struct request_queue *, void (*free)(void *data, struct blk_mq_hw_ctx *, struct request *, unsigned int), void *data); | ||
| 121 | 122 | ||
| 122 | void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule); | 123 | void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule); |
| 123 | 124 | ||
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4afa4f8f6090..1e1fa3f93d5f 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -99,6 +99,7 @@ struct request { | |||
| 99 | union { | 99 | union { |
| 100 | struct call_single_data csd; | 100 | struct call_single_data csd; |
| 101 | struct work_struct mq_flush_work; | 101 | struct work_struct mq_flush_work; |
| 102 | unsigned long fifo_time; | ||
| 102 | }; | 103 | }; |
| 103 | 104 | ||
| 104 | struct request_queue *q; | 105 | struct request_queue *q; |
diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 306dd8cd0b6f..df63bd3a8cf1 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h | |||
| @@ -202,17 +202,8 @@ enum { | |||
| 202 | #define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq)) | 202 | #define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq)) |
| 203 | #define rb_entry_rq(node) rb_entry((node), struct request, rb_node) | 203 | #define rb_entry_rq(node) rb_entry((node), struct request, rb_node) |
| 204 | 204 | ||
| 205 | /* | ||
| 206 | * Hack to reuse the csd.list list_head as the fifo time holder while | ||
| 207 | * the request is in the io scheduler. Saves an unsigned long in rq. | ||
| 208 | */ | ||
| 209 | #define rq_fifo_time(rq) ((unsigned long) (rq)->csd.list.next) | ||
| 210 | #define rq_set_fifo_time(rq,exp) ((rq)->csd.list.next = (void *) (exp)) | ||
| 211 | #define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist) | 205 | #define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist) |
| 212 | #define rq_fifo_clear(rq) do { \ | 206 | #define rq_fifo_clear(rq) list_del_init(&(rq)->queuelist) |
| 213 | list_del_init(&(rq)->queuelist); \ | ||
| 214 | INIT_LIST_HEAD(&(rq)->csd.list); \ | ||
| 215 | } while (0) | ||
| 216 | 207 | ||
| 217 | #else /* CONFIG_BLOCK */ | 208 | #else /* CONFIG_BLOCK */ |
| 218 | 209 | ||
diff --git a/include/linux/smp.h b/include/linux/smp.h index 6ae004e437ea..633f5edd7470 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
| @@ -17,10 +17,7 @@ extern void cpu_idle(void); | |||
| 17 | 17 | ||
| 18 | typedef void (*smp_call_func_t)(void *info); | 18 | typedef void (*smp_call_func_t)(void *info); |
| 19 | struct call_single_data { | 19 | struct call_single_data { |
| 20 | union { | 20 | struct llist_node llist; |
| 21 | struct list_head list; | ||
| 22 | struct llist_node llist; | ||
| 23 | }; | ||
| 24 | smp_call_func_t func; | 21 | smp_call_func_t func; |
| 25 | void *info; | 22 | void *info; |
| 26 | u16 flags; | 23 | u16 flags; |
| @@ -53,8 +50,7 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), | |||
| 53 | smp_call_func_t func, void *info, bool wait, | 50 | smp_call_func_t func, void *info, bool wait, |
| 54 | gfp_t gfp_flags); | 51 | gfp_t gfp_flags); |
| 55 | 52 | ||
| 56 | void __smp_call_function_single(int cpuid, struct call_single_data *data, | 53 | int smp_call_function_single_async(int cpu, struct call_single_data *csd); |
| 57 | int wait); | ||
| 58 | 54 | ||
| 59 | #ifdef CONFIG_SMP | 55 | #ifdef CONFIG_SMP |
| 60 | 56 | ||
diff --git a/include/trace/events/block.h b/include/trace/events/block.h index e76ae19a8d6f..e8a5eca1dbe5 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h | |||
| @@ -132,6 +132,7 @@ DEFINE_EVENT(block_rq_with_error, block_rq_requeue, | |||
| 132 | * block_rq_complete - block IO operation completed by device driver | 132 | * block_rq_complete - block IO operation completed by device driver |
| 133 | * @q: queue containing the block operation request | 133 | * @q: queue containing the block operation request |
| 134 | * @rq: block operations request | 134 | * @rq: block operations request |
| 135 | * @nr_bytes: number of completed bytes | ||
| 135 | * | 136 | * |
| 136 | * The block_rq_complete tracepoint event indicates that some portion | 137 | * The block_rq_complete tracepoint event indicates that some portion |
| 137 | * of operation request has been completed by the device driver. If | 138 | * of operation request has been completed by the device driver. If |
| @@ -139,11 +140,37 @@ DEFINE_EVENT(block_rq_with_error, block_rq_requeue, | |||
| 139 | * do for the request. If @rq->bio is non-NULL then there is | 140 | * do for the request. If @rq->bio is non-NULL then there is |
| 140 | * additional work required to complete the request. | 141 | * additional work required to complete the request. |
| 141 | */ | 142 | */ |
| 142 | DEFINE_EVENT(block_rq_with_error, block_rq_complete, | 143 | TRACE_EVENT(block_rq_complete, |
| 143 | 144 | ||
| 144 | TP_PROTO(struct request_queue *q, struct request *rq), | 145 | TP_PROTO(struct request_queue *q, struct request *rq, |
| 146 | unsigned int nr_bytes), | ||
| 145 | 147 | ||
| 146 | TP_ARGS(q, rq) | 148 | TP_ARGS(q, rq, nr_bytes), |
| 149 | |||
| 150 | TP_STRUCT__entry( | ||
| 151 | __field( dev_t, dev ) | ||
| 152 | __field( sector_t, sector ) | ||
| 153 | __field( unsigned int, nr_sector ) | ||
| 154 | __field( int, errors ) | ||
| 155 | __array( char, rwbs, RWBS_LEN ) | ||
| 156 | __dynamic_array( char, cmd, blk_cmd_buf_len(rq) ) | ||
| 157 | ), | ||
| 158 | |||
| 159 | TP_fast_assign( | ||
| 160 | __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; | ||
| 161 | __entry->sector = blk_rq_pos(rq); | ||
| 162 | __entry->nr_sector = nr_bytes >> 9; | ||
| 163 | __entry->errors = rq->errors; | ||
| 164 | |||
| 165 | blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); | ||
| 166 | blk_dump_cmd(__get_str(cmd), rq); | ||
| 167 | ), | ||
| 168 | |||
| 169 | TP_printk("%d,%d %s (%s) %llu + %u [%d]", | ||
| 170 | MAJOR(__entry->dev), MINOR(__entry->dev), | ||
| 171 | __entry->rwbs, __get_str(cmd), | ||
| 172 | (unsigned long long)__entry->sector, | ||
| 173 | __entry->nr_sector, __entry->errors) | ||
| 147 | ); | 174 | ); |
| 148 | 175 | ||
| 149 | DECLARE_EVENT_CLASS(block_rq, | 176 | DECLARE_EVENT_CLASS(block_rq, |
