Three minor bug fixes:
 
 - qedr not setting the QP timeout properly toward userspace
 
 - Memory leak on error path in ib_cm
 
 - Divide by 0 in RDMA interrupt moderation
 -----BEGIN PGP SIGNATURE-----
 
 iHUEABYIAB0WIQRRRCHOFoQz/8F5bUaFwuHvBreFYQUCYr2asAAKCRCFwuHvBreF
 YZRwAQCoGE+/UNxxZKZPwB/OP1oYGby2zMm8tMmgrvREFpGg4AD/UzWAWYpPBmXj
 Ue6xDo2wzS3nwGSZlDzWOI1kD9fGlQA=
 =9mO3
 -----END PGP SIGNATURE-----

Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma

Pull rdma fixes from Jason Gunthorpe:
 "Three minor bug fixes:

   - qedr not setting the QP timeout properly toward userspace

   - Memory leak on error path in ib_cm

   - Divide by 0 in RDMA interrupt moderation"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma:
  linux/dim: Fix divide by 0 in RDMA DIM
  RDMA/cm: Fix memory leak in ib_cm_insert_listen
  RDMA/qedr: Fix reporting QP timeout attribute
This commit is contained in:
Linus Torvalds 2022-06-30 10:03:22 -07:00
Родитель 9fb3bb25d1 0fe3dbbefb
Коммит 1a0e93df1e
4 изменённых файлов: 8 добавлений и 3 удалений

Просмотреть файл

@ -1252,8 +1252,10 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,
return ERR_CAST(cm_id_priv); return ERR_CAST(cm_id_priv);
err = cm_init_listen(cm_id_priv, service_id, 0); err = cm_init_listen(cm_id_priv, service_id, 0);
if (err) if (err) {
ib_destroy_cm_id(&cm_id_priv->id);
return ERR_PTR(err); return ERR_PTR(err);
}
spin_lock_irq(&cm_id_priv->lock); spin_lock_irq(&cm_id_priv->lock);
listen_id_priv = cm_insert_listen(cm_id_priv, cm_handler); listen_id_priv = cm_insert_listen(cm_id_priv, cm_handler);

Просмотреть файл

@ -418,6 +418,7 @@ struct qedr_qp {
u32 sq_psn; u32 sq_psn;
u32 qkey; u32 qkey;
u32 dest_qp_num; u32 dest_qp_num;
u8 timeout;
/* Relevant to qps created from kernel space only (ULPs) */ /* Relevant to qps created from kernel space only (ULPs) */
u8 prev_wqe_size; u8 prev_wqe_size;

Просмотреть файл

@ -2613,6 +2613,8 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
1 << max_t(int, attr->timeout - 8, 0); 1 << max_t(int, attr->timeout - 8, 0);
else else
qp_params.ack_timeout = 0; qp_params.ack_timeout = 0;
qp->timeout = attr->timeout;
} }
if (attr_mask & IB_QP_RETRY_CNT) { if (attr_mask & IB_QP_RETRY_CNT) {
@ -2772,7 +2774,7 @@ int qedr_query_qp(struct ib_qp *ibqp,
rdma_ah_set_dgid_raw(&qp_attr->ah_attr, &params.dgid.bytes[0]); rdma_ah_set_dgid_raw(&qp_attr->ah_attr, &params.dgid.bytes[0]);
rdma_ah_set_port_num(&qp_attr->ah_attr, 1); rdma_ah_set_port_num(&qp_attr->ah_attr, 1);
rdma_ah_set_sl(&qp_attr->ah_attr, 0); rdma_ah_set_sl(&qp_attr->ah_attr, 0);
qp_attr->timeout = params.timeout; qp_attr->timeout = qp->timeout;
qp_attr->rnr_retry = params.rnr_retry; qp_attr->rnr_retry = params.rnr_retry;
qp_attr->retry_cnt = params.retry_cnt; qp_attr->retry_cnt = params.retry_cnt;
qp_attr->min_rnr_timer = params.min_rnr_nak_timer; qp_attr->min_rnr_timer = params.min_rnr_nak_timer;

Просмотреть файл

@ -21,7 +21,7 @@
* We consider 10% difference as significant. * We consider 10% difference as significant.
*/ */
#define IS_SIGNIFICANT_DIFF(val, ref) \ #define IS_SIGNIFICANT_DIFF(val, ref) \
(((100UL * abs((val) - (ref))) / (ref)) > 10) ((ref) && (((100UL * abs((val) - (ref))) / (ref)) > 10))
/* /*
* Calculate the gap between two values. * Calculate the gap between two values.