Thread (2 messages) flat view 2 messages, 2 authors, 2015-08-24

Re: [PATCH] usbnet: Fix two races between usbnet_stop() and the BH

From: Bjørn Mork <bjorn@mork.no>
Date: 2015-08-19 12:31:32
Also in: lkml

Eugene Shatokhin [off-list ref] writes:
The problem is not in the reordering but rather in the fact that
"dev->flags = 0" is not necessarily atomic
w.r.t. "clear_bit(EVENT_RX_KILL, &dev->flags)", and vice versa.

So the following might be possible, although unlikely:

CPU0             CPU1
                 clear_bit: read dev->flags
                 clear_bit: clear EVENT_RX_KILL in the read value

dev->flags=0;

                 clear_bit: write updated dev->flags

As a result, dev->flags may become non-zero again.
Ah, right.  Thanks for explaining.
I cannot prove yet that this is an impossible situation. If anyone
can, please explain. If so, this part of the patch will not be needed.
I wonder if we could simply move the dev->flags = 0 down a few lines to
fix both issues?  It doesn't seem to do anything useful except for
resetting the flags to a sane initial state after the device is down.

Stopping the tasklet rescheduling etc depends only on netif_running(),
which will be false when usbnet_stop is called.  There is no need to
touch dev->flags for this to happen.
quoted
The EVENT_NO_RUNTIME_PM bug should definitely be fixed.  Please split
that out as a separate fix.  It's a separate issue, and should be
backported to all maintained stable releases it applies to (anything
from v3.8 and newer)
Yes, that makes sense. However, this fix was originally provided by
Oliver Neukum rather than me, so I would like to hear his opinion as
well first.
If what I write above is correct (please help me verify...), then maybe
it does make sense to do these together anyway.



Bjørn
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help