提交 8e8496e0 编写于 作者: L Logan Gunthorpe 提交者: Jon Mason

ntb_transport: fix bug calculating num_qps_mw

A divide by zero error occurs if qp_count is less than mw_count because
num_qps_mw is calculated to be zero. The calculation appears to be
incorrect.

The requirement is for num_qps_mw to be set to qp_count / mw_count
with any remainder divided among the earlier mws.

For example, if mw_count is 5 and qp_count is 12 then mws 0 and 1
will have 3 qps per window and mws 2 through 4 will have 2 qps per window.
Thus, when mw_num < qp_count % mw_count, num_qps_mw is 1 higher
than when mw_num >= qp_count.
Signed-off-by: NLogan Gunthorpe <logang@deltatee.com>
Fixes: e26a5843 ("NTB: Split ntb_hw_intel and ntb_transport drivers")
Acked-by: NAllen Hubbe <Allen.Hubbe@dell.com>
Signed-off-by: NJon Mason <jdmason@kudzu.us>
上级 cb827ee6
...@@ -623,7 +623,7 @@ static int ntb_transport_setup_qp_mw(struct ntb_transport_ctx *nt, ...@@ -623,7 +623,7 @@ static int ntb_transport_setup_qp_mw(struct ntb_transport_ctx *nt,
if (!mw->virt_addr) if (!mw->virt_addr)
return -ENOMEM; return -ENOMEM;
if (qp_count % mw_count && mw_num + 1 < qp_count / mw_count) if (mw_num < qp_count % mw_count)
num_qps_mw = qp_count / mw_count + 1; num_qps_mw = qp_count / mw_count + 1;
else else
num_qps_mw = qp_count / mw_count; num_qps_mw = qp_count / mw_count;
...@@ -1000,7 +1000,7 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt, ...@@ -1000,7 +1000,7 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt,
qp->event_handler = NULL; qp->event_handler = NULL;
ntb_qp_link_down_reset(qp); ntb_qp_link_down_reset(qp);
if (qp_count % mw_count && mw_num + 1 < qp_count / mw_count) if (mw_num < qp_count % mw_count)
num_qps_mw = qp_count / mw_count + 1; num_qps_mw = qp_count / mw_count + 1;
else else
num_qps_mw = qp_count / mw_count; num_qps_mw = qp_count / mw_count;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册