From: Alex Chiang <achiang@hp.com>
To: yakui_zhao <yakui.zhao@intel.com>
Cc: lenb@kernel.org, linux-acpi@vger.kernel.org
Subject: Re: [PATCH]: ACPI: Add the reference count to avoid unloading ACPI video bus twice
Date: Tue, 16 Jun 2009 08:50:58 -0600 [thread overview]
Message-ID: <20090616145058.GA18154@ldl.fc.hp.com> (raw)
In-Reply-To: <1245122593.3583.117.camel@localhost.localdomain>
Hi Yakui,
* yakui_zhao <yakui.zhao@intel.com>:
> From: Zhao Yakui <yakui.zhao@intel.com>
>
> Sometimes both acpi video and i915 driver are compiled as modules.
> And there exists the strict dependency between the two drivers.
> The acpi video bus will be unloaded in course of unloading the i915 driver.
> If we unload the acpi video driver, then the kernel oops will be triggered.
>
> Add the reference count to avoid unloading the ACPI video bus twice.
> The reference count should be checked before unregistering the acpi video bus.
> If the reference count is already zero, it won't unregister it again.
> And after the acpi video bus is already unregistered, the reference count
> will be set to zero.
Your implementation below isn't really a reference count, so I
don't think you should call it that in your changelog.
Since you are talking about refcounts, have you tried using
try_module_get()?
Thanks.
/ac
>
> http://bugzilla.kernel.org/show_bug.cgi?id=13396
>
> Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
> ---
> drivers/acpi/video.c | 41 +++++++++++++++++++++++++++++------
> drivers/gpu/drm/i915/i915_opregion.c | 2 -
> include/acpi/video.h | 4 +--
> 3 files changed, 38 insertions(+), 9 deletions(-)
>
> Index: linux-2.6/drivers/acpi/video.c
> ===================================================================
> --- linux-2.6.orig/drivers/acpi/video.c 2009-06-16 10:25:12.000000000 +0800
> +++ linux-2.6/drivers/acpi/video.c 2009-06-16 11:09:57.000000000 +0800
> @@ -76,6 +76,7 @@
> static int brightness_switch_enabled = 1;
> module_param(brightness_switch_enabled, bool, 0644);
>
> +static int register_count = 0;
> static int acpi_video_bus_add(struct acpi_device *device);
> static int acpi_video_bus_remove(struct acpi_device *device, int type);
> static int acpi_video_resume(struct acpi_device *device);
> @@ -2318,6 +2319,13 @@
> int acpi_video_register(void)
> {
> int result = 0;
> + if (register_count) {
> + /*
> + * if the function of acpi_video_register is already called,
> + * don't register the acpi_vide_bus again and return no error.
> + */
> + return 0;
> + }
>
> acpi_video_dir = proc_mkdir(ACPI_VIDEO_CLASS, acpi_root_dir);
> if (!acpi_video_dir)
> @@ -2329,10 +2337,35 @@
> return -ENODEV;
> }
>
> + /*
> + * When the acpi_video_bus is loaded successfully, increase
> + * the counter reference.
> + */
> + register_count = 1;
> +
> return 0;
> }
> EXPORT_SYMBOL(acpi_video_register);
>
> +void acpi_video_unregister(void)
> +{
> + if (!register_count) {
> + /*
> + * If the acpi video bus is already unloaded, don't
> + * unload it again and return directly.
> + */
> + return;
> + }
> + acpi_bus_unregister_driver(&acpi_video_bus);
> +
> + remove_proc_entry(ACPI_VIDEO_CLASS, acpi_root_dir);
> +
> + register_count = 0;
> +
> + return;
> +}
> +EXPORT_SYMBOL(acpi_video_unregister);
> +
> /*
> * This is kind of nasty. Hardware using Intel chipsets may require
> * the video opregion code to be run first in order to initialise
> @@ -2350,16 +2383,12 @@
> return acpi_video_register();
> }
>
> -void acpi_video_exit(void)
> +static void __exit acpi_video_exit(void)
> {
> -
> - acpi_bus_unregister_driver(&acpi_video_bus);
> -
> - remove_proc_entry(ACPI_VIDEO_CLASS, acpi_root_dir);
> + acpi_video_unregister();
>
> return;
> }
> -EXPORT_SYMBOL(acpi_video_exit);
>
> module_init(acpi_video_init);
> module_exit(acpi_video_exit);
> Index: linux-2.6/drivers/gpu/drm/i915/i915_opregion.c
> ===================================================================
> --- linux-2.6.orig/drivers/gpu/drm/i915/i915_opregion.c 2009-06-16 10:25:12.000000000 +0800
> +++ linux-2.6/drivers/gpu/drm/i915/i915_opregion.c 2009-06-16 10:29:50.000000000 +0800
> @@ -419,7 +419,7 @@
> return;
>
> if (!suspend)
> - acpi_video_exit();
> + acpi_video_unregister();
>
> opregion->acpi->drdy = 0;
>
> Index: linux-2.6/include/acpi/video.h
> ===================================================================
> --- linux-2.6.orig/include/acpi/video.h 2009-06-16 10:25:12.000000000 +0800
> +++ linux-2.6/include/acpi/video.h 2009-06-16 11:07:43.000000000 +0800
> @@ -3,10 +3,10 @@
>
> #if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
> extern int acpi_video_register(void);
> -extern int acpi_video_exit(void);
> +extern void acpi_video_unregister(void);
> #else
> static inline int acpi_video_register(void) { return 0; }
> -static inline void acpi_video_exit(void) { return; }
> +static inline void acpi_video_unregister(void) { return; }
> #endif
>
> #endif
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2009-06-16 14:50 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-16 3:23 [PATCH]: ACPI: Add the reference count to avoid unloading ACPI video bus twice yakui_zhao
2009-06-16 14:50 ` Alex Chiang [this message]
2009-06-17 3:09 ` yakui_zhao
2009-06-24 3:36 ` Zhang Rui
-- strict thread matches above, loose matches on Subject: below --
2009-06-12 0:51 yakui_zhao
2009-06-01 5:44 yakui_zhao
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=20090616145058.GA18154@ldl.fc.hp.com \
--to=achiang@hp.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=yakui.zhao@intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox