]> Git Repo - linux.git/blob - drivers/gpu/drm/i915/i915_gem_userptr.c
Merge tag 'docs-4.11' of git://git.lwn.net/linux
[linux.git] / drivers / gpu / drm / i915 / i915_gem_userptr.c
1 /*
2  * Copyright © 2012-2014 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  */
24
25 #include <drm/drmP.h>
26 #include <drm/i915_drm.h>
27 #include "i915_drv.h"
28 #include "i915_trace.h"
29 #include "intel_drv.h"
30 #include <linux/mmu_context.h>
31 #include <linux/mmu_notifier.h>
32 #include <linux/mempolicy.h>
33 #include <linux/swap.h>
34
35 struct i915_mm_struct {
36         struct mm_struct *mm;
37         struct drm_i915_private *i915;
38         struct i915_mmu_notifier *mn;
39         struct hlist_node node;
40         struct kref kref;
41         struct work_struct work;
42 };
43
44 #if defined(CONFIG_MMU_NOTIFIER)
45 #include <linux/interval_tree.h>
46
47 struct i915_mmu_notifier {
48         spinlock_t lock;
49         struct hlist_node node;
50         struct mmu_notifier mn;
51         struct rb_root objects;
52         struct workqueue_struct *wq;
53 };
54
55 struct i915_mmu_object {
56         struct i915_mmu_notifier *mn;
57         struct drm_i915_gem_object *obj;
58         struct interval_tree_node it;
59         struct list_head link;
60         struct work_struct work;
61         bool attached;
62 };
63
64 static void cancel_userptr(struct work_struct *work)
65 {
66         struct i915_mmu_object *mo = container_of(work, typeof(*mo), work);
67         struct drm_i915_gem_object *obj = mo->obj;
68         struct drm_device *dev = obj->base.dev;
69
70         i915_gem_object_wait(obj, I915_WAIT_ALL, MAX_SCHEDULE_TIMEOUT, NULL);
71
72         mutex_lock(&dev->struct_mutex);
73         /* Cancel any active worker and force us to re-evaluate gup */
74         obj->userptr.work = NULL;
75
76         /* We are inside a kthread context and can't be interrupted */
77         if (i915_gem_object_unbind(obj) == 0)
78                 __i915_gem_object_put_pages(obj, I915_MM_NORMAL);
79         WARN_ONCE(obj->mm.pages,
80                   "Failed to release pages: bind_count=%d, pages_pin_count=%d, pin_display=%d\n",
81                   obj->bind_count,
82                   atomic_read(&obj->mm.pages_pin_count),
83                   obj->pin_display);
84
85         i915_gem_object_put(obj);
86         mutex_unlock(&dev->struct_mutex);
87 }
88
89 static void add_object(struct i915_mmu_object *mo)
90 {
91         if (mo->attached)
92                 return;
93
94         interval_tree_insert(&mo->it, &mo->mn->objects);
95         mo->attached = true;
96 }
97
98 static void del_object(struct i915_mmu_object *mo)
99 {
100         if (!mo->attached)
101                 return;
102
103         interval_tree_remove(&mo->it, &mo->mn->objects);
104         mo->attached = false;
105 }
106
107 static void i915_gem_userptr_mn_invalidate_range_start(struct mmu_notifier *_mn,
108                                                        struct mm_struct *mm,
109                                                        unsigned long start,
110                                                        unsigned long end)
111 {
112         struct i915_mmu_notifier *mn =
113                 container_of(_mn, struct i915_mmu_notifier, mn);
114         struct i915_mmu_object *mo;
115         struct interval_tree_node *it;
116         LIST_HEAD(cancelled);
117
118         if (RB_EMPTY_ROOT(&mn->objects))
119                 return;
120
121         /* interval ranges are inclusive, but invalidate range is exclusive */
122         end--;
123
124         spin_lock(&mn->lock);
125         it = interval_tree_iter_first(&mn->objects, start, end);
126         while (it) {
127                 /* The mmu_object is released late when destroying the
128                  * GEM object so it is entirely possible to gain a
129                  * reference on an object in the process of being freed
130                  * since our serialisation is via the spinlock and not
131                  * the struct_mutex - and consequently use it after it
132                  * is freed and then double free it. To prevent that
133                  * use-after-free we only acquire a reference on the
134                  * object if it is not in the process of being destroyed.
135                  */
136                 mo = container_of(it, struct i915_mmu_object, it);
137                 if (kref_get_unless_zero(&mo->obj->base.refcount))
138                         queue_work(mn->wq, &mo->work);
139
140                 list_add(&mo->link, &cancelled);
141                 it = interval_tree_iter_next(it, start, end);
142         }
143         list_for_each_entry(mo, &cancelled, link)
144                 del_object(mo);
145         spin_unlock(&mn->lock);
146
147         flush_workqueue(mn->wq);
148 }
149
150 static const struct mmu_notifier_ops i915_gem_userptr_notifier = {
151         .invalidate_range_start = i915_gem_userptr_mn_invalidate_range_start,
152 };
153
154 static struct i915_mmu_notifier *
155 i915_mmu_notifier_create(struct mm_struct *mm)
156 {
157         struct i915_mmu_notifier *mn;
158         int ret;
159
160         mn = kmalloc(sizeof(*mn), GFP_KERNEL);
161         if (mn == NULL)
162                 return ERR_PTR(-ENOMEM);
163
164         spin_lock_init(&mn->lock);
165         mn->mn.ops = &i915_gem_userptr_notifier;
166         mn->objects = RB_ROOT;
167         mn->wq = alloc_workqueue("i915-userptr-release", WQ_UNBOUND, 0);
168         if (mn->wq == NULL) {
169                 kfree(mn);
170                 return ERR_PTR(-ENOMEM);
171         }
172
173          /* Protected by mmap_sem (write-lock) */
174         ret = __mmu_notifier_register(&mn->mn, mm);
175         if (ret) {
176                 destroy_workqueue(mn->wq);
177                 kfree(mn);
178                 return ERR_PTR(ret);
179         }
180
181         return mn;
182 }
183
184 static void
185 i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj)
186 {
187         struct i915_mmu_object *mo;
188
189         mo = obj->userptr.mmu_object;
190         if (mo == NULL)
191                 return;
192
193         spin_lock(&mo->mn->lock);
194         del_object(mo);
195         spin_unlock(&mo->mn->lock);
196         kfree(mo);
197
198         obj->userptr.mmu_object = NULL;
199 }
200
201 static struct i915_mmu_notifier *
202 i915_mmu_notifier_find(struct i915_mm_struct *mm)
203 {
204         struct i915_mmu_notifier *mn = mm->mn;
205
206         mn = mm->mn;
207         if (mn)
208                 return mn;
209
210         down_write(&mm->mm->mmap_sem);
211         mutex_lock(&mm->i915->mm_lock);
212         if ((mn = mm->mn) == NULL) {
213                 mn = i915_mmu_notifier_create(mm->mm);
214                 if (!IS_ERR(mn))
215                         mm->mn = mn;
216         }
217         mutex_unlock(&mm->i915->mm_lock);
218         up_write(&mm->mm->mmap_sem);
219
220         return mn;
221 }
222
223 static int
224 i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj,
225                                     unsigned flags)
226 {
227         struct i915_mmu_notifier *mn;
228         struct i915_mmu_object *mo;
229
230         if (flags & I915_USERPTR_UNSYNCHRONIZED)
231                 return capable(CAP_SYS_ADMIN) ? 0 : -EPERM;
232
233         if (WARN_ON(obj->userptr.mm == NULL))
234                 return -EINVAL;
235
236         mn = i915_mmu_notifier_find(obj->userptr.mm);
237         if (IS_ERR(mn))
238                 return PTR_ERR(mn);
239
240         mo = kzalloc(sizeof(*mo), GFP_KERNEL);
241         if (mo == NULL)
242                 return -ENOMEM;
243
244         mo->mn = mn;
245         mo->obj = obj;
246         mo->it.start = obj->userptr.ptr;
247         mo->it.last = obj->userptr.ptr + obj->base.size - 1;
248         INIT_WORK(&mo->work, cancel_userptr);
249
250         obj->userptr.mmu_object = mo;
251         return 0;
252 }
253
254 static void
255 i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
256                        struct mm_struct *mm)
257 {
258         if (mn == NULL)
259                 return;
260
261         mmu_notifier_unregister(&mn->mn, mm);
262         destroy_workqueue(mn->wq);
263         kfree(mn);
264 }
265
266 #else
267
268 static void
269 i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj)
270 {
271 }
272
273 static int
274 i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj,
275                                     unsigned flags)
276 {
277         if ((flags & I915_USERPTR_UNSYNCHRONIZED) == 0)
278                 return -ENODEV;
279
280         if (!capable(CAP_SYS_ADMIN))
281                 return -EPERM;
282
283         return 0;
284 }
285
286 static void
287 i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
288                        struct mm_struct *mm)
289 {
290 }
291
292 #endif
293
294 static struct i915_mm_struct *
295 __i915_mm_struct_find(struct drm_i915_private *dev_priv, struct mm_struct *real)
296 {
297         struct i915_mm_struct *mm;
298
299         /* Protected by dev_priv->mm_lock */
300         hash_for_each_possible(dev_priv->mm_structs, mm, node, (unsigned long)real)
301                 if (mm->mm == real)
302                         return mm;
303
304         return NULL;
305 }
306
307 static int
308 i915_gem_userptr_init__mm_struct(struct drm_i915_gem_object *obj)
309 {
310         struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
311         struct i915_mm_struct *mm;
312         int ret = 0;
313
314         /* During release of the GEM object we hold the struct_mutex. This
315          * precludes us from calling mmput() at that time as that may be
316          * the last reference and so call exit_mmap(). exit_mmap() will
317          * attempt to reap the vma, and if we were holding a GTT mmap
318          * would then call drm_gem_vm_close() and attempt to reacquire
319          * the struct mutex. So in order to avoid that recursion, we have
320          * to defer releasing the mm reference until after we drop the
321          * struct_mutex, i.e. we need to schedule a worker to do the clean
322          * up.
323          */
324         mutex_lock(&dev_priv->mm_lock);
325         mm = __i915_mm_struct_find(dev_priv, current->mm);
326         if (mm == NULL) {
327                 mm = kmalloc(sizeof(*mm), GFP_KERNEL);
328                 if (mm == NULL) {
329                         ret = -ENOMEM;
330                         goto out;
331                 }
332
333                 kref_init(&mm->kref);
334                 mm->i915 = to_i915(obj->base.dev);
335
336                 mm->mm = current->mm;
337                 atomic_inc(&current->mm->mm_count);
338
339                 mm->mn = NULL;
340
341                 /* Protected by dev_priv->mm_lock */
342                 hash_add(dev_priv->mm_structs,
343                          &mm->node, (unsigned long)mm->mm);
344         } else
345                 kref_get(&mm->kref);
346
347         obj->userptr.mm = mm;
348 out:
349         mutex_unlock(&dev_priv->mm_lock);
350         return ret;
351 }
352
353 static void
354 __i915_mm_struct_free__worker(struct work_struct *work)
355 {
356         struct i915_mm_struct *mm = container_of(work, typeof(*mm), work);
357         i915_mmu_notifier_free(mm->mn, mm->mm);
358         mmdrop(mm->mm);
359         kfree(mm);
360 }
361
362 static void
363 __i915_mm_struct_free(struct kref *kref)
364 {
365         struct i915_mm_struct *mm = container_of(kref, typeof(*mm), kref);
366
367         /* Protected by dev_priv->mm_lock */
368         hash_del(&mm->node);
369         mutex_unlock(&mm->i915->mm_lock);
370
371         INIT_WORK(&mm->work, __i915_mm_struct_free__worker);
372         schedule_work(&mm->work);
373 }
374
375 static void
376 i915_gem_userptr_release__mm_struct(struct drm_i915_gem_object *obj)
377 {
378         if (obj->userptr.mm == NULL)
379                 return;
380
381         kref_put_mutex(&obj->userptr.mm->kref,
382                        __i915_mm_struct_free,
383                        &to_i915(obj->base.dev)->mm_lock);
384         obj->userptr.mm = NULL;
385 }
386
387 struct get_pages_work {
388         struct work_struct work;
389         struct drm_i915_gem_object *obj;
390         struct task_struct *task;
391 };
392
393 #if IS_ENABLED(CONFIG_SWIOTLB)
394 #define swiotlb_active() swiotlb_nr_tbl()
395 #else
396 #define swiotlb_active() 0
397 #endif
398
399 static int
400 st_set_pages(struct sg_table **st, struct page **pvec, int num_pages)
401 {
402         struct scatterlist *sg;
403         int ret, n;
404
405         *st = kmalloc(sizeof(**st), GFP_KERNEL);
406         if (*st == NULL)
407                 return -ENOMEM;
408
409         if (swiotlb_active()) {
410                 ret = sg_alloc_table(*st, num_pages, GFP_KERNEL);
411                 if (ret)
412                         goto err;
413
414                 for_each_sg((*st)->sgl, sg, num_pages, n)
415                         sg_set_page(sg, pvec[n], PAGE_SIZE, 0);
416         } else {
417                 ret = sg_alloc_table_from_pages(*st, pvec, num_pages,
418                                                 0, num_pages << PAGE_SHIFT,
419                                                 GFP_KERNEL);
420                 if (ret)
421                         goto err;
422         }
423
424         return 0;
425
426 err:
427         kfree(*st);
428         *st = NULL;
429         return ret;
430 }
431
432 static struct sg_table *
433 __i915_gem_userptr_set_pages(struct drm_i915_gem_object *obj,
434                              struct page **pvec, int num_pages)
435 {
436         struct sg_table *pages;
437         int ret;
438
439         ret = st_set_pages(&pages, pvec, num_pages);
440         if (ret)
441                 return ERR_PTR(ret);
442
443         ret = i915_gem_gtt_prepare_pages(obj, pages);
444         if (ret) {
445                 sg_free_table(pages);
446                 kfree(pages);
447                 return ERR_PTR(ret);
448         }
449
450         return pages;
451 }
452
453 static int
454 __i915_gem_userptr_set_active(struct drm_i915_gem_object *obj,
455                               bool value)
456 {
457         int ret = 0;
458
459         /* During mm_invalidate_range we need to cancel any userptr that
460          * overlaps the range being invalidated. Doing so requires the
461          * struct_mutex, and that risks recursion. In order to cause
462          * recursion, the user must alias the userptr address space with
463          * a GTT mmapping (possible with a MAP_FIXED) - then when we have
464          * to invalidate that mmaping, mm_invalidate_range is called with
465          * the userptr address *and* the struct_mutex held.  To prevent that
466          * we set a flag under the i915_mmu_notifier spinlock to indicate
467          * whether this object is valid.
468          */
469 #if defined(CONFIG_MMU_NOTIFIER)
470         if (obj->userptr.mmu_object == NULL)
471                 return 0;
472
473         spin_lock(&obj->userptr.mmu_object->mn->lock);
474         /* In order to serialise get_pages with an outstanding
475          * cancel_userptr, we must drop the struct_mutex and try again.
476          */
477         if (!value)
478                 del_object(obj->userptr.mmu_object);
479         else if (!work_pending(&obj->userptr.mmu_object->work))
480                 add_object(obj->userptr.mmu_object);
481         else
482                 ret = -EAGAIN;
483         spin_unlock(&obj->userptr.mmu_object->mn->lock);
484 #endif
485
486         return ret;
487 }
488
489 static void
490 __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
491 {
492         struct get_pages_work *work = container_of(_work, typeof(*work), work);
493         struct drm_i915_gem_object *obj = work->obj;
494         const int npages = obj->base.size >> PAGE_SHIFT;
495         struct page **pvec;
496         int pinned, ret;
497
498         ret = -ENOMEM;
499         pinned = 0;
500
501         pvec = drm_malloc_gfp(npages, sizeof(struct page *), GFP_TEMPORARY);
502         if (pvec != NULL) {
503                 struct mm_struct *mm = obj->userptr.mm->mm;
504                 unsigned int flags = 0;
505
506                 if (!obj->userptr.read_only)
507                         flags |= FOLL_WRITE;
508
509                 ret = -EFAULT;
510                 if (atomic_inc_not_zero(&mm->mm_users)) {
511                         down_read(&mm->mmap_sem);
512                         while (pinned < npages) {
513                                 ret = get_user_pages_remote
514                                         (work->task, mm,
515                                          obj->userptr.ptr + pinned * PAGE_SIZE,
516                                          npages - pinned,
517                                          flags,
518                                          pvec + pinned, NULL, NULL);
519                                 if (ret < 0)
520                                         break;
521
522                                 pinned += ret;
523                         }
524                         up_read(&mm->mmap_sem);
525                         mmput(mm);
526                 }
527         }
528
529         mutex_lock(&obj->mm.lock);
530         if (obj->userptr.work == &work->work) {
531                 struct sg_table *pages = ERR_PTR(ret);
532
533                 if (pinned == npages) {
534                         pages = __i915_gem_userptr_set_pages(obj, pvec, npages);
535                         if (!IS_ERR(pages)) {
536                                 __i915_gem_object_set_pages(obj, pages);
537                                 pinned = 0;
538                                 pages = NULL;
539                         }
540                 }
541
542                 obj->userptr.work = ERR_CAST(pages);
543         }
544         mutex_unlock(&obj->mm.lock);
545
546         release_pages(pvec, pinned, 0);
547         drm_free_large(pvec);
548
549         i915_gem_object_put(obj);
550         put_task_struct(work->task);
551         kfree(work);
552 }
553
554 static struct sg_table *
555 __i915_gem_userptr_get_pages_schedule(struct drm_i915_gem_object *obj,
556                                       bool *active)
557 {
558         struct get_pages_work *work;
559
560         /* Spawn a worker so that we can acquire the
561          * user pages without holding our mutex. Access
562          * to the user pages requires mmap_sem, and we have
563          * a strict lock ordering of mmap_sem, struct_mutex -
564          * we already hold struct_mutex here and so cannot
565          * call gup without encountering a lock inversion.
566          *
567          * Userspace will keep on repeating the operation
568          * (thanks to EAGAIN) until either we hit the fast
569          * path or the worker completes. If the worker is
570          * cancelled or superseded, the task is still run
571          * but the results ignored. (This leads to
572          * complications that we may have a stray object
573          * refcount that we need to be wary of when
574          * checking for existing objects during creation.)
575          * If the worker encounters an error, it reports
576          * that error back to this function through
577          * obj->userptr.work = ERR_PTR.
578          */
579         work = kmalloc(sizeof(*work), GFP_KERNEL);
580         if (work == NULL)
581                 return ERR_PTR(-ENOMEM);
582
583         obj->userptr.work = &work->work;
584
585         work->obj = i915_gem_object_get(obj);
586
587         work->task = current;
588         get_task_struct(work->task);
589
590         INIT_WORK(&work->work, __i915_gem_userptr_get_pages_worker);
591         schedule_work(&work->work);
592
593         *active = true;
594         return ERR_PTR(-EAGAIN);
595 }
596
597 static struct sg_table *
598 i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)
599 {
600         const int num_pages = obj->base.size >> PAGE_SHIFT;
601         struct page **pvec;
602         struct sg_table *pages;
603         int pinned, ret;
604         bool active;
605
606         /* If userspace should engineer that these pages are replaced in
607          * the vma between us binding this page into the GTT and completion
608          * of rendering... Their loss. If they change the mapping of their
609          * pages they need to create a new bo to point to the new vma.
610          *
611          * However, that still leaves open the possibility of the vma
612          * being copied upon fork. Which falls under the same userspace
613          * synchronisation issue as a regular bo, except that this time
614          * the process may not be expecting that a particular piece of
615          * memory is tied to the GPU.
616          *
617          * Fortunately, we can hook into the mmu_notifier in order to
618          * discard the page references prior to anything nasty happening
619          * to the vma (discard or cloning) which should prevent the more
620          * egregious cases from causing harm.
621          */
622
623         if (obj->userptr.work) {
624                 /* active flag should still be held for the pending work */
625                 if (IS_ERR(obj->userptr.work))
626                         return ERR_CAST(obj->userptr.work);
627                 else
628                         return ERR_PTR(-EAGAIN);
629         }
630
631         /* Let the mmu-notifier know that we have begun and need cancellation */
632         ret = __i915_gem_userptr_set_active(obj, true);
633         if (ret)
634                 return ERR_PTR(ret);
635
636         pvec = NULL;
637         pinned = 0;
638         if (obj->userptr.mm->mm == current->mm) {
639                 pvec = drm_malloc_gfp(num_pages, sizeof(struct page *),
640                                       GFP_TEMPORARY);
641                 if (pvec == NULL) {
642                         __i915_gem_userptr_set_active(obj, false);
643                         return ERR_PTR(-ENOMEM);
644                 }
645
646                 pinned = __get_user_pages_fast(obj->userptr.ptr, num_pages,
647                                                !obj->userptr.read_only, pvec);
648         }
649
650         active = false;
651         if (pinned < 0)
652                 pages = ERR_PTR(pinned), pinned = 0;
653         else if (pinned < num_pages)
654                 pages = __i915_gem_userptr_get_pages_schedule(obj, &active);
655         else
656                 pages = __i915_gem_userptr_set_pages(obj, pvec, num_pages);
657         if (IS_ERR(pages)) {
658                 __i915_gem_userptr_set_active(obj, active);
659                 release_pages(pvec, pinned, 0);
660         }
661         drm_free_large(pvec);
662         return pages;
663 }
664
665 static void
666 i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj,
667                            struct sg_table *pages)
668 {
669         struct sgt_iter sgt_iter;
670         struct page *page;
671
672         BUG_ON(obj->userptr.work != NULL);
673         __i915_gem_userptr_set_active(obj, false);
674
675         if (obj->mm.madv != I915_MADV_WILLNEED)
676                 obj->mm.dirty = false;
677
678         i915_gem_gtt_finish_pages(obj, pages);
679
680         for_each_sgt_page(page, sgt_iter, pages) {
681                 if (obj->mm.dirty)
682                         set_page_dirty(page);
683
684                 mark_page_accessed(page);
685                 put_page(page);
686         }
687         obj->mm.dirty = false;
688
689         sg_free_table(pages);
690         kfree(pages);
691 }
692
693 static void
694 i915_gem_userptr_release(struct drm_i915_gem_object *obj)
695 {
696         i915_gem_userptr_release__mmu_notifier(obj);
697         i915_gem_userptr_release__mm_struct(obj);
698 }
699
700 static int
701 i915_gem_userptr_dmabuf_export(struct drm_i915_gem_object *obj)
702 {
703         if (obj->userptr.mmu_object)
704                 return 0;
705
706         return i915_gem_userptr_init__mmu_notifier(obj, 0);
707 }
708
709 static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
710         .flags = I915_GEM_OBJECT_HAS_STRUCT_PAGE |
711                  I915_GEM_OBJECT_IS_SHRINKABLE,
712         .get_pages = i915_gem_userptr_get_pages,
713         .put_pages = i915_gem_userptr_put_pages,
714         .dmabuf_export = i915_gem_userptr_dmabuf_export,
715         .release = i915_gem_userptr_release,
716 };
717
718 /**
719  * Creates a new mm object that wraps some normal memory from the process
720  * context - user memory.
721  *
722  * We impose several restrictions upon the memory being mapped
723  * into the GPU.
724  * 1. It must be page aligned (both start/end addresses, i.e ptr and size).
725  * 2. It must be normal system memory, not a pointer into another map of IO
726  *    space (e.g. it must not be a GTT mmapping of another object).
727  * 3. We only allow a bo as large as we could in theory map into the GTT,
728  *    that is we limit the size to the total size of the GTT.
729  * 4. The bo is marked as being snoopable. The backing pages are left
730  *    accessible directly by the CPU, but reads and writes by the GPU may
731  *    incur the cost of a snoop (unless you have an LLC architecture).
732  *
733  * Synchronisation between multiple users and the GPU is left to userspace
734  * through the normal set-domain-ioctl. The kernel will enforce that the
735  * GPU relinquishes the VMA before it is returned back to the system
736  * i.e. upon free(), munmap() or process termination. However, the userspace
737  * malloc() library may not immediately relinquish the VMA after free() and
738  * instead reuse it whilst the GPU is still reading and writing to the VMA.
739  * Caveat emptor.
740  *
741  * Also note, that the object created here is not currently a "first class"
742  * object, in that several ioctls are banned. These are the CPU access
743  * ioctls: mmap(), pwrite and pread. In practice, you are expected to use
744  * direct access via your pointer rather than use those ioctls. Another
745  * restriction is that we do not allow userptr surfaces to be pinned to the
746  * hardware and so we reject any attempt to create a framebuffer out of a
747  * userptr.
748  *
749  * If you think this is a good interface to use to pass GPU memory between
750  * drivers, please use dma-buf instead. In fact, wherever possible use
751  * dma-buf instead.
752  */
753 int
754 i915_gem_userptr_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
755 {
756         struct drm_i915_private *dev_priv = to_i915(dev);
757         struct drm_i915_gem_userptr *args = data;
758         struct drm_i915_gem_object *obj;
759         int ret;
760         u32 handle;
761
762         if (!HAS_LLC(dev_priv) && !HAS_SNOOP(dev_priv)) {
763                 /* We cannot support coherent userptr objects on hw without
764                  * LLC and broken snooping.
765                  */
766                 return -ENODEV;
767         }
768
769         if (args->flags & ~(I915_USERPTR_READ_ONLY |
770                             I915_USERPTR_UNSYNCHRONIZED))
771                 return -EINVAL;
772
773         if (offset_in_page(args->user_ptr | args->user_size))
774                 return -EINVAL;
775
776         if (!access_ok(args->flags & I915_USERPTR_READ_ONLY ? VERIFY_READ : VERIFY_WRITE,
777                        (char __user *)(unsigned long)args->user_ptr, args->user_size))
778                 return -EFAULT;
779
780         if (args->flags & I915_USERPTR_READ_ONLY) {
781                 /* On almost all of the current hw, we cannot tell the GPU that a
782                  * page is readonly, so this is just a placeholder in the uAPI.
783                  */
784                 return -ENODEV;
785         }
786
787         obj = i915_gem_object_alloc(dev);
788         if (obj == NULL)
789                 return -ENOMEM;
790
791         drm_gem_private_object_init(dev, &obj->base, args->user_size);
792         i915_gem_object_init(obj, &i915_gem_userptr_ops);
793         obj->cache_level = I915_CACHE_LLC;
794         obj->base.write_domain = I915_GEM_DOMAIN_CPU;
795         obj->base.read_domains = I915_GEM_DOMAIN_CPU;
796
797         obj->userptr.ptr = args->user_ptr;
798         obj->userptr.read_only = !!(args->flags & I915_USERPTR_READ_ONLY);
799
800         /* And keep a pointer to the current->mm for resolving the user pages
801          * at binding. This means that we need to hook into the mmu_notifier
802          * in order to detect if the mmu is destroyed.
803          */
804         ret = i915_gem_userptr_init__mm_struct(obj);
805         if (ret == 0)
806                 ret = i915_gem_userptr_init__mmu_notifier(obj, args->flags);
807         if (ret == 0)
808                 ret = drm_gem_handle_create(file, &obj->base, &handle);
809
810         /* drop reference from allocate - handle holds it now */
811         i915_gem_object_put(obj);
812         if (ret)
813                 return ret;
814
815         args->handle = handle;
816         return 0;
817 }
818
819 void i915_gem_init_userptr(struct drm_i915_private *dev_priv)
820 {
821         mutex_init(&dev_priv->mm_lock);
822         hash_init(dev_priv->mm_structs);
823 }
This page took 0.083539 seconds and 4 git commands to generate.