lkml.org 
[lkml]   [2015]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13.y-ckt 089/132] dell-laptop: Fix allocating & freeing SMI buffer page
    Date
    3.13.11-ckt24 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali.rohar@gmail.com>

    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>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/platform/x86/dell-laptop.c | 8 +++-----
    1 file changed, 3 insertions(+), 5 deletions(-)

    diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
    index c608b1d..eb1b398 100644
    --- a/drivers/platform/x86/dell-laptop.c
    +++ b/drivers/platform/x86/dell-laptop.c
    @@ -272,7 +272,6 @@ static struct dmi_system_id dell_quirks[] = {
    };

    static struct calling_interface_buffer *buffer;
    -static struct page *bufferpage;
    static DEFINE_MUTEX(buffer_mutex);

    static int hwswitch_state;
    @@ -814,12 +813,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();

    @@ -888,7 +886,7 @@ fail_backlight:
    fail_filter:
    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:
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-07-23 04:21    [W:2.796 / U:0.804 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site