Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932502AbXB0AwL (ORCPT ); Mon, 26 Feb 2007 19:52:11 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932560AbXB0AwL (ORCPT ); Mon, 26 Feb 2007 19:52:11 -0500 Received: from ns.suse.de ([195.135.220.2]:34387 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932502AbXB0AwJ (ORCPT ); Mon, 26 Feb 2007 19:52:09 -0500 Subject: patch platform-reorder-platform_device_del.patch added to gregkh-2.6 tree To: khali@linux-fr.org, dmitry.torokhov@gmail.com, gregkh@suse.de, linux-kernel@vger.kernel.org From: Date: Mon, 26 Feb 2007 16:50:48 -0800 In-Reply-To: <20070220225506.ab3c66aa.khali@linux-fr.org> Message-Id: <20070227005200.48F67C3598B@imap.suse.de> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3822 Lines: 100 This is a note to let you know that I've just added the patch titled Subject: platform: reorder platform_device_del to my gregkh-2.6 tree. Its filename is platform-reorder-platform_device_del.patch This tree can be found at http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/ >From khali@linux-fr.org Tue Feb 20 13:55:29 2007 From: Jean Delvare Date: Tue, 20 Feb 2007 22:55:06 +0100 Subject: platform: reorder platform_device_del To: "Dmitry Torokhov" Cc: "Greg Kroah-Hartman" , LKML Message-ID: <20070220225506.ab3c66aa.khali@linux-fr.org> In platform_device_del(), we currently delete the device resources first, then we delete the device itself. This causes a (minor) bug to occur when one unregisters a platform device before unregistering its platform driver, and the driver is requesting (in .probe()) and releasing (in .remove()) a resource of the device. The device resources are already gone by the time the driver gets the chance to release the resources it had been requesting, causing an error like: Trying to free nonexistent resource <0000000000000295-0000000000000296> If the platform driver is unregistered first, the problem doesn't occur, as the driver will have the opportunity to release the resources it had requested before the device resources themselves are released. It's a bit odd that unregistering the driver first or the device first doesn't lead to the same result. So I believe that we should delete the device first in platform_device_del(). I've searched the git history and found that it used to be the case before 2.6.8, but was changed here: http://www.kernel.org/git/?p=linux/kernel/git/torvalds/old-2.6-bkcvs.git;a=commitdiff;h=96ef7b3689936ee1e64b711511342026a8ce459c > 2004/07/14 16:09:44-07:00 dtor_core > [PATCH] Driver core: Fix OOPS in device_platform_unregister > > Driver core: platform_device_unregister should release resources first > and only then call device_unregister, otherwise if there > are no more references to the device it will be freed and > the fucntion will try to access freed memory. However we now have an explicit call to put_device() at the end of platform_device_unregister() so I guess the original problem no longer exists and it is safe to revert that change. Signed-off-by: Jean Delvare Cc: Dmitry Torokhov Signed-off-by: Greg Kroah-Hartman --- drivers/base/platform.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) --- gregkh-2.6.orig/drivers/base/platform.c +++ gregkh-2.6/drivers/base/platform.c @@ -292,20 +292,22 @@ EXPORT_SYMBOL_GPL(platform_device_add); * @pdev: platform device we're removing * * Note that this function will also release all memory- and port-based - * resources owned by the device (@dev->resource). + * resources owned by the device (@dev->resource). This function + * must _only_ be externally called in error cases. All other usage + * is a bug. */ void platform_device_del(struct platform_device *pdev) { int i; if (pdev) { + device_del(&pdev->dev); + for (i = 0; i < pdev->num_resources; i++) { struct resource *r = &pdev->resource[i]; if (r->flags & (IORESOURCE_MEM|IORESOURCE_IO)) release_resource(r); } - - device_del(&pdev->dev); } } EXPORT_SYMBOL_GPL(platform_device_del); Patches currently in gregkh-2.6 which might be from khali@linux-fr.org are - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/