@@ -207,8 +207,7 @@ static int ethernet_read_keys(struct pingpong_dest *rem_dest,
char msg[KEY_MSG_SIZE];
if (read(comm->rdma_params->sockfd, msg, sizeof msg) != sizeof msg) {
- perror("pp_read_keys");
- fprintf(stderr, "Couldn't read remote address\n");
+ fprintf(stderr, "ethernet_read_keys: Couldn't read remote address\n");
return 1;
}
@@ -229,8 +228,7 @@ static int ethernet_read_keys(struct pingpong_dest *rem_dest,
int i;
if (read(comm->rdma_params->sockfd, msg, sizeof msg) != sizeof msg) {
- perror("pp_read_keys");
- fprintf(stderr, "Couldn't read remote address\n");
+ fprintf(stderr, "ethernet_read_keys: Couldn't read remote address\n");
return 1;
}
@@ -1130,8 +1128,7 @@ int ethernet_write_data(struct perftest_comm *comm, char* msg) {
int ethernet_read_data(struct perftest_comm *comm, char* recv_msg) {
if (read(comm->rdma_params->sockfd, recv_msg, sizeof recv_msg) != sizeof recv_msg) {
- perror("pp_read_keys");
- fprintf(stderr, "Couldn't read reports\n");
+ fprintf(stderr, "ethernet_read_data: Couldn't read reports\n");
return 1;
}
@@ -267,6 +267,8 @@ static void usage(const char *argv0,VerbType verb,TestType tst) {
if (tst == BW)
printf(" -q, --qp=<num of qp's> Num of qp's(default %d)\n",DEF_NUM_QPS);
+ printf(" --pkey_index=<pkey index> PKey index to use for QP\n");
+
putchar('\n');
}
/******************************************************************************
@@ -345,6 +347,7 @@ static void init_perftest_params(struct perftest_parameters *user_param) {
user_param->limit_bw = 0;
user_param->is_limit_msgrate = OFF;
user_param->limit_msgrate = 0;
+ user_param->pkey_index = 0;
if (user_param->tst == LAT) {
user_param->r_flag->unsorted = OFF;
@@ -841,6 +844,33 @@ static int ctx_set_out_reads(struct ibv_context *context,int num_user_reads) {
/******************************************************************************
*
******************************************************************************/
+static int ctx_chk_pkey_index(struct ibv_context *context,int pkey_idx) {
+
+
+ int idx = 0;
+ struct ibv_device_attr attr;
+
+ if (!ibv_query_device(context,&attr)) {
+
+ if (pkey_idx > attr.max_pkeys - 1) {
+ printf(RESULT_LINE);
+ fprintf(stderr," Specified PKey Index, %i, greater than allowed max, %i\n",pkey_idx,attr.max_pkeys - 1);
+ fprintf(stderr," Changing to 0\n");
+ idx = 0;
+ } else
+ idx = pkey_idx;
+ } else {
+ fprintf(stderr," Unable to validate PKey Index, changing to 0\n");
+ idx = 0;
+ }
+
+ return idx;
+
+}
+
+/******************************************************************************
+ *
+ ******************************************************************************/
static void ctx_set_max_inline(struct ibv_context *context,struct perftest_parameters *user_param) {
@@ -883,6 +913,7 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) {
static int run_inf_flag = 0;
static int report_fmt_flag = 0;
static int srq_flag = 0;
+ static int pkey_flag = 0;
init_perftest_params(user_param);
@@ -941,6 +972,7 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) {
{ .name = "run_infinitely", .has_arg = 0, .flag = &run_inf_flag, .val = 1 },
{ .name = "report_gbits", .has_arg = 0, .flag = &report_fmt_flag, .val = 1},
{ .name = "use-srq", .has_arg = 0, .flag = &srq_flag, .val = 1},
+ { .name = "pkey_index", .has_arg = 1, .flag = &pkey_flag, .val = 1},
{ 0 }
};
c = getopt_long(argc,argv,"w:y:p:d:i:m:s:n:t:u:S:x:c:q:I:o:M:r:Q:A:l:D:f:B:T:E:J:j:K:k:aFegzRvhbNVCHUOZP",long_options,NULL);
@@ -1143,7 +1175,11 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) {
case 'P': user_param->machine = CLIENT; break;
case 'Z': user_param->machine = SERVER; break;
case 'v': user_param->mac_fwd = ON; break;
- case 0: break; // required for long options to work.
+ case 0: // used for long options
+ if (pkey_flag) {
+ user_param->pkey_index = strtol(optarg,NULL,0);
+ }
+ break;
default:
fprintf(stderr," Invalid Command or flag.\n");
fprintf(stderr," Please check command line and run again.\n\n");
@@ -1256,6 +1292,9 @@ int check_link_and_mtu(struct ibv_context *context,struct perftest_parameters *u
if (!user_param->ib_devname)
GET_STRING(user_param->ib_devname,ibv_get_device_name(context->device))
+ if (user_param->pkey_index > 0)
+ user_param->pkey_index = ctx_chk_pkey_index(context, user_param->pkey_index);
+
return SUCCESS;
}
@@ -291,6 +291,7 @@ struct perftest_parameters {
int work_rdma_cm;
char *user_mgid;
int buff_size;
+ int pkey_index;
// New test params format pilot. will be used in all flags soon,.
enum ctx_test_method test_method;
enum ibv_transport_type transport_type;
@@ -619,7 +619,7 @@ int ctx_modify_qp_to_init(struct ibv_qp *qp,struct perftest_parameters *user_par
memset(&attr, 0, sizeof(struct ibv_qp_attr));
attr.qp_state = IBV_QPS_INIT;
- attr.pkey_index = 0;
+ attr.pkey_index = user_param->pkey_index;
if ( user_param->use_xrc && (user_param->duplex || user_param->tst == LAT)) {
num_of_qps /= 2;