• J
    thermal: core: move tz->device.groups cleanup to thermal_release · f53345e8
    Jacob von Chorus 提交于
    The device_unregister call in thermal_zone_device_unregister causes the
    thermal_zone_device structure to be freed before the call to free the
    dynamically allocated attribute groups. This leads to a kernel panic.
    
    Furthermore, the 4 calls to free the trip point attribute structures
    occur before the call to unregister the device, leading to a kernel
    panic when sysfs attempts to access the attributes to remove them.
    
    Here is an example of a kernel panic when the cpu thermal zones are
    removed upon cpu offline:
    BUG: unable to handle kernel NULL pointer dereference at (null)
    IP: strlen+0x0/0x20
    <snip>
    Call Trace:
       ? kernfs_name_hash+0x17/0x80
       kernfs_find_ns+0x3f/0xd0
       kernfs_remove_by_name_ns+0x36/0xa0
       remove_files.isra.1+0x36/0x70
       sysfs_remove_group+0x44/0x90
       sysfs_remove_groups+0x2e/0x50
       device_remove_attrs+0x5e/0x90
       device_del+0x1ea/0x350
       device_unregister+0x1a/0x60
       thermal_zone_device_unregister+0x1f2/0x210
       pkg_thermal_cpu_offline+0x14f/0x1a0 [x86_pkg_temp_thermal]
       ? kzalloc.constprop.2+0x10/0x10 [x86_pkg_temp_thermal]
       cpuhp_invoke_callback+0x8d/0x3f0
       cpuhp_down_callbacks+0x42/0x80
       cpuhp_thread_fun+0x8b/0xf0
       smpboot_thread_fn+0x110/0x160
       kthread+0x101/0x140
       ? sort_range+0x30/0x30
       ? kthread_park+0x90/0x90
       ret_from_fork+0x25/0x30
    
    This patch moves the kfree calls to clean up the dynamic attributes to
    the thermal_class's thermal_zone_device release function.
    
    Cc: Zhang Rui <rui.zhang@intel.com>
    Cc: Eduardo Valentin <edubezval@gmail.com>
    Cc: linux-pm@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Tested-by: NYasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
    Signed-off-by: NJacob von Chorus <jacobvonchorus@cwphoto.ca>
    Signed-off-by: NZhang Rui <rui.zhang@intel.com>
    f53345e8
thermal_core.c 40.3 KB