diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-12-13 06:19:05 -0500 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-12-13 06:19:05 -0500 |
commit | 3ed37d9aba486dece93e05d68f691b80ee100900 (patch) | |
tree | 3e391eb45694c948c608a9c5ce99bc2cc0b52164 /drivers/video/omap2/omapfb/omapfb-ioctl.c | |
parent | c7e1eae537652330cec3fbf5f8f50000b2f24269 (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.c | 68 |
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); |
400 | err: | 447 | err: |
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]; |
425 | err: | 477 | err: |
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 | ||