From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [Intel-gfx] [PATCH v5 15/63] drm/i915: Make compilation of userptr code depend on MMU_NOTIFIER.
Date: Wed, 25 Nov 2020 11:39:23 +0100 [thread overview]
Message-ID: <20201125104011.606641-16-maarten.lankhorst@linux.intel.com> (raw)
In-Reply-To: <20201125104011.606641-1-maarten.lankhorst@linux.intel.com>
Now that unsynchronized mappings are removed, the only time userptr
works is when the MMU notifier is enabled. Put all of the userptr
code behind a mmu notifier ifdef.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
.../gpu/drm/i915/gem/i915_gem_execbuffer.c | 2 +
drivers/gpu/drm/i915/gem/i915_gem_object.h | 4 ++
.../gpu/drm/i915/gem/i915_gem_object_types.h | 2 +
drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 58 +++++++------------
drivers/gpu/drm/i915/i915_drv.h | 2 +
5 files changed, 31 insertions(+), 37 deletions(-)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index b396e47da0ea..9cf22e179bf7 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1970,8 +1970,10 @@ static noinline int eb_relocate_parse_slow(struct i915_execbuffer *eb,
err = 0;
}
+#ifdef CONFIG_MMU_NOTIFIER
if (!err)
flush_workqueue(eb->i915->mm.userptr_wq);
+#endif
err_relock:
i915_gem_ww_ctx_init(&eb->ww, true);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 2ba6d114182c..dc4f3175550d 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -537,7 +537,11 @@ void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
static inline bool
i915_gem_object_is_userptr(struct drm_i915_gem_object *obj)
{
+#ifdef CONFIG_MMU_NOTIFIER
return obj->userptr.mm;
+#else
+ return false;
+#endif
}
static inline void
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
index b53e44b06b09..6d3f451c15c6 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
@@ -289,6 +289,7 @@ struct drm_i915_gem_object {
unsigned long *bit_17;
union {
+#ifdef CONFIG_MMU_NOTIFIER
struct i915_gem_userptr {
uintptr_t ptr;
@@ -296,6 +297,7 @@ struct drm_i915_gem_object {
struct i915_mmu_object *mmu_object;
struct work_struct *work;
} userptr;
+#endif
unsigned long scratch;
u64 encode;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index 241f865077b9..1183b28c084b 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -15,6 +15,8 @@
#include "i915_gem_object.h"
#include "i915_scatterlist.h"
+#if defined(CONFIG_MMU_NOTIFIER)
+
struct i915_mm_struct {
struct mm_struct *mm;
struct drm_i915_private *i915;
@@ -24,7 +26,6 @@ struct i915_mm_struct {
struct rcu_work work;
};
-#if defined(CONFIG_MMU_NOTIFIER)
#include <linux/interval_tree.h>
struct i915_mmu_notifier {
@@ -217,15 +218,11 @@ i915_mmu_notifier_find(struct i915_mm_struct *mm)
}
static int
-i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj,
- unsigned flags)
+i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj)
{
struct i915_mmu_notifier *mn;
struct i915_mmu_object *mo;
- if (flags & I915_USERPTR_UNSYNCHRONIZED)
- return -ENODEV;
-
if (GEM_WARN_ON(!obj->userptr.mm))
return -EINVAL;
@@ -258,32 +255,6 @@ i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
kfree(mn);
}
-#else
-
-static void
-__i915_gem_userptr_set_active(struct drm_i915_gem_object *obj, bool value)
-{
-}
-
-static void
-i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj)
-{
-}
-
-static int
-i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj,
- unsigned flags)
-{
- return -ENODEV;
-}
-
-static void
-i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
- struct mm_struct *mm)
-{
-}
-
-#endif
static struct i915_mm_struct *
__i915_mm_struct_find(struct drm_i915_private *i915, struct mm_struct *real)
@@ -725,6 +696,8 @@ static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
.release = i915_gem_userptr_release,
};
+#endif
+
/*
* Creates a new mm object that wraps some normal memory from the process
* context - user memory.
@@ -765,12 +738,12 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
void *data,
struct drm_file *file)
{
- static struct lock_class_key lock_class;
+ static struct lock_class_key __maybe_unused lock_class;
struct drm_i915_private *dev_priv = to_i915(dev);
struct drm_i915_gem_userptr *args = data;
- struct drm_i915_gem_object *obj;
- int ret;
- u32 handle;
+ struct drm_i915_gem_object __maybe_unused *obj;
+ int __maybe_unused ret;
+ u32 __maybe_unused handle;
if (!HAS_LLC(dev_priv) && !HAS_SNOOP(dev_priv)) {
/* We cannot support coherent userptr objects on hw without
@@ -809,6 +782,9 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
if (!access_ok((char __user *)(unsigned long)args->user_ptr, args->user_size))
return -EFAULT;
+ if (args->flags & I915_USERPTR_UNSYNCHRONIZED)
+ return -ENODEV;
+
if (args->flags & I915_USERPTR_READ_ONLY) {
/*
* On almost all of the older hw, we cannot tell the GPU that
@@ -818,6 +794,7 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
return -ENODEV;
}
+#ifdef CONFIG_MMU_NOTIFIER
obj = i915_gem_object_alloc();
if (obj == NULL)
return -ENOMEM;
@@ -839,7 +816,7 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
*/
ret = i915_gem_userptr_init__mm_struct(obj);
if (ret == 0)
- ret = i915_gem_userptr_init__mmu_notifier(obj, args->flags);
+ ret = i915_gem_userptr_init__mmu_notifier(obj);
if (ret == 0)
ret = drm_gem_handle_create(file, &obj->base, &handle);
@@ -850,10 +827,14 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
args->handle = handle;
return 0;
+#else
+ return -ENODEV;
+#endif
}
int i915_gem_init_userptr(struct drm_i915_private *dev_priv)
{
+#ifdef CONFIG_MMU_NOTIFIER
spin_lock_init(&dev_priv->mm_lock);
hash_init(dev_priv->mm_structs);
@@ -863,11 +844,14 @@ int i915_gem_init_userptr(struct drm_i915_private *dev_priv)
0);
if (!dev_priv->mm.userptr_wq)
return -ENOMEM;
+#endif
return 0;
}
void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv)
{
+#ifdef CONFIG_MMU_NOTIFIER
destroy_workqueue(dev_priv->mm.userptr_wq);
+#endif
}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index a7e7efafe350..7f788db844cd 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -590,12 +590,14 @@ struct i915_gem_mm {
struct notifier_block vmap_notifier;
struct shrinker shrinker;
+#ifdef CONFIG_MMU_NOTIFIER
/**
* Workqueue to fault in userptr pages, flushed by the execbuf
* when required but otherwise left to userspace to try again
* on EAGAIN.
*/
struct workqueue_struct *userptr_wq;
+#endif
/* shrinker accounting, also useful for userland debugging */
u64 shrink_memory;
--
2.29.2.222.g5d2a92d10f8
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2020-11-25 10:41 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-25 10:39 [Intel-gfx] [PATCH v5 00/63] drm/i915: Remove obj->mm.lock! Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 01/63] drm/i915: Do not share hwsp across contexts any more, v6 Maarten Lankhorst
2020-11-25 10:44 ` Chris Wilson
2020-11-27 10:06 ` Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 02/63] drm/i915: Pin timeline map after first timeline pin, v3 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 03/63] drm/i915: Move cmd parser pinning to execbuffer Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 04/63] drm/i915: Add missing -EDEADLK handling to execbuf pinning, v2 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 05/63] drm/i915: Ensure we hold the object mutex in pin correctly Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 06/63] drm/i915: Add gem object locking to madvise Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 07/63] drm/i915: Move HAS_STRUCT_PAGE to obj->flags Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 08/63] drm/i915: Rework struct phys attachment handling Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 09/63] drm/i915: Convert i915_gem_object_attach_phys() to ww locking, v2 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 10/63] drm/i915: make lockdep slightly happier about execbuf Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 11/63] drm/i915: Disable userptr pread/pwrite support Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 12/63] drm/i915: No longer allow exporting userptr through dma-buf Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 13/63] drm/i915: Reject more ioctls for userptr Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 14/63] drm/i915: Reject UNSYNCHRONIZED for userptr, v2 Maarten Lankhorst
2020-11-25 10:39 ` Maarten Lankhorst [this message]
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 16/63] drm/i915: Fix userptr so we do not have to worry about obj->mm.lock, v5 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 17/63] drm/i915: Flatten obj->mm.lock Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 18/63] drm/i915: Populate logical context during first pin Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 19/63] drm/i915: Make ring submission compatible with obj->mm.lock removal, v2 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 20/63] drm/i915: Handle ww locking in init_status_page Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 21/63] drm/i915: Rework clflush to work correctly without obj->mm.lock Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 22/63] drm/i915: Pass ww ctx to intel_pin_to_display_plane Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 23/63] drm/i915: Add object locking to vm_fault_cpu Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 24/63] drm/i915: Move pinning to inside engine_wa_list_verify() Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 25/63] drm/i915: Take reservation lock around i915_vma_pin Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 26/63] drm/i915: Make intel_init_workaround_bb more compatible with ww locking Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 27/63] drm/i915: Make __engine_unpark() " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 28/63] drm/i915: Take obj lock around set_domain ioctl Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 29/63] drm/i915: Defer pin calls in buffer pool until first use by caller Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 30/63] drm/i915: Fix pread/pwrite to work with new locking rules Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 31/63] drm/i915: Fix workarounds selftest, part 1 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 32/63] drm/i915: Prepare for obj->mm.lock removal Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 33/63] drm/i915: Add igt_spinner_pin() to allow for ww locking around spinner Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 34/63] drm/i915: Add ww locking around vm_access() Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 35/63] drm/i915: Increase ww locking for perf Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 36/63] drm/i915: Lock ww in ucode objects correctly Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 37/63] drm/i915: Add ww locking to dma-buf ops Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 38/63] drm/i915: Add missing ww lock in intel_dsb_prepare Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 39/63] drm/i915: Fix ww locking in shmem_create_from_object Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 40/63] drm/i915: Use a single page table lock for each gtt Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 41/63] drm/i915/selftests: Prepare huge_pages testcases for obj->mm.lock removal Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 42/63] drm/i915/selftests: Prepare client blit " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 43/63] drm/i915/selftests: Prepare coherency tests " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 44/63] drm/i915/selftests: Prepare context " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 45/63] drm/i915/selftests: Prepare dma-buf " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 46/63] drm/i915/selftests: Prepare execbuf " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 47/63] drm/i915/selftests: Prepare mman testcases " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 48/63] drm/i915/selftests: Prepare object tests " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 49/63] drm/i915/selftests: Prepare object blit " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 50/63] drm/i915/selftests: Prepare igt_gem_utils " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 51/63] drm/i915/selftests: Prepare context selftest " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 52/63] drm/i915/selftests: Prepare hangcheck " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 53/63] drm/i915/selftests: Prepare execlists " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 54/63] drm/i915/selftests: Prepare mocs tests " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 55/63] drm/i915/selftests: Prepare ring submission " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 56/63] drm/i915/selftests: Prepare timeline tests " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 57/63] drm/i915/selftests: Prepare i915_request " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 58/63] drm/i915/selftests: Prepare memory region " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 59/63] drm/i915/selftests: Prepare cs engine " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 60/63] drm/i915/selftests: Prepare gtt " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 61/63] drm/i915: Finally remove obj->mm.lock Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 62/63] drm/i915: Keep userpointer bindings if seqcount is unchanged, v2 Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 63/63] drm/i915: Move gt_revoke() slightly Maarten Lankhorst
2020-11-25 12:30 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Remove obj->mm.lock! (rev11) Patchwork
2020-11-25 12:31 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2020-11-25 12:34 ` [Intel-gfx] ✗ Fi.CI.DOCS: " Patchwork
2020-11-25 13:00 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-11-25 14:49 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201125104011.606641-16-maarten.lankhorst@linux.intel.com \
--to=maarten.lankhorst@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox