struct virtio_gpu_vbuffer *vbuf;
        int max_size;
        struct virtio_gpu_drv_cap_cache *cache_ent;
+       struct virtio_gpu_drv_cap_cache *search_ent;
        void *resp_buf;
 
+       *cache_p = NULL;
+
        if (idx >= vgdev->num_capsets)
                return -EINVAL;
 
        atomic_set(&cache_ent->is_valid, 0);
        cache_ent->size = max_size;
        spin_lock(&vgdev->display_info_lock);
-       list_add_tail(&cache_ent->head, &vgdev->cap_cache);
+       /* Search while under lock in case it was added by another task. */
+       list_for_each_entry(search_ent, &vgdev->cap_cache, head) {
+               if (search_ent->id == vgdev->capsets[idx].id &&
+                   search_ent->version == version) {
+                       *cache_p = search_ent;
+                       break;
+               }
+       }
+       if (!*cache_p)
+               list_add_tail(&cache_ent->head, &vgdev->cap_cache);
        spin_unlock(&vgdev->display_info_lock);
 
+       if (*cache_p) {
+               /* Entry was found, so free everything that was just created. */
+               kfree(resp_buf);
+               kfree(cache_ent->caps_cache);
+               kfree(cache_ent);
+               return 0;
+       }
+
        cmd_p = virtio_gpu_alloc_cmd_resp
                (vgdev, &virtio_gpu_cmd_capset_cb, &vbuf, sizeof(*cmd_p),
                 sizeof(struct virtio_gpu_resp_capset) + max_size,