On Wed, Apr 18 2007, Jens Axboe wrote: > I had something similar for generic_unplug_request() as well, but didn't > see/hear any reports of it being tried out. Here's a complete debugging > patch for this and other potential dangers.
Which had a bug (do the check _after_ deleting from the rbtree, otherwise it'll go rightfully BUG() the first time). diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 6853fb7..9aa7bf7 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -644,12 +644,15 @@ static void cfq_remove_request(struct request *rq) { struct cfq_queue *cfqq = RQ_CFQQ(rq); + BUG_ON(!irqs_disabled()); if (cfqq->next_rq == rq) cfqq->next_rq = cfq_find_next_rq(cfqq->cfqd, cfqq, rq); list_del_init(&rq->queuelist); cfq_del_rq_rb(rq); + BUG_ON(!cfqq->next_rq && !RB_EMPTY_ROOT(&cfqq->sort_list)); + if (rq_is_meta(rq)) { WARN_ON(!cfqq->meta_pending); cfqq->meta_pending--; @@ -1231,6 +1234,8 @@ static void cfq_exit_single_io_context(struct cfq_io_context *cic) { struct cfq_data *cfqd = cic->key; + BUG_ON(irqs_disabled()); + if (cfqd) { request_queue_t *q = cfqd->queue; @@ -1699,6 +1704,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq, /* * check if this request is a better next-serve candidate)) { */ + BUG_ON(!irqs_disabled()); cfqq->next_rq = cfq_choose_req(cfqd, cfqq->next_rq, rq); BUG_ON(!cfqq->next_rq); @@ -2014,6 +2020,7 @@ static void cfq_exit_queue(elevator_t *e) cfq_shutdown_timer_wq(cfqd); + BUG_ON(irqs_disabled()); spin_lock_irq(q->queue_lock); if (cfqd->active_queue) diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index 3de0695..c16863e 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c @@ -1602,6 +1602,8 @@ EXPORT_SYMBOL(__generic_unplug_device); **/ void generic_unplug_device(request_queue_t *q) { + BUG_ON(irqs_disabled()); + spin_lock_irq(q->queue_lock); __generic_unplug_device(q); spin_unlock_irq(q->queue_lock); -- Jens Axboe - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/