aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChangbin Du <changbin.du@intel.com>2018-03-12 03:12:34 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2018-03-19 02:51:11 -0400
commit5cd4223ea3bd29e4a17d0bd8f2adbe50e50b2e57 (patch)
treec623f578c582b974a87de26fe3cdfb0901eb07ff /drivers
parent84f69ba081b8d8358f725f2a7fd12c1b6f43d445 (diff)
drm/i915/kvmgt: Handle kzalloc failure
Out-of-memory error must be handled correctly. Signed-off-by: Changbin Du <changbin.du@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/gvt/kvmgt.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
index 8a428678e4b5..520fe3d0a882 100644
--- a/drivers/gpu/drm/i915/gvt/kvmgt.c
+++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
@@ -184,7 +184,7 @@ static struct gvt_dma *__gvt_cache_find_gfn(struct intel_vgpu *vgpu, gfn_t gfn)
184 return NULL; 184 return NULL;
185} 185}
186 186
187static void __gvt_cache_add(struct intel_vgpu *vgpu, gfn_t gfn, 187static int __gvt_cache_add(struct intel_vgpu *vgpu, gfn_t gfn,
188 dma_addr_t dma_addr) 188 dma_addr_t dma_addr)
189{ 189{
190 struct gvt_dma *new, *itr; 190 struct gvt_dma *new, *itr;
@@ -192,7 +192,7 @@ static void __gvt_cache_add(struct intel_vgpu *vgpu, gfn_t gfn,
192 192
193 new = kzalloc(sizeof(struct gvt_dma), GFP_KERNEL); 193 new = kzalloc(sizeof(struct gvt_dma), GFP_KERNEL);
194 if (!new) 194 if (!new)
195 return; 195 return -ENOMEM;
196 196
197 new->vgpu = vgpu; 197 new->vgpu = vgpu;
198 new->gfn = gfn; 198 new->gfn = gfn;
@@ -229,6 +229,7 @@ static void __gvt_cache_add(struct intel_vgpu *vgpu, gfn_t gfn,
229 rb_insert_color(&new->dma_addr_node, &vgpu->vdev.dma_addr_cache); 229 rb_insert_color(&new->dma_addr_node, &vgpu->vdev.dma_addr_cache);
230 230
231 vgpu->vdev.nr_cache_entries++; 231 vgpu->vdev.nr_cache_entries++;
232 return 0;
232} 233}
233 234
234static void __gvt_cache_remove_entry(struct intel_vgpu *vgpu, 235static void __gvt_cache_remove_entry(struct intel_vgpu *vgpu,
@@ -1586,11 +1587,12 @@ int kvmgt_dma_map_guest_page(unsigned long handle, unsigned long gfn,
1586 entry = __gvt_cache_find_gfn(info->vgpu, gfn); 1587 entry = __gvt_cache_find_gfn(info->vgpu, gfn);
1587 if (!entry) { 1588 if (!entry) {
1588 ret = gvt_dma_map_page(vgpu, gfn, dma_addr); 1589 ret = gvt_dma_map_page(vgpu, gfn, dma_addr);
1589 if (ret) { 1590 if (ret)
1590 mutex_unlock(&info->vgpu->vdev.cache_lock); 1591 goto err_unlock;
1591 return ret; 1592
1592 } 1593 ret = __gvt_cache_add(info->vgpu, gfn, *dma_addr);
1593 __gvt_cache_add(info->vgpu, gfn, *dma_addr); 1594 if (ret)
1595 goto err_unmap;
1594 } else { 1596 } else {
1595 kref_get(&entry->ref); 1597 kref_get(&entry->ref);
1596 *dma_addr = entry->dma_addr; 1598 *dma_addr = entry->dma_addr;
@@ -1598,6 +1600,12 @@ int kvmgt_dma_map_guest_page(unsigned long handle, unsigned long gfn,
1598 1600
1599 mutex_unlock(&info->vgpu->vdev.cache_lock); 1601 mutex_unlock(&info->vgpu->vdev.cache_lock);
1600 return 0; 1602 return 0;
1603
1604err_unmap:
1605 gvt_dma_unmap_page(vgpu, gfn, *dma_addr);
1606err_unlock:
1607 mutex_unlock(&info->vgpu->vdev.cache_lock);
1608 return ret;
1601} 1609}
1602 1610
1603static void __gvt_dma_release(struct kref *ref) 1611static void __gvt_dma_release(struct kref *ref)