OSDN Git Service

nouveau: restore check that avoids multiple user bos per kernel bo
authorBen Skeggs <bskeggs@redhat.com>
Wed, 6 May 2015 04:34:22 +0000 (14:34 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 6 May 2015 04:50:07 +0000 (14:50 +1000)
Lost in 5ea6f1c32628887c9df0c53bc8c199eb12633fec, triggering fdo#89842.

Unlike the PRIME fd->handle interfaces, the GEM_OPEN interface doesn't
do anything at the kernel level to prevent this situation occuring,
and we end up with multiple GEM handles for a single kernel buffer.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
nouveau/nouveau.c

index 0071249..7393474 100644 (file)
@@ -480,10 +480,20 @@ nouveau_bo_name_ref(struct nouveau_device *dev, uint32_t name,
                    struct nouveau_bo **pbo)
 {
        struct nouveau_device_priv *nvdev = nouveau_device(dev);
+       struct nouveau_bo_priv *nvbo;
        struct drm_gem_open req = { .name = name };
        int ret;
 
        pthread_mutex_lock(&nvdev->lock);
+       DRMLISTFOREACHENTRY(nvbo, &nvdev->bo_list, head) {
+               if (nvbo->name == name) {
+                       ret = nouveau_bo_wrap_locked(dev, nvbo->base.handle,
+                                                    pbo, name);
+                       pthread_mutex_unlock(&nvdev->lock);
+                       return ret;
+               }
+       }
+
        ret = drmIoctl(dev->fd, DRM_IOCTL_GEM_OPEN, &req);
        if (ret == 0) {
                ret = nouveau_bo_wrap_locked(dev, req.handle, pbo, name);