* [PATCH] Revert "spi/doc: spi_master_put must be followed up by kfree" @ 2012-09-03 20:26 Guenter Roeck 2012-09-04 7:25 ` Uwe Kleine-König 2015-09-06 0:09 ` Applied "spi: Fix documentation of spi_alloc_master()" to the spi tree Mark Brown 0 siblings, 2 replies; 4+ messages in thread From: Guenter Roeck @ 2012-09-03 20:26 UTC (permalink / raw) To: spi-devel-general Cc: linux-kernel, Grant Likely, Mark Brown, Guenter Roeck, Uwe Kleine-Koenig Actually, spi_master_put() after spi_alloc_master() must _not_ be followed by kfree(). The memory is already freed with the call to spi_master_put() through spi_master_class, which registers a release function. Calling both spi_master_put() and kfree() results in often nasty (and delayed) crashes elsewhere in the kernel, often in the networking stack. This reverts commit eb4af0f5349235df2e4a5057a72fc8962d00308a. Cc: Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> Signed-off-by: Guenter Roeck <linux@roeck-us.net> --- drivers/spi/spi.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 2d9b5bb..6470750 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1082,8 +1082,7 @@ static struct class spi_master_class = { * * The caller is responsible for assigning the bus number and initializing * the master's methods before calling spi_register_master(); and (after errors - * adding the device) calling spi_master_put() and kfree() to prevent a memory - * leak. + * adding the device) calling spi_master_put() to prevent a memory leak. */ struct spi_master *spi_alloc_master(struct device *dev, unsigned size) { -- 1.7.9.7 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] Revert "spi/doc: spi_master_put must be followed up by kfree" 2012-09-03 20:26 [PATCH] Revert "spi/doc: spi_master_put must be followed up by kfree" Guenter Roeck @ 2012-09-04 7:25 ` Uwe Kleine-König 2012-09-04 11:57 ` Guenter Roeck 2015-09-06 0:09 ` Applied "spi: Fix documentation of spi_alloc_master()" to the spi tree Mark Brown 1 sibling, 1 reply; 4+ messages in thread From: Uwe Kleine-König @ 2012-09-04 7:25 UTC (permalink / raw) To: Guenter Roeck Cc: spi-devel-general, linux-kernel, Grant Likely, Mark Brown, kernel On Mon, Sep 03, 2012 at 01:26:26PM -0700, Guenter Roeck wrote: > Actually, spi_master_put() after spi_alloc_master() must _not_ be followed > by kfree(). The memory is already freed with the call to spi_master_put() > through spi_master_class, which registers a release function. Calling both > spi_master_put() and kfree() results in often nasty (and delayed) crashes > elsewhere in the kernel, often in the networking stack. > > This reverts commit eb4af0f5349235df2e4a5057a72fc8962d00308a. > > Cc: Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> > Signed-off-by: Guenter Roeck <linux@roeck-us.net> I didn't check the callback, but I introduced eb4af0f5349235df2e4a5057a72fc8962d00308a because I saw the kfree in drivers/spi/spi-imx.c. So I guess this needs fixing, too?! Best regards Uwe > --- > drivers/spi/spi.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c > index 2d9b5bb..6470750 100644 > --- a/drivers/spi/spi.c > +++ b/drivers/spi/spi.c > @@ -1082,8 +1082,7 @@ static struct class spi_master_class = { > * > * The caller is responsible for assigning the bus number and initializing > * the master's methods before calling spi_register_master(); and (after errors > - * adding the device) calling spi_master_put() and kfree() to prevent a memory > - * leak. > + * adding the device) calling spi_master_put() to prevent a memory leak. > */ > struct spi_master *spi_alloc_master(struct device *dev, unsigned size) > { -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ | ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Revert "spi/doc: spi_master_put must be followed up by kfree" 2012-09-04 7:25 ` Uwe Kleine-König @ 2012-09-04 11:57 ` Guenter Roeck 0 siblings, 0 replies; 4+ messages in thread From: Guenter Roeck @ 2012-09-04 11:57 UTC (permalink / raw) To: Uwe Kleine-König Cc: spi-devel-general, linux-kernel, Grant Likely, Mark Brown, kernel On Tue, Sep 04, 2012 at 09:25:23AM +0200, Uwe Kleine-König wrote: > On Mon, Sep 03, 2012 at 01:26:26PM -0700, Guenter Roeck wrote: > > Actually, spi_master_put() after spi_alloc_master() must _not_ be followed > > by kfree(). The memory is already freed with the call to spi_master_put() > > through spi_master_class, which registers a release function. Calling both > > spi_master_put() and kfree() results in often nasty (and delayed) crashes > > elsewhere in the kernel, often in the networking stack. > > > > This reverts commit eb4af0f5349235df2e4a5057a72fc8962d00308a. > > > > Cc: Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> > > Signed-off-by: Guenter Roeck <linux@roeck-us.net> > I didn't check the callback, but I introduced > eb4af0f5349235df2e4a5057a72fc8962d00308a because I saw the kfree in > drivers/spi/spi-imx.c. So I guess this needs fixing, too?! > This is a bitbang driver, which is one of the tricky ones which I have not touched yet. That driver calls spi_alloc_master spi_master_get .. error: spi_master_put kfree which works out fine, since there are two references to master (one from spi_alloc_master and one from spi_master_put). Calling spi_master_put twice would be cleaner, of course, but one can not have everything and at least nothing bad will happen. Other bitbang drivers are problematic, though. For example, looking at spi-altera.c: hw->bitbang.master = spi_master_get(master); if (!hw->bitbang.master) return err; That error case should never happen, but if it does the return would leave master unreleased. In practice it is not necessary to check the return code here since it will only be NULL if master is NULL. exit: spi_master_put(master); return err; So this driver calls spi_alloc_master and spi_master_get, but only calls spi_master_put once in the error path, meaning one reference is left and master will not be freed. Given the context, it should really be spi_master_put(hw->bitbang.master); spi_master_put(master); return err; This is just an example. spi-ath79.c and spi-au1550.c are wrong as well, and many others. The issue really is that one must keep track of the number of references to master, and many drivers don't get that right. Bitbang drivers usually call spi_master_get() to get an additional reference to master, and thus must call spi_master_put twice (or spi_master_put/kfree) in the error path. Non-bitbang drivers don't call spi_master_get() and thus don't need the additional call to spi_master_put (or kfree). Guenter ^ permalink raw reply [flat|nested] 4+ messages in thread
* Applied "spi: Fix documentation of spi_alloc_master()" to the spi tree 2012-09-03 20:26 [PATCH] Revert "spi/doc: spi_master_put must be followed up by kfree" Guenter Roeck 2012-09-04 7:25 ` Uwe Kleine-König @ 2015-09-06 0:09 ` Mark Brown 1 sibling, 0 replies; 4+ messages in thread From: Mark Brown @ 2015-09-06 0:09 UTC (permalink / raw) To: Guenter Roeck, Alexey Klimov, Mark Brown, stable; +Cc: linux-spi The patch spi: Fix documentation of spi_alloc_master() has been applied to the spi tree at git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted. You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed. If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced. Please add any relevant lists and maintainers to the CCs when replying to this mail. Thanks, Mark >From a394d635193b641f2c86ead5ada5b115d57c51f8 Mon Sep 17 00:00:00 2001 From: Guenter Roeck <linux@roeck-us.net> Date: Sun, 6 Sep 2015 01:46:54 +0300 Subject: [PATCH] spi: Fix documentation of spi_alloc_master() Actually, spi_master_put() after spi_alloc_master() must _not_ be followed by kfree(). The memory is already freed with the call to spi_master_put() through spi_master_class, which registers a release function. Calling both spi_master_put() and kfree() results in often nasty (and delayed) crashes elsewhere in the kernel, often in the networking stack. This reverts commit eb4af0f5349235df2e4a5057a72fc8962d00308a. Link to patch and concerns: https://lkml.org/lkml/2012/9/3/269 or http://lkml.iu.edu/hypermail/linux/kernel/1209.0/00790.html Alexey Klimov: This revert becomes valid after 94c69f765f1b4a658d96905ec59928e3e3e07e6a when spi-imx.c has been fixed and there is no need to call kfree() so comment for spi_alloc_master() should be fixed. Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Alexey Klimov <alexey.klimov@linaro.org> Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org --- drivers/spi/spi.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index cf8b91b23a76..9ce2f156d382 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1437,8 +1437,7 @@ static struct class spi_master_class = { * * The caller is responsible for assigning the bus number and initializing * the master's methods before calling spi_register_master(); and (after errors - * adding the device) calling spi_master_put() and kfree() to prevent a memory - * leak. + * adding the device) calling spi_master_put() to prevent a memory leak. */ struct spi_master *spi_alloc_master(struct device *dev, unsigned size) { -- 2.5.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-09-06 0:09 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-09-03 20:26 [PATCH] Revert "spi/doc: spi_master_put must be followed up by kfree" Guenter Roeck 2012-09-04 7:25 ` Uwe Kleine-König 2012-09-04 11:57 ` Guenter Roeck 2015-09-06 0:09 ` Applied "spi: Fix documentation of spi_alloc_master()" to the spi tree Mark Brown
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).