On 11/14/2017 7:34 AM, Dennis Dalessandro wrote: > From: Venkata Sandeep Dhanalakota <venkata.s.dhanalakota@xxxxxxxxx> > > SA queries SM for class port info when there is a LID_CHANGE event. > > When a base lid is configured before fm is started ie when smlid is > not yet assigned, SA handles the LID_CHANGE event and tries query SM > with lid 0. This will cause an hang. > > [ 1106.958820] INFO: task kworker/2:0:23 blocked for more than 120 seconds. > [ 1106.965082] Tainted: G O 4.12.0+ #1 > [ 1106.969602] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [ 1106.977227] kworker/2:0 D 0 23 2 0x00000000 > [ 1106.977250] Workqueue: infiniband update_ib_cpi [ib_core] > [ 1106.977261] Call Trace: > [ 1106.977273] __schedule+0x28e/0x860 > [ 1106.977285] schedule+0x36/0x80 > [ 1106.977298] schedule_timeout+0x1a3/0x2e0 > [ 1106.977310] ? radix_tree_iter_tag_clear+0x1b/0x20 > [ 1106.977322] ? idr_alloc+0x64/0x90 > [ 1106.977334] wait_for_completion+0xe3/0x140 > [ 1106.977347] ? wake_up_q+0x80/0x80 > [ 1106.977369] update_ib_cpi+0x163/0x210 [ib_core] > [ 1106.977381] process_one_work+0x147/0x370 > [ 1106.977394] worker_thread+0x4a/0x390 > [ 1106.977406] kthread+0x109/0x140 > [ 1106.977418] ? process_one_work+0x370/0x370 > [ 1106.977430] ? kthread_park+0x60/0x60 > [ 1106.977443] ret_from_fork+0x22/0x30 > > Always ensure a proper smlid is assigned before querying SM for cpi. > > Fixes: ee1c60b1bff ("IB/SA: Modify SA to implicitly cache Class Port info") > Reviewed-by: Mike Marciniszyn <mike.marciniszyn@xxxxxxxxx> > Reviewed-by: Ira Weiny <ira.weiny@xxxxxxxxx> > Signed-off-by: Venkata Sandeep Dhanalakota <venkata.s.dhanalakota@xxxxxxxxx> > Signed-off-by: Dennis Dalessandro <dennis.dalessandro@xxxxxxxxx> > --- > drivers/infiniband/core/sa_query.c | 10 ++++++++++ > 1 files changed, 10 insertions(+), 0 deletions(-) > > diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c > index ab5e102..24b9b5f 100644 > --- a/drivers/infiniband/core/sa_query.c > +++ b/drivers/infiniband/core/sa_query.c > @@ -1345,6 +1345,7 @@ int ib_init_ah_from_path(struct ib_device *device, u8 port_num, > > static int alloc_mad(struct ib_sa_query *query, gfp_t gfp_mask) > { > + struct rdma_ah_attr ah_attr; > unsigned long flags; > > spin_lock_irqsave(&query->port->ah_lock, flags); > @@ -1356,6 +1357,15 @@ static int alloc_mad(struct ib_sa_query *query, gfp_t gfp_mask) > query->sm_ah = query->port->sm_ah; > spin_unlock_irqrestore(&query->port->ah_lock, flags); > > + /* > + * Always check if sm_ah has valid dlid assigned, > + * before querying for class port info > + */ > + if ((rdma_query_ah(query->sm_ah->ah, &ah_attr) < 0) || > + !rdma_ah_get_dlid(&ah_attr)) { Isn't valid SM LID more complex than just != 0 ? For IB, invalid SM LID is != 0 and not in multicast LID range (>= 0xC000 which includes the permissive LID). At a minimum (for at least IB), this check should also include the permissive LID. -- Hal > + kref_put(&query->sm_ah->ref, free_sm_ah); > + return -EAGAIN; > + } > query->mad_buf = ib_create_send_mad(query->port->agent, 1, > query->sm_ah->pkey_index, > 0, IB_MGMT_SA_HDR, IB_MGMT_SA_DATA, > > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html