aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/omap2/omapfb/omapfb-ioctl.c
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2012-12-13 06:19:05 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2012-12-13 06:19:05 -0500
commit3ed37d9aba486dece93e05d68f691b80ee100900 (patch)
tree3e391eb45694c948c608a9c5ce99bc2cc0b52164 /drivers/video/omap2/omapfb/omapfb-ioctl.c
parentc7e1eae537652330cec3fbf5f8f50000b2f24269 (diff)
Revert "OMAPFB: simplify locking"
This reverts commit b41deecbda70067b26a3a7704fdf967a7940935b. The simpler locking causes huge latencies when two processes use the omapfb, even if they use different framebuffers. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video/omap2/omapfb/omapfb-ioctl.c')
-rw-r--r--drivers/video/omap2/omapfb/omapfb-ioctl.c68
1 files changed, 59 insertions, 9 deletions
diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
index dccb158b0d0b..d30b45d72649 100644
--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
+++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
@@ -85,6 +85,16 @@ static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
85 goto out; 85 goto out;
86 } 86 }
87 87
88 /* Take the locks in a specific order to keep lockdep happy */
89 if (old_rg->id < new_rg->id) {
90 omapfb_get_mem_region(old_rg);
91 omapfb_get_mem_region(new_rg);
92 } else if (new_rg->id < old_rg->id) {
93 omapfb_get_mem_region(new_rg);
94 omapfb_get_mem_region(old_rg);
95 } else
96 omapfb_get_mem_region(old_rg);
97
88 if (pi->enabled && !new_rg->size) { 98 if (pi->enabled && !new_rg->size) {
89 /* 99 /*
90 * This plane's memory was freed, can't enable it 100 * This plane's memory was freed, can't enable it
@@ -136,6 +146,16 @@ static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
136 goto undo; 146 goto undo;
137 } 147 }
138 148
149 /* Release the locks in a specific order to keep lockdep happy */
150 if (old_rg->id > new_rg->id) {
151 omapfb_put_mem_region(old_rg);
152 omapfb_put_mem_region(new_rg);
153 } else if (new_rg->id > old_rg->id) {
154 omapfb_put_mem_region(new_rg);
155 omapfb_put_mem_region(old_rg);
156 } else
157 omapfb_put_mem_region(old_rg);
158
139 return 0; 159 return 0;
140 160
141 undo: 161 undo:
@@ -146,6 +166,15 @@ static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
146 166
147 ovl->set_overlay_info(ovl, &old_info); 167 ovl->set_overlay_info(ovl, &old_info);
148 put_mem: 168 put_mem:
169 /* Release the locks in a specific order to keep lockdep happy */
170 if (old_rg->id > new_rg->id) {
171 omapfb_put_mem_region(old_rg);
172 omapfb_put_mem_region(new_rg);
173 } else if (new_rg->id > old_rg->id) {
174 omapfb_put_mem_region(new_rg);
175 omapfb_put_mem_region(old_rg);
176 } else
177 omapfb_put_mem_region(old_rg);
149 out: 178 out:
150 dev_err(fbdev->dev, "setup_plane failed\n"); 179 dev_err(fbdev->dev, "setup_plane failed\n");
151 180
@@ -195,10 +224,11 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
195 if (display && display->driver->sync) 224 if (display && display->driver->sync)
196 display->driver->sync(display); 225 display->driver->sync(display);
197 226
198 mutex_lock(&fbi->mm_lock);
199
200 rg = ofbi->region; 227 rg = ofbi->region;
201 228
229 down_write_nested(&rg->lock, rg->id);
230 atomic_inc(&rg->lock_count);
231
202 if (rg->size == size && rg->type == mi->type) 232 if (rg->size == size && rg->type == mi->type)
203 goto out; 233 goto out;
204 234
@@ -231,7 +261,9 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
231 } 261 }
232 262
233 out: 263 out:
234 mutex_unlock(&fbi->mm_lock); 264 atomic_dec(&rg->lock_count);
265 up_write(&rg->lock);
266
235 return r; 267 return r;
236} 268}
237 269
@@ -240,12 +272,14 @@ static int omapfb_query_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
240 struct omapfb_info *ofbi = FB2OFB(fbi); 272 struct omapfb_info *ofbi = FB2OFB(fbi);
241 struct omapfb2_mem_region *rg; 273 struct omapfb2_mem_region *rg;
242 274
243 rg = ofbi->region; 275 rg = omapfb_get_mem_region(ofbi->region);
244 memset(mi, 0, sizeof(*mi)); 276 memset(mi, 0, sizeof(*mi));
245 277
246 mi->size = rg->size; 278 mi->size = rg->size;
247 mi->type = rg->type; 279 mi->type = rg->type;
248 280
281 omapfb_put_mem_region(rg);
282
249 return 0; 283 return 0;
250} 284}
251 285
@@ -284,10 +318,14 @@ int omapfb_set_update_mode(struct fb_info *fbi,
284 if (mode != OMAPFB_AUTO_UPDATE && mode != OMAPFB_MANUAL_UPDATE) 318 if (mode != OMAPFB_AUTO_UPDATE && mode != OMAPFB_MANUAL_UPDATE)
285 return -EINVAL; 319 return -EINVAL;
286 320
321 omapfb_lock(fbdev);
322
287 d = get_display_data(fbdev, display); 323 d = get_display_data(fbdev, display);
288 324
289 if (d->update_mode == mode) 325 if (d->update_mode == mode) {
326 omapfb_unlock(fbdev);
290 return 0; 327 return 0;
328 }
291 329
292 r = 0; 330 r = 0;
293 331
@@ -303,6 +341,8 @@ int omapfb_set_update_mode(struct fb_info *fbi,
303 r = -EINVAL; 341 r = -EINVAL;
304 } 342 }
305 343
344 omapfb_unlock(fbdev);
345
306 return r; 346 return r;
307} 347}
308 348
@@ -317,10 +357,14 @@ int omapfb_get_update_mode(struct fb_info *fbi,
317 if (!display) 357 if (!display)
318 return -EINVAL; 358 return -EINVAL;
319 359
360 omapfb_lock(fbdev);
361
320 d = get_display_data(fbdev, display); 362 d = get_display_data(fbdev, display);
321 363
322 *mode = d->update_mode; 364 *mode = d->update_mode;
323 365
366 omapfb_unlock(fbdev);
367
324 return 0; 368 return 0;
325} 369}
326 370
@@ -380,10 +424,13 @@ static int omapfb_set_color_key(struct fb_info *fbi,
380 struct omapfb_color_key *ck) 424 struct omapfb_color_key *ck)
381{ 425{
382 struct omapfb_info *ofbi = FB2OFB(fbi); 426 struct omapfb_info *ofbi = FB2OFB(fbi);
427 struct omapfb2_device *fbdev = ofbi->fbdev;
383 int r; 428 int r;
384 int i; 429 int i;
385 struct omap_overlay_manager *mgr = NULL; 430 struct omap_overlay_manager *mgr = NULL;
386 431
432 omapfb_lock(fbdev);
433
387 for (i = 0; i < ofbi->num_overlays; i++) { 434 for (i = 0; i < ofbi->num_overlays; i++) {
388 if (ofbi->overlays[i]->manager) { 435 if (ofbi->overlays[i]->manager) {
389 mgr = ofbi->overlays[i]->manager; 436 mgr = ofbi->overlays[i]->manager;
@@ -398,6 +445,8 @@ static int omapfb_set_color_key(struct fb_info *fbi,
398 445
399 r = _omapfb_set_color_key(mgr, ck); 446 r = _omapfb_set_color_key(mgr, ck);
400err: 447err:
448 omapfb_unlock(fbdev);
449
401 return r; 450 return r;
402} 451}
403 452
@@ -405,10 +454,13 @@ static int omapfb_get_color_key(struct fb_info *fbi,
405 struct omapfb_color_key *ck) 454 struct omapfb_color_key *ck)
406{ 455{
407 struct omapfb_info *ofbi = FB2OFB(fbi); 456 struct omapfb_info *ofbi = FB2OFB(fbi);
457 struct omapfb2_device *fbdev = ofbi->fbdev;
408 struct omap_overlay_manager *mgr = NULL; 458 struct omap_overlay_manager *mgr = NULL;
409 int r = 0; 459 int r = 0;
410 int i; 460 int i;
411 461
462 omapfb_lock(fbdev);
463
412 for (i = 0; i < ofbi->num_overlays; i++) { 464 for (i = 0; i < ofbi->num_overlays; i++) {
413 if (ofbi->overlays[i]->manager) { 465 if (ofbi->overlays[i]->manager) {
414 mgr = ofbi->overlays[i]->manager; 466 mgr = ofbi->overlays[i]->manager;
@@ -423,6 +475,8 @@ static int omapfb_get_color_key(struct fb_info *fbi,
423 475
424 *ck = omapfb_color_keys[mgr->id]; 476 *ck = omapfb_color_keys[mgr->id];
425err: 477err:
478 omapfb_unlock(fbdev);
479
426 return r; 480 return r;
427} 481}
428 482
@@ -549,8 +603,6 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
549 603
550 int r = 0; 604 int r = 0;
551 605
552 omapfb_lock(fbdev);
553
554 switch (cmd) { 606 switch (cmd) {
555 case OMAPFB_SYNC_GFX: 607 case OMAPFB_SYNC_GFX:
556 DBG("ioctl SYNC_GFX\n"); 608 DBG("ioctl SYNC_GFX\n");
@@ -856,8 +908,6 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
856 r = -EINVAL; 908 r = -EINVAL;
857 } 909 }
858 910
859 omapfb_unlock(fbdev);
860
861 if (r < 0) 911 if (r < 0)
862 DBG("ioctl failed: %d\n", r); 912 DBG("ioctl failed: %d\n", r);
863 913