Re: [PATCH 3/3] drm/i915: Allocate active tracking nodes from a slabcache

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 30/01/2019 20:50, Chris Wilson wrote:
Wrap the active tracking for a GPU references in a slabcache for faster
allocations, and hopefully better fragmentation reduction.


v2 where art thou? :)

v3: Nothing device specific left, it's just a slabcache that we can
make global.

Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
---
  drivers/gpu/drm/i915/i915_active.c | 31 +++++++++++++++++++++++++++---
  drivers/gpu/drm/i915/i915_active.h |  3 +++
  drivers/gpu/drm/i915/i915_pci.c    |  3 +++
  3 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c
index b1fefe98f9a6..5818ddf88462 100644
--- a/drivers/gpu/drm/i915/i915_active.c
+++ b/drivers/gpu/drm/i915/i915_active.c
@@ -9,6 +9,17 @@
#define BKL(ref) (&(ref)->i915->drm.struct_mutex) +/*
+ * Active refs memory management
+ *
+ * To be more economical with memory, we reap all the i915_active trees as
+ * they idle (when we know the active requests are inactive) and allocate the
+ * nodes from a local slab cache to hopefully reduce the fragmentation.
+ */
+static struct i915_global_active {
+	struct kmem_cache *slab_cache;
+} global;
+
  struct active_node {
  	struct i915_gem_active base;
  	struct i915_active *ref;
@@ -23,7 +34,7 @@ __active_park(struct i915_active *ref)
rbtree_postorder_for_each_entry_safe(it, n, &ref->tree, node) {
  		GEM_BUG_ON(i915_gem_active_isset(&it->base));
-		kfree(it);
+		kmem_cache_free(global.slab_cache, it);
  	}
  	ref->tree = RB_ROOT;
  }
@@ -96,11 +107,11 @@ active_instance(struct i915_active *ref, u64 idx)
  			p = &parent->rb_left;
  	}
- node = kmalloc(sizeof(*node), GFP_KERNEL);
+	node = kmem_cache_alloc(global.slab_cache, GFP_KERNEL);
/* kmalloc may retire the ref->last (thanks shrinker)! */
  	if (unlikely(!i915_gem_active_raw(&ref->last, BKL(ref)))) {
-		kfree(node);
+		kmem_cache_free(global.slab_cache, node);
  		goto out;
  	}
@@ -234,6 +245,20 @@ void i915_active_fini(struct i915_active *ref)
  	GEM_BUG_ON(!RB_EMPTY_ROOT(&ref->tree));
  	GEM_BUG_ON(ref->count);
  }
+
+int __init i915_global_active_init(void)
+{
+	global.slab_cache = KMEM_CACHE(active_node, SLAB_HWCACHE_ALIGN);
+	if (!global.slab_cache)
+		return -ENOMEM;
+
+	return 0;
+}
+
+void __exit i915_global_active_exit(void)
+{
+	kmem_cache_destroy(global.slab_cache);
+}
  #endif
#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
diff --git a/drivers/gpu/drm/i915/i915_active.h b/drivers/gpu/drm/i915/i915_active.h
index 6130c6770d10..48fdb1497883 100644
--- a/drivers/gpu/drm/i915/i915_active.h
+++ b/drivers/gpu/drm/i915/i915_active.h
@@ -63,4 +63,7 @@ void i915_active_fini(struct i915_active *ref);
  static inline void i915_active_fini(struct i915_active *ref) { }
  #endif
+int i915_global_active_init(void);
+void i915_global_active_exit(void);
+
  #endif /* _I915_ACTIVE_H_ */
diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c
index 44c23ac60347..751a787c83d1 100644
--- a/drivers/gpu/drm/i915/i915_pci.c
+++ b/drivers/gpu/drm/i915/i915_pci.c

Add explicit #include "i915_active.h"?

@@ -793,6 +793,8 @@ static int __init i915_init(void)
  	bool use_kms = true;
  	int err;
+ i915_global_active_init();
+
  	err = i915_mock_selftests();
  	if (err)
  		return err > 0 ? 0 : err;
@@ -824,6 +826,7 @@ static void __exit i915_exit(void)
  		return;
pci_unregister_driver(&i915_pci_driver);
+	i915_global_active_exit();
  }
module_init(i915_init);


Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux