Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
This commit is contained in:
@@ -308,10 +308,11 @@ static int cm_alloc_id(struct cm_id_private *cm_id_priv)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
static int next_id;
|
||||
|
||||
do {
|
||||
spin_lock_irqsave(&cm.lock, flags);
|
||||
ret = idr_get_new_above(&cm.local_id_table, cm_id_priv, 1,
|
||||
ret = idr_get_new_above(&cm.local_id_table, cm_id_priv, next_id++,
|
||||
(__force int *) &cm_id_priv->id.local_id);
|
||||
spin_unlock_irqrestore(&cm.lock, flags);
|
||||
} while( (ret == -EAGAIN) && idr_pre_get(&cm.local_id_table, GFP_KERNEL) );
|
||||
@@ -684,6 +685,13 @@ retest:
|
||||
cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT);
|
||||
break;
|
||||
case IB_CM_REQ_SENT:
|
||||
ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
|
||||
spin_unlock_irqrestore(&cm_id_priv->lock, flags);
|
||||
ib_send_cm_rej(cm_id, IB_CM_REJ_TIMEOUT,
|
||||
&cm_id_priv->av.port->cm_dev->ca_guid,
|
||||
sizeof cm_id_priv->av.port->cm_dev->ca_guid,
|
||||
NULL, 0);
|
||||
break;
|
||||
case IB_CM_MRA_REQ_RCVD:
|
||||
case IB_CM_REP_SENT:
|
||||
case IB_CM_MRA_REP_RCVD:
|
||||
@@ -694,10 +702,8 @@ retest:
|
||||
case IB_CM_REP_RCVD:
|
||||
case IB_CM_MRA_REP_SENT:
|
||||
spin_unlock_irqrestore(&cm_id_priv->lock, flags);
|
||||
ib_send_cm_rej(cm_id, IB_CM_REJ_TIMEOUT,
|
||||
&cm_id_priv->av.port->cm_dev->ca_guid,
|
||||
sizeof cm_id_priv->av.port->cm_dev->ca_guid,
|
||||
NULL, 0);
|
||||
ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED,
|
||||
NULL, 0, NULL, 0);
|
||||
break;
|
||||
case IB_CM_ESTABLISHED:
|
||||
spin_unlock_irqrestore(&cm_id_priv->lock, flags);
|
||||
|
@@ -197,8 +197,8 @@ static void send_handler(struct ib_mad_agent *agent,
|
||||
memcpy(timeout->mad.data, packet->mad.data,
|
||||
sizeof (struct ib_mad_hdr));
|
||||
|
||||
if (!queue_packet(file, agent, timeout))
|
||||
return;
|
||||
if (queue_packet(file, agent, timeout))
|
||||
kfree(timeout);
|
||||
}
|
||||
out:
|
||||
kfree(packet);
|
||||
|
@@ -489,6 +489,7 @@ err_idr:
|
||||
|
||||
err_unreg:
|
||||
ib_dereg_mr(mr);
|
||||
atomic_dec(&pd->usecnt);
|
||||
|
||||
err_up:
|
||||
up(&ib_uverbs_idr_mutex);
|
||||
@@ -593,13 +594,18 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file,
|
||||
if (cmd.comp_vector >= file->device->num_comp_vectors)
|
||||
return -EINVAL;
|
||||
|
||||
if (cmd.comp_channel >= 0)
|
||||
ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel);
|
||||
|
||||
uobj = kmalloc(sizeof *uobj, GFP_KERNEL);
|
||||
if (!uobj)
|
||||
return -ENOMEM;
|
||||
|
||||
if (cmd.comp_channel >= 0) {
|
||||
ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel);
|
||||
if (!ev_file) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
uobj->uobject.user_handle = cmd.user_handle;
|
||||
uobj->uobject.context = file->ucontext;
|
||||
uobj->uverbs_file = file;
|
||||
@@ -663,6 +669,8 @@ err_up:
|
||||
ib_destroy_cq(cq);
|
||||
|
||||
err:
|
||||
if (ev_file)
|
||||
ib_uverbs_release_ucq(file, ev_file, uobj);
|
||||
kfree(uobj);
|
||||
return ret;
|
||||
}
|
||||
@@ -935,6 +943,11 @@ err_idr:
|
||||
|
||||
err_destroy:
|
||||
ib_destroy_qp(qp);
|
||||
atomic_dec(&pd->usecnt);
|
||||
atomic_dec(&attr.send_cq->usecnt);
|
||||
atomic_dec(&attr.recv_cq->usecnt);
|
||||
if (attr.srq)
|
||||
atomic_dec(&attr.srq->usecnt);
|
||||
|
||||
err_up:
|
||||
up(&ib_uverbs_idr_mutex);
|
||||
@@ -1448,6 +1461,7 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
|
||||
attr.sl = cmd.attr.sl;
|
||||
attr.src_path_bits = cmd.attr.src_path_bits;
|
||||
attr.static_rate = cmd.attr.static_rate;
|
||||
attr.ah_flags = cmd.attr.is_global ? IB_AH_GRH : 0;
|
||||
attr.port_num = cmd.attr.port_num;
|
||||
attr.grh.flow_label = cmd.attr.grh.flow_label;
|
||||
attr.grh.sgid_index = cmd.attr.grh.sgid_index;
|
||||
@@ -1729,6 +1743,7 @@ err_idr:
|
||||
|
||||
err_destroy:
|
||||
ib_destroy_srq(srq);
|
||||
atomic_dec(&pd->usecnt);
|
||||
|
||||
err_up:
|
||||
up(&ib_uverbs_idr_mutex);
|
||||
|
@@ -107,9 +107,9 @@ struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc,
|
||||
|
||||
if (wc->wc_flags & IB_WC_GRH) {
|
||||
ah_attr.ah_flags = IB_AH_GRH;
|
||||
ah_attr.grh.dgid = grh->dgid;
|
||||
ah_attr.grh.dgid = grh->sgid;
|
||||
|
||||
ret = ib_find_cached_gid(pd->device, &grh->sgid, &port_num,
|
||||
ret = ib_find_cached_gid(pd->device, &grh->dgid, &port_num,
|
||||
&gid_index);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
Reference in New Issue
Block a user