Skip to content

Commit a4e79b7

Browse files
include/rdma: new fi_peer_match structure
Add a new structure fi_peer_match to collect the parameters which need to be passed to the get_msg and get_tag functions. Update the util_get_tag() and util_get_msg() function callbacks. Compilation gives a warning but not failing. This causes memory corruption when the callbacks are called. Signed-off-by: Amir Shehata <shehataa@ornl.gov>
1 parent 44d3847 commit a4e79b7

File tree

5 files changed

+51
-20
lines changed

5 files changed

+51
-20
lines changed

include/rdma/providers/fi_peer.h

+13-4
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,21 @@ struct fi_peer_rx_entry {
177177
struct iovec *iov;
178178
};
179179

180+
struct fi_peer_match {
181+
fi_addr_t addr;
182+
uint64_t tag;
183+
size_t size;
184+
void *context;
185+
};
186+
180187
struct fi_ops_srx_owner {
181188
size_t size;
182-
int (*get_msg)(struct fid_peer_srx *srx, fi_addr_t addr,
183-
size_t size, struct fi_peer_rx_entry **entry);
184-
int (*get_tag)(struct fid_peer_srx *srx, fi_addr_t addr,
185-
uint64_t tag, struct fi_peer_rx_entry **entry);
189+
int (*get_msg)(struct fid_peer_srx *srx,
190+
struct fi_peer_match *match,
191+
struct fi_peer_rx_entry **entry);
192+
int (*get_tag)(struct fid_peer_srx *srx,
193+
struct fi_peer_match *match,
194+
struct fi_peer_rx_entry **entry);
186195
int (*queue_msg)(struct fi_peer_rx_entry *entry);
187196
int (*queue_tag)(struct fi_peer_rx_entry *entry);
188197
void (*foreach_unspec_addr)(struct fid_peer_srx *srx,

prov/efa/src/rdm/efa_rdm_msg.c

+10-4
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,7 @@ struct efa_rdm_ope *efa_rdm_msg_alloc_rxe_for_msgrtm(struct efa_rdm_ep *ep,
764764
size_t data_size;
765765
int ret;
766766
int pkt_type;
767+
struct fi_peer_match match = {0};
767768

768769
if ((*pkt_entry_ptr)->alloc_type == EFA_RDM_PKE_FROM_USER_BUFFER) {
769770
/* If a pkt_entry is constructred from user supplied buffer,
@@ -782,7 +783,10 @@ struct efa_rdm_ope *efa_rdm_msg_alloc_rxe_for_msgrtm(struct efa_rdm_ep *ep,
782783
peer_srx = util_get_peer_srx(ep->peer_srx_ep);
783784
data_size = efa_rdm_pke_get_rtm_msg_length(*pkt_entry_ptr);
784785

785-
ret = peer_srx->owner_ops->get_msg(peer_srx, (*pkt_entry_ptr)->addr, data_size, &peer_rxe);
786+
match->addr = (*pkt_entry_ptr)->addr;
787+
match->size = data_size;
788+
789+
ret = peer_srx->owner_ops->get_msg(peer_srx, &match, &peer_rxe);
786790

787791
if (ret == FI_SUCCESS) { /* A matched rxe is found */
788792
rxe = efa_rdm_msg_alloc_matched_rxe_for_rtm(ep, *pkt_entry_ptr, peer_rxe, ofi_op_msg);
@@ -844,12 +848,14 @@ struct efa_rdm_ope *efa_rdm_msg_alloc_rxe_for_tagrtm(struct efa_rdm_ep *ep,
844848
struct efa_rdm_ope *rxe;
845849
int ret;
846850
int pkt_type;
851+
struct fi_peer_match match = {0};
847852

848853
peer_srx = util_get_peer_srx(ep->peer_srx_ep);
849854

850-
ret = peer_srx->owner_ops->get_tag(peer_srx, (*pkt_entry_ptr)->addr,
851-
efa_rdm_pke_get_rtm_tag(*pkt_entry_ptr),
852-
&peer_rxe);
855+
match->addr = (*pkt_entry_ptr)->addr;
856+
match->tag = efa_rdm_pke_get_rtm_tag(*pkt_entry_ptr);
857+
858+
ret = peer_srx->owner_ops->get_tag(peer_srx, &match, &peer_rxe);
853859

854860
if (ret == FI_SUCCESS) { /* A matched rxe is found */
855861
rxe = efa_rdm_msg_alloc_matched_rxe_for_rtm(ep, *pkt_entry_ptr, peer_rxe, ofi_op_tagged);

prov/shm/src/smr_progress.c

+10-6
Original file line numberDiff line numberDiff line change
@@ -987,13 +987,16 @@ static int smr_progress_cmd_msg(struct smr_ep *ep, struct smr_cmd *cmd)
987987
{
988988
struct fid_peer_srx *peer_srx = smr_get_peer_srx(ep);
989989
struct fi_peer_rx_entry *rx_entry;
990-
fi_addr_t addr;
990+
struct fi_peer_match match_info = {0};
991991
int ret;
992992

993-
addr = ep->region->map->peers[cmd->msg.hdr.id].fiaddr;
993+
match_info.addr = ep->region->map->peers[cmd->msg.hdr.id].fiaddr;
994+
match_info.context = NULL;
995+
994996
if (cmd->msg.hdr.op == ofi_op_tagged) {
995-
ret = peer_srx->owner_ops->get_tag(peer_srx, addr,
996-
cmd->msg.hdr.tag, &rx_entry);
997+
match_info.tag = cmd->msg.hdr.tag;
998+
ret = peer_srx->owner_ops->get_tag(peer_srx, &match_info,
999+
&rx_entry);
9971000
if (ret == -FI_ENOENT) {
9981001
ret = smr_alloc_cmd_ctx(ep, rx_entry, cmd);
9991002
if (ret) {
@@ -1009,8 +1012,9 @@ static int smr_progress_cmd_msg(struct smr_ep *ep, struct smr_cmd *cmd)
10091012
goto out;
10101013
}
10111014
} else {
1012-
ret = peer_srx->owner_ops->get_msg(peer_srx, addr,
1013-
cmd->msg.hdr.size, &rx_entry);
1015+
match_info.size = cmd->msg.hdr.size;
1016+
ret = peer_srx->owner_ops->get_msg(peer_srx, &match_info,
1017+
&rx_entry);
10141018
if (ret == -FI_ENOENT) {
10151019
ret = smr_alloc_cmd_ctx(ep, rx_entry, cmd);
10161020
if (ret) {

prov/sm2/src/sm2_progress.c

+8-2
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,7 @@ static int sm2_progress_recv_msg(struct sm2_ep *ep,
520520
{
521521
struct fid_peer_srx *peer_srx = sm2_get_peer_srx(ep);
522522
struct fi_peer_rx_entry *rx_entry;
523+
struct fi_peer_match match;
523524
struct sm2_av *sm2_av;
524525
fi_addr_t addr;
525526
int ret = 0;
@@ -540,9 +541,13 @@ static int sm2_progress_recv_msg(struct sm2_ep *ep,
540541
sm2_av = container_of(ep->util_ep.av, struct sm2_av, util_av);
541542
addr = sm2_av->reverse_lookup[xfer_entry->hdr.sender_gid];
542543

544+
memset(&match, 0, sizeof(match));
545+
match.addr = addr;
546+
543547
if (xfer_entry->hdr.op == ofi_op_tagged) {
548+
match.tag = xfer_entry->hdr.tag;
544549
ret = peer_srx->owner_ops->get_tag(
545-
peer_srx, addr, xfer_entry->hdr.tag, &rx_entry);
550+
peer_srx, &match, &rx_entry);
546551
if (ret == -FI_ENOENT) {
547552
xfer_entry->hdr.proto_flags |= SM2_UNEXP;
548553
ret = sm2_alloc_xfer_entry_ctx(ep, rx_entry,
@@ -557,8 +562,9 @@ static int sm2_progress_recv_msg(struct sm2_ep *ep,
557562
goto out;
558563
}
559564
} else {
565+
match.size = xfer_entry->hdr.size;
560566
ret = peer_srx->owner_ops->get_msg(
561-
peer_srx, addr, xfer_entry->hdr.size, &rx_entry);
567+
peer_srx, &match, &rx_entry);
562568
if (ret == -FI_ENOENT) {
563569
xfer_entry->hdr.proto_flags |= SM2_UNEXP;
564570
ret = sm2_alloc_xfer_entry_ctx(ep, rx_entry,

prov/util/src/util_srx.c

+10-4
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,15 @@ static int util_match_msg(struct fid_peer_srx *srx, fi_addr_t addr, size_t size,
194194
return ret;
195195
}
196196

197-
static int util_get_msg(struct fid_peer_srx *srx, fi_addr_t addr,
198-
size_t size, struct fi_peer_rx_entry **rx_entry)
197+
static int util_get_msg(struct fid_peer_srx *srx,
198+
struct fi_peer_match *match_info,
199+
struct fi_peer_rx_entry **rx_entry)
199200
{
200201
struct util_srx_ctx *srx_ctx;
201202
struct util_rx_entry *util_entry, *any_entry;
202203
struct slist *queue;
204+
fi_addr_t addr = match_info->addr;
205+
size_t size = match_info->size;
203206

204207
srx_ctx = srx->ep_fid.fid.context;
205208
assert(ofi_genlock_held(srx_ctx->lock));
@@ -269,14 +272,17 @@ static int util_match_tag(struct fid_peer_srx *srx, fi_addr_t addr,
269272
return ret;
270273
}
271274

272-
static int util_get_tag(struct fid_peer_srx *srx, fi_addr_t addr,
273-
uint64_t tag, struct fi_peer_rx_entry **rx_entry)
275+
static int util_get_tag(struct fid_peer_srx *srx,
276+
struct fi_peer_match *match_info,
277+
struct fi_peer_rx_entry **rx_entry)
274278
{
275279
struct util_srx_ctx *srx_ctx;
276280
struct slist *queue;
277281
struct slist_entry *any_item, *any_prev;
278282
struct slist_entry *item, *prev;
279283
struct util_rx_entry *util_entry, *any_entry;
284+
uint64_t tag = match_info->tag;
285+
fi_addr_t addr = match_info->addr;
280286
int ret = FI_SUCCESS;
281287

282288
srx_ctx = srx->ep_fid.fid.context;

0 commit comments

Comments
 (0)