mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
dell-laptop: Fix allocating & freeing SMI buffer page
commit b8830a4e71b15d0364ac8e6c55301eea73f211da upstream. This commit fix kernel crash when probing for rfkill devices in dell-laptop driver failed. Function free_page() was incorrectly used on struct page * instead of virtual address of SMI buffer. This commit also simplify allocating page for SMI buffer by using __get_free_page() function instead of sequential call of functions alloc_page() and page_address(). Signed-off-by: Pali Rohár <pali.rohar@gmail.com> Acked-by: Michal Hocko <mhocko@suse.cz> Signed-off-by: Darren Hart <dvhart@linux.intel.com> [lizf: Backported to 3.4: adjust context] Signed-off-by: Zefan Li <lizefan@huawei.com>
This commit is contained in:
parent
019db118fe
commit
800e58ae21
1 changed files with 3 additions and 5 deletions
|
@ -216,7 +216,6 @@ static struct dmi_system_id __devinitdata dell_quirks[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct calling_interface_buffer *buffer;
|
static struct calling_interface_buffer *buffer;
|
||||||
static struct page *bufferpage;
|
|
||||||
static DEFINE_MUTEX(buffer_mutex);
|
static DEFINE_MUTEX(buffer_mutex);
|
||||||
|
|
||||||
static int hwswitch_state;
|
static int hwswitch_state;
|
||||||
|
@ -714,11 +713,10 @@ static int __init dell_init(void)
|
||||||
* Allocate buffer below 4GB for SMI data--only 32-bit physical addr
|
* Allocate buffer below 4GB for SMI data--only 32-bit physical addr
|
||||||
* is passed to SMI handler.
|
* is passed to SMI handler.
|
||||||
*/
|
*/
|
||||||
bufferpage = alloc_page(GFP_KERNEL | GFP_DMA32);
|
buffer = (void *)__get_free_page(GFP_KERNEL | GFP_DMA32);
|
||||||
|
|
||||||
if (!bufferpage)
|
if (!buffer)
|
||||||
goto fail_buffer;
|
goto fail_buffer;
|
||||||
buffer = page_address(bufferpage);
|
|
||||||
|
|
||||||
ret = dell_setup_rfkill();
|
ret = dell_setup_rfkill();
|
||||||
|
|
||||||
|
@ -787,7 +785,7 @@ fail_backlight:
|
||||||
fail_filter:
|
fail_filter:
|
||||||
dell_cleanup_rfkill();
|
dell_cleanup_rfkill();
|
||||||
fail_rfkill:
|
fail_rfkill:
|
||||||
free_page((unsigned long)bufferpage);
|
free_page((unsigned long)buffer);
|
||||||
fail_buffer:
|
fail_buffer:
|
||||||
platform_device_del(platform_device);
|
platform_device_del(platform_device);
|
||||||
fail_platform_device2:
|
fail_platform_device2:
|
||||||
|
|
Loading…
Reference in a new issue