Skip to content

Commit 6007265

Browse files
minipli-ossrodrigovivi
authored andcommitted
drm/i915: Register engines early to avoid type confusion
Commit 1ec23ed ("drm/i915: Use uabi engines for the default engine map") switched from using for_each_engine() to for_each_uabi_engine() to iterate over the user engines. While this seems to be a sensible change, it's only safe to do when the engines are actually chained using the rb-tree structure which is not the case during early driver initialization where it can be either a lock-less list or regular double-linked list. In fact, the modesetting initialization code may end up calling default_engines() through the fb helper code while the engines list is still llist_node-based: i915_driver_probe() -> intel_display_driver_probe() -> intel_fbdev_init() -> drm_fb_helper_init() -> drm_client_init() -> drm_client_open() -> drm_file_alloc() -> i915_driver_open() -> i915_gem_open() -> i915_gem_context_open() -> i915_gem_create_context() -> default_engines() Using for_each_uabi_engine() in default_engines() is therefore wrong, as it would try to interpret the llist as rb-tree, making it find no engine at all, as the rb_left and rb_right members will still be NULL, as they haven't been initialized yet. To fix this type confusion register the engines earlier and at the same time reduce the amount of code that has to deal with the intermediate llist state. Reported-by: sanity checks in grsecurity Suggested-by: Tvrtko Ursulin <[email protected]> Fixes: 1ec23ed ("drm/i915: Use uabi engines for the default engine map") Signed-off-by: Mathias Krause <[email protected]> Cc: Jonathan Cavitt <[email protected]> Cc: Tvrtko Ursulin <[email protected]> Reviewed-by: Tvrtko Ursulin <[email protected]> Signed-off-by: Tvrtko Ursulin <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] [tursulin: fixed commit tag typo] (cherry picked from commit 2b562f0) Signed-off-by: Rodrigo Vivi <[email protected]>
1 parent 128c20e commit 6007265

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,13 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
11991199
goto err_unlock;
12001200
}
12011201

1202+
/*
1203+
* Register engines early to ensure the engine list is in its final
1204+
* rb-tree form, lowering the amount of code that has to deal with
1205+
* the intermediate llist state.
1206+
*/
1207+
intel_engines_driver_register(dev_priv);
1208+
12021209
return 0;
12031210

12041211
/*
@@ -1246,8 +1253,6 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
12461253
void i915_gem_driver_register(struct drm_i915_private *i915)
12471254
{
12481255
i915_gem_driver_register__shrinker(i915);
1249-
1250-
intel_engines_driver_register(i915);
12511256
}
12521257

12531258
void i915_gem_driver_unregister(struct drm_i915_private *i915)

0 commit comments

Comments
 (0)