@@ -164,27 +164,30 @@ void rds_ib_init_frag(unsigned int version)
164
164
}
165
165
166
166
/* Update the RDS IB frag size */
167
- static void rds_ib_set_frag_size (struct rds_connection * conn , u16 dp_frag )
167
+ static u16 rds_ib_set_frag_size (struct rds_connection * conn , u16 dp_frag )
168
168
{
169
169
struct rds_ib_connection * ic = conn -> c_transport_data ;
170
170
u16 current_frag = ic -> i_frag_sz ;
171
171
u16 frag ;
172
172
173
- if (ib_init_frag_size != dp_frag ) {
174
- frag = min_t (unsigned int , dp_frag , ib_init_frag_size );
173
+ frag = min_t (unsigned int , ib_init_frag_size ,
174
+ PAGE_ALIGN ((ic -> i_hca_sge - 1 ) * PAGE_SIZE ));
175
+
176
+ if (frag != dp_frag ) {
177
+ frag = min_t (unsigned int , dp_frag , frag );
175
178
ic -> i_frag_sz = rds_ib_get_frag (conn -> c_version , frag );
176
179
} else {
177
- ic -> i_frag_sz = ib_init_frag_size ;
180
+ ic -> i_frag_sz = frag ;
178
181
}
179
182
180
- ic -> i_frag_pages = ic -> i_frag_sz / PAGE_SIZE ;
181
- if (!ic -> i_frag_pages )
182
- ic -> i_frag_pages = 1 ;
183
+ ic -> i_frag_pages = ceil (ic -> i_frag_sz , PAGE_SIZE );
183
184
184
185
pr_debug ("RDS/IB: conn <%pI4, %pI4,%d>, Frags <init,ic,dp>: {%d,%d,%d}, updated {%d -> %d}\n" ,
185
186
& conn -> c_laddr , & conn -> c_faddr , conn -> c_tos ,
186
187
ib_init_frag_size / SZ_1K , ic -> i_frag_sz / SZ_1K , dp_frag / SZ_1K ,
187
188
current_frag / SZ_1K , ic -> i_frag_sz / SZ_1K );
189
+
190
+ return ic -> i_frag_sz ;
188
191
}
189
192
190
193
/* Init per IC frag size */
@@ -762,6 +765,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
762
765
attr .srq = rds_ibdev -> srq -> s_srq ;
763
766
}
764
767
768
+ ic -> i_hca_sge = rds_ibdev -> max_sge ;
765
769
/*
766
770
* XXX this can fail if max_*_wr is too large? Are we supposed
767
771
* to back off until we get a value that the hardware can support?
@@ -892,6 +896,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
892
896
u32 version ;
893
897
int err = 1 , destroy = 1 ;
894
898
int acl_ret = 0 ;
899
+ u16 frag ;
895
900
896
901
/* Check whether the remote protocol version matches ours. */
897
902
version = rds_ib_protocol_compatible (event );
@@ -925,7 +930,6 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
925
930
}
926
931
927
932
rds_ib_set_protocol (conn , version );
928
- rds_ib_set_frag_size (conn , be16_to_cpu (dp -> dp_frag_sz ));
929
933
930
934
conn -> c_acl_en = acl_ret ;
931
935
conn -> c_acl_init = 1 ;
@@ -1017,11 +1021,12 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
1017
1021
rds_conn_drop (conn , DR_IB_PAS_SETUP_QP_FAIL );
1018
1022
goto out ;
1019
1023
}
1024
+ frag = rds_ib_set_frag_size (conn , be16_to_cpu (dp -> dp_frag_sz ));
1020
1025
1021
1026
rds_ib_cm_fill_conn_param (conn , & conn_param , & dp_rep , version ,
1022
1027
event -> param .conn .responder_resources ,
1023
1028
event -> param .conn .initiator_depth ,
1024
- ib_init_frag_size );
1029
+ frag );
1025
1030
1026
1031
/* rdma_accept() calls rdma_reject() internally if it fails */
1027
1032
err = rdma_accept (cm_id , & conn_param );
@@ -1071,6 +1076,7 @@ int rds_ib_cm_initiate_connect(struct rdma_cm_id *cm_id)
1071
1076
struct rds_ib_connection * ic = conn -> c_transport_data ;
1072
1077
struct rdma_conn_param conn_param ;
1073
1078
struct rds_ib_connect_private dp ;
1079
+ u16 frag ;
1074
1080
int ret ;
1075
1081
1076
1082
ret = rds_ib_match_acl (ic -> i_cm_id , conn -> c_faddr );
@@ -1104,10 +1110,10 @@ int rds_ib_cm_initiate_connect(struct rdma_cm_id *cm_id)
1104
1110
rds_conn_drop (conn , DR_IB_ACT_SETUP_QP_FAIL );
1105
1111
goto out ;
1106
1112
}
1107
-
1113
+ frag = rds_ib_set_frag_size ( conn , ib_init_frag_size );
1108
1114
rds_ib_cm_fill_conn_param (conn , & conn_param , & dp ,
1109
- conn -> c_proposed_version , UINT_MAX , UINT_MAX ,
1110
- ib_init_frag_size );
1115
+ conn -> c_proposed_version , UINT_MAX , UINT_MAX ,
1116
+ frag );
1111
1117
ret = rdma_connect (cm_id , & conn_param );
1112
1118
if (ret ) {
1113
1119
pr_warn ("RDS/IB: rdma_connect failed (%d)\n" , ret );
0 commit comments