Re: [PATCH] as i/o hang with aacraid driver 2.6.0-test1

Nick Piggin
2003-07-17T11:13:27Z

[-- Attachment #1: Type: text/plain, Size: 334 bytes --]

Jens Axboe wrote:

>On Thu, Jul 17 2003, Nick Piggin wrote:
>

snip

>>
>>Jens, this is exactly right. Would you be OK with this? Everyone else?
>>
>
>I'm happy with it.
>

OK, Mark, please try the following patch in combination with Jens'
previous. Untested due to not being able to exercise the requeue
path, so it might blow up.

[-- Attachment #2: as-requeue --]
[-- Type: text/plain, Size: 2265 bytes --]

--- linux-2.6/drivers/block/as-iosched.c.orig 2003-07-17 21:13:55.000000000 +1000
+++ linux-2.6/drivers/block/as-iosched.c 2003-07-17 21:24:07.000000000 +1000
@@ -1307,6 +1307,66 @@ static void as_add_request(struct as_dat
as_update_arq(ad, arq); /* keep state machine up to date */
}

+/*
+ * requeue the request. The request has not been completed, nor is it a
+ * new request, so don't touch accounting.
+ */
+static void as_requeue_request(request_queue_t *q, struct request *rq)
+{
+ struct as_data *ad = q->elevator.elevator_data;
+ struct as_rq *arq = RQ_DATA(rq);
+ int data_dir;
+
+ if (unlikely(rq->flags & REQ_HARDBARRIER)) {
+ AS_INVALIDATE_HASH(ad);
+ q->last_merge = NULL;
+
+ while (ad->next_arq[REQ_SYNC])
+ as_move_to_dispatch(ad, ad->next_arq[REQ_SYNC]);
+
+ while (ad->next_arq[REQ_ASYNC])
+ as_move_to_dispatch(ad, ad->next_arq[REQ_ASYNC]);
+ }
+
+ if (unlikely(!blk_fs_request(rq))) {
+ list_add(&rq->queuelist, ad->dispatch->prev);
+
+ /* Stop anticipating - let this request get through */
+ if (!list_empty(ad->dispatch)
+ && (ad->antic_status == ANTIC_WAIT_REQ
+ || ad->antic_status == ANTIC_WAIT_NEXT))
+ as_antic_stop(ad);
+
+ return;
+ }
+
+ if (rq_mergeable(rq)) {
+ as_add_arq_hash(ad, arq);
+
+ if (!q->last_merge)
+ q->last_merge = &rq->queuelist;
+ }
+
+
+ if (rq_data_dir(arq->request) == READ
+ || current->flags&PF_SYNCWRITE)
+ arq->is_sync = 1;
+ else
+ arq->is_sync = 0;
+ data_dir = arq->is_sync;
+
+ as_add_arq_rb(ad, arq);
+
+ /*
+ * set expire time (only used for reads) and add to fifo list
+ */
+ arq->expires = jiffies + ad->fifo_expire[data_dir];
+ list_add_tail(&arq->fifo, &ad->fifo_list[data_dir]);
+ arq->state = AS_RQ_QUEUED;
+ as_update_arq(ad, arq); /* keep state machine up to date */
+
+}
+
static void
as_insert_request(request_queue_t *q, struct request *rq,
struct list_head *insert_here)
@@ -1822,6 +1882,7 @@ elevator_t iosched_as = {
.elevator_next_req_fn = as_next_request,
.elevator_add_req_fn = as_insert_request,
.elevator_remove_req_fn = as_remove_request,
+ .elevator_requeue_req_fn = as_requeue_request,
.elevator_queue_empty_fn = as_queue_empty,
.elevator_completed_req_fn = as_completed_request,
.elevator_former_req_fn = as_former_request,