diff options
author | Changbin Du <changbin.du@intel.com> | 2018-03-12 03:12:34 -0400 |
---|---|---|
committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2018-03-19 02:51:11 -0400 |
commit | 5cd4223ea3bd29e4a17d0bd8f2adbe50e50b2e57 (patch) | |
tree | c623f578c582b974a87de26fe3cdfb0901eb07ff /drivers | |
parent | 84f69ba081b8d8358f725f2a7fd12c1b6f43d445 (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.c | 22 |
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 | ||
187 | static void __gvt_cache_add(struct intel_vgpu *vgpu, gfn_t gfn, | 187 | static 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 | ||
234 | static void __gvt_cache_remove_entry(struct intel_vgpu *vgpu, | 235 | static 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 | |||
1604 | err_unmap: | ||
1605 | gvt_dma_unmap_page(vgpu, gfn, *dma_addr); | ||
1606 | err_unlock: | ||
1607 | mutex_unlock(&info->vgpu->vdev.cache_lock); | ||
1608 | return ret; | ||
1601 | } | 1609 | } |
1602 | 1610 | ||
1603 | static void __gvt_dma_release(struct kref *ref) | 1611 | static void __gvt_dma_release(struct kref *ref) |