diff --git a/src/urpc/include/umq/umq_pro_types.h b/src/urpc/include/umq/umq_pro_types.h index 18df2f47dc12908c02b96e507a42d3dc11490b3b..2bec40b66c61eb22db5172f9e6c7bdaf3e1ec0c2 100644 --- a/src/urpc/include/umq/umq_pro_types.h +++ b/src/urpc/include/umq/umq_pro_types.h @@ -68,7 +68,8 @@ typedef struct umq_buf_pro { uint32_t rsvd0 : 24; } remote_sge; // remote sge which reference read/write - uint64_t rsvd1[2]; + uint64_t umq_ctx; // umq ctx record when create umq, only share rx res will fill + uint64_t rsvd1; } umq_buf_pro_t; #ifdef __cplusplus diff --git a/src/urpc/umq/umq_ub/core/private/umq_pro_ub.c b/src/urpc/umq/umq_ub/core/private/umq_pro_ub.c index ca5be2bf76a25a754e373cfa9514016074082fdc..586a102f6ac75146ebf4551892539752b729937f 100644 --- a/src/urpc/umq/umq_ub/core/private/umq_pro_ub.c +++ b/src/urpc/umq/umq_ub/core/private/umq_pro_ub.c @@ -483,9 +483,16 @@ static int umq_ub_on_rx_done(ub_queue_t *queue, urma_cr_t *cr, umq_buf_t *rx_buf return UMQ_SUCCESS; } + /* only sub umq need set umq_ctx */ + umq_buf_pro_t *buf_pro = (umq_buf_pro_t *)rx_buf->qbuf_ext; + if ((queue->create_flag & UMQ_CREATE_FLAG_SUB_UMQ) == 0) { + buf_pro->umq_ctx = 0; + } else { + buf_pro->umq_ctx = queue->dev_ctx->umq_ctx_jetty_table[cr->local_id]; + } + umq_ub_imm_t imm = {.value = cr->imm_data}; if (imm.bs.umq_private == 0) { - umq_buf_pro_t *buf_pro = (umq_buf_pro_t *)rx_buf->qbuf_ext; buf_pro->imm_data = imm.value; return UMQ_SUCCESS; } @@ -569,6 +576,17 @@ static int process_rx_msg(urma_cr_t *cr, umq_buf_t *buf, ub_queue_t *queue, umq_ ret = umq_ub_on_rx_done(queue, cr, buf, qbuf_status); break; } + case URMA_CR_OPC_SEND: { + umq_buf_pro_t *buf_pro = (umq_buf_pro_t *)buf->qbuf_ext; + if ((queue->create_flag & UMQ_CREATE_FLAG_SUB_UMQ) == 0) { + buf_pro->umq_ctx = 0; + break; + } + + /* only subqueue need fill umq_ctx */ + buf_pro->umq_ctx = queue->dev_ctx->umq_ctx_jetty_table[cr->local_id]; + break; + } default: break; }