Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Functions to sequence PREFLUSH and FUA writes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (C) 2011		Max Planck Institute for Gravitational Physics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (C) 2011		Tejun Heo <tj@kernel.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * REQ_{PREFLUSH|FUA} requests are decomposed to sequences consisted of three
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * optional steps - PREFLUSH, DATA and POSTFLUSH - according to the request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  * properties and hardware capability.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  * If a request doesn't have data, only REQ_PREFLUSH makes sense, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  * indicates a simple flush request.  If there is data, REQ_PREFLUSH indicates
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  * that the device cache should be flushed before the data is executed, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  * REQ_FUA means that the data must be on non-volatile media on request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  * completion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * If the device doesn't have writeback cache, PREFLUSH and FUA don't make any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * difference.  The requests are either completed immediately if there's no data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * or executed as normal requests otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  * If the device has writeback cache and supports FUA, REQ_PREFLUSH is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * translated to PREFLUSH but REQ_FUA is passed down directly with DATA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * If the device has writeback cache and doesn't support FUA, REQ_PREFLUSH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  * is translated to PREFLUSH and REQ_FUA to POSTFLUSH.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * The actual execution of flush is double buffered.  Whenever a request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  * needs to execute PRE or POSTFLUSH, it queues at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  * fq->flush_queue[fq->flush_pending_idx].  Once certain criteria are met, a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  * REQ_OP_FLUSH is issued and the pending_idx is toggled.  When the flush
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  * completes, all the requests which were pending are proceeded to the next
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  * step.  This allows arbitrary merging of different types of PREFLUSH/FUA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  * requests.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * Currently, the following conditions are used to determine when to issue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * flush.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  * C1. At any given time, only one flush shall be in progress.  This makes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  *     double buffering sufficient.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  * C2. Flush is deferred if any request is executing DATA of its sequence.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  *     This avoids issuing separate POSTFLUSHes for requests which shared
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)  *     PREFLUSH.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)  * C3. The second condition is ignored if there is a request which has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47)  *     waited longer than FLUSH_PENDING_TIMEOUT.  This is to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48)  *     starvation in the unlikely case where there are continuous stream of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)  *     FUA (without PREFLUSH) requests.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * For devices which support FUA, it isn't clear whether C2 (and thus C3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  * is beneficial.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)  * Note that a sequenced PREFLUSH/FUA request with DATA is completed twice.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)  * Once while executing DATA and again after the whole sequence is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)  * complete.  The first completion updates the contained bio but doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57)  * finish it so that the bio submitter is notified only after the whole
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58)  * sequence is complete.  This is implemented by testing RQF_FLUSH_SEQ in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59)  * req_bio_endio().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)  * The above peculiarity requires that each PREFLUSH/FUA request has only one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62)  * bio attached to it, which is guaranteed as they aren't allowed to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63)  * merged in the usual way.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) #include <linux/bio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) #include <linux/gfp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) #include <linux/blk-mq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) #include <linux/lockdep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) #include "blk.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) #include "blk-mq.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) #include "blk-mq-tag.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) #include "blk-mq-sched.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) /* PREFLUSH/FUA sequences */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	REQ_FSEQ_PREFLUSH	= (1 << 0), /* pre-flushing in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	REQ_FSEQ_DATA		= (1 << 1), /* data write in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	REQ_FSEQ_POSTFLUSH	= (1 << 2), /* post-flushing in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	REQ_FSEQ_DONE		= (1 << 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	REQ_FSEQ_ACTIONS	= REQ_FSEQ_PREFLUSH | REQ_FSEQ_DATA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 				  REQ_FSEQ_POSTFLUSH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	 * If flush has been pending longer than the following timeout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	 * it's issued even if flush_data requests are still in flight.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	FLUSH_PENDING_TIMEOUT	= 5 * HZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) static void blk_kick_flush(struct request_queue *q,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 			   struct blk_flush_queue *fq, unsigned int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) static unsigned int blk_flush_policy(unsigned long fflags, struct request *rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	unsigned int policy = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	if (blk_rq_sectors(rq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 		policy |= REQ_FSEQ_DATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	if (fflags & (1UL << QUEUE_FLAG_WC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 		if (rq->cmd_flags & REQ_PREFLUSH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 			policy |= REQ_FSEQ_PREFLUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 		if (!(fflags & (1UL << QUEUE_FLAG_FUA)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		    (rq->cmd_flags & REQ_FUA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 			policy |= REQ_FSEQ_POSTFLUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	return policy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) static unsigned int blk_flush_cur_seq(struct request *rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	return 1 << ffz(rq->flush.seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) static void blk_flush_restore_request(struct request *rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	 * After flush data completion, @rq->bio is %NULL but we need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	 * complete the bio again.  @rq->biotail is guaranteed to equal the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	 * original @rq->bio.  Restore it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	rq->bio = rq->biotail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	/* make @rq a normal request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	rq->rq_flags &= ~RQF_FLUSH_SEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	rq->end_io = rq->flush.saved_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static void blk_flush_queue_rq(struct request *rq, bool add_front)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	blk_mq_add_to_requeue_list(rq, add_front, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static void blk_account_io_flush(struct request *rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	struct hd_struct *part = &rq->rq_disk->part0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	part_stat_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	part_stat_inc(part, ios[STAT_FLUSH]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	part_stat_add(part, nsecs[STAT_FLUSH],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		      ktime_get_ns() - rq->start_time_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	part_stat_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)  * blk_flush_complete_seq - complete flush sequence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)  * @rq: PREFLUSH/FUA request being sequenced
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)  * @fq: flush queue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)  * @seq: sequences to complete (mask of %REQ_FSEQ_*, can be zero)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)  * @error: whether an error occurred
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)  * @rq just completed @seq part of its flush sequence, record the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)  * completion and trigger the next step.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)  * CONTEXT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)  * spin_lock_irq(fq->mq_flush_lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static void blk_flush_complete_seq(struct request *rq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 				   struct blk_flush_queue *fq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 				   unsigned int seq, blk_status_t error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	struct request_queue *q = rq->q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	struct list_head *pending = &fq->flush_queue[fq->flush_pending_idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	unsigned int cmd_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	BUG_ON(rq->flush.seq & seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	rq->flush.seq |= seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	cmd_flags = rq->cmd_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	if (likely(!error))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		seq = blk_flush_cur_seq(rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		seq = REQ_FSEQ_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	switch (seq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	case REQ_FSEQ_PREFLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	case REQ_FSEQ_POSTFLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		/* queue for flush */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		if (list_empty(pending))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 			fq->flush_pending_since = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		list_move_tail(&rq->flush.list, pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	case REQ_FSEQ_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 		list_move_tail(&rq->flush.list, &fq->flush_data_in_flight);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		blk_flush_queue_rq(rq, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	case REQ_FSEQ_DONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 		 * @rq was previously adjusted by blk_insert_flush() for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		 * flush sequencing and may already have gone through the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		 * flush data request completion path.  Restore @rq for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		 * normal completion and end it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		BUG_ON(!list_empty(&rq->queuelist));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		list_del_init(&rq->flush.list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		blk_flush_restore_request(rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		blk_mq_end_request(rq, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	blk_kick_flush(q, fq, cmd_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) static void flush_end_io(struct request *flush_rq, blk_status_t error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	struct request_queue *q = flush_rq->q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	struct list_head *running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	struct request *rq, *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	struct blk_flush_queue *fq = blk_get_flush_queue(q, flush_rq->mq_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	/* release the tag's ownership to the req cloned from */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	spin_lock_irqsave(&fq->mq_flush_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	if (!refcount_dec_and_test(&flush_rq->ref)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		fq->rq_status = error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 		spin_unlock_irqrestore(&fq->mq_flush_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	blk_account_io_flush(flush_rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	 * Flush request has to be marked as IDLE when it is really ended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	 * because its .end_io() is called from timeout code path too for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	 * avoiding use-after-free.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	WRITE_ONCE(flush_rq->state, MQ_RQ_IDLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	if (fq->rq_status != BLK_STS_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 		error = fq->rq_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		fq->rq_status = BLK_STS_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	if (!q->elevator) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 		flush_rq->tag = BLK_MQ_NO_TAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 		blk_mq_put_driver_tag(flush_rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 		flush_rq->internal_tag = BLK_MQ_NO_TAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	running = &fq->flush_queue[fq->flush_running_idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	BUG_ON(fq->flush_pending_idx == fq->flush_running_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	/* account completion of the flush request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	fq->flush_running_idx ^= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	/* and push the waiting requests to the next stage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	list_for_each_entry_safe(rq, n, running, flush.list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		unsigned int seq = blk_flush_cur_seq(rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		BUG_ON(seq != REQ_FSEQ_PREFLUSH && seq != REQ_FSEQ_POSTFLUSH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 		blk_flush_complete_seq(rq, fq, seq, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	spin_unlock_irqrestore(&fq->mq_flush_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) bool is_flush_rq(struct request *rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	return rq->end_io == flush_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)  * blk_kick_flush - consider issuing flush request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)  * @q: request_queue being kicked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)  * @fq: flush queue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)  * @flags: cmd_flags of the original request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)  * Flush related states of @q have changed, consider issuing flush request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)  * Please read the comment at the top of this file for more info.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)  * CONTEXT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)  * spin_lock_irq(fq->mq_flush_lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) static void blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 			   unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	struct list_head *pending = &fq->flush_queue[fq->flush_pending_idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	struct request *first_rq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 		list_first_entry(pending, struct request, flush.list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	struct request *flush_rq = fq->flush_rq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	/* C1 described at the top of this file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	if (fq->flush_pending_idx != fq->flush_running_idx || list_empty(pending))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	/* C2 and C3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	if (!list_empty(&fq->flush_data_in_flight) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	    time_before(jiffies,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 			fq->flush_pending_since + FLUSH_PENDING_TIMEOUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	 * Issue flush and toggle pending_idx.  This makes pending_idx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	 * different from running_idx, which means flush is in flight.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	fq->flush_pending_idx ^= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	blk_rq_init(q, flush_rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	 * In case of none scheduler, borrow tag from the first request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	 * since they can't be in flight at the same time. And acquire
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	 * the tag's ownership for flush req.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	 * In case of IO scheduler, flush rq need to borrow scheduler tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	 * just for cheating put/get driver tag.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	flush_rq->mq_ctx = first_rq->mq_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	flush_rq->mq_hctx = first_rq->mq_hctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	if (!q->elevator) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 		flush_rq->tag = first_rq->tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 		 * We borrow data request's driver tag, so have to mark
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 		 * this flush request as INFLIGHT for avoiding double
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 		 * account of this driver tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 		flush_rq->rq_flags |= RQF_MQ_INFLIGHT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 		flush_rq->internal_tag = first_rq->internal_tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	flush_rq->cmd_flags = REQ_OP_FLUSH | REQ_PREFLUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	flush_rq->cmd_flags |= (flags & REQ_DRV) | (flags & REQ_FAILFAST_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	flush_rq->rq_flags |= RQF_FLUSH_SEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	flush_rq->rq_disk = first_rq->rq_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	flush_rq->end_io = flush_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	 * Order WRITE ->end_io and WRITE rq->ref, and its pair is the one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	 * implied in refcount_inc_not_zero() called from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	 * blk_mq_find_and_get_req(), which orders WRITE/READ flush_rq->ref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	 * and READ flush_rq->end_io
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	smp_wmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	refcount_set(&flush_rq->ref, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 	blk_flush_queue_rq(flush_rq, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) static void mq_flush_data_end_io(struct request *rq, blk_status_t error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	struct request_queue *q = rq->q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	struct blk_mq_hw_ctx *hctx = rq->mq_hctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	struct blk_mq_ctx *ctx = rq->mq_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	struct blk_flush_queue *fq = blk_get_flush_queue(q, ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	if (q->elevator) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 		WARN_ON(rq->tag < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 		blk_mq_put_driver_tag(rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	 * After populating an empty queue, kick it to avoid stall.  Read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	 * the comment in flush_end_io().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	spin_lock_irqsave(&fq->mq_flush_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	blk_flush_complete_seq(rq, fq, REQ_FSEQ_DATA, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	spin_unlock_irqrestore(&fq->mq_flush_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	blk_mq_sched_restart(hctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)  * blk_insert_flush - insert a new PREFLUSH/FUA request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)  * @rq: request to insert
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)  * To be called from __elv_add_request() for %ELEVATOR_INSERT_FLUSH insertions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)  * or __blk_mq_run_hw_queue() to dispatch request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)  * @rq is being submitted.  Analyze what needs to be done and put it on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)  * right queue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) void blk_insert_flush(struct request *rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	struct request_queue *q = rq->q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	unsigned long fflags = q->queue_flags;	/* may change, cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	unsigned int policy = blk_flush_policy(fflags, rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	struct blk_flush_queue *fq = blk_get_flush_queue(q, rq->mq_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	 * @policy now records what operations need to be done.  Adjust
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	 * REQ_PREFLUSH and FUA for the driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	rq->cmd_flags &= ~REQ_PREFLUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 	if (!(fflags & (1UL << QUEUE_FLAG_FUA)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 		rq->cmd_flags &= ~REQ_FUA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 	 * REQ_PREFLUSH|REQ_FUA implies REQ_SYNC, so if we clear any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 	 * of those flags, we have to set REQ_SYNC to avoid skewing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 	 * the request accounting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	rq->cmd_flags |= REQ_SYNC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	 * An empty flush handed down from a stacking driver may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	 * translate into nothing if the underlying device does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	 * advertise a write-back cache.  In this case, simply
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	 * complete the request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	if (!policy) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 		blk_mq_end_request(rq, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	BUG_ON(rq->bio != rq->biotail); /*assumes zero or single bio rq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	 * If there's data but flush is not necessary, the request can be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 	 * processed directly without going through flush machinery.  Queue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	 * for normal execution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 	if ((policy & REQ_FSEQ_DATA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	    !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 		blk_mq_request_bypass_insert(rq, false, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 	 * @rq should go through flush machinery.  Mark it part of flush
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	 * sequence and submit for further processing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	memset(&rq->flush, 0, sizeof(rq->flush));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	INIT_LIST_HEAD(&rq->flush.list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 	rq->rq_flags |= RQF_FLUSH_SEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 	rq->flush.saved_end_io = rq->end_io; /* Usually NULL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 	rq->end_io = mq_flush_data_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	spin_lock_irq(&fq->mq_flush_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	blk_flush_complete_seq(rq, fq, REQ_FSEQ_ACTIONS & ~policy, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	spin_unlock_irq(&fq->mq_flush_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)  * blkdev_issue_flush - queue a flush
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)  * @bdev:	blockdev to issue flush for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)  * @gfp_mask:	memory allocation flags (for bio_alloc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)  * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)  *    Issue a flush for the block device in question.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	struct bio *bio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	bio = bio_alloc(gfp_mask, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	bio_set_dev(bio, bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	ret = submit_bio_wait(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 	bio_put(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) EXPORT_SYMBOL(blkdev_issue_flush);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) struct blk_flush_queue *blk_alloc_flush_queue(int node, int cmd_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 					      gfp_t flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 	struct blk_flush_queue *fq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 	int rq_sz = sizeof(struct request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	fq = kzalloc_node(sizeof(*fq), flags, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 	if (!fq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 	spin_lock_init(&fq->mq_flush_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 	rq_sz = round_up(rq_sz + cmd_size, cache_line_size());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 	fq->flush_rq = kzalloc_node(rq_sz, flags, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 	if (!fq->flush_rq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 		goto fail_rq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 	INIT_LIST_HEAD(&fq->flush_queue[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	INIT_LIST_HEAD(&fq->flush_queue[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	INIT_LIST_HEAD(&fq->flush_data_in_flight);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	lockdep_register_key(&fq->key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 	lockdep_set_class(&fq->mq_flush_lock, &fq->key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 	return fq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)  fail_rq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 	kfree(fq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)  fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) void blk_free_flush_queue(struct blk_flush_queue *fq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 	/* bio based request queue hasn't flush queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 	if (!fq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 	lockdep_unregister_key(&fq->key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 	kfree(fq->flush_rq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 	kfree(fq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) }