On Mon, Jun 22, 2015 at 05:31:59PM +1000, Dave Airlie wrote: > From: Daniel Vetter <daniel.vetter@xxxxxxxx> > > 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@xxxxxxxxxx> Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxxx> Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> 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@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel