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: Alexey Marchuk <alexeymar@mellanox.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5307
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Alexey Marchuk 2020-11-27 13:41:10 +03:00 committed by Tomasz Zawadzki
parent db436f2dc0
commit efb6081cf6

View File

@ -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;
}