Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b12d4f82 authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

paride: dequeue in-flight request



pd/pf/pcd have track in-flight request by pd/pf/pcd_req.  They can be
converted to dequeueing model by updating fetching and completion
paths.  Convert them.

Note that removal of elv_next_request() call from pf_next_buf()
doesn't make any functional difference.  The path is traveled only
during partial completion of a request and elv_next_request() call
must return the same request anyway.

[ Impact: dequeue in-flight request ]

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Tim Waugh <tim@cyberelk.net>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 2d75ce08
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -719,9 +719,12 @@ static void do_pcd_request(struct request_queue * q)
	if (pcd_busy)
		return;
	while (1) {
		if (!pcd_req) {
			pcd_req = elv_next_request(q);
			if (!pcd_req)
				return;
			blkdev_dequeue_request(pcd_req);
		}

		if (rq_data_dir(pcd_req) == READ) {
			struct pcd_unit *cd = pcd_req->rq_disk->private_data;
@@ -734,8 +737,10 @@ static void do_pcd_request(struct request_queue * q)
			pcd_busy = 1;
			ps_set_intr(do_pcd_read, NULL, 0, nice);
			return;
		} else
			__blk_end_request_cur(pcd_req, -EIO);
		} else {
			__blk_end_request_all(pcd_req, -EIO);
			pcd_req = NULL;
		}
	}
}

@@ -744,7 +749,8 @@ static inline void next_request(int err)
	unsigned long saved_flags;

	spin_lock_irqsave(&pcd_lock, saved_flags);
	__blk_end_request_cur(pcd_req, err);
	if (!__blk_end_request_cur(pcd_req, err))
		pcd_req = NULL;
	pcd_busy = 0;
	do_pcd_request(pcd_queue);
	spin_unlock_irqrestore(&pcd_lock, saved_flags);
+9 −5
Original line number Diff line number Diff line
@@ -410,11 +410,14 @@ static void run_fsm(void)
				pd_claimed = 0;
				phase = NULL;
				spin_lock_irqsave(&pd_lock, saved_flags);
				__blk_end_request_cur(pd_req,
						      res == Ok ? 0 : -EIO);
				if (!__blk_end_request_cur(pd_req,
						res == Ok ? 0 : -EIO)) {
					pd_req = elv_next_request(pd_queue);
					if (!pd_req)
						stop = 1;
					else
						blkdev_dequeue_request(pd_req);
				}
				spin_unlock_irqrestore(&pd_lock, saved_flags);
				if (stop)
					return;
@@ -706,6 +709,7 @@ static void do_pd_request(struct request_queue * q)
	pd_req = elv_next_request(q);
	if (!pd_req)
		return;
	blkdev_dequeue_request(pd_req);

	schedule_fsm();
}
+7 −7
Original line number Diff line number Diff line
@@ -752,20 +752,21 @@ static struct request_queue *pf_queue;

static void pf_end_request(int err)
{
	if (pf_req) {
		__blk_end_request_cur(pf_req, err);
	if (pf_req && !__blk_end_request_cur(pf_req, err))
		pf_req = NULL;
}
}

static void do_pf_request(struct request_queue * q)
{
	if (pf_busy)
		return;
repeat:
	if (!pf_req) {
		pf_req = elv_next_request(q);
		if (!pf_req)
			return;
		blkdev_dequeue_request(pf_req);
	}

	pf_current = pf_req->rq_disk->private_data;
	pf_block = blk_rq_pos(pf_req);
@@ -806,7 +807,6 @@ static int pf_next_buf(void)
	if (!pf_count) {
		spin_lock_irqsave(&pf_spin_lock, saved_flags);
		pf_end_request(0);
		pf_req = elv_next_request(pf_queue);
		spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
		if (!pf_req)
			return 1;