dell-laptop: Fix allocating & freeing SMI buffer page
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> Cc: stable@vger.kernel.org Signed-off-by: Darren Hart <dvhart@linux.intel.com>
This commit is contained in:
Родитель
2e19f93fec
Коммит
b8830a4e71
|
@ -306,7 +306,6 @@ static const struct dmi_system_id dell_quirks[] __initconst = {
|
||||||
};
|
};
|
||||||
|
|
||||||
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;
|
||||||
|
@ -2068,12 +2067,11 @@ 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) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto fail_buffer;
|
goto fail_buffer;
|
||||||
}
|
}
|
||||||
buffer = page_address(bufferpage);
|
|
||||||
|
|
||||||
ret = dell_setup_rfkill();
|
ret = dell_setup_rfkill();
|
||||||
|
|
||||||
|
@ -2135,7 +2133,7 @@ static int __init dell_init(void)
|
||||||
fail_backlight:
|
fail_backlight:
|
||||||
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:
|
||||||
|
|
Загрузка…
Ссылка в новой задаче