diff options
author | Dave Airlie <airlied@redhat.com> | 2017-10-11 20:38:09 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-10-11 20:38:09 -0400 |
commit | 545036a9944e9d6e50fed4ca03117147c880ff71 (patch) | |
tree | 4af4bb0a2408c66ff77c5bf441a23ec4643cf81e | |
parent | 8a5776a5f49812d29fe4b2d0a2d71675c3facf3f (diff) | |
parent | f7974880cf869ddbd0ba9a8e2ab11dff4a667f96 (diff) |
Merge tag 'drm-misc-fixes-2017-10-11' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
Core Changes:
- sync_file: Fix race in SYNC_IOC_FILE_INFO (John)
- atomic_helper: Give up reference taken in suspend helper (Jeffy)
Cc: John Einar Reitan <john.reitan@arm.com>
Cc: Jeffy Chen <jeffy.chen@rock-chips.com>
* tag 'drm-misc-fixes-2017-10-11' of git://anongit.freedesktop.org/drm/drm-misc:
sync_file: Return consistent status in SYNC_IOC_FILE_INFO
drm/atomic: Unref duplicated drm_atomic_state in drm_atomic_helper_resume()
-rw-r--r-- | drivers/dma-buf/sync_file.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_atomic_helper.c | 1 |
2 files changed, 13 insertions, 5 deletions
diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c index 66fb40d0ebdb..03830634e141 100644 --- a/drivers/dma-buf/sync_file.c +++ b/drivers/dma-buf/sync_file.c | |||
@@ -383,7 +383,7 @@ err_put_fd: | |||
383 | return err; | 383 | return err; |
384 | } | 384 | } |
385 | 385 | ||
386 | static void sync_fill_fence_info(struct dma_fence *fence, | 386 | static int sync_fill_fence_info(struct dma_fence *fence, |
387 | struct sync_fence_info *info) | 387 | struct sync_fence_info *info) |
388 | { | 388 | { |
389 | strlcpy(info->obj_name, fence->ops->get_timeline_name(fence), | 389 | strlcpy(info->obj_name, fence->ops->get_timeline_name(fence), |
@@ -399,6 +399,8 @@ static void sync_fill_fence_info(struct dma_fence *fence, | |||
399 | test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags) ? | 399 | test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags) ? |
400 | ktime_to_ns(fence->timestamp) : | 400 | ktime_to_ns(fence->timestamp) : |
401 | ktime_set(0, 0); | 401 | ktime_set(0, 0); |
402 | |||
403 | return info->status; | ||
402 | } | 404 | } |
403 | 405 | ||
404 | static long sync_file_ioctl_fence_info(struct sync_file *sync_file, | 406 | static long sync_file_ioctl_fence_info(struct sync_file *sync_file, |
@@ -424,8 +426,12 @@ static long sync_file_ioctl_fence_info(struct sync_file *sync_file, | |||
424 | * sync_fence_info and return the actual number of fences on | 426 | * sync_fence_info and return the actual number of fences on |
425 | * info->num_fences. | 427 | * info->num_fences. |
426 | */ | 428 | */ |
427 | if (!info.num_fences) | 429 | if (!info.num_fences) { |
430 | info.status = dma_fence_is_signaled(sync_file->fence); | ||
428 | goto no_fences; | 431 | goto no_fences; |
432 | } else { | ||
433 | info.status = 1; | ||
434 | } | ||
429 | 435 | ||
430 | if (info.num_fences < num_fences) | 436 | if (info.num_fences < num_fences) |
431 | return -EINVAL; | 437 | return -EINVAL; |
@@ -435,8 +441,10 @@ static long sync_file_ioctl_fence_info(struct sync_file *sync_file, | |||
435 | if (!fence_info) | 441 | if (!fence_info) |
436 | return -ENOMEM; | 442 | return -ENOMEM; |
437 | 443 | ||
438 | for (i = 0; i < num_fences; i++) | 444 | for (i = 0; i < num_fences; i++) { |
439 | sync_fill_fence_info(fences[i], &fence_info[i]); | 445 | int status = sync_fill_fence_info(fences[i], &fence_info[i]); |
446 | info.status = info.status <= 0 ? info.status : status; | ||
447 | } | ||
440 | 448 | ||
441 | if (copy_to_user(u64_to_user_ptr(info.sync_fence_info), fence_info, | 449 | if (copy_to_user(u64_to_user_ptr(info.sync_fence_info), fence_info, |
442 | size)) { | 450 | size)) { |
@@ -446,7 +454,6 @@ static long sync_file_ioctl_fence_info(struct sync_file *sync_file, | |||
446 | 454 | ||
447 | no_fences: | 455 | no_fences: |
448 | sync_file_get_name(sync_file, info.name, sizeof(info.name)); | 456 | sync_file_get_name(sync_file, info.name, sizeof(info.name)); |
449 | info.status = dma_fence_is_signaled(sync_file->fence); | ||
450 | info.num_fences = num_fences; | 457 | info.num_fences = num_fences; |
451 | 458 | ||
452 | if (copy_to_user((void __user *)arg, &info, sizeof(info))) | 459 | if (copy_to_user((void __user *)arg, &info, sizeof(info))) |
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 4e53aae9a1fb..0028591f3f95 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c | |||
@@ -2960,6 +2960,7 @@ out: | |||
2960 | drm_modeset_backoff(&ctx); | 2960 | drm_modeset_backoff(&ctx); |
2961 | } | 2961 | } |
2962 | 2962 | ||
2963 | drm_atomic_state_put(state); | ||
2963 | drm_modeset_drop_locks(&ctx); | 2964 | drm_modeset_drop_locks(&ctx); |
2964 | drm_modeset_acquire_fini(&ctx); | 2965 | drm_modeset_acquire_fini(&ctx); |
2965 | 2966 | ||