| From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Date: Sat, 20 May 2017 12:32:23 +0200 |
| Subject: [PATCH] delayacct: use raw_spinlocks |
| |
| try_to_wake_up() might invoke delayacct_blkio_end() while holding the |
| pi_lock. The lock is only held for a short amount of time so it should |
| be safe to make it raw. |
| |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| include/linux/delayacct.h | 2 +- |
| kernel/delayacct.c | 14 +++++++------- |
| 2 files changed, 8 insertions(+), 8 deletions(-) |
| |
| --- a/include/linux/delayacct.h |
| +++ b/include/linux/delayacct.h |
| @@ -29,7 +29,7 @@ |
| |
| #ifdef CONFIG_TASK_DELAY_ACCT |
| struct task_delay_info { |
| - spinlock_t lock; |
| + raw_spinlock_t lock; |
| unsigned int flags; /* Private per-task flags */ |
| |
| /* For each stat XXX, add following, aligned appropriately |
| --- a/kernel/delayacct.c |
| +++ b/kernel/delayacct.c |
| @@ -44,7 +44,7 @@ void __delayacct_tsk_init(struct task_st |
| { |
| tsk->delays = kmem_cache_zalloc(delayacct_cache, GFP_KERNEL); |
| if (tsk->delays) |
| - spin_lock_init(&tsk->delays->lock); |
| + raw_spin_lock_init(&tsk->delays->lock); |
| } |
| |
| /* |
| @@ -57,10 +57,10 @@ static void delayacct_end(u64 *start, u6 |
| unsigned long flags; |
| |
| if (ns > 0) { |
| - spin_lock_irqsave(¤t->delays->lock, flags); |
| + raw_spin_lock_irqsave(¤t->delays->lock, flags); |
| *total += ns; |
| (*count)++; |
| - spin_unlock_irqrestore(¤t->delays->lock, flags); |
| + raw_spin_unlock_irqrestore(¤t->delays->lock, flags); |
| } |
| } |
| |
| @@ -119,7 +119,7 @@ int __delayacct_add_tsk(struct taskstats |
| |
| /* zero XXX_total, non-zero XXX_count implies XXX stat overflowed */ |
| |
| - spin_lock_irqsave(&tsk->delays->lock, flags); |
| + raw_spin_lock_irqsave(&tsk->delays->lock, flags); |
| tmp = d->blkio_delay_total + tsk->delays->blkio_delay; |
| d->blkio_delay_total = (tmp < d->blkio_delay_total) ? 0 : tmp; |
| tmp = d->swapin_delay_total + tsk->delays->swapin_delay; |
| @@ -129,7 +129,7 @@ int __delayacct_add_tsk(struct taskstats |
| d->blkio_count += tsk->delays->blkio_count; |
| d->swapin_count += tsk->delays->swapin_count; |
| d->freepages_count += tsk->delays->freepages_count; |
| - spin_unlock_irqrestore(&tsk->delays->lock, flags); |
| + raw_spin_unlock_irqrestore(&tsk->delays->lock, flags); |
| |
| return 0; |
| } |
| @@ -139,10 +139,10 @@ int __delayacct_add_tsk(struct taskstats |
| __u64 ret; |
| unsigned long flags; |
| |
| - spin_lock_irqsave(&tsk->delays->lock, flags); |
| + raw_spin_lock_irqsave(&tsk->delays->lock, flags); |
| ret = nsec_to_clock_t(tsk->delays->blkio_delay + |
| tsk->delays->swapin_delay); |
| - spin_unlock_irqrestore(&tsk->delays->lock, flags); |
| + raw_spin_unlock_irqrestore(&tsk->delays->lock, flags); |
| return ret; |
| } |
| |