[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