lkml.org 
[lkml]   [2004]   [Mar]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRE: cciss per device queue patch for 2.6.4
Date
From
Thanks, Jens. I'll fix it & resubmit.

-----Original Message-----
From: Jens Axboe [mailto:axboe@suse.de]
Sent: Monday, March 08, 2004 1:46 PM
To: Miller, Mike (OS Dev)
Cc: apkm@osdl.org; linux-kernel@vger.kernel.org
Subject: Re: cciss per device queue patch for 2.6.4


On Mon, Mar 08 2004, mikem@beardog.cca.cpqcorp.net wrote:
> /*
> * See if we can queue up some more IO
> + * check every disk that exists on this controller
> + * and start it's IO
> */
> - blk_start_queue(h->queue);
> + for(j=0;j < NWD; j++) {
> + /* make sure the disk has been added and the drive is real */
> + /* because this can be called from the middle of init_one */
> + if(!(h->gendisk[j]->queue) || !(h->drv[j].nr_blocks) )
> + continue;
> + blk_start_queue(h->gendisk[j]->queue);
> + }
> spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
> return IRQ_HANDLED;

You can't do this, you must hold the specific queue lock for calling
blk_start_queue() for it. The comment for that functions states that,
too. It's even more important now that blk_start_queue() actually works
properly (included).

===== drivers/block/ll_rw_blk.c 1.228 vs edited =====
--- 1.228/drivers/block/ll_rw_blk.c Sun Feb 1 19:09:12 2004
+++ edited/drivers/block/ll_rw_blk.c Mon Mar 8 20:41:21 2004
@@ -1188,13 +1193,23 @@
* Description:
* blk_start_queue() will clear the stop flag on the queue, and call
* the request_fn for the queue if it was in a stopped state when
- * entered. Also see blk_stop_queue(). Must not be called from driver
- * request function due to recursion issues. Queue lock must be held.
+ * entered. Also see blk_stop_queue(). Queue lock must be held.
**/
void blk_start_queue(request_queue_t *q)
{
clear_bit(QUEUE_FLAG_STOPPED, &q->queue_flags);
- schedule_work(&q->unplug_work);
+
+ /*
+ * one level of recursion is ok and is much faster than kicking
+ * the unplug handling
+ */
+ if (!test_and_set_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) {
+ q->request_fn(q);
+ clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
+ } else {
+ blk_plug_device(q);
+ schedule_work(&q->unplug_work);
+ }
}

EXPORT_SYMBOL(blk_start_queue);

--
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 14:01    [W:0.023 / U:0.036 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site