Thread (3 messages) 3 messages, 3 authors, 2018-06-22

Re: [BUG] mm: backing-dev: a possible sleep-in-atomic-context bug in cgwb_create()

From: Jan Kara <jack@suse.cz>
Date: 2018-06-22 08:50:43
Also in: lkml

On Wed 20-06-18 20:35:15, Matthew Wilcox wrote:
On Thu, Jun 21, 2018 at 11:02:58AM +0800, Jia-Ju Bai wrote:
quoted
The kernel may sleep with holding a spinlock.
The function call path (from bottom to top) in Linux-4.16.7 is:

[FUNC] schedule
lib/percpu-refcount.c, 222:
        schedule in __percpu_ref_switch_mode
lib/percpu-refcount.c, 339:
        __percpu_ref_switch_mode in percpu_ref_kill_and_confirm
./include/linux/percpu-refcount.h, 127:
        percpu_ref_kill_and_confirm in percpu_ref_kill
mm/backing-dev.c, 545:
        percpu_ref_kill in cgwb_kill
mm/backing-dev.c, 576:
        cgwb_kill in cgwb_create
mm/backing-dev.c, 573:
        _raw_spin_lock_irqsave in cgwb_create

This bug is found by my static analysis tool (DSAC-2) and checked by my
code review.
I disagree with your code review.

         * If the previous ATOMIC switching hasn't finished yet, wait for
         * its completion.  If the caller ensures that ATOMIC switching
         * isn't in progress, this function can be called from any context.

I believe cgwb_kill is always called under the spinlock, so we will never
sleep because the percpu ref will never be switching to atomic mode.
You are right that the sleep under spinlock never happens. And the reason
is that percpu_ref_kill() never results in blocking - it does call
percpu_ref_kill_and_confirm() but the 'confirm' argument is NULL and thus
even percpu_ref_kill_and_confirm() never blocks.

								Honza
-- 
Jan Kara [off-list ref]
SUSE Labs, CR
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help