Commit efb6081c authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Tomasz Zawadzki
Browse files

nvmf/rdma: Correct SoftRoCE driver vendor_id



In some cases we need to check if we are working with
SoftRoCE driver (rxe) since it doesn't support several features
such as SEND_WITH_INVAL and LAST_WQE_REACHED ibv async event.
vendor_id of this driver has been changed from 0 (it was not
initialized at all) to 0XFFFFFF in commit
0184afd15a141d7ce24c32c0d86a1e3ba6bc0eb3
So now we should check for both values.

Change-Id: I62ce4d68c11612a07fe97606658a5b79f1db2149
Signed-off-by: default avatarAlexey Marchuk <alexeymar@mellanox.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5307


Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent db436f2d
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -61,6 +61,10 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma;
#define DEFAULT_NVMF_RDMA_CQ_SIZE	4096
#define MAX_WR_PER_QP(queue_depth)	(queue_depth * 3 + 2)

/* rxe driver vendor_id has been changed from 0 to 0XFFFFFF in 0184afd15a141d7ce24c32c0d86a1e3ba6bc0eb3 */
#define NVMF_RXE_VENDOR_ID_OLD 0
#define NVMF_RXE_VENDOR_ID_NEW 0XFFFFFF

static int g_spdk_nvmf_ibv_query_mask =
	IBV_QP_STATE |
	IBV_QP_PKEY_INDEX |
@@ -2292,6 +2296,13 @@ const struct spdk_mem_map_ops g_nvmf_rdma_map_ops = {
static int nvmf_rdma_destroy(struct spdk_nvmf_transport *transport,
			     spdk_nvmf_transport_destroy_done_cb cb_fn, void *cb_arg);

static inline bool
nvmf_rdma_is_rxe_device(struct spdk_nvmf_rdma_device *device)
{
	return device->attr.vendor_id == NVMF_RXE_VENDOR_ID_OLD ||
	       device->attr.vendor_id == NVMF_RXE_VENDOR_ID_NEW;
}

static struct spdk_nvmf_transport *
nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
{
@@ -2474,7 +2485,7 @@ nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
		 *
		 * TODO: enable this for versions of the kernel rxe driver that support it.
		 */
		if (device->attr.vendor_id == 0) {
		if (nvmf_rdma_is_rxe_device(device)) {
			device->attr.device_cap_flags &= ~(IBV_DEVICE_MEM_MGT_EXTENSIONS);
		}
#endif
@@ -2847,8 +2858,8 @@ nvmf_rdma_destroy_drained_qpair(struct spdk_nvmf_rdma_qpair *rqpair)
	/* Judge whether the device is emulated by Software RoCE.
	 * And it will not send last_wqe event
	 */
	if (rqpair->srq != NULL && rqpair->device->attr.vendor_id != 0 &&
	    rqpair->last_wqe_reached == false) {
	if (rqpair->srq != NULL && rqpair->last_wqe_reached == false &&
	    !nvmf_rdma_is_rxe_device(rqpair->device)) {
		return;
	}