Re: [PATCH net] net: qmi_wwan: fix Oops while disconnecting
From: Ming Lei <tom.leiming@gmail.com>
Date: 2012-06-25 08:08:52
On Mon, Jun 25, 2012 at 3:24 PM, Bjørn Mork [off-list ref] wrote:
True, but irrelevant. The pointer is either valid or NULL. We don't need to care about synchronizing the exact time it is set to NULL. The locking in cdc-wdm will ensure that the pointer is valid while it is in use by .manage_power, because usbnet_disconnect is prevented from continuing with free_netdev() while any caller of .manage_power is running.
What I mean is that the situation is just what moving the set to NULL is doing.
quoted
So it is only the sync mechanism that works on the race even the check is added in the patch. Putting usb_set_intfdata(, NULL) after driver_info->unbind should be OK, and it is a general solution for the problem.There is no problem wrt qmi_wwan and intfdata as long as the NULL test is added to .manage_power.
It depends on the ARCH or compiler. Considered there is not any locking/memory barrier between the set to NULL and read the pointer, also no ACCESS_ONCE on read or store the pointer, reading in .manage_power may see a invalid pointer if the CPU doesn't support Store Atomicity or the compiler does a byte-at-a-time optimization on the store[1]. So why not take the correct way in theory? also it is a general solution, and we can document its usage. [1], Paul mentioned it in the previous discussion http://lkml.org/lkml/2012/6/6/280 Thanks, -- Ming Lei