diff options
author | Eugeni Dodonov <eugeni.dodonov@intel.com> | 2011-11-10 10:55:15 -0500 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2011-12-16 11:49:56 -0500 |
commit | 4ed0b577457eb6aeb7cdc7e7316576e63d15abb2 (patch) | |
tree | 9ecf2ddc9ff64ce9a10e3e2b8827a9e7e2b34f8f /drivers/gpu/drm/i915/i915_drv.h | |
parent | 03d00ac53f9bcde06ff7e33d6676083c18d569a4 (diff) |
drm/i915: prevent division by zero when asking for chipset power
This prevents an in-kernel division by zero which happens when we are
asking for i915_chipset_val too quickly, or within a race condition
between the power monitoring thread and userspace accesses via debugfs.
The issue can be reproduced easily via the following command:
while ``; do cat /sys/kernel/debug/dri/0/i915_emon_status; done
This is particularly dangerous because it can be triggered by
a non-privileged user by just reading the debugfs entry.
This issue was also found independently by Konstantin Belousov
<kostikbel@gmail.com>, who proposed a similar patch.
Reported-by: Konstantin Belousov <kostikbel@gmail.com>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Acked-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: <stable@vger.kernel.org>
Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.h')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 8ba88cfc36de..39a72f642b33 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -713,6 +713,7 @@ typedef struct drm_i915_private { | |||
713 | 713 | ||
714 | u64 last_count1; | 714 | u64 last_count1; |
715 | unsigned long last_time1; | 715 | unsigned long last_time1; |
716 | unsigned long chipset_power; | ||
716 | u64 last_count2; | 717 | u64 last_count2; |
717 | struct timespec last_time2; | 718 | struct timespec last_time2; |
718 | unsigned long gfx_power; | 719 | unsigned long gfx_power; |