Messages in this thread Patch in this message | | | Date | Thu, 13 Nov 2003 11:38:23 +0100 | From | Jens Axboe <> | Subject | AS spin lock bugs |
| |
Hi,
Was looking at io tracking for cfq, and I think I found some spin lock bugs in current as (current BK). as_update_iohist() runs from add_request which is typically in process context. It could be run with interrupts disabled though, either driver private stuff or using the generic block layer tagging.
Anyways, as_update_iohist() grabs aic->lock without disabling interrupts, while as_completed_request() typically runs at interrupt time and grabs the same lock. Deadlock.
To be safe, both need to use the flags saving lock variants.
===== drivers/block/as-iosched.c 1.28 vs edited ===== --- 1.28/drivers/block/as-iosched.c Mon Nov 10 06:12:07 2003 +++ edited/drivers/block/as-iosched.c Thu Nov 13 11:37:47 2003 @@ -783,14 +783,14 @@ { struct as_rq *arq = RQ_DATA(rq); int data_dir = arq->is_sync; - unsigned long thinktime; + unsigned long thinktime, flags; sector_t seek_dist; if (aic == NULL) return; if (data_dir == REQ_SYNC) { - spin_lock(&aic->lock); + spin_lock_irqsave(&aic->lock, flags); if (test_bit(AS_TASK_IORUNNING, &aic->state) && !atomic_read(&aic->nr_queued) @@ -844,7 +844,7 @@ aic->seek_total = (aic->seek_total>>1) + (aic->seek_total>>2); - spin_unlock(&aic->lock); + spin_unlock_irqrestore(&aic->lock, flags); } } @@ -909,6 +909,7 @@ struct as_data *ad = q->elevator.elevator_data; struct as_rq *arq = RQ_DATA(rq); struct as_io_context *aic; + unsigned long flags; WARN_ON(!list_empty(&rq->queuelist)); @@ -959,12 +960,12 @@ if (!aic) return; - spin_lock(&aic->lock); + spin_lock_irqsave(&aic->lock, flags); if (arq->is_sync == REQ_SYNC) { set_bit(AS_TASK_IORUNNING, &aic->state); aic->last_end_request = jiffies; } - spin_unlock(&aic->lock); + spin_unlock_irqrestore(&aic->lock, flags); put_io_context(arq->io_context); } -- 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/
| |