Merge tag 'drm-misc-fixes-2022-11-24' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
drm-misc-fixes for v6.1-rc7: - Another amdgpu gang submit fix. - Use dma_fence_unwrap_for_each when importing sync files. - Fix race in dma_heap_add(). - Fix use of uninitialized memory in logo. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/a5721505-4823-98ef-7d6f-0ea478221391@linux.intel.com
This commit is contained in:
commit
9e2c5c651a
@ -15,6 +15,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/dma-buf.h>
|
||||
#include <linux/dma-fence.h>
|
||||
#include <linux/dma-fence-unwrap.h>
|
||||
#include <linux/anon_inodes.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/debugfs.h>
|
||||
@ -391,8 +392,10 @@ static long dma_buf_import_sync_file(struct dma_buf *dmabuf,
|
||||
const void __user *user_data)
|
||||
{
|
||||
struct dma_buf_import_sync_file arg;
|
||||
struct dma_fence *fence;
|
||||
struct dma_fence *fence, *f;
|
||||
enum dma_resv_usage usage;
|
||||
struct dma_fence_unwrap iter;
|
||||
unsigned int num_fences;
|
||||
int ret = 0;
|
||||
|
||||
if (copy_from_user(&arg, user_data, sizeof(arg)))
|
||||
@ -411,13 +414,21 @@ static long dma_buf_import_sync_file(struct dma_buf *dmabuf,
|
||||
usage = (arg.flags & DMA_BUF_SYNC_WRITE) ? DMA_RESV_USAGE_WRITE :
|
||||
DMA_RESV_USAGE_READ;
|
||||
|
||||
dma_resv_lock(dmabuf->resv, NULL);
|
||||
num_fences = 0;
|
||||
dma_fence_unwrap_for_each(f, &iter, fence)
|
||||
++num_fences;
|
||||
|
||||
ret = dma_resv_reserve_fences(dmabuf->resv, 1);
|
||||
if (!ret)
|
||||
dma_resv_add_fence(dmabuf->resv, fence, usage);
|
||||
if (num_fences > 0) {
|
||||
dma_resv_lock(dmabuf->resv, NULL);
|
||||
|
||||
dma_resv_unlock(dmabuf->resv);
|
||||
ret = dma_resv_reserve_fences(dmabuf->resv, num_fences);
|
||||
if (!ret) {
|
||||
dma_fence_unwrap_for_each(f, &iter, fence)
|
||||
dma_resv_add_fence(dmabuf->resv, f, usage);
|
||||
}
|
||||
|
||||
dma_resv_unlock(dmabuf->resv);
|
||||
}
|
||||
|
||||
dma_fence_put(fence);
|
||||
|
||||
|
@ -233,18 +233,6 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info)
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/* check the name is unique */
|
||||
mutex_lock(&heap_list_lock);
|
||||
list_for_each_entry(h, &heap_list, list) {
|
||||
if (!strcmp(h->name, exp_info->name)) {
|
||||
mutex_unlock(&heap_list_lock);
|
||||
pr_err("dma_heap: Already registered heap named %s\n",
|
||||
exp_info->name);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&heap_list_lock);
|
||||
|
||||
heap = kzalloc(sizeof(*heap), GFP_KERNEL);
|
||||
if (!heap)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@ -283,13 +271,27 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info)
|
||||
err_ret = ERR_CAST(dev_ret);
|
||||
goto err2;
|
||||
}
|
||||
/* Add heap to the list */
|
||||
|
||||
mutex_lock(&heap_list_lock);
|
||||
/* check the name is unique */
|
||||
list_for_each_entry(h, &heap_list, list) {
|
||||
if (!strcmp(h->name, exp_info->name)) {
|
||||
mutex_unlock(&heap_list_lock);
|
||||
pr_err("dma_heap: Already registered heap named %s\n",
|
||||
exp_info->name);
|
||||
err_ret = ERR_PTR(-EINVAL);
|
||||
goto err3;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add heap to the list */
|
||||
list_add(&heap->list, &heap_list);
|
||||
mutex_unlock(&heap_list_lock);
|
||||
|
||||
return heap;
|
||||
|
||||
err3:
|
||||
device_destroy(dma_heap_class, heap->heap_devt);
|
||||
err2:
|
||||
cdev_del(&heap->heap_cdev);
|
||||
err1:
|
||||
|
@ -254,6 +254,9 @@ static struct dma_fence *amdgpu_job_dependency(struct drm_sched_job *sched_job,
|
||||
DRM_ERROR("Error adding fence (%d)\n", r);
|
||||
}
|
||||
|
||||
if (!fence && job->gang_submit)
|
||||
fence = amdgpu_device_switch_gang(ring->adev, job->gang_submit);
|
||||
|
||||
while (fence == NULL && vm && !job->vmid) {
|
||||
r = amdgpu_vmid_grab(vm, ring, &job->sync,
|
||||
&job->base.s_fence->finished,
|
||||
@ -264,9 +267,6 @@ static struct dma_fence *amdgpu_job_dependency(struct drm_sched_job *sched_job,
|
||||
fence = amdgpu_sync_get_fence(&job->sync);
|
||||
}
|
||||
|
||||
if (!fence && job->gang_submit)
|
||||
fence = amdgpu_device_switch_gang(ring->adev, job->gang_submit);
|
||||
|
||||
return fence;
|
||||
}
|
||||
|
||||
|
@ -577,7 +577,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
|
||||
if (scr_readw(r) != vc->vc_video_erase_char)
|
||||
break;
|
||||
if (r != q && new_rows >= rows + logo_lines) {
|
||||
save = kmalloc(array3_size(logo_lines, new_cols, 2),
|
||||
save = kzalloc(array3_size(logo_lines, new_cols, 2),
|
||||
GFP_KERNEL);
|
||||
if (save) {
|
||||
int i = min(cols, new_cols);
|
||||
|
Loading…
Reference in New Issue
Block a user