RDMA/rxe: Create AH index and return to user space
Make changes to rdma_user_rxe.h to allow indexing AH objects, passing the index in UD send WRs to the driver and returning the index to the rxe provider. Modify rxe_create_ah() to add an index to AH when created and if called from a new user provider return it to user space. If called from an old provider mark the AH as not having a useful index. Modify rxe_destroy_ah to drop the index before deleting the object. Link: https://lore.kernel.org/r/20211007204051.10086-4-rpearsonhpe@gmail.com Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
Родитель
99c13a3e29
Коммит
73a5493210
|
@ -158,9 +158,19 @@ static int rxe_create_ah(struct ib_ah *ibah,
|
|||
struct ib_udata *udata)
|
||||
|
||||
{
|
||||
int err;
|
||||
struct rxe_dev *rxe = to_rdev(ibah->device);
|
||||
struct rxe_ah *ah = to_rah(ibah);
|
||||
struct rxe_create_ah_resp __user *uresp = NULL;
|
||||
int err;
|
||||
|
||||
if (udata) {
|
||||
/* test if new user provider */
|
||||
if (udata->outlen >= sizeof(*uresp))
|
||||
uresp = udata->outbuf;
|
||||
ah->is_user = true;
|
||||
} else {
|
||||
ah->is_user = false;
|
||||
}
|
||||
|
||||
err = rxe_av_chk_attr(rxe, init_attr->ah_attr);
|
||||
if (err)
|
||||
|
@ -170,6 +180,24 @@ static int rxe_create_ah(struct ib_ah *ibah,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
/* create index > 0 */
|
||||
rxe_add_index(ah);
|
||||
ah->ah_num = ah->pelem.index;
|
||||
|
||||
if (uresp) {
|
||||
/* only if new user provider */
|
||||
err = copy_to_user(&uresp->ah_num, &ah->ah_num,
|
||||
sizeof(uresp->ah_num));
|
||||
if (err) {
|
||||
rxe_drop_index(ah);
|
||||
rxe_drop_ref(ah);
|
||||
return -EFAULT;
|
||||
}
|
||||
} else if (ah->is_user) {
|
||||
/* only if old user provider */
|
||||
ah->ah_num = 0;
|
||||
}
|
||||
|
||||
rxe_init_av(init_attr->ah_attr, &ah->av);
|
||||
return 0;
|
||||
}
|
||||
|
@ -202,6 +230,7 @@ static int rxe_destroy_ah(struct ib_ah *ibah, u32 flags)
|
|||
{
|
||||
struct rxe_ah *ah = to_rah(ibah);
|
||||
|
||||
rxe_drop_index(ah);
|
||||
rxe_drop_ref(ah);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -48,6 +48,8 @@ struct rxe_ah {
|
|||
struct rxe_pool_entry pelem;
|
||||
struct rxe_pd *pd;
|
||||
struct rxe_av av;
|
||||
bool is_user;
|
||||
int ah_num;
|
||||
};
|
||||
|
||||
struct rxe_cqe {
|
||||
|
|
|
@ -99,7 +99,8 @@ struct rxe_send_wr {
|
|||
__u32 remote_qkey;
|
||||
__u16 pkey_index;
|
||||
__u16 reserved;
|
||||
__u32 pad[5];
|
||||
__u32 ah_num;
|
||||
__u32 pad[4];
|
||||
struct rxe_av av;
|
||||
} ud;
|
||||
struct {
|
||||
|
@ -170,6 +171,11 @@ struct rxe_recv_wqe {
|
|||
struct rxe_dma_info dma;
|
||||
};
|
||||
|
||||
struct rxe_create_ah_resp {
|
||||
__u32 ah_num;
|
||||
__u32 reserved;
|
||||
};
|
||||
|
||||
struct rxe_create_cq_resp {
|
||||
struct mminfo mi;
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче