From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751990Ab3LLXde (ORCPT ); Thu, 12 Dec 2013 18:33:34 -0500 Received: from mail-la0-f47.google.com ([209.85.215.47]:52385 "EHLO mail-la0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751502Ab3LLXdd (ORCPT ); Thu, 12 Dec 2013 18:33:33 -0500 Date: Fri, 13 Dec 2013 02:25:57 +0300 From: Sergey Senozhatsky To: Alex Deucher Cc: David Airlie , Jerome Glisse , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH] radeon_pm: fix oops in hwmon_attributes_visible() and radeon_hwmon_show_temp_thresh() Message-ID: <20131212232557.GA2203@swordfish> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.22 (2013-10-16) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since ec39f64bba radeon_hwmon_init() is using hwmon_device_register_with_groups(), which sets `rdev' as a device private driver_data, while hwmon_attributes_visible() and radeon_hwmon_show_temp_thresh() are still waiting for `drm_device'. fix them by using dev_get_drvdata(): BUG: unable to handle kernel paging request at 0000000000001e28 IP: [] hwmon_attributes_visible+0x18/0x3d [radeon] PGD 15057e067 PUD 151a8e067 PMD 0 Oops: 0000 [#1] PREEMPT SMP Call Trace: [] internal_create_group+0x114/0x1d9 [] sysfs_create_group+0xe/0x10 [] sysfs_create_groups+0x22/0x5f [] device_add+0x34f/0x501 [] device_register+0x15/0x18 [] hwmon_device_register_with_groups+0xb5/0xed [] radeon_hwmon_init+0x56/0x7c [radeon] [] radeon_pm_init+0x134/0x7e5 [radeon] [] ? kmem_cache_alloc+0x63/0xe3 [] radeon_modeset_init+0x75f/0x8ed [radeon] [] radeon_driver_load_kms+0xc6/0x187 [radeon] [] drm_dev_register+0xf9/0x1b4 [drm] [] drm_get_pci_dev+0x98/0x129 [drm] [] ? kfree+0x10a/0x166 [] ? radeon_pci_probe+0x91/0xac [radeon] [] radeon_pci_probe+0xa3/0xac [radeon] [] pci_device_probe+0x6e/0xcf [] driver_probe_device+0x98/0x1c4 [] __driver_attach+0x5c/0x7e [] ? __device_attach+0x38/0x38 [] bus_for_each_dev+0x7b/0x85 [] driver_attach+0x19/0x1b [] bus_add_driver+0x104/0x1ce [] driver_register+0x89/0xc5 [] __pci_register_driver+0x58/0x5b [] ? 0xffffffffa037efff [] drm_pci_init+0x86/0xea [drm] [] ? 0xffffffffa037efff [] radeon_init+0x97/0x1000 [radeon] [] do_one_initcall+0x7f/0x117 [] ? set_memory_nx+0x3b/0x3d [] load_module+0x1583/0x1bb4 [] ? store_uevent+0x35/0x35 [] ? finish_task_switch+0x3b/0x10c [] ? preempt_schedule_irq+0x5d/0x99 [] ? retint_restore_args+0x13/0x13 [] SyS_init_module+0xa0/0xaf [] tracesys+0xd4/0xd9 Signed-off-by: Sergey Senozhatsky --- drivers/gpu/drm/radeon/radeon_pm.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index dc75bb6..984097b 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c @@ -552,8 +552,7 @@ static ssize_t radeon_hwmon_show_temp_thresh(struct device *dev, struct device_attribute *attr, char *buf) { - struct drm_device *ddev = dev_get_drvdata(dev); - struct radeon_device *rdev = ddev->dev_private; + struct radeon_device *rdev = dev_get_drvdata(dev); int hyst = to_sensor_dev_attr(attr)->index; int temp; @@ -580,8 +579,7 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj, struct attribute *attr, int index) { struct device *dev = container_of(kobj, struct device, kobj); - struct drm_device *ddev = dev_get_drvdata(dev); - struct radeon_device *rdev = ddev->dev_private; + struct radeon_device *rdev = dev_get_drvdata(dev); /* Skip limit attributes if DPM is not enabled */ if (rdev->pm.pm_method != PM_METHOD_DPM &&