brcm2708: update linux 4.4 patches to latest version
[openwrt.git] / target / linux / brcm2708 / patches-4.4 / 0093-drm-vc4-bo-cache-locking-fixes.patch
1 From edb828d91374e8fa4f05d68be008c40d4f9a158d Mon Sep 17 00:00:00 2001
2 From: Eric Anholt <eric@anholt.net>
3 Date: Mon, 19 Oct 2015 08:23:18 -0700
4 Subject: [PATCH 093/170] drm/vc4: bo cache locking fixes.
5
6 Signed-off-by: Eric Anholt <eric@anholt.net>
7 ---
8  drivers/gpu/drm/vc4/vc4_bo.c  | 32 ++++++++++++++++++--------------
9  drivers/gpu/drm/vc4/vc4_drv.h |  2 +-
10  2 files changed, 19 insertions(+), 15 deletions(-)
11
12 --- a/drivers/gpu/drm/vc4/vc4_bo.c
13 +++ b/drivers/gpu/drm/vc4/vc4_bo.c
14 @@ -112,14 +112,14 @@ void vc4_bo_cache_purge(struct drm_devic
15  {
16         struct vc4_dev *vc4 = to_vc4_dev(dev);
17  
18 -       spin_lock(&vc4->bo_lock);
19 +       mutex_lock(&vc4->bo_lock);
20         while (!list_empty(&vc4->bo_cache.time_list)) {
21                 struct vc4_bo *bo = list_last_entry(&vc4->bo_cache.time_list,
22                                                     struct vc4_bo, unref_head);
23                 vc4_bo_remove_from_cache(bo);
24                 vc4_bo_destroy(bo);
25         }
26 -       spin_unlock(&vc4->bo_lock);
27 +       mutex_unlock(&vc4->bo_lock);
28  }
29  
30  struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t unaligned_size)
31 @@ -134,18 +134,18 @@ struct vc4_bo *vc4_bo_create(struct drm_
32                 return NULL;
33  
34         /* First, try to get a vc4_bo from the kernel BO cache. */
35 -       spin_lock(&vc4->bo_lock);
36 +       mutex_lock(&vc4->bo_lock);
37         if (page_index < vc4->bo_cache.size_list_size &&
38             !list_empty(&vc4->bo_cache.size_list[page_index])) {
39                 struct vc4_bo *bo =
40                         list_first_entry(&vc4->bo_cache.size_list[page_index],
41                                          struct vc4_bo, size_head);
42                 vc4_bo_remove_from_cache(bo);
43 -               spin_unlock(&vc4->bo_lock);
44 +               mutex_unlock(&vc4->bo_lock);
45                 kref_init(&bo->base.base.refcount);
46                 return bo;
47         }
48 -       spin_unlock(&vc4->bo_lock);
49 +       mutex_unlock(&vc4->bo_lock);
50  
51         /* Otherwise, make a new BO. */
52         for (pass = 0; ; pass++) {
53 @@ -215,7 +215,7 @@ vc4_bo_cache_free_old(struct drm_device
54         struct vc4_dev *vc4 = to_vc4_dev(dev);
55         unsigned long expire_time = jiffies - msecs_to_jiffies(1000);
56  
57 -       spin_lock(&vc4->bo_lock);
58 +       mutex_lock(&vc4->bo_lock);
59         while (!list_empty(&vc4->bo_cache.time_list)) {
60                 struct vc4_bo *bo = list_last_entry(&vc4->bo_cache.time_list,
61                                                     struct vc4_bo, unref_head);
62 @@ -223,14 +223,14 @@ vc4_bo_cache_free_old(struct drm_device
63                         mod_timer(&vc4->bo_cache.time_timer,
64                                   round_jiffies_up(jiffies +
65                                                    msecs_to_jiffies(1000)));
66 -                       spin_unlock(&vc4->bo_lock);
67 +                       mutex_unlock(&vc4->bo_lock);
68                         return;
69                 }
70  
71                 vc4_bo_remove_from_cache(bo);
72                 vc4_bo_destroy(bo);
73         }
74 -       spin_unlock(&vc4->bo_lock);
75 +       mutex_unlock(&vc4->bo_lock);
76  }
77  
78  /* Called on the last userspace/kernel unreference of the BO.  Returns
79 @@ -248,21 +248,25 @@ void vc4_free_object(struct drm_gem_obje
80         /* If the object references someone else's memory, we can't cache it.
81          */
82         if (gem_bo->import_attach) {
83 +               mutex_lock(&vc4->bo_lock);
84                 vc4_bo_destroy(bo);
85 +               mutex_unlock(&vc4->bo_lock);
86                 return;
87         }
88  
89         /* Don't cache if it was publicly named. */
90         if (gem_bo->name) {
91 +               mutex_lock(&vc4->bo_lock);
92                 vc4_bo_destroy(bo);
93 +               mutex_unlock(&vc4->bo_lock);
94                 return;
95         }
96  
97 -       spin_lock(&vc4->bo_lock);
98 +       mutex_lock(&vc4->bo_lock);
99         cache_list = vc4_get_cache_list_for_size(dev, gem_bo->size);
100         if (!cache_list) {
101                 vc4_bo_destroy(bo);
102 -               spin_unlock(&vc4->bo_lock);
103 +               mutex_unlock(&vc4->bo_lock);
104                 return;
105         }
106  
107 @@ -278,7 +282,7 @@ void vc4_free_object(struct drm_gem_obje
108  
109         vc4->bo_stats.num_cached++;
110         vc4->bo_stats.size_cached += gem_bo->size;
111 -       spin_unlock(&vc4->bo_lock);
112 +       mutex_unlock(&vc4->bo_lock);
113  
114         vc4_bo_cache_free_old(dev);
115  }
116 @@ -465,7 +469,7 @@ void vc4_bo_cache_init(struct drm_device
117  {
118         struct vc4_dev *vc4 = to_vc4_dev(dev);
119  
120 -       spin_lock_init(&vc4->bo_lock);
121 +       mutex_init(&vc4->bo_lock);
122  
123         INIT_LIST_HEAD(&vc4->bo_cache.time_list);
124  
125 @@ -498,9 +502,9 @@ int vc4_bo_stats_debugfs(struct seq_file
126         struct vc4_dev *vc4 = to_vc4_dev(dev);
127         struct vc4_bo_stats stats;
128  
129 -       spin_lock(&vc4->bo_lock);
130 +       mutex_lock(&vc4->bo_lock);
131         stats = vc4->bo_stats;
132 -       spin_unlock(&vc4->bo_lock);
133 +       mutex_unlock(&vc4->bo_lock);
134  
135         seq_printf(m, "num bos allocated: %d\n", stats.num_allocated);
136         seq_printf(m, "size bos allocated: %dkb\n", stats.size_allocated / 1024);
137 --- a/drivers/gpu/drm/vc4/vc4_drv.h
138 +++ b/drivers/gpu/drm/vc4/vc4_drv.h
139 @@ -49,7 +49,7 @@ struct vc4_dev {
140         } bo_stats;
141  
142         /* Protects bo_cache and the BO stats. */
143 -       spinlock_t bo_lock;
144 +       struct mutex bo_lock;
145  
146         /* Sequence number for the last job queued in job_list.
147          * Starts at 0 (no jobs emitted).