From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933198AbWFXCoq (ORCPT ); Fri, 23 Jun 2006 22:44:46 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S933196AbWFXCnZ (ORCPT ); Fri, 23 Jun 2006 22:43:25 -0400 Received: from smtp.ustc.edu.cn ([202.38.64.16]:9113 "HELO ustc.edu.cn") by vger.kernel.org with SMTP id S932097AbWFXCm4 (ORCPT ); Fri, 23 Jun 2006 22:42:56 -0400 Message-ID: <351116974.29400@ustc.edu.cn> X-EYOUMAIL-SMTPAUTH: wfg@mail.ustc.edu.cn Message-Id: <20060624024259.755490540@localhost.localdomain> References: <20060624020358.719251923@localhost.localdomain> Date: Sat, 24 Jun 2006 10:04:05 +0800 From: Fengguang Wu To: Jens Axboe Cc: linux-kernel@vger.kernel.org, Andrew Morton , Nick Piggin , Lubos Lunak , Wu Fengguang Subject: [PATCH 7/7] iosched: introduce deadline_kick_page() Content-Disposition: inline; filename=iosched-kick-page-deadline.patch Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Introduce deadline_kick_page() to - find the request containing the page - remove its BIO_RW_AHEAD flag - reschedule if it was of type READA Signed-off-by: Wu Fengguang --- block/deadline-iosched.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 43 insertions(+), 2 deletions(-) --- linux-2.6.17-rc6-mm2.orig/block/deadline-iosched.c +++ linux-2.6.17-rc6-mm2/block/deadline-iosched.c @@ -317,6 +317,44 @@ deadline_add_request(struct request_queu } /* + * We have a pending read on @page, + * find the corresponding request of type READA, + * promote it to READ, and reschedule it. + */ +static int +deadline_kick_page(struct request_queue *q, struct page *page) +{ + struct deadline_data *dd = q->elevator->elevator_data; + struct deadline_rq *drq; + struct request *rq; + struct list_head *pos; + struct bio_vec *bvec; + struct bio *bio; + int i; + + list_for_each(pos, &dd->fifo_list[READ]) { + drq = list_entry_fifo(pos); + rq = drq->request; + if (rq->flags & (1 << BIO_RW_AHEAD)) { + rq_for_each_bio(bio, rq) { + bio_for_each_segment(bvec, bio, i) { + if (page == bvec->bv_page) + goto found; + } + } + } + } + + return -1; + +found: + rq->flags &= ~(1 << BIO_RW_AHEAD); + list_del(&drq->fifo); + deadline_add_drq_fifo(dd, rq); + return 0; +} + +/* * remove rq from rbtree, fifo, and hash */ static void deadline_remove_request(request_queue_t *q, struct request *rq) @@ -794,6 +832,7 @@ static struct elevator_type iosched_dead .elevator_merge_req_fn = deadline_merged_requests, .elevator_dispatch_fn = deadline_dispatch_requests, .elevator_add_req_fn = deadline_add_request, + .elevator_kick_page_fn = deadline_kick_page, .elevator_queue_empty_fn = deadline_queue_empty, .elevator_former_req_fn = deadline_former_request, .elevator_latter_req_fn = deadline_latter_request, --