]>
Commit | Line | Data |
---|---|---|
59e997d5 GKH |
1 | From 11e504cc705e8ccb06ac93a276e11b5e8fee4d40 Mon Sep 17 00:00:00 2001 |
2 | From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> | |
3 | Date: Sun, 3 Aug 2014 19:59:35 +0900 | |
4 | Subject: drm/ttm: Fix possible division by 0 in ttm_dma_pool_shrink_scan(). | |
5 | ||
6 | From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> | |
7 | ||
8 | commit 11e504cc705e8ccb06ac93a276e11b5e8fee4d40 upstream. | |
9 | ||
10 | list_empty(&_manager->pools) being false before taking _manager->lock | |
11 | does not guarantee that _manager->npools != 0 after taking _manager->lock | |
12 | because _manager->npools is updated under _manager->lock. | |
13 | ||
14 | Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> | |
15 | Signed-off-by: Dave Airlie <airlied@redhat.com> | |
16 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
17 | ||
18 | --- | |
19 | drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 3 +++ | |
20 | 1 file changed, 3 insertions(+) | |
21 | ||
22 | --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | |
23 | +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | |
24 | @@ -1016,6 +1016,8 @@ static int ttm_dma_pool_mm_shrink(struct | |
25 | return 0; | |
26 | ||
27 | mutex_lock(&_manager->lock); | |
28 | + if (!_manager->npools) | |
29 | + goto out; | |
30 | pool_offset = pool_offset % _manager->npools; | |
31 | list_for_each_entry(p, &_manager->pools, pools) { | |
32 | unsigned nr_free; | |
33 | @@ -1033,6 +1035,7 @@ static int ttm_dma_pool_mm_shrink(struct | |
34 | p->pool->dev_name, p->pool->name, current->pid, | |
35 | nr_free, shrink_pages); | |
36 | } | |
37 | +out: | |
38 | mutex_unlock(&_manager->lock); | |
39 | /* return estimated number of unused pages in pool */ | |
40 | return ttm_dma_pool_get_num_unused_pages(); |