blk-flush.c (27eb2c4b3d3e13f376a359e293c212a2e9407af5) | blk-flush.c (320ae51feed5c2f13664aa05a76bec198967e04d) |
---|---|
1/* 2 * Functions to sequence FLUSH and FUA writes. 3 * 4 * Copyright (C) 2011 Max Planck Institute for Gravitational Physics 5 * Copyright (C) 2011 Tejun Heo <tj@kernel.org> 6 * 7 * This file is released under the GPLv2. 8 * --- 55 unchanged lines hidden (view full) --- 64 * merged in the usual way. 65 */ 66 67#include <linux/kernel.h> 68#include <linux/module.h> 69#include <linux/bio.h> 70#include <linux/blkdev.h> 71#include <linux/gfp.h> | 1/* 2 * Functions to sequence FLUSH and FUA writes. 3 * 4 * Copyright (C) 2011 Max Planck Institute for Gravitational Physics 5 * Copyright (C) 2011 Tejun Heo <tj@kernel.org> 6 * 7 * This file is released under the GPLv2. 8 * --- 55 unchanged lines hidden (view full) --- 64 * merged in the usual way. 65 */ 66 67#include <linux/kernel.h> 68#include <linux/module.h> 69#include <linux/bio.h> 70#include <linux/blkdev.h> 71#include <linux/gfp.h> |
72#include <linux/blk-mq.h> |
|
72 73#include "blk.h" | 73 74#include "blk.h" |
75#include "blk-mq.h" |
|
74 75/* FLUSH/FUA sequences */ 76enum { 77 REQ_FSEQ_PREFLUSH = (1 << 0), /* pre-flushing in progress */ 78 REQ_FSEQ_DATA = (1 << 1), /* data write in progress */ 79 REQ_FSEQ_POSTFLUSH = (1 << 2), /* post-flushing in progress */ 80 REQ_FSEQ_DONE = (1 << 3), 81 --- 37 unchanged lines hidden (view full) --- 119 * complete the bio again. @rq->biotail is guaranteed to equal the 120 * original @rq->bio. Restore it. 121 */ 122 rq->bio = rq->biotail; 123 124 /* make @rq a normal request */ 125 rq->cmd_flags &= ~REQ_FLUSH_SEQ; 126 rq->end_io = rq->flush.saved_end_io; | 76 77/* FLUSH/FUA sequences */ 78enum { 79 REQ_FSEQ_PREFLUSH = (1 << 0), /* pre-flushing in progress */ 80 REQ_FSEQ_DATA = (1 << 1), /* data write in progress */ 81 REQ_FSEQ_POSTFLUSH = (1 << 2), /* post-flushing in progress */ 82 REQ_FSEQ_DONE = (1 << 3), 83 --- 37 unchanged lines hidden (view full) --- 121 * complete the bio again. @rq->biotail is guaranteed to equal the 122 * original @rq->bio. Restore it. 123 */ 124 rq->bio = rq->biotail; 125 126 /* make @rq a normal request */ 127 rq->cmd_flags &= ~REQ_FLUSH_SEQ; 128 rq->end_io = rq->flush.saved_end_io; |
129 130 blk_clear_rq_complete(rq); |
|
127} 128 | 131} 132 |
133static void mq_flush_data_run(struct work_struct *work) 134{ 135 struct request *rq; 136 137 rq = container_of(work, struct request, mq_flush_data); 138 139 memset(&rq->csd, 0, sizeof(rq->csd)); 140 blk_mq_run_request(rq, true, false); 141} 142 143static void blk_mq_flush_data_insert(struct request *rq) 144{ 145 INIT_WORK(&rq->mq_flush_data, mq_flush_data_run); 146 kblockd_schedule_work(rq->q, &rq->mq_flush_data); 147} 148 |
|
129/** 130 * blk_flush_complete_seq - complete flush sequence 131 * @rq: FLUSH/FUA request being sequenced 132 * @seq: sequences to complete (mask of %REQ_FSEQ_*, can be zero) 133 * @error: whether an error occurred 134 * 135 * @rq just completed @seq part of its flush sequence, record the 136 * completion and trigger the next step. 137 * 138 * CONTEXT: | 149/** 150 * blk_flush_complete_seq - complete flush sequence 151 * @rq: FLUSH/FUA request being sequenced 152 * @seq: sequences to complete (mask of %REQ_FSEQ_*, can be zero) 153 * @error: whether an error occurred 154 * 155 * @rq just completed @seq part of its flush sequence, record the 156 * completion and trigger the next step. 157 * 158 * CONTEXT: |
139 * spin_lock_irq(q->queue_lock) | 159 * spin_lock_irq(q->queue_lock or q->mq_flush_lock) |
140 * 141 * RETURNS: 142 * %true if requests were added to the dispatch queue, %false otherwise. 143 */ 144static bool blk_flush_complete_seq(struct request *rq, unsigned int seq, 145 int error) 146{ 147 struct request_queue *q = rq->q; 148 struct list_head *pending = &q->flush_queue[q->flush_pending_idx]; | 160 * 161 * RETURNS: 162 * %true if requests were added to the dispatch queue, %false otherwise. 163 */ 164static bool blk_flush_complete_seq(struct request *rq, unsigned int seq, 165 int error) 166{ 167 struct request_queue *q = rq->q; 168 struct list_head *pending = &q->flush_queue[q->flush_pending_idx]; |
149 bool queued = false; | 169 bool queued = false, kicked; |
150 151 BUG_ON(rq->flush.seq & seq); 152 rq->flush.seq |= seq; 153 154 if (likely(!error)) 155 seq = blk_flush_cur_seq(rq); 156 else 157 seq = REQ_FSEQ_DONE; --- 4 unchanged lines hidden (view full) --- 162 /* queue for flush */ 163 if (list_empty(pending)) 164 q->flush_pending_since = jiffies; 165 list_move_tail(&rq->flush.list, pending); 166 break; 167 168 case REQ_FSEQ_DATA: 169 list_move_tail(&rq->flush.list, &q->flush_data_in_flight); | 170 171 BUG_ON(rq->flush.seq & seq); 172 rq->flush.seq |= seq; 173 174 if (likely(!error)) 175 seq = blk_flush_cur_seq(rq); 176 else 177 seq = REQ_FSEQ_DONE; --- 4 unchanged lines hidden (view full) --- 182 /* queue for flush */ 183 if (list_empty(pending)) 184 q->flush_pending_since = jiffies; 185 list_move_tail(&rq->flush.list, pending); 186 break; 187 188 case REQ_FSEQ_DATA: 189 list_move_tail(&rq->flush.list, &q->flush_data_in_flight); |
170 list_add(&rq->queuelist, &q->queue_head); 171 queued = true; | 190 if (q->mq_ops) 191 blk_mq_flush_data_insert(rq); 192 else { 193 list_add(&rq->queuelist, &q->queue_head); 194 queued = true; 195 } |
172 break; 173 174 case REQ_FSEQ_DONE: 175 /* 176 * @rq was previously adjusted by blk_flush_issue() for 177 * flush sequencing and may already have gone through the 178 * flush data request completion path. Restore @rq for 179 * normal completion and end it. 180 */ 181 BUG_ON(!list_empty(&rq->queuelist)); 182 list_del_init(&rq->flush.list); 183 blk_flush_restore_request(rq); | 196 break; 197 198 case REQ_FSEQ_DONE: 199 /* 200 * @rq was previously adjusted by blk_flush_issue() for 201 * flush sequencing and may already have gone through the 202 * flush data request completion path. Restore @rq for 203 * normal completion and end it. 204 */ 205 BUG_ON(!list_empty(&rq->queuelist)); 206 list_del_init(&rq->flush.list); 207 blk_flush_restore_request(rq); |
184 __blk_end_request_all(rq, error); | 208 if (q->mq_ops) 209 blk_mq_end_io(rq, error); 210 else 211 __blk_end_request_all(rq, error); |
185 break; 186 187 default: 188 BUG(); 189 } 190 | 212 break; 213 214 default: 215 BUG(); 216 } 217 |
191 return blk_kick_flush(q) | queued; | 218 kicked = blk_kick_flush(q); 219 /* blk_mq_run_flush will run queue */ 220 if (q->mq_ops) 221 return queued; 222 return kicked | queued; |
192} 193 194static void flush_end_io(struct request *flush_rq, int error) 195{ 196 struct request_queue *q = flush_rq->q; | 223} 224 225static void flush_end_io(struct request *flush_rq, int error) 226{ 227 struct request_queue *q = flush_rq->q; |
197 struct list_head *running = &q->flush_queue[q->flush_running_idx]; | 228 struct list_head *running; |
198 bool queued = false; 199 struct request *rq, *n; | 229 bool queued = false; 230 struct request *rq, *n; |
231 unsigned long flags = 0; |
|
200 | 232 |
233 if (q->mq_ops) { 234 blk_mq_free_request(flush_rq); 235 spin_lock_irqsave(&q->mq_flush_lock, flags); 236 } 237 running = &q->flush_queue[q->flush_running_idx]; |
|
201 BUG_ON(q->flush_pending_idx == q->flush_running_idx); 202 203 /* account completion of the flush request */ 204 q->flush_running_idx ^= 1; | 238 BUG_ON(q->flush_pending_idx == q->flush_running_idx); 239 240 /* account completion of the flush request */ 241 q->flush_running_idx ^= 1; |
205 elv_completed_request(q, flush_rq); | |
206 | 242 |
243 if (!q->mq_ops) 244 elv_completed_request(q, flush_rq); 245 |
|
207 /* and push the waiting requests to the next stage */ 208 list_for_each_entry_safe(rq, n, running, flush.list) { 209 unsigned int seq = blk_flush_cur_seq(rq); 210 211 BUG_ON(seq != REQ_FSEQ_PREFLUSH && seq != REQ_FSEQ_POSTFLUSH); 212 queued |= blk_flush_complete_seq(rq, seq, error); 213 } 214 215 /* 216 * Kick the queue to avoid stall for two cases: 217 * 1. Moving a request silently to empty queue_head may stall the 218 * queue. 219 * 2. When flush request is running in non-queueable queue, the 220 * queue is hold. Restart the queue after flush request is finished 221 * to avoid stall. 222 * This function is called from request completion path and calling 223 * directly into request_fn may confuse the driver. Always use 224 * kblockd. 225 */ | 246 /* and push the waiting requests to the next stage */ 247 list_for_each_entry_safe(rq, n, running, flush.list) { 248 unsigned int seq = blk_flush_cur_seq(rq); 249 250 BUG_ON(seq != REQ_FSEQ_PREFLUSH && seq != REQ_FSEQ_POSTFLUSH); 251 queued |= blk_flush_complete_seq(rq, seq, error); 252 } 253 254 /* 255 * Kick the queue to avoid stall for two cases: 256 * 1. Moving a request silently to empty queue_head may stall the 257 * queue. 258 * 2. When flush request is running in non-queueable queue, the 259 * queue is hold. Restart the queue after flush request is finished 260 * to avoid stall. 261 * This function is called from request completion path and calling 262 * directly into request_fn may confuse the driver. Always use 263 * kblockd. 264 */ |
226 if (queued || q->flush_queue_delayed) 227 blk_run_queue_async(q); | 265 if (queued || q->flush_queue_delayed) { 266 if (!q->mq_ops) 267 blk_run_queue_async(q); 268 else 269 /* 270 * This can be optimized to only run queues with requests 271 * queued if necessary. 272 */ 273 blk_mq_run_queues(q, true); 274 } |
228 q->flush_queue_delayed = 0; | 275 q->flush_queue_delayed = 0; |
276 if (q->mq_ops) 277 spin_unlock_irqrestore(&q->mq_flush_lock, flags); |
|
229} 230 | 278} 279 |
280static void mq_flush_work(struct work_struct *work) 281{ 282 struct request_queue *q; 283 struct request *rq; 284 285 q = container_of(work, struct request_queue, mq_flush_work); 286 287 /* We don't need set REQ_FLUSH_SEQ, it's for consistency */ 288 rq = blk_mq_alloc_request(q, WRITE_FLUSH|REQ_FLUSH_SEQ, 289 __GFP_WAIT|GFP_ATOMIC); 290 rq->cmd_type = REQ_TYPE_FS; 291 rq->end_io = flush_end_io; 292 293 blk_mq_run_request(rq, true, false); 294} 295 296/* 297 * We can't directly use q->flush_rq, because it doesn't have tag and is not in 298 * hctx->rqs[]. so we must allocate a new request, since we can't sleep here, 299 * so offload the work to workqueue. 300 * 301 * Note: we assume a flush request finished in any hardware queue will flush 302 * the whole disk cache. 303 */ 304static void mq_run_flush(struct request_queue *q) 305{ 306 kblockd_schedule_work(q, &q->mq_flush_work); 307} 308 |
|
231/** 232 * blk_kick_flush - consider issuing flush request 233 * @q: request_queue being kicked 234 * 235 * Flush related states of @q have changed, consider issuing flush request. 236 * Please read the comment at the top of this file for more info. 237 * 238 * CONTEXT: | 309/** 310 * blk_kick_flush - consider issuing flush request 311 * @q: request_queue being kicked 312 * 313 * Flush related states of @q have changed, consider issuing flush request. 314 * Please read the comment at the top of this file for more info. 315 * 316 * CONTEXT: |
239 * spin_lock_irq(q->queue_lock) | 317 * spin_lock_irq(q->queue_lock or q->mq_flush_lock) |
240 * 241 * RETURNS: 242 * %true if flush was issued, %false otherwise. 243 */ 244static bool blk_kick_flush(struct request_queue *q) 245{ 246 struct list_head *pending = &q->flush_queue[q->flush_pending_idx]; 247 struct request *first_rq = --- 8 unchanged lines hidden (view full) --- 256 time_before(jiffies, 257 q->flush_pending_since + FLUSH_PENDING_TIMEOUT)) 258 return false; 259 260 /* 261 * Issue flush and toggle pending_idx. This makes pending_idx 262 * different from running_idx, which means flush is in flight. 263 */ | 318 * 319 * RETURNS: 320 * %true if flush was issued, %false otherwise. 321 */ 322static bool blk_kick_flush(struct request_queue *q) 323{ 324 struct list_head *pending = &q->flush_queue[q->flush_pending_idx]; 325 struct request *first_rq = --- 8 unchanged lines hidden (view full) --- 334 time_before(jiffies, 335 q->flush_pending_since + FLUSH_PENDING_TIMEOUT)) 336 return false; 337 338 /* 339 * Issue flush and toggle pending_idx. This makes pending_idx 340 * different from running_idx, which means flush is in flight. 341 */ |
342 q->flush_pending_idx ^= 1; 343 if (q->mq_ops) { 344 mq_run_flush(q); 345 return true; 346 } 347 |
|
264 blk_rq_init(q, &q->flush_rq); 265 q->flush_rq.cmd_type = REQ_TYPE_FS; 266 q->flush_rq.cmd_flags = WRITE_FLUSH | REQ_FLUSH_SEQ; 267 q->flush_rq.rq_disk = first_rq->rq_disk; 268 q->flush_rq.end_io = flush_end_io; 269 | 348 blk_rq_init(q, &q->flush_rq); 349 q->flush_rq.cmd_type = REQ_TYPE_FS; 350 q->flush_rq.cmd_flags = WRITE_FLUSH | REQ_FLUSH_SEQ; 351 q->flush_rq.rq_disk = first_rq->rq_disk; 352 q->flush_rq.end_io = flush_end_io; 353 |
270 q->flush_pending_idx ^= 1; | |
271 list_add_tail(&q->flush_rq.queuelist, &q->queue_head); 272 return true; 273} 274 275static void flush_data_end_io(struct request *rq, int error) 276{ 277 struct request_queue *q = rq->q; 278 279 /* 280 * After populating an empty queue, kick it to avoid stall. Read 281 * the comment in flush_end_io(). 282 */ 283 if (blk_flush_complete_seq(rq, REQ_FSEQ_DATA, error)) 284 blk_run_queue_async(q); 285} 286 | 354 list_add_tail(&q->flush_rq.queuelist, &q->queue_head); 355 return true; 356} 357 358static void flush_data_end_io(struct request *rq, int error) 359{ 360 struct request_queue *q = rq->q; 361 362 /* 363 * After populating an empty queue, kick it to avoid stall. Read 364 * the comment in flush_end_io(). 365 */ 366 if (blk_flush_complete_seq(rq, REQ_FSEQ_DATA, error)) 367 blk_run_queue_async(q); 368} 369 |
370static void mq_flush_data_end_io(struct request *rq, int error) 371{ 372 struct request_queue *q = rq->q; 373 struct blk_mq_hw_ctx *hctx; 374 struct blk_mq_ctx *ctx; 375 unsigned long flags; 376 377 ctx = rq->mq_ctx; 378 hctx = q->mq_ops->map_queue(q, ctx->cpu); 379 380 /* 381 * After populating an empty queue, kick it to avoid stall. Read 382 * the comment in flush_end_io(). 383 */ 384 spin_lock_irqsave(&q->mq_flush_lock, flags); 385 if (blk_flush_complete_seq(rq, REQ_FSEQ_DATA, error)) 386 blk_mq_run_hw_queue(hctx, true); 387 spin_unlock_irqrestore(&q->mq_flush_lock, flags); 388} 389 |
|
287/** 288 * blk_insert_flush - insert a new FLUSH/FUA request 289 * @rq: request to insert 290 * 291 * To be called from __elv_add_request() for %ELEVATOR_INSERT_FLUSH insertions. | 390/** 391 * blk_insert_flush - insert a new FLUSH/FUA request 392 * @rq: request to insert 393 * 394 * To be called from __elv_add_request() for %ELEVATOR_INSERT_FLUSH insertions. |
395 * or __blk_mq_run_hw_queue() to dispatch request. |
|
292 * @rq is being submitted. Analyze what needs to be done and put it on the 293 * right queue. 294 * 295 * CONTEXT: | 396 * @rq is being submitted. Analyze what needs to be done and put it on the 397 * right queue. 398 * 399 * CONTEXT: |
296 * spin_lock_irq(q->queue_lock) | 400 * spin_lock_irq(q->queue_lock) in !mq case |
297 */ 298void blk_insert_flush(struct request *rq) 299{ 300 struct request_queue *q = rq->q; 301 unsigned int fflags = q->flush_flags; /* may change, cache */ 302 unsigned int policy = blk_flush_policy(fflags, rq); 303 304 /* --- 6 unchanged lines hidden (view full) --- 311 312 /* 313 * An empty flush handed down from a stacking driver may 314 * translate into nothing if the underlying device does not 315 * advertise a write-back cache. In this case, simply 316 * complete the request. 317 */ 318 if (!policy) { | 401 */ 402void blk_insert_flush(struct request *rq) 403{ 404 struct request_queue *q = rq->q; 405 unsigned int fflags = q->flush_flags; /* may change, cache */ 406 unsigned int policy = blk_flush_policy(fflags, rq); 407 408 /* --- 6 unchanged lines hidden (view full) --- 415 416 /* 417 * An empty flush handed down from a stacking driver may 418 * translate into nothing if the underlying device does not 419 * advertise a write-back cache. In this case, simply 420 * complete the request. 421 */ 422 if (!policy) { |
319 __blk_end_bidi_request(rq, 0, 0, 0); | 423 if (q->mq_ops) 424 blk_mq_end_io(rq, 0); 425 else 426 __blk_end_bidi_request(rq, 0, 0, 0); |
320 return; 321 } 322 323 BUG_ON(rq->bio != rq->biotail); /*assumes zero or single bio rq */ 324 325 /* 326 * If there's data but flush is not necessary, the request can be 327 * processed directly without going through flush machinery. Queue 328 * for normal execution. 329 */ 330 if ((policy & REQ_FSEQ_DATA) && 331 !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) { | 427 return; 428 } 429 430 BUG_ON(rq->bio != rq->biotail); /*assumes zero or single bio rq */ 431 432 /* 433 * If there's data but flush is not necessary, the request can be 434 * processed directly without going through flush machinery. Queue 435 * for normal execution. 436 */ 437 if ((policy & REQ_FSEQ_DATA) && 438 !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) { |
332 list_add_tail(&rq->queuelist, &q->queue_head); | 439 if (q->mq_ops) { 440 blk_mq_run_request(rq, false, true); 441 } else 442 list_add_tail(&rq->queuelist, &q->queue_head); |
333 return; 334 } 335 336 /* 337 * @rq should go through flush machinery. Mark it part of flush 338 * sequence and submit for further processing. 339 */ 340 memset(&rq->flush, 0, sizeof(rq->flush)); 341 INIT_LIST_HEAD(&rq->flush.list); 342 rq->cmd_flags |= REQ_FLUSH_SEQ; 343 rq->flush.saved_end_io = rq->end_io; /* Usually NULL */ | 443 return; 444 } 445 446 /* 447 * @rq should go through flush machinery. Mark it part of flush 448 * sequence and submit for further processing. 449 */ 450 memset(&rq->flush, 0, sizeof(rq->flush)); 451 INIT_LIST_HEAD(&rq->flush.list); 452 rq->cmd_flags |= REQ_FLUSH_SEQ; 453 rq->flush.saved_end_io = rq->end_io; /* Usually NULL */ |
454 if (q->mq_ops) { 455 rq->end_io = mq_flush_data_end_io; 456 457 spin_lock_irq(&q->mq_flush_lock); 458 blk_flush_complete_seq(rq, REQ_FSEQ_ACTIONS & ~policy, 0); 459 spin_unlock_irq(&q->mq_flush_lock); 460 return; 461 } |
|
344 rq->end_io = flush_data_end_io; 345 346 blk_flush_complete_seq(rq, REQ_FSEQ_ACTIONS & ~policy, 0); 347} 348 349/** 350 * blk_abort_flushes - @q is being aborted, abort flush requests 351 * @q: request_queue being aborted --- 96 unchanged lines hidden (view full) --- 448 449 if (!bio_flagged(bio, BIO_UPTODATE)) 450 ret = -EIO; 451 452 bio_put(bio); 453 return ret; 454} 455EXPORT_SYMBOL(blkdev_issue_flush); | 462 rq->end_io = flush_data_end_io; 463 464 blk_flush_complete_seq(rq, REQ_FSEQ_ACTIONS & ~policy, 0); 465} 466 467/** 468 * blk_abort_flushes - @q is being aborted, abort flush requests 469 * @q: request_queue being aborted --- 96 unchanged lines hidden (view full) --- 566 567 if (!bio_flagged(bio, BIO_UPTODATE)) 568 ret = -EIO; 569 570 bio_put(bio); 571 return ret; 572} 573EXPORT_SYMBOL(blkdev_issue_flush); |
574 575void blk_mq_init_flush(struct request_queue *q) 576{ 577 spin_lock_init(&q->mq_flush_lock); 578 INIT_WORK(&q->mq_flush_work, mq_flush_work); 579} |
|