77
79
mutex_lock(&file_priv->prime.lock);
78
80
/* re-export the original imported object */
79
81
if (obj->import_attach) {
80
get_dma_buf(obj->import_attach->dmabuf);
81
*prime_fd = dma_buf_fd(obj->import_attach->dmabuf, flags);
82
drm_gem_object_unreference_unlocked(obj);
83
mutex_unlock(&file_priv->prime.lock);
87
mutex_lock(&dev->prime_lock);
89
get_dma_buf(obj->dma_buf);
91
buf = dev->driver->gem_prime_export(dev, obj, flags);
93
/* normally the created dma-buf takes ownership of the ref,
94
* but if that fails then drop the ref
99
/* Allocate a reference for the dma buf. */
100
drm_gem_object_reference(obj);
102
/* Allocate a reference for the re-export cache. */
82
dmabuf = obj->import_attach->dmabuf;
86
if (obj->export_dma_buf) {
87
dmabuf = obj->export_dma_buf;
91
buf = dev->driver->gem_prime_export(dev, obj, flags);
93
/* normally the created dma-buf takes ownership of the ref,
94
* but if that fails then drop the ref
99
obj->export_dma_buf = buf;
106
101
/* if we've exported this buffer the cheat and add it to the import list
107
102
* so we get the correct handle back
109
ret = drm_prime_add_imported_buf_handle(&file_priv->prime,
110
obj->dma_buf, handle);
104
ret = drm_prime_add_buf_handle(&file_priv->prime,
105
obj->export_dma_buf, handle);
114
/* Only set up the userspace fd once everything is done. */
115
*prime_fd = dma_buf_fd(obj->dma_buf, flags);
109
*prime_fd = dma_buf_fd(buf, flags);
110
mutex_unlock(&file_priv->prime.lock);
115
*prime_fd = dma_buf_fd(dmabuf, flags);
117
mutex_unlock(&dev->prime_lock);
118
mutex_unlock(&file_priv->prime.lock);
120
/* Check whether someone sneaky dropped the last userspace gem handle,
121
* clean up the mess if so. */
122
if (atomic_read(&obj->handle_count) == 0)
123
drm_gem_object_handle_free(obj);
125
117
drm_gem_object_unreference_unlocked(obj);
118
mutex_unlock(&file_priv->prime.lock);
129
121
EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
142
134
mutex_lock(&file_priv->prime.lock);
144
ret = drm_prime_lookup_imported_buf_handle(&file_priv->prime,
136
ret = drm_prime_lookup_buf_handle(&file_priv->prime,
145
137
dma_buf, handle);
147
mutex_unlock(&file_priv->prime.lock);
148
dma_buf_put(dma_buf);
153
143
/* never seen this one, need to import */
154
144
obj = dev->driver->gem_prime_import(dev, dma_buf);
155
145
if (IS_ERR(obj)) {
156
mutex_unlock(&file_priv->prime.lock);
157
dma_buf_put(dma_buf);
162
mutex_lock(&dev->prime_lock);
163
/* Refill the export cache - this is only really important if the dma
164
* buf was the only userspace visible handle left and we're re-importing
165
* into the original exporter, in which case we've cleared obj->dma_buf
166
* already. Because we will create a GEM userspace handle below we only
167
* need to check for gem_close races if that fails.
170
obj->dma_buf = dma_buf;
171
get_dma_buf(dma_buf);
173
WARN_ON(obj->dma_buf != dma_buf);
174
mutex_unlock(&dev->prime_lock);
176
150
ret = drm_gem_handle_create(file_priv, obj, handle);
151
drm_gem_object_unreference_unlocked(obj);
180
ret = drm_prime_add_imported_buf_handle(&file_priv->prime,
155
ret = drm_prime_add_buf_handle(&file_priv->prime,
181
156
dma_buf, *handle);
185
160
mutex_unlock(&file_priv->prime.lock);
186
drm_gem_object_unreference_unlocked(obj);
187
dma_buf_put(dma_buf);
193
165
* to detach.. which seems ok..
195
167
drm_gem_object_handle_unreference_unlocked(obj);
197
if (atomic_read(&obj->handle_count) == 0)
198
drm_gem_object_handle_free(obj);
169
dma_buf_put(dma_buf);
199
170
mutex_unlock(&file_priv->prime.lock);
200
drm_gem_object_unreference_unlocked(obj);
201
dma_buf_put(dma_buf);
205
173
EXPORT_SYMBOL(drm_gem_prime_fd_to_handle);
343
311
EXPORT_SYMBOL(drm_prime_destroy_file_private);
345
int drm_prime_add_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t handle)
313
static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t handle)
347
315
struct drm_prime_member *member;
321
get_dma_buf(dma_buf);
353
322
member->dma_buf = dma_buf;
354
323
member->handle = handle;
355
324
list_add(&member->entry, &prime_fpriv->head);
358
EXPORT_SYMBOL(drm_prime_add_imported_buf_handle);
360
int drm_prime_lookup_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t *handle)
328
int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t *handle)
362
330
struct drm_prime_member *member;
372
EXPORT_SYMBOL(drm_prime_lookup_imported_buf_handle);
340
EXPORT_SYMBOL(drm_prime_lookup_buf_handle);
374
void drm_prime_remove_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf)
342
void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf)
376
344
struct drm_prime_member *member, *safe;
378
346
mutex_lock(&prime_fpriv->lock);
379
347
list_for_each_entry_safe(member, safe, &prime_fpriv->head, entry) {
380
348
if (member->dma_buf == dma_buf) {
349
dma_buf_put(dma_buf);
381
350
list_del(&member->entry);
385
354
mutex_unlock(&prime_fpriv->lock);
387
EXPORT_SYMBOL(drm_prime_remove_imported_buf_handle);
356
EXPORT_SYMBOL(drm_prime_remove_buf_handle);