mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
RDMA/efa: Add EFA query MR support
Add EFA driver uapi definitions and register a new query MR method that currently returns the physical interconnects the device is using to reach the MR. Update admin definitions and efa-abi accordingly. Reviewed-by: Anas Mousa <anasmous@amazon.com> Reviewed-by: Firas Jahjah <firasj@amazon.com> Signed-off-by: Michael Margolin <mrgolin@amazon.com> Link: https://lore.kernel.org/r/20240104095155.10676-1-mrgolin@amazon.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
2f1888281e
commit
2307157c85
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
|
||||
/*
|
||||
* Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
* Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _EFA_H_
|
||||
@ -80,9 +80,19 @@ struct efa_pd {
|
||||
u16 pdn;
|
||||
};
|
||||
|
||||
struct efa_mr_interconnect_info {
|
||||
u16 recv_ic_id;
|
||||
u16 rdma_read_ic_id;
|
||||
u16 rdma_recv_ic_id;
|
||||
u8 recv_ic_id_valid : 1;
|
||||
u8 rdma_read_ic_id_valid : 1;
|
||||
u8 rdma_recv_ic_id_valid : 1;
|
||||
};
|
||||
|
||||
struct efa_mr {
|
||||
struct ib_mr ibmr;
|
||||
struct ib_umem *umem;
|
||||
struct efa_mr_interconnect_info ic_info;
|
||||
};
|
||||
|
||||
struct efa_cq {
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
|
||||
/*
|
||||
* Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
* Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _EFA_ADMIN_CMDS_H_
|
||||
@ -415,6 +415,32 @@ struct efa_admin_reg_mr_resp {
|
||||
* memory region
|
||||
*/
|
||||
u32 r_key;
|
||||
|
||||
/*
|
||||
* Mask indicating which fields have valid values
|
||||
* 0 : recv_ic_id
|
||||
* 1 : rdma_read_ic_id
|
||||
* 2 : rdma_recv_ic_id
|
||||
*/
|
||||
u8 validity;
|
||||
|
||||
/*
|
||||
* Physical interconnect used by the device to reach the MR for receive
|
||||
* operation
|
||||
*/
|
||||
u8 recv_ic_id;
|
||||
|
||||
/*
|
||||
* Physical interconnect used by the device to reach the MR for RDMA
|
||||
* read operation
|
||||
*/
|
||||
u8 rdma_read_ic_id;
|
||||
|
||||
/*
|
||||
* Physical interconnect used by the device to reach the MR for RDMA
|
||||
* write receive
|
||||
*/
|
||||
u8 rdma_recv_ic_id;
|
||||
};
|
||||
|
||||
struct efa_admin_dereg_mr_cmd {
|
||||
@ -999,6 +1025,11 @@ struct efa_admin_host_info {
|
||||
#define EFA_ADMIN_REG_MR_CMD_REMOTE_WRITE_ENABLE_MASK BIT(1)
|
||||
#define EFA_ADMIN_REG_MR_CMD_REMOTE_READ_ENABLE_MASK BIT(2)
|
||||
|
||||
/* reg_mr_resp */
|
||||
#define EFA_ADMIN_REG_MR_RESP_RECV_IC_ID_MASK BIT(0)
|
||||
#define EFA_ADMIN_REG_MR_RESP_RDMA_READ_IC_ID_MASK BIT(1)
|
||||
#define EFA_ADMIN_REG_MR_RESP_RDMA_RECV_IC_ID_MASK BIT(2)
|
||||
|
||||
/* create_cq_cmd */
|
||||
#define EFA_ADMIN_CREATE_CQ_CMD_INTERRUPT_MODE_ENABLED_MASK BIT(5)
|
||||
#define EFA_ADMIN_CREATE_CQ_CMD_VIRT_MASK BIT(6)
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
|
||||
/*
|
||||
* Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
* Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
#include "efa_com.h"
|
||||
@ -270,6 +270,15 @@ int efa_com_register_mr(struct efa_com_dev *edev,
|
||||
|
||||
result->l_key = cmd_completion.l_key;
|
||||
result->r_key = cmd_completion.r_key;
|
||||
result->ic_info.recv_ic_id = cmd_completion.recv_ic_id;
|
||||
result->ic_info.rdma_read_ic_id = cmd_completion.rdma_read_ic_id;
|
||||
result->ic_info.rdma_recv_ic_id = cmd_completion.rdma_recv_ic_id;
|
||||
result->ic_info.recv_ic_id_valid = EFA_GET(&cmd_completion.validity,
|
||||
EFA_ADMIN_REG_MR_RESP_RECV_IC_ID);
|
||||
result->ic_info.rdma_read_ic_id_valid = EFA_GET(&cmd_completion.validity,
|
||||
EFA_ADMIN_REG_MR_RESP_RDMA_READ_IC_ID);
|
||||
result->ic_info.rdma_recv_ic_id_valid = EFA_GET(&cmd_completion.validity,
|
||||
EFA_ADMIN_REG_MR_RESP_RDMA_RECV_IC_ID);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
|
||||
/*
|
||||
* Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
* Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _EFA_COM_CMD_H_
|
||||
@ -199,6 +199,15 @@ struct efa_com_reg_mr_params {
|
||||
u8 indirect;
|
||||
};
|
||||
|
||||
struct efa_com_mr_interconnect_info {
|
||||
u16 recv_ic_id;
|
||||
u16 rdma_read_ic_id;
|
||||
u16 rdma_recv_ic_id;
|
||||
u8 recv_ic_id_valid : 1;
|
||||
u8 rdma_read_ic_id_valid : 1;
|
||||
u8 rdma_recv_ic_id_valid : 1;
|
||||
};
|
||||
|
||||
struct efa_com_reg_mr_result {
|
||||
/*
|
||||
* To be used in conjunction with local buffers references in SQ and
|
||||
@ -210,6 +219,7 @@ struct efa_com_reg_mr_result {
|
||||
* accessed memory region
|
||||
*/
|
||||
u32 r_key;
|
||||
struct efa_com_mr_interconnect_info ic_info;
|
||||
};
|
||||
|
||||
struct efa_com_dereg_mr_params {
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
|
||||
/*
|
||||
* Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
* Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -9,6 +9,7 @@
|
||||
#include <linux/version.h>
|
||||
|
||||
#include <rdma/ib_user_verbs.h>
|
||||
#include <rdma/uverbs_ioctl.h>
|
||||
|
||||
#include "efa.h"
|
||||
|
||||
@ -36,6 +37,8 @@ MODULE_DEVICE_TABLE(pci, efa_pci_tbl);
|
||||
(BIT(EFA_ADMIN_FATAL_ERROR) | BIT(EFA_ADMIN_WARNING) | \
|
||||
BIT(EFA_ADMIN_NOTIFICATION) | BIT(EFA_ADMIN_KEEP_ALIVE))
|
||||
|
||||
extern const struct uapi_definition efa_uapi_defs[];
|
||||
|
||||
/* This handler will called for unknown event group or unimplemented handlers */
|
||||
static void unimplemented_aenq_handler(void *data,
|
||||
struct efa_admin_aenq_entry *aenq_e)
|
||||
@ -432,6 +435,8 @@ static int efa_ib_device_add(struct efa_dev *dev)
|
||||
|
||||
ib_set_device_ops(&dev->ibdev, &efa_dev_ops);
|
||||
|
||||
dev->ibdev.driver_def = efa_uapi_defs;
|
||||
|
||||
err = ib_register_device(&dev->ibdev, "efa_%d", &pdev->dev);
|
||||
if (err)
|
||||
goto err_destroy_eqs;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
||||
/*
|
||||
* Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
* Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/dma-buf.h>
|
||||
@ -13,6 +13,9 @@
|
||||
#include <rdma/ib_user_verbs.h>
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/uverbs_ioctl.h>
|
||||
#define UVERBS_MODULE_NAME efa_ib
|
||||
#include <rdma/uverbs_named_ioctl.h>
|
||||
#include <rdma/ib_user_ioctl_cmds.h>
|
||||
|
||||
#include "efa.h"
|
||||
#include "efa_io_defs.h"
|
||||
@ -1653,6 +1656,12 @@ static int efa_register_mr(struct ib_pd *ibpd, struct efa_mr *mr, u64 start,
|
||||
mr->ibmr.lkey = result.l_key;
|
||||
mr->ibmr.rkey = result.r_key;
|
||||
mr->ibmr.length = length;
|
||||
mr->ic_info.recv_ic_id = result.ic_info.recv_ic_id;
|
||||
mr->ic_info.rdma_read_ic_id = result.ic_info.rdma_read_ic_id;
|
||||
mr->ic_info.rdma_recv_ic_id = result.ic_info.rdma_recv_ic_id;
|
||||
mr->ic_info.recv_ic_id_valid = result.ic_info.recv_ic_id_valid;
|
||||
mr->ic_info.rdma_read_ic_id_valid = result.ic_info.rdma_read_ic_id_valid;
|
||||
mr->ic_info.rdma_recv_ic_id_valid = result.ic_info.rdma_recv_ic_id_valid;
|
||||
ibdev_dbg(&dev->ibdev, "Registered mr[%d]\n", mr->ibmr.lkey);
|
||||
|
||||
return 0;
|
||||
@ -1735,6 +1744,39 @@ err_out:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static int UVERBS_HANDLER(EFA_IB_METHOD_MR_QUERY)(struct uverbs_attr_bundle *attrs)
|
||||
{
|
||||
struct ib_mr *ibmr = uverbs_attr_get_obj(attrs, EFA_IB_ATTR_QUERY_MR_HANDLE);
|
||||
struct efa_mr *mr = to_emr(ibmr);
|
||||
u16 ic_id_validity = 0;
|
||||
int ret;
|
||||
|
||||
ret = uverbs_copy_to(attrs, EFA_IB_ATTR_QUERY_MR_RESP_RECV_IC_ID,
|
||||
&mr->ic_info.recv_ic_id, sizeof(mr->ic_info.recv_ic_id));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = uverbs_copy_to(attrs, EFA_IB_ATTR_QUERY_MR_RESP_RDMA_READ_IC_ID,
|
||||
&mr->ic_info.rdma_read_ic_id, sizeof(mr->ic_info.rdma_read_ic_id));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = uverbs_copy_to(attrs, EFA_IB_ATTR_QUERY_MR_RESP_RDMA_RECV_IC_ID,
|
||||
&mr->ic_info.rdma_recv_ic_id, sizeof(mr->ic_info.rdma_recv_ic_id));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (mr->ic_info.recv_ic_id_valid)
|
||||
ic_id_validity |= EFA_QUERY_MR_VALIDITY_RECV_IC_ID;
|
||||
if (mr->ic_info.rdma_read_ic_id_valid)
|
||||
ic_id_validity |= EFA_QUERY_MR_VALIDITY_RDMA_READ_IC_ID;
|
||||
if (mr->ic_info.rdma_recv_ic_id_valid)
|
||||
ic_id_validity |= EFA_QUERY_MR_VALIDITY_RDMA_RECV_IC_ID;
|
||||
|
||||
return uverbs_copy_to(attrs, EFA_IB_ATTR_QUERY_MR_RESP_IC_ID_VALIDITY,
|
||||
&ic_id_validity, sizeof(ic_id_validity));
|
||||
}
|
||||
|
||||
int efa_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
|
||||
{
|
||||
struct efa_dev *dev = to_edev(ibmr->device);
|
||||
@ -2157,3 +2199,30 @@ enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev,
|
||||
return IB_LINK_LAYER_UNSPECIFIED;
|
||||
}
|
||||
|
||||
DECLARE_UVERBS_NAMED_METHOD(EFA_IB_METHOD_MR_QUERY,
|
||||
UVERBS_ATTR_IDR(EFA_IB_ATTR_QUERY_MR_HANDLE,
|
||||
UVERBS_OBJECT_MR,
|
||||
UVERBS_ACCESS_READ,
|
||||
UA_MANDATORY),
|
||||
UVERBS_ATTR_PTR_OUT(EFA_IB_ATTR_QUERY_MR_RESP_IC_ID_VALIDITY,
|
||||
UVERBS_ATTR_TYPE(u16),
|
||||
UA_MANDATORY),
|
||||
UVERBS_ATTR_PTR_OUT(EFA_IB_ATTR_QUERY_MR_RESP_RECV_IC_ID,
|
||||
UVERBS_ATTR_TYPE(u16),
|
||||
UA_MANDATORY),
|
||||
UVERBS_ATTR_PTR_OUT(EFA_IB_ATTR_QUERY_MR_RESP_RDMA_READ_IC_ID,
|
||||
UVERBS_ATTR_TYPE(u16),
|
||||
UA_MANDATORY),
|
||||
UVERBS_ATTR_PTR_OUT(EFA_IB_ATTR_QUERY_MR_RESP_RDMA_RECV_IC_ID,
|
||||
UVERBS_ATTR_TYPE(u16),
|
||||
UA_MANDATORY));
|
||||
|
||||
ADD_UVERBS_METHODS(efa_mr,
|
||||
UVERBS_OBJECT_MR,
|
||||
&UVERBS_METHOD(EFA_IB_METHOD_MR_QUERY));
|
||||
|
||||
const struct uapi_definition efa_uapi_defs[] = {
|
||||
UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_MR,
|
||||
&efa_mr),
|
||||
{},
|
||||
};
|
||||
|
@ -1,12 +1,13 @@
|
||||
/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
* Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef EFA_ABI_USER_H
|
||||
#define EFA_ABI_USER_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <rdma/ib_user_ioctl_cmds.h>
|
||||
|
||||
/*
|
||||
* Increment this value if any changes that break userspace ABI
|
||||
@ -134,4 +135,22 @@ struct efa_ibv_ex_query_device_resp {
|
||||
__u32 device_caps;
|
||||
};
|
||||
|
||||
enum {
|
||||
EFA_QUERY_MR_VALIDITY_RECV_IC_ID = 1 << 0,
|
||||
EFA_QUERY_MR_VALIDITY_RDMA_READ_IC_ID = 1 << 1,
|
||||
EFA_QUERY_MR_VALIDITY_RDMA_RECV_IC_ID = 1 << 2,
|
||||
};
|
||||
|
||||
enum efa_query_mr_attrs {
|
||||
EFA_IB_ATTR_QUERY_MR_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
|
||||
EFA_IB_ATTR_QUERY_MR_RESP_IC_ID_VALIDITY,
|
||||
EFA_IB_ATTR_QUERY_MR_RESP_RECV_IC_ID,
|
||||
EFA_IB_ATTR_QUERY_MR_RESP_RDMA_READ_IC_ID,
|
||||
EFA_IB_ATTR_QUERY_MR_RESP_RDMA_RECV_IC_ID,
|
||||
};
|
||||
|
||||
enum efa_mr_methods {
|
||||
EFA_IB_METHOD_MR_QUERY = (1U << UVERBS_ID_NS_SHIFT),
|
||||
};
|
||||
|
||||
#endif /* EFA_ABI_USER_H */
|
||||
|
Loading…
Reference in New Issue
Block a user