diff mbox

[05/15] v4l: vsp1: Use vsp1_entity.pipe to check if entity belongs to a pipeline

Message ID 20180226214516.11559-6-laurent.pinchart+renesas@ideasonboard.com (mailing list archive)
State New, archived
Headers show

Commit Message

Laurent Pinchart Feb. 26, 2018, 9:45 p.m. UTC
The DRM pipeline handling code uses the entity's pipe list head to check
whether the entity is already included in a pipeline. This method is a
bit fragile in the sense that it uses list_empty() on a list_head that
is a list member. Replace it by a simpler check for the entity pipe
pointer.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
 drivers/media/platform/vsp1/vsp1_drm.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Kieran Bingham March 28, 2018, 2:10 p.m. UTC | #1
Hi Laurent,

On 26/02/18 21:45, Laurent Pinchart wrote:
> The DRM pipeline handling code uses the entity's pipe list head to check
> whether the entity is already included in a pipeline. This method is a
> bit fragile in the sense that it uses list_empty() on a list_head that
> is a list member. Replace it by a simpler check for the entity pipe
> pointer.

Yes, excellent.

> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>

> ---
>  drivers/media/platform/vsp1/vsp1_drm.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c
> index a7ad85ab0b08..e210917fdc3f 100644
> --- a/drivers/media/platform/vsp1/vsp1_drm.c
> +++ b/drivers/media/platform/vsp1/vsp1_drm.c
> @@ -119,9 +119,9 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index,
>  			 * Remove the RPF from the pipe and the list of BRU
>  			 * inputs.
>  			 */
> -			WARN_ON(list_empty(&rpf->entity.list_pipe));
> +			WARN_ON(!rpf->entity.pipe);

Does this WARN_ON() have much value any more ?

I think it could probably be removed... unless there is a race between potential
calls through vsp1_du_atomic_flush() and vsp1_du_setup_lif() - but I would be
very surprised if that wasn't protected at the DRM levels.

 (Removing it if chosen doesn't need to be in this patch though)

>  			rpf->entity.pipe = NULL;
> -			list_del_init(&rpf->entity.list_pipe);
> +			list_del(&rpf->entity.list_pipe);
>  			pipe->inputs[i] = NULL;
>  
>  			bru->inputs[rpf->bru_input].rpf = NULL;
> @@ -537,7 +537,7 @@ void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index)
>  			continue;
>  		}
>  
> -		if (list_empty(&rpf->entity.list_pipe)) {
> +		if (!rpf->entity.pipe) {
>  			rpf->entity.pipe = pipe;
>  			list_add_tail(&rpf->entity.list_pipe, &pipe->entities);
>  		}
> @@ -566,7 +566,7 @@ void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index)
>  					   VI6_DPR_NODE_UNUSED);
>  
>  			entity->pipe = NULL;
> -			list_del_init(&entity->list_pipe);
> +			list_del(&entity->list_pipe);
>  
>  			continue;
>  		}
>
Laurent Pinchart March 29, 2018, 7 a.m. UTC | #2
Hi Kieran,

On Wednesday, 28 March 2018 17:10:10 EEST Kieran Bingham wrote:
> On 26/02/18 21:45, Laurent Pinchart wrote:
> > The DRM pipeline handling code uses the entity's pipe list head to check
> > whether the entity is already included in a pipeline. This method is a
> > bit fragile in the sense that it uses list_empty() on a list_head that
> > is a list member. Replace it by a simpler check for the entity pipe
> > pointer.
> 
> Yes, excellent.
> 
> > Signed-off-by: Laurent Pinchart
> > <laurent.pinchart+renesas@ideasonboard.com>
> 
> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
> 
> > ---
> > 
> >  drivers/media/platform/vsp1/vsp1_drm.c | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/media/platform/vsp1/vsp1_drm.c
> > b/drivers/media/platform/vsp1/vsp1_drm.c index a7ad85ab0b08..e210917fdc3f
> > 100644
> > --- a/drivers/media/platform/vsp1/vsp1_drm.c
> > +++ b/drivers/media/platform/vsp1/vsp1_drm.c
> > @@ -119,9 +119,9 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int
> > pipe_index,> 
> >  			 * Remove the RPF from the pipe and the list of BRU
> >  			 * inputs.
> >  			 */
> > 
> > -			WARN_ON(list_empty(&rpf->entity.list_pipe));
> > +			WARN_ON(!rpf->entity.pipe);
> 
> Does this WARN_ON() have much value any more ?
> 
> I think it could probably be removed... unless there is a race between
> potential calls through vsp1_du_atomic_flush() and vsp1_du_setup_lif() -
> but I would be very surprised if that wasn't protected at the DRM levels.

It should indeed be protected at the DRM level. The purpose of the WARN_ON() 
is twofold, it catches both bugs in the VSP1 driver (but I don't expect any 
bug here, so from that point of view the WARN_ON isn't needed), but also 
misbehaviours in the callers. There hasn't been any so far though, so maybe we 
could indeed remove the WARN_ON(). It just makes me feel a bit safer but 
probably not in any rational way :-)

>  (Removing it if chosen doesn't need to be in this patch though)
> 
> >  			rpf->entity.pipe = NULL;
> > 
> > -			list_del_init(&rpf->entity.list_pipe);
> > +			list_del(&rpf->entity.list_pipe);
> > 
> >  			pipe->inputs[i] = NULL;
> >  			
> >  			bru->inputs[rpf->bru_input].rpf = NULL;
> > 
> > @@ -537,7 +537,7 @@ void vsp1_du_atomic_flush(struct device *dev, unsigned
> > int pipe_index)> 
> >  			continue;
> >  		
> >  		}
> > 
> > -		if (list_empty(&rpf->entity.list_pipe)) {
> > +		if (!rpf->entity.pipe) {
> > 
> >  			rpf->entity.pipe = pipe;
> >  			list_add_tail(&rpf->entity.list_pipe, &pipe->entities);
> >  		
> >  		}
> > 
> > @@ -566,7 +566,7 @@ void vsp1_du_atomic_flush(struct device *dev, unsigned
> > int pipe_index)> 
> >  					   VI6_DPR_NODE_UNUSED);
> >  			
> >  			entity->pipe = NULL;
> > 
> > -			list_del_init(&entity->list_pipe);
> > +			list_del(&entity->list_pipe);
> > 
> >  			continue;
> >  		
> >  		}
diff mbox

Patch

diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c
index a7ad85ab0b08..e210917fdc3f 100644
--- a/drivers/media/platform/vsp1/vsp1_drm.c
+++ b/drivers/media/platform/vsp1/vsp1_drm.c
@@ -119,9 +119,9 @@  int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index,
 			 * Remove the RPF from the pipe and the list of BRU
 			 * inputs.
 			 */
-			WARN_ON(list_empty(&rpf->entity.list_pipe));
+			WARN_ON(!rpf->entity.pipe);
 			rpf->entity.pipe = NULL;
-			list_del_init(&rpf->entity.list_pipe);
+			list_del(&rpf->entity.list_pipe);
 			pipe->inputs[i] = NULL;
 
 			bru->inputs[rpf->bru_input].rpf = NULL;
@@ -537,7 +537,7 @@  void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index)
 			continue;
 		}
 
-		if (list_empty(&rpf->entity.list_pipe)) {
+		if (!rpf->entity.pipe) {
 			rpf->entity.pipe = pipe;
 			list_add_tail(&rpf->entity.list_pipe, &pipe->entities);
 		}
@@ -566,7 +566,7 @@  void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index)
 					   VI6_DPR_NODE_UNUSED);
 
 			entity->pipe = NULL;
-			list_del_init(&entity->list_pipe);
+			list_del(&entity->list_pipe);
 
 			continue;
 		}