diff mbox

[for-next,08/12] i40iw: Reinitialize IEQ on MTU change

Message ID 20171016204605.37512-9-shiraz.saleem@intel.com (mailing list archive)
State Accepted
Headers show

Commit Message

Shiraz Saleem Oct. 16, 2017, 8:46 p.m. UTC
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.

Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
---
 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(-)

Comments

Kalderon, Michal Oct. 17, 2017, 9:15 a.m. UTC | #1
> From: linux-rdma-owner@vger.kernel.org [mailto:linux-rdma-
> owner@vger.kernel.org] 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@intel.com>
> ---
>  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@vger.kernel.org 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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Shiraz Saleem Oct. 17, 2017, 3:55 p.m. UTC | #2
On Tue, Oct 17, 2017 at 09:15:07AM +0000, Kalderon, Michal wrote:
> > From: linux-rdma-owner@vger.kernel.org [mailto:linux-rdma-
> > owner@vger.kernel.org] 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? 

MTU change on active QPs is not supported. These QPs will continue to run on old MTU
and are not explicitly torn down. New QPs are created with the new value.

Shiraz
 
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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);