diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 8db885e3..fd28dec1 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -1688,17 +1688,14 @@ static int gk20a_channel_add_job(struct channel_gk20a *c, | |||
1688 | if (!skip_buffer_refcounting) { | 1688 | if (!skip_buffer_refcounting) { |
1689 | err = gk20a_vm_get_buffers(vm, &mapped_buffers, | 1689 | err = gk20a_vm_get_buffers(vm, &mapped_buffers, |
1690 | &num_mapped_buffers); | 1690 | &num_mapped_buffers); |
1691 | if (err) { | 1691 | if (err) |
1692 | gk20a_vm_put(vm); | 1692 | goto err_put_vm; |
1693 | return err; | ||
1694 | } | ||
1695 | } | 1693 | } |
1696 | 1694 | ||
1697 | job = kzalloc(sizeof(*job), GFP_KERNEL); | 1695 | job = kzalloc(sizeof(*job), GFP_KERNEL); |
1698 | if (!job) { | 1696 | if (!job) { |
1699 | gk20a_vm_put_buffers(vm, mapped_buffers, num_mapped_buffers); | 1697 | err = -ENOMEM; |
1700 | gk20a_vm_put(vm); | 1698 | goto err_put_buffers; |
1701 | return -ENOMEM; | ||
1702 | } | 1699 | } |
1703 | 1700 | ||
1704 | /* put() is done in gk20a_channel_update() when the job is done */ | 1701 | /* put() is done in gk20a_channel_update() when the job is done */ |
@@ -1718,10 +1715,20 @@ static int gk20a_channel_add_job(struct channel_gk20a *c, | |||
1718 | list_add_tail(&job->list, &c->jobs); | 1715 | list_add_tail(&job->list, &c->jobs); |
1719 | mutex_unlock(&c->jobs_lock); | 1716 | mutex_unlock(&c->jobs_lock); |
1720 | } else { | 1717 | } else { |
1721 | return -ETIMEDOUT; | 1718 | err = -ETIMEDOUT; |
1719 | goto err_free_job; | ||
1722 | } | 1720 | } |
1723 | 1721 | ||
1724 | return 0; | 1722 | return 0; |
1723 | |||
1724 | err_free_job: | ||
1725 | kfree(job); | ||
1726 | err_put_buffers: | ||
1727 | gk20a_vm_put_buffers(vm, mapped_buffers, num_mapped_buffers); | ||
1728 | err_put_vm: | ||
1729 | gk20a_vm_put(vm); | ||
1730 | |||
1731 | return err; | ||
1725 | } | 1732 | } |
1726 | 1733 | ||
1727 | void gk20a_channel_update(struct channel_gk20a *c, int nr_completed) | 1734 | void gk20a_channel_update(struct channel_gk20a *c, int nr_completed) |