diff mbox

[08/26] drm: Consolidate connector arrays in drm_atomic_state

Message ID 1464546923-13439-9-git-send-email-daniel.vetter@ffwll.ch (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Vetter May 29, 2016, 6:35 p.m. UTC
It's kinda pointless to have 2 separate mallocs for these. And when we
add more per-connector state in the future it's even more pointless.

Right now there's no such thing planned, but both Gustavo's per-crtc
fence patches, and some nonblocking commit helpers I'm playing around
with will add more per-crtc stuff. It makes sense to also consolidate
connectors, just for consistency.

In the future we can use this to store a pointer to the preceeding
state, making an atomic update entirely free-standing. This will be
needed to be able to queue them up with a depth > 1.

Cc: Gustavo Padovan <gustavo@padovan.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
---
 drivers/gpu/drm/drm_atomic.c        | 27 +++++++++------------------
 drivers/gpu/drm/drm_atomic_helper.c |  2 +-
 include/drm/drm_atomic.h            | 10 +++++-----
 include/drm/drm_crtc.h              | 11 +++++++----
 4 files changed, 22 insertions(+), 28 deletions(-)

Comments

Ville Syrjala May 30, 2016, 2:59 p.m. UTC | #1
On Sun, May 29, 2016 at 08:35:05PM +0200, Daniel Vetter wrote:
> It's kinda pointless to have 2 separate mallocs for these. And when we
> add more per-connector state in the future it's even more pointless.
> 
> Right now there's no such thing planned, but both Gustavo's per-crtc
> fence patches, and some nonblocking commit helpers I'm playing around
> with will add more per-crtc stuff. It makes sense to also consolidate
> connectors, just for consistency.
> 
> In the future we can use this to store a pointer to the preceeding
> state, making an atomic update entirely free-standing. This will be
> needed to be able to queue them up with a depth > 1.
> 
> Cc: Gustavo Padovan <gustavo@padovan.org>
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> ---
>  drivers/gpu/drm/drm_atomic.c        | 27 +++++++++------------------
>  drivers/gpu/drm/drm_atomic_helper.c |  2 +-
>  include/drm/drm_atomic.h            | 10 +++++-----
>  include/drm/drm_crtc.h              | 11 +++++++----
>  4 files changed, 22 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index 3ff1ed7b33db..a6395e9654af 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -44,7 +44,6 @@
>  void drm_atomic_state_default_release(struct drm_atomic_state *state)
>  {
>  	kfree(state->connectors);
> -	kfree(state->connector_states);
>  	kfree(state->crtcs);
>  	kfree(state->crtc_states);
>  	kfree(state->planes);
> @@ -139,15 +138,15 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
>  	DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state);
>  
>  	for (i = 0; i < state->num_connector; i++) {
> -		struct drm_connector *connector = state->connectors[i];
> +		struct drm_connector *connector = state->connectors[i].ptr;

'ptr' is not a very good name.
Daniel Vetter May 30, 2016, 3:13 p.m. UTC | #2
On Mon, May 30, 2016 at 05:59:24PM +0300, Ville Syrjälä wrote:
> On Sun, May 29, 2016 at 08:35:05PM +0200, Daniel Vetter wrote:
> > It's kinda pointless to have 2 separate mallocs for these. And when we
> > add more per-connector state in the future it's even more pointless.
> > 
> > Right now there's no such thing planned, but both Gustavo's per-crtc
> > fence patches, and some nonblocking commit helpers I'm playing around
> > with will add more per-crtc stuff. It makes sense to also consolidate
> > connectors, just for consistency.
> > 
> > In the future we can use this to store a pointer to the preceeding
> > state, making an atomic update entirely free-standing. This will be
> > needed to be able to queue them up with a depth > 1.
> > 
> > Cc: Gustavo Padovan <gustavo@padovan.org>
> > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> > ---
> >  drivers/gpu/drm/drm_atomic.c        | 27 +++++++++------------------
> >  drivers/gpu/drm/drm_atomic_helper.c |  2 +-
> >  include/drm/drm_atomic.h            | 10 +++++-----
> >  include/drm/drm_crtc.h              | 11 +++++++----
> >  4 files changed, 22 insertions(+), 28 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> > index 3ff1ed7b33db..a6395e9654af 100644
> > --- a/drivers/gpu/drm/drm_atomic.c
> > +++ b/drivers/gpu/drm/drm_atomic.c
> > @@ -44,7 +44,6 @@
> >  void drm_atomic_state_default_release(struct drm_atomic_state *state)
> >  {
> >  	kfree(state->connectors);
> > -	kfree(state->connector_states);
> >  	kfree(state->crtcs);
> >  	kfree(state->crtc_states);
> >  	kfree(state->planes);
> > @@ -139,15 +138,15 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
> >  	DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state);
> >  
> >  	for (i = 0; i < state->num_connector; i++) {
> > -		struct drm_connector *connector = state->connectors[i];
> > +		struct drm_connector *connector = state->connectors[i].ptr;
> 
> 'ptr' is not a very good name.

Suggestions for something better? I was lacking good inspiration ...
-Daniel
Ville Syrjala May 30, 2016, 3:25 p.m. UTC | #3
On Mon, May 30, 2016 at 05:13:56PM +0200, Daniel Vetter wrote:
> On Mon, May 30, 2016 at 05:59:24PM +0300, Ville Syrjälä wrote:
> > On Sun, May 29, 2016 at 08:35:05PM +0200, Daniel Vetter wrote:
> > > It's kinda pointless to have 2 separate mallocs for these. And when we
> > > add more per-connector state in the future it's even more pointless.
> > > 
> > > Right now there's no such thing planned, but both Gustavo's per-crtc
> > > fence patches, and some nonblocking commit helpers I'm playing around
> > > with will add more per-crtc stuff. It makes sense to also consolidate
> > > connectors, just for consistency.
> > > 
> > > In the future we can use this to store a pointer to the preceeding
> > > state, making an atomic update entirely free-standing. This will be
> > > needed to be able to queue them up with a depth > 1.
> > > 
> > > Cc: Gustavo Padovan <gustavo@padovan.org>
> > > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> > > ---
> > >  drivers/gpu/drm/drm_atomic.c        | 27 +++++++++------------------
> > >  drivers/gpu/drm/drm_atomic_helper.c |  2 +-
> > >  include/drm/drm_atomic.h            | 10 +++++-----
> > >  include/drm/drm_crtc.h              | 11 +++++++----
> > >  4 files changed, 22 insertions(+), 28 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> > > index 3ff1ed7b33db..a6395e9654af 100644
> > > --- a/drivers/gpu/drm/drm_atomic.c
> > > +++ b/drivers/gpu/drm/drm_atomic.c
> > > @@ -44,7 +44,6 @@
> > >  void drm_atomic_state_default_release(struct drm_atomic_state *state)
> > >  {
> > >  	kfree(state->connectors);
> > > -	kfree(state->connector_states);
> > >  	kfree(state->crtcs);
> > >  	kfree(state->crtc_states);
> > >  	kfree(state->planes);
> > > @@ -139,15 +138,15 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
> > >  	DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state);
> > >  
> > >  	for (i = 0; i < state->num_connector; i++) {
> > > -		struct drm_connector *connector = state->connectors[i];
> > > +		struct drm_connector *connector = state->connectors[i].ptr;
> > 
> > 'ptr' is not a very good name.
> 
> Suggestions for something better? I was lacking good inspiration ...

Maybe just 'connector' ?
Daniel Vetter May 30, 2016, 3:33 p.m. UTC | #4
On Mon, May 30, 2016 at 06:25:50PM +0300, Ville Syrjälä wrote:
> On Mon, May 30, 2016 at 05:13:56PM +0200, Daniel Vetter wrote:
> > On Mon, May 30, 2016 at 05:59:24PM +0300, Ville Syrjälä wrote:
> > > On Sun, May 29, 2016 at 08:35:05PM +0200, Daniel Vetter wrote:
> > > > It's kinda pointless to have 2 separate mallocs for these. And when we
> > > > add more per-connector state in the future it's even more pointless.
> > > > 
> > > > Right now there's no such thing planned, but both Gustavo's per-crtc
> > > > fence patches, and some nonblocking commit helpers I'm playing around
> > > > with will add more per-crtc stuff. It makes sense to also consolidate
> > > > connectors, just for consistency.
> > > > 
> > > > In the future we can use this to store a pointer to the preceeding
> > > > state, making an atomic update entirely free-standing. This will be
> > > > needed to be able to queue them up with a depth > 1.
> > > > 
> > > > Cc: Gustavo Padovan <gustavo@padovan.org>
> > > > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> > > > ---
> > > >  drivers/gpu/drm/drm_atomic.c        | 27 +++++++++------------------
> > > >  drivers/gpu/drm/drm_atomic_helper.c |  2 +-
> > > >  include/drm/drm_atomic.h            | 10 +++++-----
> > > >  include/drm/drm_crtc.h              | 11 +++++++----
> > > >  4 files changed, 22 insertions(+), 28 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> > > > index 3ff1ed7b33db..a6395e9654af 100644
> > > > --- a/drivers/gpu/drm/drm_atomic.c
> > > > +++ b/drivers/gpu/drm/drm_atomic.c
> > > > @@ -44,7 +44,6 @@
> > > >  void drm_atomic_state_default_release(struct drm_atomic_state *state)
> > > >  {
> > > >  	kfree(state->connectors);
> > > > -	kfree(state->connector_states);
> > > >  	kfree(state->crtcs);
> > > >  	kfree(state->crtc_states);
> > > >  	kfree(state->planes);
> > > > @@ -139,15 +138,15 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
> > > >  	DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state);
> > > >  
> > > >  	for (i = 0; i < state->num_connector; i++) {
> > > > -		struct drm_connector *connector = state->connectors[i];
> > > > +		struct drm_connector *connector = state->connectors[i].ptr;
> > > 
> > > 'ptr' is not a very good name.
> > 
> > Suggestions for something better? I was lacking good inspiration ...
> 
> Maybe just 'connector' ?

state->connectors[i].connector is really long, and makes a lot of code
look ugly. "obj" might be a bit better than "ptr" at least. Something
else?
-Daniel
Ville Syrjala May 30, 2016, 3:45 p.m. UTC | #5
On Mon, May 30, 2016 at 05:33:56PM +0200, Daniel Vetter wrote:
> On Mon, May 30, 2016 at 06:25:50PM +0300, Ville Syrjälä wrote:
> > On Mon, May 30, 2016 at 05:13:56PM +0200, Daniel Vetter wrote:
> > > On Mon, May 30, 2016 at 05:59:24PM +0300, Ville Syrjälä wrote:
> > > > On Sun, May 29, 2016 at 08:35:05PM +0200, Daniel Vetter wrote:
> > > > > It's kinda pointless to have 2 separate mallocs for these. And when we
> > > > > add more per-connector state in the future it's even more pointless.
> > > > > 
> > > > > Right now there's no such thing planned, but both Gustavo's per-crtc
> > > > > fence patches, and some nonblocking commit helpers I'm playing around
> > > > > with will add more per-crtc stuff. It makes sense to also consolidate
> > > > > connectors, just for consistency.
> > > > > 
> > > > > In the future we can use this to store a pointer to the preceeding
> > > > > state, making an atomic update entirely free-standing. This will be
> > > > > needed to be able to queue them up with a depth > 1.
> > > > > 
> > > > > Cc: Gustavo Padovan <gustavo@padovan.org>
> > > > > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> > > > > ---
> > > > >  drivers/gpu/drm/drm_atomic.c        | 27 +++++++++------------------
> > > > >  drivers/gpu/drm/drm_atomic_helper.c |  2 +-
> > > > >  include/drm/drm_atomic.h            | 10 +++++-----
> > > > >  include/drm/drm_crtc.h              | 11 +++++++----
> > > > >  4 files changed, 22 insertions(+), 28 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> > > > > index 3ff1ed7b33db..a6395e9654af 100644
> > > > > --- a/drivers/gpu/drm/drm_atomic.c
> > > > > +++ b/drivers/gpu/drm/drm_atomic.c
> > > > > @@ -44,7 +44,6 @@
> > > > >  void drm_atomic_state_default_release(struct drm_atomic_state *state)
> > > > >  {
> > > > >  	kfree(state->connectors);
> > > > > -	kfree(state->connector_states);
> > > > >  	kfree(state->crtcs);
> > > > >  	kfree(state->crtc_states);
> > > > >  	kfree(state->planes);
> > > > > @@ -139,15 +138,15 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
> > > > >  	DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state);
> > > > >  
> > > > >  	for (i = 0; i < state->num_connector; i++) {
> > > > > -		struct drm_connector *connector = state->connectors[i];
> > > > > +		struct drm_connector *connector = state->connectors[i].ptr;
> > > > 
> > > > 'ptr' is not a very good name.
> > > 
> > > Suggestions for something better? I was lacking good inspiration ...
> > 
> > Maybe just 'connector' ?
> 
> state->connectors[i].connector is really long, and makes a lot of code
> look ugly. "obj" might be a bit better than "ptr" at least. Something
> else?

How often are you expecting to have to type this anyway? Using any
kind of generic name here will make life harder for cscope users.
Atomic is really bad in this regard, escecially with all the identically
named function pointers. It's seriosuly hard to navigate that maze
these days. Someone should do a bit of renaming of stuff to make
things more unique.
Daniel Vetter May 30, 2016, 3:48 p.m. UTC | #6
On Mon, May 30, 2016 at 5:45 PM, Ville Syrjälä
<ville.syrjala@linux.intel.com> wrote:
>> state->connectors[i].connector is really long, and makes a lot of code
>> look ugly. "obj" might be a bit better than "ptr" at least. Something
>> else?
>
> How often are you expecting to have to type this anyway? Using any
> kind of generic name here will make life harder for cscope users.
> Atomic is really bad in this regard, escecially with all the identically
> named function pointers. It's seriosuly hard to navigate that maze
> these days. Someone should do a bit of renaming of stuff to make
> things more unique.

We have the same aliasing with legacy hooks shared between
encoder/bridge&crtc. I just always search for the containing structure
since indeed there's no other way to find stuff. Plus big screens ;-)
-Daniel
diff mbox

Patch

diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 3ff1ed7b33db..a6395e9654af 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -44,7 +44,6 @@ 
 void drm_atomic_state_default_release(struct drm_atomic_state *state)
 {
 	kfree(state->connectors);
-	kfree(state->connector_states);
 	kfree(state->crtcs);
 	kfree(state->crtc_states);
 	kfree(state->planes);
@@ -139,15 +138,15 @@  void drm_atomic_state_default_clear(struct drm_atomic_state *state)
 	DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state);
 
 	for (i = 0; i < state->num_connector; i++) {
-		struct drm_connector *connector = state->connectors[i];
+		struct drm_connector *connector = state->connectors[i].ptr;
 
 		if (!connector)
 			continue;
 
 		connector->funcs->atomic_destroy_state(connector,
-						       state->connector_states[i]);
-		state->connectors[i] = NULL;
-		state->connector_states[i] = NULL;
+						       state->connectors[i].state);
+		state->connectors[i].ptr = NULL;
+		state->connectors[i].state = NULL;
 		drm_connector_unreference(connector);
 	}
 
@@ -896,8 +895,7 @@  drm_atomic_get_connector_state(struct drm_atomic_state *state,
 	index = drm_connector_index(connector);
 
 	if (index >= state->num_connector) {
-		struct drm_connector **c;
-		struct drm_connector_state **cs;
+		struct __drm_connnectors_state *c;
 		int alloc = max(index + 1, config->num_connector);
 
 		c = krealloc(state->connectors, alloc * sizeof(*state->connectors), GFP_KERNEL);
@@ -908,26 +906,19 @@  drm_atomic_get_connector_state(struct drm_atomic_state *state,
 		memset(&state->connectors[state->num_connector], 0,
 		       sizeof(*state->connectors) * (alloc - state->num_connector));
 
-		cs = krealloc(state->connector_states, alloc * sizeof(*state->connector_states), GFP_KERNEL);
-		if (!cs)
-			return ERR_PTR(-ENOMEM);
-
-		state->connector_states = cs;
-		memset(&state->connector_states[state->num_connector], 0,
-		       sizeof(*state->connector_states) * (alloc - state->num_connector));
 		state->num_connector = alloc;
 	}
 
-	if (state->connector_states[index])
-		return state->connector_states[index];
+	if (state->connectors[index].state)
+		return state->connectors[index].state;
 
 	connector_state = connector->funcs->atomic_duplicate_state(connector);
 	if (!connector_state)
 		return ERR_PTR(-ENOMEM);
 
 	drm_connector_reference(connector);
-	state->connector_states[index] = connector_state;
-	state->connectors[index] = connector;
+	state->connectors[index].state = connector_state;
+	state->connectors[index].ptr = connector;
 	connector_state->state = state;
 
 	DRM_DEBUG_ATOMIC("Added [CONNECTOR:%d] %p state to %p\n",
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 464541c87c40..0fb4868fdad6 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -1567,7 +1567,7 @@  void drm_atomic_helper_swap_state(struct drm_device *dev,
 
 	for_each_connector_in_state(state, connector, conn_state, i) {
 		connector->state->state = state;
-		swap(state->connector_states[i], connector->state);
+		swap(state->connectors[i].state, connector->state);
 		connector->state->state = NULL;
 	}
 
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index 4e97186293be..37478adb6a16 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -106,7 +106,7 @@  drm_atomic_get_existing_connector_state(struct drm_atomic_state *state,
 	if (index >= state->num_connector)
 		return NULL;
 
-	return state->connector_states[index];
+	return state->connectors[index].state;
 }
 
 /**
@@ -175,11 +175,11 @@  int __must_check drm_atomic_check_only(struct drm_atomic_state *state);
 int __must_check drm_atomic_commit(struct drm_atomic_state *state);
 int __must_check drm_atomic_nonblocking_commit(struct drm_atomic_state *state);
 
-#define for_each_connector_in_state(state, connector, connector_state, __i) \
+#define for_each_connector_in_state(__state, connector, connector_state, __i) \
 	for ((__i) = 0;							\
-	     (__i) < (state)->num_connector &&				\
-	     ((connector) = (state)->connectors[__i],			\
-	     (connector_state) = (state)->connector_states[__i], 1); 	\
+	     (__i) < (__state)->num_connector &&				\
+	     ((connector) = (__state)->connectors[__i].ptr,			\
+	     (connector_state) = (__state)->connectors[__i].state, 1); 	\
 	     (__i)++)							\
 		for_each_if (connector)
 
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 5bffb5c86ea8..d4c46bfe4142 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1694,6 +1694,11 @@  struct drm_bridge {
 	void *driver_private;
 };
 
+struct __drm_connnectors_state {
+	struct drm_connector *ptr;
+	struct drm_connector_state *state;
+};
+
 /**
  * struct drm_atomic_state - the global state object for atomic updates
  * @dev: parent DRM device
@@ -1705,8 +1710,7 @@  struct drm_bridge {
  * @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
+ * @connectors: pointer to array of structures with per-connector data
  * @acquire_ctx: acquire context for this atomic modeset state update
  */
 struct drm_atomic_state {
@@ -1719,8 +1723,7 @@  struct drm_atomic_state {
 	struct drm_crtc **crtcs;
 	struct drm_crtc_state **crtc_states;
 	int num_connector;
-	struct drm_connector **connectors;
-	struct drm_connector_state **connector_states;
+	struct __drm_connnectors_state *connectors;
 
 	struct drm_modeset_acquire_ctx *acquire_ctx;
 };