From: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
To: Jonathan Corbet <corbet@lwn.net>
Cc: linux-kernel@vger.kernel.org, Harald Welte <laforge@gnumonks.org>,
JosephChan@via.com.tw, ScottFang@viatech.com.cn,
Deepak Saxena <dsaxena@laptop.org>,
linux-fbdev-devel@lists.sourceforge.net,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH 01/16] [FB] viafb: Fix various resource leaks during module_init()
Date: Thu, 08 Apr 2010 20:22:57 +0200 [thread overview]
Message-ID: <4BBE1F01.5000800@gmx.de> (raw)
In-Reply-To: <1270746946-12467-2-git-send-email-corbet@lwn.net>
Jonathan Corbet schrieb:
> From: Harald Welte <laforge@gnumonks.org>
>
> The current code executed from module_init() in viafb does not have
> proper error checking and [partial] resoure release paths in case
> an error happens half way through driver initialization.
>
> This patch adresses the most obvious of those issues, such as a
> leftover i2c bus if module_init (and thus module load) fails.
>
> [jc: fixed merge conflicts]
> Signed-off-by: Harald Welte <HaraldWelte@viatech.com>
> ---
> drivers/video/via/viafbdev.c | 52 ++++++++++++++++++++++++++++++-----------
> 1 files changed, 38 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
> index 3028e7d..91bfe6d 100644
> --- a/drivers/video/via/viafbdev.c
> +++ b/drivers/video/via/viafbdev.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
> + * Copyright 1998-2009 VIA Technologies, Inc. All Rights Reserved.
> * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
>
> * This program is free software; you can redistribute it and/or
> @@ -1847,7 +1847,7 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
> const struct pci_device_id *ent)
> {
> u32 default_xres, default_yres;
> - int vmode_index;
> + int rc, vmode_index;
> u32 viafb_par_length;
>
> DEBUG_MSG(KERN_INFO "VIAFB PCI Probe!!\n");
> @@ -1862,7 +1862,7 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
> &pdev->dev);
> if (!viafbinfo) {
> printk(KERN_ERR"Could not allocate memory for viafb_info.\n");
> - return -ENODEV;
> + return -ENOMEM;
> }
>
> viaparinfo = (struct viafb_par *)viafbinfo->par;
> @@ -1886,7 +1886,9 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
> viafb_dual_fb = 0;
>
> /* Set up I2C bus stuff */
> - viafb_create_i2c_bus(viaparinfo);
> + rc = viafb_create_i2c_bus(viaparinfo);
> + if (rc)
> + goto out_fb_release;
>
> viafb_init_chip_info(pdev, ent);
> viaparinfo->fbmem = pci_resource_start(pdev, 0);
> @@ -1897,7 +1899,8 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
> viaparinfo->memsize);
> if (!viafbinfo->screen_base) {
> printk(KERN_INFO "ioremap failed\n");
> - return -ENOMEM;
> + rc = -EIO;
I don't know whether this is right (changing the return code) as Andrew
recommend a while ago:
"It should return -ENOMEM rather than -1, but that's minor."
So I did and now I wonder which one is correct?
> + goto out_delete_i2c;
> }
>
> viafbinfo->fix.mmio_start = pci_resource_start(pdev, 1);
> @@ -1988,8 +1991,7 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
> if (!viafbinfo1) {
> printk(KERN_ERR
> "allocate the second framebuffer struct error\n");
> - framebuffer_release(viafbinfo);
> - return -ENOMEM;
rc = -ENOMEM;
is missing?
> + goto out_delete_i2c;
> }
> viaparinfo1 = viafbinfo1->par;
> memcpy(viaparinfo1, viaparinfo, viafb_par_length);
> @@ -2044,21 +2046,26 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
> viaparinfo->depth = fb_get_color_depth(&viafbinfo->var,
> &viafbinfo->fix);
> default_var.activate = FB_ACTIVATE_NOW;
> - fb_alloc_cmap(&viafbinfo->cmap, 256, 0);
> + rc = fb_alloc_cmap(&viafbinfo->cmap, 256, 0);
> + if (rc)
> + goto out_fb1_release;
>
> if (viafb_dual_fb && (viafb_primary_dev == LCD_Device)
> && (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)) {
> - if (register_framebuffer(viafbinfo1) < 0)
> - return -EINVAL;
> + rc = register_framebuffer(viafbinfo1);
> + if (rc)
> + goto out_dealloc_cmap;
> }
> - if (register_framebuffer(viafbinfo) < 0)
> - return -EINVAL;
> + rc = register_framebuffer(viafbinfo);
> + if (rc)
> + goto out_fb1_unreg_lcd_cle266;
>
> if (viafb_dual_fb && ((viafb_primary_dev != LCD_Device)
> || (viaparinfo->chip_info->gfx_chip_name !=
> UNICHROME_CLE266))) {
> - if (register_framebuffer(viafbinfo1) < 0)
> - return -EINVAL;
> + rc = register_framebuffer(viafbinfo1);
> + if (rc)
> + goto out_fb_unreg;
> }
> DEBUG_MSG(KERN_INFO "fb%d: %s frame buffer device %dx%d-%dbpp\n",
> viafbinfo->node, viafbinfo->fix.id, default_var.xres,
> @@ -2067,6 +2074,23 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
> viafb_init_proc(&viaparinfo->shared->proc_entry);
> viafb_init_dac(IGA2);
> return 0;
> +
> +out_fb_unreg:
> + unregister_framebuffer(viafbinfo);
> +out_fb1_unreg_lcd_cle266:
> + if (viafb_dual_fb && (viafb_primary_dev == LCD_Device)
> + && (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266))
> + unregister_framebuffer(viafbinfo1);
> +out_dealloc_cmap:
> + fb_dealloc_cmap(&viafbinfo->cmap);
> +out_fb1_release:
> + if (viafbinfo1)
> + framebuffer_release(viafbinfo1);
> +out_delete_i2c:
> + viafb_delete_i2c_buss(viaparinfo);
> +out_fb_release:
> + framebuffer_release(viafbinfo);
> + return rc;
> }
>
> static void __devexit via_pci_remove(struct pci_dev *pdev)
Otherwise it looks okay.
Thanks,
Florian Tobias Schandinat
next prev parent reply other threads:[~2010-04-08 18:22 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-08 17:15 [RFC] Initial OLPC Viafb merge Jonathan Corbet
2010-04-08 17:15 ` [PATCH 01/16] [FB] viafb: Fix various resource leaks during module_init() Jonathan Corbet
2010-04-08 18:22 ` Florian Tobias Schandinat [this message]
2010-04-09 19:31 ` Jonathan Corbet
2010-04-08 17:15 ` [PATCH 02/16] viafb: use proper pci config API Jonathan Corbet
2010-04-08 18:42 ` Florian Tobias Schandinat
2010-04-09 19:46 ` Jonathan Corbet
2010-04-10 6:41 ` Harald Welte
2010-04-08 17:15 ` [PATCH 03/16] viafb: Unmap the frame buffer on initialization error Jonathan Corbet
2010-04-08 18:55 ` Florian Tobias Schandinat
2010-04-08 17:15 ` [PATCH 04/16] viafb: Retain GEMODE reserved bits Jonathan Corbet
2010-04-09 3:07 ` Florian Tobias Schandinat
2010-04-09 19:59 ` Jonathan Corbet
2010-04-09 20:23 ` Florian Tobias Schandinat
2010-04-09 20:30 ` Jonathan Corbet
2010-04-08 17:15 ` [PATCH 05/16] viafb: Determine type of 2D engine and store it in chip_info Jonathan Corbet
2010-04-09 3:20 ` Florian Tobias Schandinat
2010-04-09 20:11 ` Jonathan Corbet
2010-04-09 20:34 ` Florian Tobias Schandinat
2010-04-18 17:34 ` Jonathan Corbet
2010-04-18 18:00 ` Harald Welte
2010-04-18 18:05 ` Florian Tobias Schandinat
2010-04-08 17:15 ` [PATCH 06/16] viafb: complete support for VX800/VX855 accelerated framebuffer Jonathan Corbet
2010-04-09 4:21 ` Florian Tobias Schandinat
2010-04-09 20:18 ` Jonathan Corbet
2010-04-08 17:15 ` [PATCH 07/16] viafb: Add 1200x900 DCON/LCD panel modes for OLPC XO-1.5 Jonathan Corbet
2010-04-09 21:27 ` Florian Tobias Schandinat
2010-04-18 17:39 ` Jonathan Corbet
2010-04-18 18:24 ` Florian Tobias Schandinat
2010-04-08 17:15 ` [PATCH 08/16] viafb: Do not probe for LVDS/TMDS on " Jonathan Corbet
2010-04-09 21:40 ` Florian Tobias Schandinat
2010-04-10 0:19 ` Jonathan Corbet
2010-04-10 0:42 ` Florian Tobias Schandinat
2010-04-10 0:55 ` Jonathan Corbet
2010-04-10 6:34 ` Harald Welte
2010-04-08 17:15 ` [PATCH 09/16] viafb: rework the I2C support in the VIA framebuffer driver Jonathan Corbet
2010-04-09 22:07 ` Florian Tobias Schandinat
2010-04-08 17:15 ` [PATCH 10/16] suppress verbose debug messages: change printk() to DEBUG_MSG() Jonathan Corbet
2010-04-09 22:09 ` Florian Tobias Schandinat
2010-04-08 17:15 ` [PATCH 11/16] Minimal support for viafb suspend/resume Jonathan Corbet
2010-04-08 17:15 ` [PATCH 12/16] fix register save count, so it matches the restore count Jonathan Corbet
2010-04-08 17:15 ` [PATCH 13/16] VIAFB: Update suspend/resume to selectively restore registers Jonathan Corbet
2010-04-08 17:15 ` [PATCH 14/16] Remove cursor restore hack in viafb Jonathan Corbet
2010-04-08 17:15 ` [PATCH 15/16] viafb: rework suspend/resume Jonathan Corbet
2010-04-08 17:15 ` [PATCH 16/16] viafb: Only suspend/resume on VX855 Jonathan Corbet
2010-04-09 5:43 ` [RFC] Initial OLPC Viafb merge Florian Tobias Schandinat
2010-04-09 18:46 ` Jonathan Corbet
2010-04-09 23:32 ` Florian Tobias Schandinat
2010-04-10 0:27 ` Jonathan Corbet
2010-04-10 1:02 ` Florian Tobias Schandinat
2010-04-10 8:52 ` Bruno Prémont
2010-04-13 3:03 ` Florian Tobias Schandinat
2010-04-21 20:37 ` Jonathan Corbet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BBE1F01.5000800@gmx.de \
--to=florianschandinat@gmx.de \
--cc=JosephChan@via.com.tw \
--cc=ScottFang@viatech.com.cn \
--cc=akpm@linux-foundation.org \
--cc=corbet@lwn.net \
--cc=dsaxena@laptop.org \
--cc=laforge@gnumonks.org \
--cc=linux-fbdev-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.