From patchwork Tue Dec 11 13:43:19 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: tlinder X-Patchwork-Id: 1862281 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id A119E3FC71 for ; Tue, 11 Dec 2012 13:43:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753215Ab2LKNnh (ORCPT ); Tue, 11 Dec 2012 08:43:37 -0500 Received: from wolverine02.qualcomm.com ([199.106.114.251]:26675 "EHLO wolverine02.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753170Ab2LKNnh (ORCPT ); Tue, 11 Dec 2012 08:43:37 -0500 X-IronPort-AV: E=McAfee;i="5400,1158,6922"; a="13144334" Received: from pdmz-ns-mip.qualcomm.com (HELO mostmsg01.qualcomm.com) ([199.106.114.10]) by wolverine02.qualcomm.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 11 Dec 2012 05:43:37 -0800 Received: from lx-tlinder2.qi.qualcomm.com (pdmz-ns-snip_218_1.qualcomm.com [192.168.218.1]) by mostmsg01.qualcomm.com (Postfix) with ESMTPA id BE5AE10004D1; Tue, 11 Dec 2012 05:43:33 -0800 (PST) From: Tanya Brokhman To: jaxboe@fusionio.com Cc: linux-arm-msm@vger.kernel.org, philippedeswert@gmail.com, jengelh@inai.de, jh80.chung@samsung.com, tgih.jun@samsung.com, arnd.bergmann@linaro.org, venkat@linaro.org, linux-mmc@vger.kernel.org, Tanya Brokhman , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 1/2] row: Adding support for reinsert already dispatched req Date: Tue, 11 Dec 2012 15:43:19 +0200 Message-Id: <1355233400-26269-2-git-send-email-tlinder@codeaurora.org> X-Mailer: git-send-email 1.7.6 In-Reply-To: <1355233400-26269-1-git-send-email-tlinder@codeaurora.org> References: <1355233400-26269-1-git-send-email-tlinder@codeaurora.org> Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org Add support for reinserting already dispatched request back to the schedulers internal data structures. The request will be reinserted back to the queue (head) it was dispatched from as if it was never dispatched. Signed-off-by: Tatyana Brokhman --- v3: Update error handling when row queue is not set for a request v2: Nothing changed. Resend v1: Initial version diff --git a/block/row-iosched.c b/block/row-iosched.c index 1f50180..b3204d6 100644 --- a/block/row-iosched.c +++ b/block/row-iosched.c @@ -274,7 +274,39 @@ static void row_add_request(struct request_queue *q, row_log_rowq(rd, rqueue->prio, "added request"); } -/* +/** + * row_reinsert_req() - Reinsert request back to the scheduler + * @q: requests queue + * @rq: request to add + * + * Reinsert the given request back to the queue it was + * dispatched from as if it was never dispatched. + * + * Returns 0 on success, error code otherwise + */ +static int row_reinsert_req(struct request_queue *q, + struct request *rq) +{ + struct row_data *rd = q->elevator->elevator_data; + struct row_queue *rqueue = RQ_ROWQ(rq); + + /* Verify rqueue is legitimate */ + if (rqueue->prio >= ROWQ_MAX_PRIO) { + pr_err("\n\nROW BUG: row_reinsert_req() rqueue->prio = %d\n", + rqueue->prio); + blk_dump_rq_flags(rq, ""); + return -EIO; + } + + list_add(&rq->queuelist, &rqueue->fifo); + rd->nr_reqs[rq_data_dir(rq)]++; + + row_log_rowq(rd, rqueue->prio, "request reinserted"); + + return 0; +} + +/** * row_remove_request() - Remove given request from scheduler * @q: requests queue * @rq: request to remove @@ -664,6 +696,7 @@ static struct elevator_type iosched_row = { .elevator_merge_req_fn = row_merged_requests, .elevator_dispatch_fn = row_dispatch_requests, .elevator_add_req_fn = row_add_request, + .elevator_reinsert_req_fn = row_reinsert_req, .elevator_former_req_fn = elv_rb_former_request, .elevator_latter_req_fn = elv_rb_latter_request, .elevator_set_req_fn = row_set_request,