forked from luck/tmp_suning_uos_patched
RDMA/uverbs: Fix validity check for modify QP
Uverbs shouldn't enforce QP state in the command unless the user set the QP state bit in the attribute mask. In addition, only copy qp attr fields which have the corresponding bit set in the attribute mask over to the internal attr structure. Fixes:88de869bbe
("RDMA/uverbs: Ensure validity of current QP state value") Fixes:bc38a6abdd
("[PATCH] IB uverbs: core implementation") Signed-off-by: Majd Dibbiny <majd@mellanox.com> Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
ee92efe41c
commit
4eeed36869
|
@ -2027,33 +2027,55 @@ static int modify_qp(struct ib_uverbs_file *file,
|
|||
|
||||
if ((cmd->base.attr_mask & IB_QP_CUR_STATE &&
|
||||
cmd->base.cur_qp_state > IB_QPS_ERR) ||
|
||||
cmd->base.qp_state > IB_QPS_ERR) {
|
||||
(cmd->base.attr_mask & IB_QP_STATE &&
|
||||
cmd->base.qp_state > IB_QPS_ERR)) {
|
||||
ret = -EINVAL;
|
||||
goto release_qp;
|
||||
}
|
||||
|
||||
attr->qp_state = cmd->base.qp_state;
|
||||
attr->cur_qp_state = cmd->base.cur_qp_state;
|
||||
attr->path_mtu = cmd->base.path_mtu;
|
||||
attr->path_mig_state = cmd->base.path_mig_state;
|
||||
attr->qkey = cmd->base.qkey;
|
||||
attr->rq_psn = cmd->base.rq_psn;
|
||||
attr->sq_psn = cmd->base.sq_psn;
|
||||
attr->dest_qp_num = cmd->base.dest_qp_num;
|
||||
attr->qp_access_flags = cmd->base.qp_access_flags;
|
||||
attr->pkey_index = cmd->base.pkey_index;
|
||||
attr->alt_pkey_index = cmd->base.alt_pkey_index;
|
||||
attr->en_sqd_async_notify = cmd->base.en_sqd_async_notify;
|
||||
attr->max_rd_atomic = cmd->base.max_rd_atomic;
|
||||
attr->max_dest_rd_atomic = cmd->base.max_dest_rd_atomic;
|
||||
attr->min_rnr_timer = cmd->base.min_rnr_timer;
|
||||
attr->port_num = cmd->base.port_num;
|
||||
attr->timeout = cmd->base.timeout;
|
||||
attr->retry_cnt = cmd->base.retry_cnt;
|
||||
attr->rnr_retry = cmd->base.rnr_retry;
|
||||
attr->alt_port_num = cmd->base.alt_port_num;
|
||||
attr->alt_timeout = cmd->base.alt_timeout;
|
||||
attr->rate_limit = cmd->rate_limit;
|
||||
if (cmd->base.attr_mask & IB_QP_STATE)
|
||||
attr->qp_state = cmd->base.qp_state;
|
||||
if (cmd->base.attr_mask & IB_QP_CUR_STATE)
|
||||
attr->cur_qp_state = cmd->base.cur_qp_state;
|
||||
if (cmd->base.attr_mask & IB_QP_PATH_MTU)
|
||||
attr->path_mtu = cmd->base.path_mtu;
|
||||
if (cmd->base.attr_mask & IB_QP_PATH_MIG_STATE)
|
||||
attr->path_mig_state = cmd->base.path_mig_state;
|
||||
if (cmd->base.attr_mask & IB_QP_QKEY)
|
||||
attr->qkey = cmd->base.qkey;
|
||||
if (cmd->base.attr_mask & IB_QP_RQ_PSN)
|
||||
attr->rq_psn = cmd->base.rq_psn;
|
||||
if (cmd->base.attr_mask & IB_QP_SQ_PSN)
|
||||
attr->sq_psn = cmd->base.sq_psn;
|
||||
if (cmd->base.attr_mask & IB_QP_DEST_QPN)
|
||||
attr->dest_qp_num = cmd->base.dest_qp_num;
|
||||
if (cmd->base.attr_mask & IB_QP_ACCESS_FLAGS)
|
||||
attr->qp_access_flags = cmd->base.qp_access_flags;
|
||||
if (cmd->base.attr_mask & IB_QP_PKEY_INDEX)
|
||||
attr->pkey_index = cmd->base.pkey_index;
|
||||
if (cmd->base.attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
|
||||
attr->en_sqd_async_notify = cmd->base.en_sqd_async_notify;
|
||||
if (cmd->base.attr_mask & IB_QP_MAX_QP_RD_ATOMIC)
|
||||
attr->max_rd_atomic = cmd->base.max_rd_atomic;
|
||||
if (cmd->base.attr_mask & IB_QP_MAX_DEST_RD_ATOMIC)
|
||||
attr->max_dest_rd_atomic = cmd->base.max_dest_rd_atomic;
|
||||
if (cmd->base.attr_mask & IB_QP_MIN_RNR_TIMER)
|
||||
attr->min_rnr_timer = cmd->base.min_rnr_timer;
|
||||
if (cmd->base.attr_mask & IB_QP_PORT)
|
||||
attr->port_num = cmd->base.port_num;
|
||||
if (cmd->base.attr_mask & IB_QP_TIMEOUT)
|
||||
attr->timeout = cmd->base.timeout;
|
||||
if (cmd->base.attr_mask & IB_QP_RETRY_CNT)
|
||||
attr->retry_cnt = cmd->base.retry_cnt;
|
||||
if (cmd->base.attr_mask & IB_QP_RNR_RETRY)
|
||||
attr->rnr_retry = cmd->base.rnr_retry;
|
||||
if (cmd->base.attr_mask & IB_QP_ALT_PATH) {
|
||||
attr->alt_port_num = cmd->base.alt_port_num;
|
||||
attr->alt_timeout = cmd->base.alt_timeout;
|
||||
attr->alt_pkey_index = cmd->base.alt_pkey_index;
|
||||
}
|
||||
if (cmd->base.attr_mask & IB_QP_RATE_LIMIT)
|
||||
attr->rate_limit = cmd->rate_limit;
|
||||
|
||||
if (cmd->base.attr_mask & IB_QP_AV)
|
||||
copy_ah_attr_from_uverbs(qp->device, &attr->ah_attr,
|
||||
|
|
Loading…
Reference in New Issue
Block a user