unsigned int rds_ib_fmr_1m_pool_size = RDS_FMR_1M_POOL_SIZE;
unsigned int rds_ib_fmr_8k_pool_size = RDS_FMR_8K_POOL_SIZE;
unsigned int rds_ib_retry_count = RDS_IB_DEFAULT_RETRY_COUNT;
+#if RDMA_RDS_APM_SUPPORTED
unsigned int rds_ib_apm_enabled = 0;
unsigned int rds_ib_apm_fallback = 1;
+#endif
unsigned int rds_ib_haip_enabled = 0;
unsigned int rds_ib_haip_fallback = 1;
+#if RDMA_RDS_APM_SUPPORTED
unsigned int rds_ib_apm_timeout = RDS_IB_DEFAULT_TIMEOUT;
+#endif
unsigned int rds_ib_rnr_retry_count = RDS_IB_DEFAULT_RNR_RETRY_COUNT;
#if IB_RDS_CQ_VECTOR_SUPPORTED
unsigned int rds_ib_cq_balance_enabled = 1;
MODULE_PARM_DESC(rds_ib_fmr_8k_pool_size, " Max number of 8k fmr per HCA");
module_param(rds_ib_retry_count, int, 0444);
MODULE_PARM_DESC(rds_ib_retry_count, " Number of hw retries before reporting an error");
+#if RDMA_RDS_APM_SUPPORTED
module_param(rds_ib_apm_enabled, int, 0444);
MODULE_PARM_DESC(rds_ib_apm_enabled, " APM Enabled");
+#endif
module_param(rds_ib_haip_enabled, int, 0444);
MODULE_PARM_DESC(rds_ib_haip_enabled, " High Availability IP enabled");
+#if RDMA_RDS_APM_SUPPORTED
module_param(rds_ib_apm_timeout, int, 0444);
MODULE_PARM_DESC(rds_ib_apm_timeout, " APM timeout");
+#endif
module_param(rds_ib_rnr_retry_count, int, 0444);
MODULE_PARM_DESC(rds_ib_rnr_retry_count, " QP rnr retry count");
+#if RDMA_RDS_APM_SUPPORTED
module_param(rds_ib_apm_fallback, int, 0444);
MODULE_PARM_DESC(rds_ib_apm_fallback, " APM failback enabled");
+#endif
module_param(rds_ib_haip_fallback, int, 0444);
MODULE_PARM_DESC(rds_ib_haip_fallback, " HAIP failback Enabled");
module_param(rds_ib_haip_failover_groups, charp, 0444);
.sync_mr = rds_ib_sync_mr,
.free_mr = rds_ib_free_mr,
.flush_mrs = rds_ib_flush_mrs,
+#if RDMA_RDS_APM_SUPPORTED
.check_migration = rds_ib_check_migration,
+#endif
.t_owner = THIS_MODULE,
.t_name = "infiniband",
.t_type = RDS_TRANS_IB
extern unsigned int rds_ib_fmr_8k_pool_size;
extern unsigned int rds_ib_retry_count;
extern unsigned int rds_ib_rnr_retry_count;
+#if RDMA_RDS_APM_SUPPORTED
extern unsigned int rds_ib_apm_enabled;
extern unsigned int rds_ib_apm_fallback;
+#endif
extern unsigned int rds_ib_haip_enabled;
extern unsigned int rds_ib_haip_fallback;
extern unsigned int rds_ib_haip_failover_enabled;
+#if RDMA_RDS_APM_SUPPORTED
extern unsigned int rds_ib_apm_timeout;
+#endif
#if IB_RDS_CQ_VECTOR_SUPPORTED
extern unsigned int rds_ib_cq_balance_enabled;
#endif
int rds_ib_cm_initiate_connect(struct rdma_cm_id *cm_id);
void rds_ib_cm_connect_complete(struct rds_connection *conn,
struct rdma_cm_event *event);
+#if RDMA_RDS_APM_SUPPORTED
void rds_ib_check_migration(struct rds_connection *conn,
struct rdma_cm_event *event);
-
+#endif
#define rds_ib_conn_error(conn, fmt...) \
__rds_ib_conn_error(conn, KERN_WARNING "RDS/IB: " fmt)
if (dp && dp->dp_ack_seq)
rds_send_drop_acked(conn, be64_to_cpu(dp->dp_ack_seq), NULL);
+#if RDMA_RDS_APM_SUPPORTED
if (rds_ib_apm_enabled && !ic->conn->c_reconnect) {
memcpy(&ic->i_pri_path.p_sgid,
&ic->i_cm_id->route.path_rec[0].sgid,
RDS_IB_GID_ARG(ic->i_pri_path.p_sgid),
RDS_IB_GID_ARG(ic->i_pri_path.p_dgid));
}
+#endif
rds_connect_complete(conn);
}
event->param.conn.responder_resources,
event->param.conn.initiator_depth);
+#if RDMA_RDS_APM_SUPPORTED
if (rds_ib_apm_enabled)
rdma_set_timeout(cm_id, rds_ib_apm_timeout);
-
+#endif
/* rdma_accept() calls rdma_reject() internally if it fails */
err = rdma_accept(cm_id, &conn_param);
if (err)
rds_ib_conn_error(conn, "rdma_accept failed (%d)\n", err);
+#if RDMA_RDS_APM_SUPPORTED
else if (rds_ib_apm_enabled && !conn->c_loopback) {
err = rdma_enable_apm(cm_id, RDMA_ALT_PATH_BEST);
if (err)
printk(KERN_WARNING "RDS/IB: APM couldn't be enabled for passive side: %d\n", err);
}
+#endif
out:
if (conn)
struct rds_ib_connect_private dp;
int ret;
+#if RDMA_RDS_APM_SUPPORTED
if (rds_ib_apm_enabled && !conn->c_loopback) {
ret = rdma_enable_apm(cm_id, RDMA_ALT_PATH_BEST);
if (ret)
printk(KERN_WARNING "RDS/IB: APM couldn't be enabled for active side: %d\n", ret);
}
+#endif
/* If the peer doesn't do protocol negotiation, we must
* default to RDSv3.0 */
struct rdma_cm_id *cm_id = ic->i_cm_id;
int ret = 0;
+#if RDMA_RDS_APM_SUPPORTED
if (!rds_ib_apm_fallback)
return;
+#endif
if (!ic->i_active_side) {
ret = ib_query_qp(cm_id->qp, &qp_attr, IB_QP_PATH_MIG_STATE,
}
}
+#if RDMA_RDS_APM_SUPPORTED
void rds_ib_check_migration(struct rds_connection *conn,
struct rdma_cm_event *event)
{
}
}
}
+#endif
static void rds_ib_destroy_id(struct work_struct *_work)
{
case RDMA_CM_EVENT_ADDR_RESOLVED:
rdma_set_service_type(cm_id, conn->c_tos);
+#if RDMA_RDS_APM_SUPPORTED
if (rds_ib_apm_enabled)
rdma_set_timeout(cm_id, rds_ib_apm_timeout);
+#endif
/* XXX do we need to clean up if this fails? */
ret = rdma_resolve_route(cm_id,
ret = trans->cm_initiate_connect(cm_id);
break;
+#if RDMA_RDS_APM_SUPPORTED
case RDMA_CM_EVENT_ALT_PATH_LOADED:
rdsdebug("RDS: alt path loaded\n");
if (conn)
case RDMA_CM_EVENT_ALT_ROUTE_ERROR:
rdsdebug("RDS: alt route resolve error\n");
break;
+#endif
case RDMA_CM_EVENT_ROUTE_ERROR:
/* IP might have been moved so flush the ARP entry and retry */
break;
case RDMA_CM_EVENT_ADDR_CHANGE:
+#if RDMA_RDS_APM_SUPPORTED
if (conn && !rds_ib_apm_enabled)
rds_conn_drop(conn);
+#else
+ if (conn)
+ rds_conn_drop(conn);
+#endif
break;
case RDMA_CM_EVENT_DISCONNECTED:
#define RDS_PROTOCOL(maj, min) (((maj) << 8) | min)
#define IB_RDS_CQ_VECTOR_SUPPORTED 0
+#define RDMA_RDS_APM_SUPPORTED 0
/*
* XXX randomly chosen, but at least seems to be unused: