Commit 8bdd3f8a authored by Jens Axboe's avatar Jens Axboe

as-iosched: fix inconsistent ioc->lock context

Since it's acquired from irq context, all locking must be of the
irq safe variant. Most are already inside the queue lock (which
already disables interrupts), but the io scheduler rmmod path
always has irqs enabled and the put_io_context() path may legally
be called with irqs enabled (even if it isn't usually). So fixup
those two.
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 4f4f6c25
...@@ -170,11 +170,11 @@ static void free_as_io_context(struct as_io_context *aic) ...@@ -170,11 +170,11 @@ static void free_as_io_context(struct as_io_context *aic)
static void as_trim(struct io_context *ioc) static void as_trim(struct io_context *ioc)
{ {
spin_lock(&ioc->lock); spin_lock_irq(&ioc->lock);
if (ioc->aic) if (ioc->aic)
free_as_io_context(ioc->aic); free_as_io_context(ioc->aic);
ioc->aic = NULL; ioc->aic = NULL;
spin_unlock(&ioc->lock); spin_unlock_irq(&ioc->lock);
} }
/* Called when the task exits */ /* Called when the task exits */
...@@ -235,10 +235,12 @@ static void as_put_io_context(struct request *rq) ...@@ -235,10 +235,12 @@ static void as_put_io_context(struct request *rq)
aic = RQ_IOC(rq)->aic; aic = RQ_IOC(rq)->aic;
if (rq_is_sync(rq) && aic) { if (rq_is_sync(rq) && aic) {
spin_lock(&aic->lock); unsigned long flags;
spin_lock_irqsave(&aic->lock, flags);
set_bit(AS_TASK_IORUNNING, &aic->state); set_bit(AS_TASK_IORUNNING, &aic->state);
aic->last_end_request = jiffies; aic->last_end_request = jiffies;
spin_unlock(&aic->lock); spin_unlock_irqrestore(&aic->lock, flags);
} }
put_io_context(RQ_IOC(rq)); put_io_context(RQ_IOC(rq));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment