drm/atomic: Don't overrun the connector array when hotplugging
Yet another fallout from not considering DP MST hotplug. With the previous patches we have stable indices, but it might still happen that a connector gets added between when we allocate the array and when we actually add a connector. Especially when we back off due to ww mutex contention or similar issues. So store the sizes of the arrays in struct drm_atomic_state and double check them. We don't really care about races except that we want to use a consistent value, so ACCESS_ONCE is all we need. And if we indeed notice that we'd overrun the array then just give up and restart the entire ioctl. Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Reviewed-by: Rob Clark <robdclark@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:

committed by
Dave Airlie

parent
6f75cea66c
commit
f52b69f1ec
@@ -825,6 +825,7 @@ struct drm_bridge {
|
||||
* @plane_states: pointer to array of plane states pointers
|
||||
* @crtcs: pointer to array of CRTC pointers
|
||||
* @crtc_states: pointer to array of CRTC states pointers
|
||||
* @num_connector: size of the @connectors and @connector_states arrays
|
||||
* @connectors: pointer to array of connector pointers
|
||||
* @connector_states: pointer to array of connector states pointers
|
||||
* @acquire_ctx: acquire context for this atomic modeset state update
|
||||
@@ -836,6 +837,7 @@ struct drm_atomic_state {
|
||||
struct drm_plane_state **plane_states;
|
||||
struct drm_crtc **crtcs;
|
||||
struct drm_crtc_state **crtc_states;
|
||||
int num_connector;
|
||||
struct drm_connector **connectors;
|
||||
struct drm_connector_state **connector_states;
|
||||
|
||||
|
Reference in New Issue
Block a user