RDMA/cma: Provide ECE reject reason
IBTA declares "vendor option not supported" reject reason in REJ messages if passive side doesn't want to accept proposed ECE options. Due to the fact that ECE is managed by userspace, there is a need to let users to provide such rejected reason. Link: https://lore.kernel.org/r/20200526103304.196371-7-leon@kernel.org Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
Родитель
0cb15372a6
Коммит
8094ba0ace
|
@ -4196,7 +4196,7 @@ int __rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param,
|
|||
return 0;
|
||||
reject:
|
||||
cma_modify_qp_err(id_priv);
|
||||
rdma_reject(id, NULL, 0);
|
||||
rdma_reject(id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(__rdma_accept);
|
||||
|
@ -4236,7 +4236,7 @@ int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
|
|||
EXPORT_SYMBOL(rdma_notify);
|
||||
|
||||
int rdma_reject(struct rdma_cm_id *id, const void *private_data,
|
||||
u8 private_data_len)
|
||||
u8 private_data_len, u8 reason)
|
||||
{
|
||||
struct rdma_id_private *id_priv;
|
||||
int ret;
|
||||
|
@ -4251,9 +4251,8 @@ int rdma_reject(struct rdma_cm_id *id, const void *private_data,
|
|||
private_data, private_data_len);
|
||||
} else {
|
||||
trace_cm_send_rej(id_priv);
|
||||
ret = ib_send_cm_rej(id_priv->cm_id.ib,
|
||||
IB_CM_REJ_CONSUMER_DEFINED, NULL,
|
||||
0, private_data, private_data_len);
|
||||
ret = ib_send_cm_rej(id_priv->cm_id.ib, reason, NULL, 0,
|
||||
private_data, private_data_len);
|
||||
}
|
||||
} else if (rdma_cap_iw_cm(id->device, id->port_num)) {
|
||||
ret = iw_cm_reject(id_priv->cm_id.iw,
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include <rdma/rdma_cm_ib.h>
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <rdma/ib.h>
|
||||
#include <rdma/ib_cm.h>
|
||||
#include <rdma/rdma_netlink.h>
|
||||
#include "core_priv.h"
|
||||
|
||||
|
@ -1181,12 +1182,24 @@ static ssize_t ucma_reject(struct ucma_file *file, const char __user *inbuf,
|
|||
if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
|
||||
return -EFAULT;
|
||||
|
||||
if (!cmd.reason)
|
||||
cmd.reason = IB_CM_REJ_CONSUMER_DEFINED;
|
||||
|
||||
switch (cmd.reason) {
|
||||
case IB_CM_REJ_CONSUMER_DEFINED:
|
||||
case IB_CM_REJ_VENDOR_OPTION_NOT_SUPPORTED:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ctx = ucma_get_ctx_dev(file, cmd.id);
|
||||
if (IS_ERR(ctx))
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
mutex_lock(&ctx->mutex);
|
||||
ret = rdma_reject(ctx->cm_id, cmd.private_data, cmd.private_data_len);
|
||||
ret = rdma_reject(ctx->cm_id, cmd.private_data, cmd.private_data_len,
|
||||
cmd.reason);
|
||||
mutex_unlock(&ctx->mutex);
|
||||
ucma_put_ctx(ctx);
|
||||
return ret;
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/in.h>
|
||||
#include <linux/in6.h>
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/ib_cm.h>
|
||||
#include <rdma/rdma_cm.h>
|
||||
#include <target/target_core_base.h>
|
||||
#include <target/target_core_fabric.h>
|
||||
|
@ -502,7 +503,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
|||
if (!np->enabled) {
|
||||
spin_unlock_bh(&np->np_thread_lock);
|
||||
isert_dbg("iscsi_np is not enabled, reject connect request\n");
|
||||
return rdma_reject(cma_id, NULL, 0);
|
||||
return rdma_reject(cma_id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
|
||||
}
|
||||
spin_unlock_bh(&np->np_thread_lock);
|
||||
|
||||
|
@ -553,7 +554,7 @@ out_rsp_dma_map:
|
|||
isert_free_login_buf(isert_conn);
|
||||
out:
|
||||
kfree(isert_conn);
|
||||
rdma_reject(cma_id, NULL, 0);
|
||||
rdma_reject(cma_id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
#include "rtrs-srv.h"
|
||||
#include "rtrs-log.h"
|
||||
#include <rdma/ib_cm.h>
|
||||
|
||||
MODULE_DESCRIPTION("RDMA Transport Server");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1576,7 +1577,7 @@ static int rtrs_rdma_do_reject(struct rdma_cm_id *cm_id, int errno)
|
|||
.errno = cpu_to_le16(errno),
|
||||
};
|
||||
|
||||
err = rdma_reject(cm_id, &msg, sizeof(msg));
|
||||
err = rdma_reject(cm_id, &msg, sizeof(msg), IB_CM_REJ_CONSUMER_DEFINED);
|
||||
if (err)
|
||||
pr_err("rdma_reject(), err: %d\n", err);
|
||||
|
||||
|
|
|
@ -2497,7 +2497,8 @@ reject:
|
|||
SRP_BUF_FORMAT_INDIRECT);
|
||||
|
||||
if (rdma_cm_id)
|
||||
rdma_reject(rdma_cm_id, rej, sizeof(*rej));
|
||||
rdma_reject(rdma_cm_id, rej, sizeof(*rej),
|
||||
IB_CM_REJ_CONSUMER_DEFINED);
|
||||
else
|
||||
ib_send_cm_rej(ib_cm_id, IB_CM_REJ_CONSUMER_DEFINED, NULL, 0,
|
||||
rej, sizeof(*rej));
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/rdma_cm.h>
|
||||
#include <rdma/rw.h>
|
||||
#include <rdma/ib_cm.h>
|
||||
|
||||
#include <linux/nvme-rdma.h>
|
||||
#include "nvmet.h"
|
||||
|
@ -1138,7 +1139,8 @@ static int nvmet_rdma_cm_reject(struct rdma_cm_id *cm_id,
|
|||
rej.recfmt = cpu_to_le16(NVME_RDMA_CM_FMT_1_0);
|
||||
rej.sts = cpu_to_le16(status);
|
||||
|
||||
return rdma_reject(cm_id, (void *)&rej, sizeof(rej));
|
||||
return rdma_reject(cm_id, (void *)&rej, sizeof(rej),
|
||||
IB_CM_REJ_CONSUMER_DEFINED);
|
||||
}
|
||||
|
||||
static struct nvmet_rdma_queue *
|
||||
|
|
|
@ -320,7 +320,7 @@ int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event);
|
|||
* rdma_reject - Called to reject a connection request or response.
|
||||
*/
|
||||
int rdma_reject(struct rdma_cm_id *id, const void *private_data,
|
||||
u8 private_data_len);
|
||||
u8 private_data_len, u8 reason);
|
||||
|
||||
/**
|
||||
* rdma_disconnect - This function disconnects the associated QP and
|
||||
|
|
|
@ -238,7 +238,8 @@ struct rdma_ucm_accept {
|
|||
struct rdma_ucm_reject {
|
||||
__u32 id;
|
||||
__u8 private_data_len;
|
||||
__u8 reserved[3];
|
||||
__u8 reason;
|
||||
__u8 reserved[2];
|
||||
__u8 private_data[RDMA_MAX_PRIVATE_DATA];
|
||||
};
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/vmalloc.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <net/addrconf.h>
|
||||
#include <rdma/ib_cm.h>
|
||||
|
||||
#include "rds_single_path.h"
|
||||
#include "rds.h"
|
||||
|
@ -927,7 +928,8 @@ out:
|
|||
if (conn)
|
||||
mutex_unlock(&conn->c_cm_lock);
|
||||
if (err)
|
||||
rdma_reject(cm_id, &err, sizeof(int));
|
||||
rdma_reject(cm_id, &err, sizeof(int),
|
||||
IB_CM_REJ_CONSUMER_DEFINED);
|
||||
return destroy;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче