Commit 103b76ee authored by Chris Wilson's avatar Chris Wilson

drm/i915: Use i915_global_register()

Rather than manually add every new global into each hook, use
i915_global_register() function and keep a list of registered globals to
invoke instead.

However, I haven't found a way for random drivers to add an .init table
to avoid having to manually add ourselves to i915_globals_init() each
time.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190305213830.18094-1-chris@chris-wilson.co.ukReviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
parent d846325a
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_active.h" #include "i915_active.h"
#include "i915_globals.h"
#define BKL(ref) (&(ref)->i915->drm.struct_mutex) #define BKL(ref) (&(ref)->i915->drm.struct_mutex)
...@@ -17,6 +18,7 @@ ...@@ -17,6 +18,7 @@
* nodes from a local slab cache to hopefully reduce the fragmentation. * nodes from a local slab cache to hopefully reduce the fragmentation.
*/ */
static struct i915_global_active { static struct i915_global_active {
struct i915_global base;
struct kmem_cache *slab_cache; struct kmem_cache *slab_cache;
} global; } global;
...@@ -285,21 +287,27 @@ void i915_active_retire_noop(struct i915_active_request *active, ...@@ -285,21 +287,27 @@ void i915_active_retire_noop(struct i915_active_request *active,
#include "selftests/i915_active.c" #include "selftests/i915_active.c"
#endif #endif
int __init i915_global_active_init(void) static void i915_global_active_shrink(void)
{ {
global.slab_cache = KMEM_CACHE(active_node, SLAB_HWCACHE_ALIGN); kmem_cache_shrink(global.slab_cache);
if (!global.slab_cache)
return -ENOMEM;
return 0;
} }
void i915_global_active_shrink(void) static void i915_global_active_exit(void)
{ {
kmem_cache_shrink(global.slab_cache); kmem_cache_destroy(global.slab_cache);
} }
void i915_global_active_exit(void) static struct i915_global_active global = { {
.shrink = i915_global_active_shrink,
.exit = i915_global_active_exit,
} };
int __init i915_global_active_init(void)
{ {
kmem_cache_destroy(global.slab_cache); global.slab_cache = KMEM_CACHE(active_node, SLAB_HWCACHE_ALIGN);
if (!global.slab_cache)
return -ENOMEM;
i915_global_register(&global.base);
return 0;
} }
...@@ -419,8 +419,4 @@ void i915_active_fini(struct i915_active *ref); ...@@ -419,8 +419,4 @@ void i915_active_fini(struct i915_active *ref);
static inline void i915_active_fini(struct i915_active *ref) { } static inline void i915_active_fini(struct i915_active *ref) { }
#endif #endif
int i915_global_active_init(void);
void i915_global_active_shrink(void);
void i915_global_active_exit(void);
#endif /* _I915_ACTIVE_H_ */ #endif /* _I915_ACTIVE_H_ */
...@@ -88,6 +88,7 @@ ...@@ -88,6 +88,7 @@
#include <linux/log2.h> #include <linux/log2.h>
#include <drm/i915_drm.h> #include <drm/i915_drm.h>
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_globals.h"
#include "i915_trace.h" #include "i915_trace.h"
#include "intel_lrc_reg.h" #include "intel_lrc_reg.h"
#include "intel_workarounds.h" #include "intel_workarounds.h"
...@@ -95,6 +96,7 @@ ...@@ -95,6 +96,7 @@
#define ALL_L3_SLICES(dev) (1 << NUM_L3_SLICES(dev)) - 1 #define ALL_L3_SLICES(dev) (1 << NUM_L3_SLICES(dev)) - 1
static struct i915_global_context { static struct i915_global_context {
struct i915_global base;
struct kmem_cache *slab_luts; struct kmem_cache *slab_luts;
} global; } global;
...@@ -1423,21 +1425,27 @@ int __i915_gem_context_pin_hw_id(struct i915_gem_context *ctx) ...@@ -1423,21 +1425,27 @@ int __i915_gem_context_pin_hw_id(struct i915_gem_context *ctx)
#include "selftests/i915_gem_context.c" #include "selftests/i915_gem_context.c"
#endif #endif
int __init i915_global_context_init(void) static void i915_global_context_shrink(void)
{ {
global.slab_luts = KMEM_CACHE(i915_lut_handle, 0); kmem_cache_shrink(global.slab_luts);
if (!global.slab_luts)
return -ENOMEM;
return 0;
} }
void i915_global_context_shrink(void) static void i915_global_context_exit(void)
{ {
kmem_cache_shrink(global.slab_luts); kmem_cache_destroy(global.slab_luts);
} }
void i915_global_context_exit(void) static struct i915_global_context global = { {
.shrink = i915_global_context_shrink,
.exit = i915_global_context_exit,
} };
int __init i915_global_context_init(void)
{ {
kmem_cache_destroy(global.slab_luts); global.slab_luts = KMEM_CACHE(i915_lut_handle, 0);
if (!global.slab_luts)
return -ENOMEM;
i915_global_register(&global.base);
return 0;
} }
...@@ -411,8 +411,4 @@ void intel_context_init(struct intel_context *ce, ...@@ -411,8 +411,4 @@ void intel_context_init(struct intel_context *ce,
struct i915_lut_handle *i915_lut_handle_alloc(void); struct i915_lut_handle *i915_lut_handle_alloc(void);
void i915_lut_handle_free(struct i915_lut_handle *lut); void i915_lut_handle_free(struct i915_lut_handle *lut);
int i915_global_context_init(void);
void i915_global_context_shrink(void);
void i915_global_context_exit(void);
#endif /* !__I915_GEM_CONTEXT_H__ */ #endif /* !__I915_GEM_CONTEXT_H__ */
...@@ -24,8 +24,10 @@ ...@@ -24,8 +24,10 @@
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_gem_object.h" #include "i915_gem_object.h"
#include "i915_globals.h"
static struct i915_global_object { static struct i915_global_object {
struct i915_global base;
struct kmem_cache *slab_objects; struct kmem_cache *slab_objects;
} global; } global;
...@@ -61,6 +63,21 @@ void i915_gem_object_set_cache_coherency(struct drm_i915_gem_object *obj, ...@@ -61,6 +63,21 @@ void i915_gem_object_set_cache_coherency(struct drm_i915_gem_object *obj,
!(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE); !(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE);
} }
static void i915_global_objects_shrink(void)
{
kmem_cache_shrink(global.slab_objects);
}
static void i915_global_objects_exit(void)
{
kmem_cache_destroy(global.slab_objects);
}
static struct i915_global_object global = { {
.shrink = i915_global_objects_shrink,
.exit = i915_global_objects_exit,
} };
int __init i915_global_objects_init(void) int __init i915_global_objects_init(void)
{ {
global.slab_objects = global.slab_objects =
...@@ -68,15 +85,6 @@ int __init i915_global_objects_init(void) ...@@ -68,15 +85,6 @@ int __init i915_global_objects_init(void)
if (!global.slab_objects) if (!global.slab_objects)
return -ENOMEM; return -ENOMEM;
i915_global_register(&global.base);
return 0; return 0;
} }
void i915_global_objects_shrink(void)
{
kmem_cache_shrink(global.slab_objects);
}
void i915_global_objects_exit(void)
{
kmem_cache_destroy(global.slab_objects);
}
...@@ -502,8 +502,4 @@ void i915_gem_object_set_cache_coherency(struct drm_i915_gem_object *obj, ...@@ -502,8 +502,4 @@ void i915_gem_object_set_cache_coherency(struct drm_i915_gem_object *obj,
unsigned int cache_level); unsigned int cache_level);
void i915_gem_object_flush_if_display(struct drm_i915_gem_object *obj); void i915_gem_object_flush_if_display(struct drm_i915_gem_object *obj);
int i915_global_objects_init(void);
void i915_global_objects_shrink(void);
void i915_global_objects_exit(void);
#endif #endif
...@@ -15,62 +15,61 @@ ...@@ -15,62 +15,61 @@
#include "i915_scheduler.h" #include "i915_scheduler.h"
#include "i915_vma.h" #include "i915_vma.h"
int __init i915_globals_init(void) static LIST_HEAD(globals);
void __init i915_global_register(struct i915_global *global)
{ {
int err; GEM_BUG_ON(!global->shrink);
GEM_BUG_ON(!global->exit);
err = i915_global_active_init(); list_add_tail(&global->link, &globals);
if (err) }
return err;
err = i915_global_context_init(); static void __i915_globals_cleanup(void)
if (err) {
goto err_active; struct i915_global *global, *next;
err = i915_global_objects_init(); list_for_each_entry_safe_reverse(global, next, &globals, link)
if (err) global->exit();
goto err_context; }
err = i915_global_request_init(); static __initconst int (* const initfn[])(void) = {
if (err) i915_global_active_init,
goto err_objects; i915_global_context_init,
i915_global_objects_init,
i915_global_request_init,
i915_global_scheduler_init,
i915_global_vma_init,
};
err = i915_global_scheduler_init(); int __init i915_globals_init(void)
if (err) {
goto err_request; int i;
err = i915_global_vma_init(); for (i = 0; i < ARRAY_SIZE(initfn); i++) {
if (err) int err;
goto err_scheduler;
return 0; err = initfn[i]();
if (err) {
__i915_globals_cleanup();
return err;
}
}
err_scheduler: return 0;
i915_global_scheduler_exit();
err_request:
i915_global_request_exit();
err_objects:
i915_global_objects_exit();
err_context:
i915_global_context_exit();
err_active:
i915_global_active_exit();
return err;
} }
static void i915_globals_shrink(void) static void i915_globals_shrink(void)
{ {
struct i915_global *global;
/* /*
* kmem_cache_shrink() discards empty slabs and reorders partially * kmem_cache_shrink() discards empty slabs and reorders partially
* filled slabs to prioritise allocating from the mostly full slabs, * filled slabs to prioritise allocating from the mostly full slabs,
* with the aim of reducing fragmentation. * with the aim of reducing fragmentation.
*/ */
i915_global_active_shrink(); list_for_each_entry(global, &globals, link)
i915_global_context_shrink(); global->shrink();
i915_global_objects_shrink();
i915_global_request_shrink();
i915_global_scheduler_shrink();
i915_global_vma_shrink();
} }
static atomic_t active; static atomic_t active;
...@@ -128,12 +127,7 @@ void __exit i915_globals_exit(void) ...@@ -128,12 +127,7 @@ void __exit i915_globals_exit(void)
rcu_barrier(); rcu_barrier();
flush_scheduled_work(); flush_scheduled_work();
i915_global_vma_exit(); __i915_globals_cleanup();
i915_global_scheduler_exit();
i915_global_request_exit();
i915_global_objects_exit();
i915_global_context_exit();
i915_global_active_exit();
/* And ensure that our DESTROY_BY_RCU slabs are truly destroyed */ /* And ensure that our DESTROY_BY_RCU slabs are truly destroyed */
rcu_barrier(); rcu_barrier();
......
...@@ -7,9 +7,28 @@ ...@@ -7,9 +7,28 @@
#ifndef _I915_GLOBALS_H_ #ifndef _I915_GLOBALS_H_
#define _I915_GLOBALS_H_ #define _I915_GLOBALS_H_
typedef void (*i915_global_func_t)(void);
struct i915_global {
struct list_head link;
i915_global_func_t shrink;
i915_global_func_t exit;
};
void i915_global_register(struct i915_global *global);
int i915_globals_init(void); int i915_globals_init(void);
void i915_globals_park(void); void i915_globals_park(void);
void i915_globals_unpark(void); void i915_globals_unpark(void);
void i915_globals_exit(void); void i915_globals_exit(void);
/* constructors */
int i915_global_active_init(void);
int i915_global_context_init(void);
int i915_global_objects_init(void);
int i915_global_request_init(void);
int i915_global_scheduler_init(void);
int i915_global_vma_init(void);
#endif /* _I915_GLOBALS_H_ */ #endif /* _I915_GLOBALS_H_ */
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_active.h" #include "i915_active.h"
#include "i915_globals.h"
#include "i915_reset.h" #include "i915_reset.h"
struct execute_cb { struct execute_cb {
...@@ -40,6 +41,7 @@ struct execute_cb { ...@@ -40,6 +41,7 @@ struct execute_cb {
}; };
static struct i915_global_request { static struct i915_global_request {
struct i915_global base;
struct kmem_cache *slab_requests; struct kmem_cache *slab_requests;
struct kmem_cache *slab_dependencies; struct kmem_cache *slab_dependencies;
struct kmem_cache *slab_execute_cbs; struct kmem_cache *slab_execute_cbs;
...@@ -1338,6 +1340,25 @@ void i915_retire_requests(struct drm_i915_private *i915) ...@@ -1338,6 +1340,25 @@ void i915_retire_requests(struct drm_i915_private *i915)
#include "selftests/i915_request.c" #include "selftests/i915_request.c"
#endif #endif
static void i915_global_request_shrink(void)
{
kmem_cache_shrink(global.slab_dependencies);
kmem_cache_shrink(global.slab_execute_cbs);
kmem_cache_shrink(global.slab_requests);
}
static void i915_global_request_exit(void)
{
kmem_cache_destroy(global.slab_dependencies);
kmem_cache_destroy(global.slab_execute_cbs);
kmem_cache_destroy(global.slab_requests);
}
static struct i915_global_request global = { {
.shrink = i915_global_request_shrink,
.exit = i915_global_request_exit,
} };
int __init i915_global_request_init(void) int __init i915_global_request_init(void)
{ {
global.slab_requests = KMEM_CACHE(i915_request, global.slab_requests = KMEM_CACHE(i915_request,
...@@ -1360,6 +1381,7 @@ int __init i915_global_request_init(void) ...@@ -1360,6 +1381,7 @@ int __init i915_global_request_init(void)
if (!global.slab_dependencies) if (!global.slab_dependencies)
goto err_execute_cbs; goto err_execute_cbs;
i915_global_register(&global.base);
return 0; return 0;
err_execute_cbs: err_execute_cbs:
...@@ -1368,17 +1390,3 @@ int __init i915_global_request_init(void) ...@@ -1368,17 +1390,3 @@ int __init i915_global_request_init(void)
kmem_cache_destroy(global.slab_requests); kmem_cache_destroy(global.slab_requests);
return -ENOMEM; return -ENOMEM;
} }
void i915_global_request_shrink(void)
{
kmem_cache_shrink(global.slab_dependencies);
kmem_cache_shrink(global.slab_execute_cbs);
kmem_cache_shrink(global.slab_requests);
}
void i915_global_request_exit(void)
{
kmem_cache_destroy(global.slab_dependencies);
kmem_cache_destroy(global.slab_execute_cbs);
kmem_cache_destroy(global.slab_requests);
}
...@@ -406,8 +406,4 @@ static inline void i915_request_mark_complete(struct i915_request *rq) ...@@ -406,8 +406,4 @@ static inline void i915_request_mark_complete(struct i915_request *rq)
void i915_retire_requests(struct drm_i915_private *i915); void i915_retire_requests(struct drm_i915_private *i915);
int i915_global_request_init(void);
void i915_global_request_shrink(void);
void i915_global_request_exit(void);
#endif /* I915_REQUEST_H */ #endif /* I915_REQUEST_H */
...@@ -7,10 +7,12 @@ ...@@ -7,10 +7,12 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_globals.h"
#include "i915_request.h" #include "i915_request.h"
#include "i915_scheduler.h" #include "i915_scheduler.h"
static struct i915_global_scheduler { static struct i915_global_scheduler {
struct i915_global base;
struct kmem_cache *slab_dependencies; struct kmem_cache *slab_dependencies;
struct kmem_cache *slab_priorities; struct kmem_cache *slab_priorities;
} global; } global;
...@@ -437,6 +439,23 @@ void __i915_priolist_free(struct i915_priolist *p) ...@@ -437,6 +439,23 @@ void __i915_priolist_free(struct i915_priolist *p)
kmem_cache_free(global.slab_priorities, p); kmem_cache_free(global.slab_priorities, p);
} }
static void i915_global_scheduler_shrink(void)
{
kmem_cache_shrink(global.slab_dependencies);
kmem_cache_shrink(global.slab_priorities);
}
static void i915_global_scheduler_exit(void)
{
kmem_cache_destroy(global.slab_dependencies);
kmem_cache_destroy(global.slab_priorities);
}
static struct i915_global_scheduler global = { {
.shrink = i915_global_scheduler_shrink,
.exit = i915_global_scheduler_exit,
} };
int __init i915_global_scheduler_init(void) int __init i915_global_scheduler_init(void)
{ {
global.slab_dependencies = KMEM_CACHE(i915_dependency, global.slab_dependencies = KMEM_CACHE(i915_dependency,
...@@ -449,21 +468,10 @@ int __init i915_global_scheduler_init(void) ...@@ -449,21 +468,10 @@ int __init i915_global_scheduler_init(void)
if (!global.slab_priorities) if (!global.slab_priorities)
goto err_priorities; goto err_priorities;
i915_global_register(&global.base);
return 0; return 0;
err_priorities: err_priorities:
kmem_cache_destroy(global.slab_priorities); kmem_cache_destroy(global.slab_priorities);
return -ENOMEM; return -ENOMEM;
} }
void i915_global_scheduler_shrink(void)
{
kmem_cache_shrink(global.slab_dependencies);
kmem_cache_shrink(global.slab_priorities);
}
void i915_global_scheduler_exit(void)
{
kmem_cache_destroy(global.slab_dependencies);
kmem_cache_destroy(global.slab_priorities);
}
...@@ -134,8 +134,4 @@ static inline void i915_priolist_free(struct i915_priolist *p) ...@@ -134,8 +134,4 @@ static inline void i915_priolist_free(struct i915_priolist *p)
__i915_priolist_free(p); __i915_priolist_free(p);
} }
int i915_global_scheduler_init(void);
void i915_global_scheduler_shrink(void);
void i915_global_scheduler_exit(void);
#endif /* _I915_SCHEDULER_H_ */ #endif /* _I915_SCHEDULER_H_ */
...@@ -25,12 +25,14 @@ ...@@ -25,12 +25,14 @@
#include "i915_vma.h" #include "i915_vma.h"
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_globals.h"
#include "intel_ringbuffer.h" #include "intel_ringbuffer.h"
#include "intel_frontbuffer.h" #include "intel_frontbuffer.h"
#include <drm/drm_gem.h> #include <drm/drm_gem.h>
static struct i915_global_vma { static struct i915_global_vma {
struct i915_global base;
struct kmem_cache *slab_vmas; struct kmem_cache *slab_vmas;
} global; } global;
...@@ -1054,21 +1056,27 @@ int i915_vma_unbind(struct i915_vma *vma) ...@@ -1054,21 +1056,27 @@ int i915_vma_unbind(struct i915_vma *vma)
#include "selftests/i915_vma.c" #include "selftests/i915_vma.c"
#endif #endif
int __init i915_global_vma_init(void) static void i915_global_vma_shrink(void)
{ {
global.slab_vmas = KMEM_CACHE(i915_vma, SLAB_HWCACHE_ALIGN); kmem_cache_shrink(global.slab_vmas);
if (!global.slab_vmas)
return -ENOMEM;
return 0;
} }
void i915_global_vma_shrink(void) static void i915_global_vma_exit(void)
{ {
kmem_cache_shrink(global.slab_vmas); kmem_cache_destroy(global.slab_vmas);
} }
void i915_global_vma_exit(void) static struct i915_global_vma global = { {
.shrink = i915_global_vma_shrink,
.exit = i915_global_vma_exit,
} };
int __init i915_global_vma_init(void)
{ {
kmem_cache_destroy(global.slab_vmas); global.slab_vmas = KMEM_CACHE(i915_vma, SLAB_HWCACHE_ALIGN);
if (!global.slab_vmas)
return -ENOMEM;
i915_global_register(&global.base);
return 0;
} }
...@@ -443,8 +443,4 @@ void i915_vma_parked(struct drm_i915_private *i915); ...@@ -443,8 +443,4 @@ void i915_vma_parked(struct drm_i915_private *i915);
struct i915_vma *i915_vma_alloc(void); struct i915_vma *i915_vma_alloc(void);
void i915_vma_free(struct i915_vma *vma); void i915_vma_free(struct i915_vma *vma);
int i915_global_vma_init(void);
void i915_global_vma_shrink(void);
void i915_global_vma_exit(void);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment