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:
parent
2e19f93fec
commit
b8830a4e71
|
@ -306,7 +306,6 @@ static const struct dmi_system_id dell_quirks[] __initconst = {
|
|||
};
|
||||
|
||||
static struct calling_interface_buffer *buffer;
|
||||
static struct page *bufferpage;
|
||||
static DEFINE_MUTEX(buffer_mutex);
|
||||
|
||||
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
|
||||
* is passed to SMI handler.
|
||||
*/
|
||||
bufferpage = alloc_page(GFP_KERNEL | GFP_DMA32);
|
||||
if (!bufferpage) {
|
||||
buffer = (void *)__get_free_page(GFP_KERNEL | GFP_DMA32);
|
||||
if (!buffer) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_buffer;
|
||||
}
|
||||
buffer = page_address(bufferpage);
|
||||
|
||||
ret = dell_setup_rfkill();
|
||||
|
||||
|
@ -2135,7 +2133,7 @@ static int __init dell_init(void)
|
|||
fail_backlight:
|
||||
dell_cleanup_rfkill();
|
||||
fail_rfkill:
|
||||
free_page((unsigned long)bufferpage);
|
||||
free_page((unsigned long)buffer);
|
||||
fail_buffer:
|
||||
platform_device_del(platform_device);
|
||||
fail_platform_device2:
|
||||
|
|
Loading…
Reference in New Issue