From 8ca64de0f08d72f566a4bdea1b120ea0eb0ac5eb Mon Sep 17 00:00:00 2001 From: chenjingwei <13827545+chenjingwei1112@user.noreply.gitee.com> Date: Tue, 18 Nov 2025 10:27:28 +0800 Subject: [PATCH] urma:add cache to store token_id to less time for import segment --- src/urma/lib/urma/bond/bondp_context_table.c | 104 +++++++++++++ src/urma/lib/urma/bond/bondp_context_table.h | 22 +++ src/urma/lib/urma/bond/bondp_provider_ops.c | 7 + src/urma/lib/urma/bond/bondp_segment.c | 146 ++++++++++++++----- src/urma/lib/urma/bond/bondp_types.h | 2 + 5 files changed, 247 insertions(+), 34 deletions(-) diff --git a/src/urma/lib/urma/bond/bondp_context_table.c b/src/urma/lib/urma/bond/bondp_context_table.c index bbe59eb..5aa287f 100644 --- a/src/urma/lib/urma/bond/bondp_context_table.c +++ b/src/urma/lib/urma/bond/bondp_context_table.c @@ -396,3 +396,107 @@ int bdp_r_p2v_jetty_id_table_lookup(bondp_hash_table_t *tbl, urma_jetty_id_t *rp (void)pthread_rwlock_unlock(&tbl->lock); return 0; } + +/* == bdp_r_v2p_token_id_table == */ + +static bool bdp_r_v2p_token_id_comp(struct ub_hmap_node *node, void *key) +{ + bondp_v2p_token_id_t *item = CONTAINER_OF_FIELD(node, bondp_v2p_token_id_t, hmap_node); + bondp_v2p_token_id_key_t *key_item = key; + + return (item->key.v_token_id == key_item->v_token_id) && + (memcmp(&item->key.v_remote_eid, &key_item->v_remote_eid, sizeof(urma_eid_t)) == 0); +} + +static void bdp_r_v2p_token_id_free(struct ub_hmap_node *node) +{ + bondp_v2p_token_id_t *item = CONTAINER_OF_FIELD(node, bondp_v2p_token_id_t, hmap_node); + free(item); +} + +static uint32_t bdp_r_v2p_token_id_hash(void *key) +{ + return ((bondp_v2p_token_id_key_t *)key)->v_token_id; +} + +int bdp_r_v2p_token_id_table_create(bondp_hash_table_t *tbl, uint32_t size) +{ + return bondp_hash_table_create(tbl, size, + bdp_r_v2p_token_id_comp, bdp_r_v2p_token_id_free, bdp_r_v2p_token_id_hash); +} + +int bdp_r_v2p_token_id_table_destroy(bondp_hash_table_t *tbl) +{ + bondp_hash_table_destroy(tbl); + return 0; +} + +int bdp_r_v2p_token_id_tabl_lookup(bondp_hash_table_t *tbl, uint32_t v_token_id, + urma_eid_t *v_remote_eid, bondp_v2p_token_id_t *item) +{ + hmap_node_t *node = NULL; + bondp_v2p_token_id_key_t key = { + .v_token_id = v_token_id, + .v_remote_eid = *v_remote_eid + }; + uint32_t hash = v_token_id; + (void)pthread_rwlock_rdlock(&tbl->lock); + node = bondp_hash_table_lookup_without_lock(tbl, &key, hash); + if (node == NULL) { + (void)pthread_rwlock_unlock(&tbl->lock); + return BONDP_HASH_MAP_NOT_FOUND_ERROR; + } + bondp_v2p_token_id_t *tmp = CONTAINER_OF_FIELD(node, bondp_v2p_token_id_t, hmap_node); + (void)memcpy(item, tmp, sizeof(bondp_v2p_token_id_t)); + (void)pthread_rwlock_unlock(&tbl->lock); + + return 0; +} + +int bdp_r_v2p_token_id_del_idx_lockless(bondp_hash_table_t *tbl, uint32_t index) +{ + bondp_v2p_token_id_t *item = NULL; + struct ub_hmap_node *node, *next; + + node = ub_hmap_first(&tbl->hmap); + while (node != NULL) { + item = CONTAINER_OF_FIELD(node, bondp_v2p_token_id_t, hmap_node); + next = ub_hmap_next(&tbl->hmap, node); + if (item->index == index) { + ub_hmap_remove(&tbl->hmap, node); + if (tbl->free_f != NULL) { + tbl->free_f(node); + } + return 0; + } + node = next; + } + + URMA_LOG_ERR("Failed to find node, index: %u.\n", index); + return -1; +} + +int bdp_r_v2p_token_id_table_add_lockless(bondp_hash_table_t *tbl, bondp_v2p_token_id_t *item) +{ + bondp_v2p_token_id_key_t key = item->key; + uint32_t hash = key.v_token_id; + hmap_node_t *node = bondp_hash_table_lookup_without_lock(tbl, &key, hash); + if (node != NULL) { + URMA_LOG_DEBUG("Node already added into hash table, hash: %u, index: %u.\n", hash, item->index); + return 0; + } + + bondp_v2p_token_id_t *new_item = calloc(1, sizeof(bondp_v2p_token_id_t)); + if (new_item == NULL) { + return BONDP_HASH_MAP_ALLOC_ERROR; + } + + (void)memcpy(new_item->peer_p_seg, item->peer_p_seg, URMA_UBAGG_DEV_MAX_NUM * sizeof(item->peer_p_seg[0])); + new_item->v_handle = item->v_handle; + new_item->key = key; + new_item->index = item->index; + + bondp_hash_table_add_with_hash_without_lock(tbl, &new_item->hmap_node, hash); + + return 0; +} \ No newline at end of file diff --git a/src/urma/lib/urma/bond/bondp_context_table.h b/src/urma/lib/urma/bond/bondp_context_table.h index b7f3060..fa06ff5 100644 --- a/src/urma/lib/urma/bond/bondp_context_table.h +++ b/src/urma/lib/urma/bond/bondp_context_table.h @@ -176,4 +176,26 @@ int bdp_r_p2v_jetty_id_table_del_without_lock(bondp_hash_table_t *tbl, int bdp_r_p2v_jetty_id_table_lookup(bondp_hash_table_t *tbl, urma_jetty_id_t *rpjetty_id, bdp_r_p2v_jetty_id_type_t type, urma_jetty_id_t *rvjetty_id); + +typedef struct bondp_v2p_token_id_key { + uint32_t v_token_id; + urma_eid_t v_remote_eid; +} bondp_v2p_token_id_key_t; + +typedef struct bondp_v2p_token_id { + hmap_node_t hmap_node; + bondp_v2p_token_id_key_t key; + urma_seg_t peer_p_seg[URMA_UBAGG_DEV_MAX_NUM]; + uint64_t v_handle; + uint32_t index; +} bondp_v2p_token_id_t; + +int bdp_r_v2p_token_id_table_create(bondp_hash_table_t *tbl, uint32_t size); +int bdp_r_v2p_token_id_table_destroy(bondp_hash_table_t *tbl); + +int bdp_r_v2p_token_id_tabl_lookup(bondp_hash_table_t *tbl, uint32_t v_token_id, + urma_eid_t *v_remote_eid, bondp_v2p_token_id_t *item); +int bdp_r_v2p_token_id_del_idx_lockless(bondp_hash_table_t *tbl, uint32_t index); +int bdp_r_v2p_token_id_table_add_lockless(bondp_hash_table_t *tbl, bondp_v2p_token_id_t *item); + #endif // BONDP_CONTEXT_TABLE \ No newline at end of file diff --git a/src/urma/lib/urma/bond/bondp_provider_ops.c b/src/urma/lib/urma/bond/bondp_provider_ops.c index 05e6911..eec563c 100644 --- a/src/urma/lib/urma/bond/bondp_provider_ops.c +++ b/src/urma/lib/urma/bond/bondp_provider_ops.c @@ -313,7 +313,14 @@ static int bondp_init_ctx_table(bondp_context_t *bond_ctx) URMA_LOG_ERR("Failed to create remote_p2v_jetty_id_table\n"); goto FREE_P_VJETTY_ID_TABLE; } + if (bdp_r_p2v_jetty_id_table_create(&bond_ctx->remote_v2p_token_id_table, BONDP_MAX_NUM_RSEGS)) { + URMA_LOG_ERR("Failed to create remote_v2p_jetty_id_table\n"); + goto FREE_V_PTOKEN_ID_TABLE; + } + atomic_init(&bond_ctx->token_id_cnt, 0); return 0; +FREE_V_PTOKEN_ID_TABLE: + (void)bdp_r_p2v_jetty_id_table_destroy(&bond_ctx->remote_v2p_token_id_table); FREE_P_VJETTY_ID_TABLE: bdp_p_vjetty_id_table_destroy(&bond_ctx->p_vjetty_id_table); ID_STORE_UNINIT: diff --git a/src/urma/lib/urma/bond/bondp_segment.c b/src/urma/lib/urma/bond/bondp_segment.c index 6987399..b09122f 100644 --- a/src/urma/lib/urma/bond/bondp_segment.c +++ b/src/urma/lib/urma/bond/bondp_segment.c @@ -402,6 +402,69 @@ unimport: return -1; } +static void bondp_fill_v_tseg(urma_target_seg_t *tseg, urma_seg_t *seg, uint64_t addr, + uint64_t handle, urma_context_t *ctx) +{ + tseg->seg.attr = seg->attr; + tseg->seg.ubva = seg->ubva; + tseg->seg.len = seg->len; + tseg->seg.token_id = seg->token_id; + tseg->mva = addr; + tseg->handle = handle; + tseg->urma_ctx = ctx; +} + +static int bondp_import_p_seg(bondp_context_t *bdp_ctx, urma_seg_t *seg, bondp_seg_cfg_t *bondp_seg_cfg) +{ + int ret; + + if (is_in_matrix_server(bdp_ctx)) { + ret = import_seg_matrix_server(bdp_ctx, seg, bondp_seg_cfg); + } else { + ret = import_seg_default(bdp_ctx, bondp_seg_cfg); + } + if (ret != 0) { + URMA_LOG_ERR("Failed to import p segment, ret: %d.\n", ret); + return ret; + } + + bondp_import_tseg_t *bdp_imprt_tseg = bondp_seg_cfg->bdp_imprt_tseg; + bdp_imprt_tseg->v_tseg.urma_ctx = &bdp_ctx->v_ctx; + bdp_imprt_tseg->v_tseg.user_ctx = (uint64_t)&bdp_imprt_tseg->v_tseg; + bdp_imprt_tseg->v_tseg.seg.ubva = seg->ubva; + + return ret; +} + +static int bondp_add_v2p_token_id(bondp_context_t *bdp_ctx, bondp_v2p_token_id_t *v2p_token_id) +{ + unsigned long token_id_cnt = atomic_load(&bdp_ctx->token_id_cnt); + uint32_t target_idx = (uint32_t)(token_id_cnt % BONDP_MAX_NUM_RSEGS); + bondp_hash_table_t *tbl = &bdp_ctx->remote_v2p_token_id_table; + int ret; + + (void)pthread_rwlock_wrlock(&tbl->lock); + if (token_id_cnt >= BONDP_MAX_NUM_RSEGS) { + /* remove the token_id with target_idx */ + ret = bdp_r_v2p_token_id_del_idx_lockless(tbl, target_idx); + if (ret != 0) { + (void)pthread_rwlock_unlock(&tbl->lock); + return ret; + } + } + /* add new v2p_token_id */ + v2p_token_id->index = target_idx; + ret = bdp_r_v2p_token_id_table_add_lockless(tbl, v2p_token_id); + if (ret != 0) { + (void)pthread_rwlock_unlock(&tbl->lock); + return ret; + } + (void)pthread_rwlock_unlock(&tbl->lock); + + atomic_fetch_add(&bdp_ctx->token_id_cnt, 1); + return 0; +} + urma_target_seg_t *bondp_import_seg(urma_context_t *ctx, urma_seg_t *seg, urma_token_t *token, uint64_t addr, urma_import_seg_flag_t flag) { @@ -413,57 +476,72 @@ urma_target_seg_t *bondp_import_seg(urma_context_t *ctx, urma_seg_t *seg, bondp_import_tseg_t *bdp_imprt_tseg = calloc(1, sizeof(bondp_import_tseg_t)); if (bdp_imprt_tseg == NULL) { - URMA_LOG_ERR("Failed to alloc import target seg\n"); + URMA_LOG_ERR("Failed to alloc import target seg.\n"); return NULL; } bdp_imprt_tseg->local_dev_num = bdp_ctx->dev_num; bdp_imprt_tseg->target_dev_num = URMA_UBAGG_DEV_MAX_NUM; + bdp_imprt_tseg->is_reused = false; + bondp_v2p_token_id_t v2p_token_id = {0}; + urma_eid_t v_remote_eid = {0}; + (void)memcpy(&v_remote_eid, &seg->ubva.eid, sizeof(urma_eid_t)); + int ret = bdp_r_v2p_token_id_tabl_lookup(&bdp_ctx->remote_v2p_token_id_table, seg->token_id, + &v_remote_eid, &v2p_token_id); - urma_import_tseg_cfg_t cfg = { - .ubva = seg->ubva, - .len = seg->len, - .attr = seg->attr, - .token_id = seg->token_id, - .token = token, - .flag = flag, - .mva = addr, - }; bondp_udata_import_seg_t udata_out = {0}; - urma_cmd_udrv_priv_t udata = { - .in_addr = 0, - .in_len = 0, - .out_addr = (uint64_t)&udata_out, - .out_len = sizeof(udata_out), - }; - bondp_seg_cfg_t bondp_seg_cfg = { - .token = token, - .addr = addr, - .flag = flag, - .udata_out = &udata_out, - .bdp_imprt_tseg = bdp_imprt_tseg, - }; + bondp_seg_cfg_t bondp_seg_cfg = { .token = token, .addr = addr, .flag = flag, + .udata_out = &udata_out, .bdp_imprt_tseg = bdp_imprt_tseg }; + if (ret == 0) { + (void)memcpy(&udata_out, v2p_token_id.peer_p_seg, sizeof(bondp_udata_import_seg_t)); + bdp_imprt_tseg->is_reused = true; + bondp_fill_v_tseg(&bdp_imprt_tseg->v_tseg, seg, addr, v2p_token_id.v_handle, ctx); + ret = bondp_import_p_seg(bdp_ctx, seg, &bondp_seg_cfg); + if (ret != 0) { + free(bdp_imprt_tseg); + return NULL; + } + return &bdp_imprt_tseg->v_tseg; + } + if (ret != BONDP_HASH_MAP_NOT_FOUND_ERROR) { + URMA_LOG_ERR("Failed to lookup v2p_token_id, ret: %d.\n", ret); + free(bdp_imprt_tseg); + return NULL; + } + /* ret is BONDP_HASH_MAP_NOT_FOUND_ERROR and start to import v_tseg */ + urma_import_tseg_cfg_t cfg = { .ubva = seg->ubva, .len = seg->len, .attr = seg->attr, + .token_id = seg->token_id, .token = token, .flag = flag, .mva = addr }; + urma_cmd_udrv_priv_t udata = { .in_addr = 0, .in_len = 0, + .out_addr = (uint64_t)&udata_out, .out_len = sizeof(udata_out) }; if (urma_cmd_import_seg(ctx, &bdp_imprt_tseg->v_tseg, &cfg, &udata) != 0) { URMA_LOG_ERR("import seg failed.\n"); goto free_bdp_imprt_tseg; } - int ret = 0; - if (is_in_matrix_server(bdp_ctx)) { - ret = import_seg_matrix_server(bdp_ctx, seg, &bondp_seg_cfg); - } else { - ret = import_seg_default(bdp_ctx, &bondp_seg_cfg); - } - if (ret) { + ret = bondp_import_p_seg(bdp_ctx, seg, &bondp_seg_cfg); + if (ret != 0) { goto cmd_unimport_seg; - } - bdp_imprt_tseg->v_tseg.urma_ctx = &bdp_ctx->v_ctx; - bdp_imprt_tseg->v_tseg.user_ctx = (uint64_t)&bdp_imprt_tseg->v_tseg; - bdp_imprt_tseg->v_tseg.seg.ubva = seg->ubva; + v2p_token_id.key.v_remote_eid = v_remote_eid; + v2p_token_id.key.v_token_id = seg->token_id; + (void)memcpy(v2p_token_id.peer_p_seg, udata_out.peer_p_seg, sizeof(bondp_udata_import_seg_t)); + v2p_token_id.v_handle = bdp_imprt_tseg->v_tseg.handle; + ret = bondp_add_v2p_token_id(bdp_ctx, &v2p_token_id); + if (ret != 0) { + goto unimport_p_seg; + } return &bdp_imprt_tseg->v_tseg; +unimport_p_seg: + for (int i = 0; i < bdp_ctx->dev_num; i++) { + for (int j = 0; j < URMA_UBAGG_DEV_MAX_NUM; j++) { + if (bdp_imprt_tseg->p_tseg[i][j] == NULL) { + continue; + } + (void)urma_unimport_seg(bdp_imprt_tseg->p_tseg[i][j]); + } + } cmd_unimport_seg: (void)urma_cmd_unimport_seg(&bdp_imprt_tseg->v_tseg); free_bdp_imprt_tseg: diff --git a/src/urma/lib/urma/bond/bondp_types.h b/src/urma/lib/urma/bond/bondp_types.h index 2839432..41c3be7 100644 --- a/src/urma/lib/urma/bond/bondp_types.h +++ b/src/urma/lib/urma/bond/bondp_types.h @@ -89,6 +89,8 @@ typedef struct bondp_context { /* The mapping of pjetty_ids to vjetty_ids of all remote jettys that have been obtained. */ bondp_hash_table_t remote_p2v_jetty_id_table; int real_async_fd; /* vcontex async_fd */ + bondp_hash_table_t remote_v2p_token_id_table; + atomic_ulong token_id_cnt; } bondp_context_t; typedef enum bondp_comp_type { -- Gitee