lkml.org 
[lkml]   [2007]   [Apr]   [18]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    DateWed, 18 Apr 2007 15:19:43 +0200
    FromJens Axboe <>
    SubjectRe: [OOPS] 2.6.21-rc6-git5 in cfq_dispatch_insert
    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 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: 2007-04-18 15:23    [from the cache]
    ©2003-2008