Messages in this thread | | | From | "Liu, Chuansheng" <> | Subject | RE: [PATCH] devres: Freeing the drs after all release() are called | Date | Thu, 7 Nov 2013 00:36:56 +0000 |
| |
> -----Original Message----- > From: Tejun Heo [mailto:htejun@gmail.com] On Behalf Of tj@kernel.org > Sent: Thursday, November 07, 2013 8:30 AM > To: Liu, Chuansheng > Cc: Greg KH; dmitry.torokhov@gmail.com; linux-kernel@vger.kernel.org > Subject: Re: [PATCH] devres: Freeing the drs after all release() are called > > Hello, Liu. > > On Thu, Nov 07, 2013 at 12:27:56AM +0000, Liu, Chuansheng wrote: > > The driver code is as below: > > _INIT() { > > > > A = devm_kzalloc(); > > B= devm_request_threaded_irq(isr_handler); > > C = devm_kzalloc(); > > } > > > > When driver _EXIT, the devres_release_all () will be called. > > The C will be kfreed before B, but when freeing irq B, the pending isr_handler() > possibly > > will access the memory B which has been freed. > > Then the memory corruption occurred. > > > > This patch can solve this scenario. > > Isn't the bug there IRQ being requested before all its resources are > allocated? The proposed change just masks the underlying issue or > incorrectly ordered operations. Yes, I knew I can put the code always like below: A = devm_kzalloc(); C = devm_kzalloc(); ... B= devm_request_threaded_irq(isr_handler);
But, the above is just one simple coding prototype, if there are many calling: E -- > F -- > D -- >... then to devm_kzalloc().
To be honest, it will make code too hard to always adapt the rule? And I trying to find out every potential devm_kzalloc() before irq requesting.
| |