Hi,

> Gesendet: Mittwoch, 24. Mai 2017 um 11:06 Uhr
> Von: "Stefan Wahren" <stefan.wah...@i2se.com>
> An: "Lino Sanfilippo" <linosanfili...@gmx.de>, "Rob Herring" 
> <robh...@kernel.org>, "Mark Rutland" <mark.rutl...@arm.com>, "David S. 
> Miller" <da...@davemloft.net>
> Cc: linux-ser...@vger.kernel.org, "Jiri Slaby" <jsl...@suse.com>, "Greg 
> Kroah-Hartman" <gre...@linuxfoundation.org>, netdev@vger.kernel.org, 
> linux-ker...@vger.kernel.org, "Jakub Kicinski" <kubak...@wp.pl>, 
> devicet...@vger.kernel.org
> Betreff: Re: [PATCH v6 net-next 17/17] net: qualcomm: add QCA7000 UART driver
>
> Am 23.05.2017 um 23:01 schrieb Lino Sanfilippo:
> > On 23.05.2017 21:38, Stefan Wahren wrote:
> >>> Lino Sanfilippo <linosanfili...@gmx.de> hat am 23. Mai 2017 um 20:16 
> >>> geschrieben:
> >>>
> >>> I suggest to avoid this possible race by first unregistering the 
> >>> netdevice and then 
> >>> calling cancel_work_sync().
> >> What makes you sure that's safe to unregister the netdev while the tx work 
> >> queue is possibly active?
> > unregister_netdevice() calls netdev_close() if the interface is still up. 
> > netdev_close() calls flush_work()
> > so the unregistration is delayed until the tx work function is finished. 
> > Furthermore both close() and
> > tx work are synchronized by means of the qca->lock which also guarantees 
> > that unregister_netdevice() wont
> > be finished until the tx work is done.
> >
> 
> Thanks for the explanation. I suspect there could be the same race
> between serdev_device_close() and the tx work queue.
> 
> So i would propose a variant of your original suggestion:
> 
> unregister_netdev(qca->net_dev);
> 
> /* Flush any pending characters in the driver. */
> serdev_device_close(serdev);
> cancel_work_sync(&qca->tx_work);
> 
> Since we have the same pattern in the error path of the probe function,
> the same applies there.

Agreed, it is much cleaner to have the same cleanup pattern in remove() as
we have in (error case of) probe().

Regards,
Lino

Reply via email to