[PATCH] drm/dp/mst: make sure mst_primary mstb is valid in work function

Daniel Vetter daniel at ffwll.ch
Mon Jun 22 00:51:48 PDT 2015


On Mon, Jun 22, 2015 at 05:31:59PM +1000, Dave Airlie wrote:
> From: Daniel Vetter <daniel.vetter at ffwll.ch>
> 
> This validates the mst_primary under the lock, and then calls
> into the check and send function. This makes the code a lot
> easier to understand the locking rules in.
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>

Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Pick what you like ;-)

> ---
>  drivers/gpu/drm/drm_dp_mst_topology.c | 24 +++++++++++++++++++-----
>  1 file changed, 19 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
> index a9c437e..8a3bfcd 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -1204,7 +1204,7 @@ static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *m
>  					       struct drm_dp_mst_branch *mstb)
>  {
>  	struct drm_dp_mst_port *port;
> -
> +	struct drm_dp_mst_branch *mstb_child;
>  	if (!mstb->link_address_sent) {
>  		drm_dp_send_link_address(mgr, mstb);
>  		mstb->link_address_sent = true;
> @@ -1219,17 +1219,31 @@ static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *m
>  		if (!port->available_pbn)
>  			drm_dp_send_enum_path_resources(mgr, mstb, port);
>  
> -		if (port->mstb)
> -			drm_dp_check_and_send_link_address(mgr, port->mstb);
> +		if (port->mstb) {
> +			mstb_child = drm_dp_get_validated_mstb_ref(mgr, port->mstb);
> +			if (mstb_child) {
> +				drm_dp_check_and_send_link_address(mgr, mstb_child);
> +				drm_dp_put_mst_branch_device(mstb_child);
> +			}
> +		}
>  	}
>  }
>  
>  static void drm_dp_mst_link_probe_work(struct work_struct *work)
>  {
>  	struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, work);
> +	struct drm_dp_mst_branch *mstb;
>  
> -	drm_dp_check_and_send_link_address(mgr, mgr->mst_primary);
> -
> +	mutex_lock(&mgr->lock);
> +	mstb = mgr->mst_primary;
> +	if (mstb) {
> +		kref_get(&mstb->kref);
> +	}
> +	mutex_unlock(&mgr->lock);
> +	if (mstb) {
> +		drm_dp_check_and_send_link_address(mgr, mstb);
> +		drm_dp_put_mst_branch_device(mstb);
> +	}
>  }
>  
>  static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
> -- 
> 2.4.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list