[Intel-gfx] [PATCH 3/3] drm/i915: Allocate active tracking nodes from a slabcache
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Thu Jan 31 11:39:46 UTC 2019
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 at chris-wilson.co.uk>
> ---
> 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
More information about the Intel-gfx
mailing list