> From: linux-rdma-owner@xxxxxxxxxxxxxxx [mailto:linux-rdma- > owner@xxxxxxxxxxxxxxx] On Behalf Of Shiraz Saleem > > On a netdev MTU change event, the iWARP > Exception Queue (IEQ) buffers may not be sized properly to handle the new > MTU. > > Reinitialize the IEQ with new MTU size on MTU change event. > > Also, add define for the max ethernet frame size field in IEQ QP context > instead of the snd_mss define which is for iWARP QPs' MSS field. How do you handle any open iWARP connections on mtu change? > > Signed-off-by: Shiraz Saleem <shiraz.saleem@xxxxxxxxx> > --- > drivers/infiniband/hw/i40iw/i40iw_ctrl.c | 5 ++++- > drivers/infiniband/hw/i40iw/i40iw_d.h | 3 +++ > drivers/infiniband/hw/i40iw/i40iw_main.c | 19 +++++++++++++++++-- > drivers/infiniband/hw/i40iw/i40iw_p.h | 1 + > drivers/infiniband/hw/i40iw/i40iw_puda.c | 2 +- > 5 files changed, 26 insertions(+), 4 deletions(-) > > diff --git a/drivers/infiniband/hw/i40iw/i40iw_ctrl.c > b/drivers/infiniband/hw/i40iw/i40iw_ctrl.c > index eabbd6d..c790f8b 100644 > --- a/drivers/infiniband/hw/i40iw/i40iw_ctrl.c > +++ b/drivers/infiniband/hw/i40iw/i40iw_ctrl.c > @@ -348,7 +348,10 @@ void i40iw_change_l2params(struct i40iw_sc_vsi > *vsi, struct i40iw_l2params *l2pa > u16 qs_handle; > int i; > > - vsi->mtu = l2params->mtu; > + if (vsi->mtu != l2params->mtu) { > + vsi->mtu = l2params->mtu; > + i40iw_reinitialize_ieq(dev); > + } > > i40iw_fill_qos_list(l2params->qs_handle_list); > for (i = 0; i < I40IW_MAX_USER_PRIORITY; i++) { diff --git > a/drivers/infiniband/hw/i40iw/i40iw_d.h > b/drivers/infiniband/hw/i40iw/i40iw_d.h > index 17ed45b..f1a6ce6c9 100644 > --- a/drivers/infiniband/hw/i40iw/i40iw_d.h > +++ b/drivers/infiniband/hw/i40iw/i40iw_d.h > @@ -1107,6 +1107,9 @@ > #define I40IWQPC_SNDMSS_SHIFT 16 > #define I40IWQPC_SNDMSS_MASK (0x3fffUL << > I40IWQPC_SNDMSS_SHIFT) > > +#define I40IW_UDA_QPC_MAXFRAMESIZE_SHIFT 16 #define > +I40IW_UDA_QPC_MAXFRAMESIZE_MASK (0x3fffUL << > +I40IW_UDA_QPC_MAXFRAMESIZE_SHIFT) > + > #define I40IWQPC_VLANTAG_SHIFT 32 > #define I40IWQPC_VLANTAG_MASK (0xffffULL << > I40IWQPC_VLANTAG_SHIFT) > > diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c > b/drivers/infiniband/hw/i40iw/i40iw_main.c > index dc6b3387..e824296 100644 > --- a/drivers/infiniband/hw/i40iw/i40iw_main.c > +++ b/drivers/infiniband/hw/i40iw/i40iw_main.c > @@ -964,8 +964,8 @@ static enum i40iw_status_code > i40iw_initialize_ieq(struct i40iw_device *iwdev) > info.pd_id = 2; > info.sq_size = 8192; > info.rq_size = 8192; > - info.buf_size = 2048; > - info.tx_buf_cnt = 16384; > + info.buf_size = iwdev->vsi.mtu + VLAN_ETH_HLEN; > + info.tx_buf_cnt = 4096; > status = i40iw_puda_create_rsrc(&iwdev->vsi, &info); > if (status) > i40iw_pr_err("ieq create fail\n"); > @@ -973,6 +973,21 @@ static enum i40iw_status_code > i40iw_initialize_ieq(struct i40iw_device *iwdev) } > > /** > + * i40iw_reinitialize_ieq - destroy and re-create ieq > + * @dev: iwarp device > + */ > +void i40iw_reinitialize_ieq(struct i40iw_sc_dev *dev) { > + struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev; > + > + i40iw_puda_dele_resources(&iwdev->vsi, > I40IW_PUDA_RSRC_TYPE_IEQ, false); > + if (i40iw_initialize_ieq(iwdev)) { > + iwdev->reset = true; > + i40iw_request_reset(iwdev); > + } > +} > + > +/** > * i40iw_hmc_setup - create hmc objects for the device > * @iwdev: iwarp device > * > diff --git a/drivers/infiniband/hw/i40iw/i40iw_p.h > b/drivers/infiniband/hw/i40iw/i40iw_p.h > index e217a12..717fbe7 100644 > --- a/drivers/infiniband/hw/i40iw/i40iw_p.h > +++ b/drivers/infiniband/hw/i40iw/i40iw_p.h > @@ -121,5 +121,6 @@ enum i40iw_status_code > i40iw_allocate_virt_mem(struct i40iw_hw *hw, enum i40iw_status_code > i40iw_free_virt_mem(struct i40iw_hw *hw, > struct i40iw_virt_mem *mem); > u8 i40iw_get_encoded_wqe_size(u32 wqsize, bool cqpsq); > +void i40iw_reinitialize_ieq(struct i40iw_sc_dev *dev); > > #endif > diff --git a/drivers/infiniband/hw/i40iw/i40iw_puda.c > b/drivers/infiniband/hw/i40iw/i40iw_puda.c > index 71914b3..d75fc81 100644 > --- a/drivers/infiniband/hw/i40iw/i40iw_puda.c > +++ b/drivers/infiniband/hw/i40iw/i40iw_puda.c > @@ -491,7 +491,7 @@ static void i40iw_puda_qp_setctx(struct > i40iw_puda_rsrc *rsrc) > LS_64(qp->hw_rq_size, I40IWQPC_RQSIZE) | > LS_64(qp->hw_sq_size, I40IWQPC_SQSIZE)); > > - set_64bit_val(qp_ctx, 48, LS_64(1514, I40IWQPC_SNDMSS)); > + set_64bit_val(qp_ctx, 48, LS_64(rsrc->buf_size, > +I40IW_UDA_QPC_MAXFRAMESIZE)); > set_64bit_val(qp_ctx, 56, 0); > set_64bit_val(qp_ctx, 64, 1); > > -- > 2.8.3 > > -- > 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