From 2da364b5fd89ea8a85175620dc148a3a2f6101ab Mon Sep 17 00:00:00 2001 From: z00929493 Date: Sat, 27 Dec 2025 15:15:46 +0800 Subject: [PATCH] urma_perftest support module uboe --- .../tools/urma_perftest/perftest_parameters.c | 61 ++++++++++++++++++- .../tools/urma_perftest/perftest_parameters.h | 36 +++++++++++ .../tools/urma_perftest/perftest_resources.c | 36 +++++++++++ 3 files changed, 132 insertions(+), 1 deletion(-) diff --git a/src/urma/tools/urma_perftest/perftest_parameters.c b/src/urma/tools/urma_perftest/perftest_parameters.c index 2e1c748..0c90a20 100644 --- a/src/urma/tools/urma_perftest/perftest_parameters.c +++ b/src/urma/tools/urma_perftest/perftest_parameters.c @@ -115,6 +115,8 @@ static void usage(const char *argv0) (void)printf(" -s, --size Size of message to exchange (default 2).\n"); (void)printf(" -S, --server Server ip for bind or connect, default: 127.0.0.1 .\n"); (void)printf(" -T, --jfs_depth Size of jfs depth (default 128 for BW, 1 for LAT).\n"); + (void)printf(" -u, --uboe Enable uboe (default false), the parametre sip, dip are required.\ + dscp, vlan, sl are optional\n"); (void)printf(" -w, --warm_up Choose to use warm_up function, only for read/write/atomic bw test.\n"); (void)printf(" -y, --infinite[second] Run perftest infinitely, only available for BW test.\n" " Print period for infinite mode, default 2 seconds.\n"); @@ -148,6 +150,11 @@ default: disable.\n"); default: disable.\n"); (void)printf(" --pair_num Enable multiplayer model and set the number of connection, \ default: disable.\n"); + (void)printf(" --sip Set source ip address.\n"); + (void)printf(" --dip Set dest ip address.\n"); + (void)printf(" --dscp Set dscp.\n"); + (void)printf(" --vlan Set vlan_id.\n"); + (void)printf(" --sl Set sl.\n"); (void)printf(" --async_import Enable asynchronous connection establishment\n"); (void)printf(" --tp_aware Enable tp aware connect, default: disable.\n"); (void)printf(" --tp_reuse Reuse tp in RM mode if enable tp aware, default: disable.\n"); @@ -273,6 +280,13 @@ static void init_cfg(perftest_config_t *cfg) cfg->jfs_depth = (cfg->type == PERFTEST_BW) ? PERFTEST_DEF_JFS_DEPTH_BW : PERFTEST_DEF_JFS_DEPTH_LAT; cfg->trans_mode = URMA_TM_RM; + cfg->uboe = false; + cfg->uboe_vlan = false; + cfg->uboe_dscp = false; + cfg->uboe_sl = false; + cfg->uboe_dip = false; + cfg->uboe_sip = false; + cfg->cache_line_size = (uint32_t)get_cache_line_size(); cfg->page_size = (uint64_t)(uint32_t)getpagesize(); cfg->use_flat_api = false; @@ -433,6 +447,22 @@ static int check_cfg_range(perftest_config_t *cfg) return 0; } +static int str_to_ip(const char *str_ip, perftest_net_addr_t *ip) +{ + if (str_ip == NULL || ip == NULL) { + return -EINVAL; + } + if (inet_pton(AF_INET, str_ip, &ip->in4.addr) > 0) { + ip->in4.resv = 0; + ip->in4.prefix = 0; + return 0; + } + if (inet_pton(AF_INET6, str_ip, ip) > 0) { + return 0; + } + return -EINVAL; +} + int perftest_parse_args(int argc, char *argv[], perftest_config_t *cfg) { uint32_t offset; @@ -485,6 +515,7 @@ int perftest_parse_args(int argc, char *argv[], perftest_config_t *cfg) {"size", required_argument, NULL, 's'}, {"server", required_argument, NULL, 'S'}, {"jfs_depth", required_argument, NULL, 'T'}, + {"uboe", no_argument, NULL, 'u'}, {"warm_up", no_argument, NULL, 'w'}, {"infinite", optional_argument, NULL, 'y'}, {"use_bonding", no_argument, NULL, 'z'}, @@ -520,6 +551,11 @@ int perftest_parse_args(int argc, char *argv[], perftest_config_t *cfg) {"ctp", no_argument, NULL, PERFTEST_OPT_CTP}, {"jetty_id", required_argument, NULL, PERFTEST_OPT_JETTY_ID }, {"wait_jfc_timeout", required_argument, NULL, PERFTEST_OPT_WAIT_JFC_TIMEOUT }, + {"sip", no_argument, NULL, PERFTEST_OPT_SIP}, + {"dip", no_argument, NULL, PERFTEST_OPT_DIP}, + {"dscp", no_argument, NULL, PERFTEST_OPT_DSCP}, + {"vlan", no_argument, NULL, PERFTEST_OPT_VLAN}, + {"sl", no_argument, NULL, PERFTEST_OPT_SL}, {"hugepage_size", required_argument, NULL, PERFTEST_OPT_PAGE_SIZE }, {"aggr_mode", required_argument, NULL, PERFTEST_OPT_AGGR_MODE }, {NULL, no_argument, NULL, '\0'}, @@ -527,7 +563,7 @@ int perftest_parse_args(int argc, char *argv[], perftest_config_t *cfg) /* Second parse the options */ while (1) { - int c = getopt_long(argc, argv, "a::A:bBcC:d:t:D:eE:fFhI:j:J:K:n:Nl:Lo:O:p:P:Q:r:R:s:S:T:wy::z", + int c = getopt_long(argc, argv, "a::A:bBcC:d:t:D:eE:fFhI:j:J:K:n:Nl:Lo:O:p:P:Q:r:R:s:S:T:uwy::z", long_options, NULL); if (c == -1) { break; @@ -682,6 +718,9 @@ int perftest_parse_args(int argc, char *argv[], perftest_config_t *cfg) case 'T': (void)ub_str_to_u32(optarg, &cfg->jfs_depth); break; + case 'u': + cfg->uboe = true; + break; case 'w': cfg->warm_up = true; break; @@ -775,6 +814,26 @@ int perftest_parse_args(int argc, char *argv[], perftest_config_t *cfg) case PERFTEST_OPT_ACK_TIMEOUT: (void)ub_str_to_u32(optarg, &cfg->ack_timeout); break; + case PERFTEST_OPT_SIP: + (void)str_to_ip(optarg, &cfg->sip); + cfg->uboe_sip = true; + break; + case PERFTEST_OPT_DIP: + cfg->uboe_dip = true; + (void)str_to_ip(optarg, &cfg->dip); + break; + case PERFTEST_OPT_DSCP: + cfg->uboe_dscp = true; + (void)ub_str_to_u8(optarg, &cfg->dscp); + break; + case PERFTEST_OPT_VLAN: + cfg->uboe_vlan = true; + (void)ub_str_to_u8(optarg, &cfg->vlan_id); + break; + case PERFTEST_OPT_SL: + cfg->uboe_sl = true; + (void)ub_str_to_u8(optarg, &cfg->sl); + break; case PERFTEST_OPT_SGE_NUM: (void)ub_str_to_u32(optarg, &cfg->sge_num); break; diff --git a/src/urma/tools/urma_perftest/perftest_parameters.h b/src/urma/tools/urma_perftest/perftest_parameters.h index 69ec0cc..dbc185b 100644 --- a/src/urma/tools/urma_perftest/perftest_parameters.h +++ b/src/urma/tools/urma_perftest/perftest_parameters.h @@ -110,6 +110,9 @@ #define PERFTEST_WRITE_DIRTY_PERIOD (50) #define PERFTEST_CHAR_MAX_VALUE (256) +#define PERFTEST_SET_ATTR_BITMAP_UBOE 0x1FC +#define PERFTEST_SET_ATTR_BITMAP_SL_FLAG 0x400 +#define PERFTEST_SET_ATTR_CNT_UBOE (7) #define PERFTEST_RESULT_LINE "---------------------------------------------------------------------------------------\n" @@ -190,6 +193,11 @@ enum perftest_opts { PERFTEST_OPT_CTP, PERFTEST_OPT_SINGLE_PATH, PERFTEST_OPT_JETTY_ID, + PERFTEST_OPT_SIP, + PERFTEST_OPT_DIP, + PERFTEST_OPT_VLAN, + PERFTEST_OPT_DSCP, + PERFTEST_OPT_SL, PERFTEST_OPT_WAIT_JFC_TIMEOUT, PERFTEST_OPT_PAGE_SIZE, PERFTEST_OPT_AGGR_MODE, @@ -201,6 +209,19 @@ typedef enum perftest_rate_limiter_units { PERFTEST_RATE_LIMIT_PS } perftest_rate_limiter_units_t; +typedef union perftest_net_addr { + uint8_t raw[URMA_IP_ADDR_BYTES]; /* Network Order */ + struct { + uint64_t resv; + uint32_t prefix; + uint32_t addr; + } in4; + struct { + uint64_t subnet_prefix; + uint64_t interface_id; + } in6; +} perftest_net_addr_t; + typedef struct perftest_config { perftest_cmd_type_t cmd; perftest_type_t type; @@ -291,6 +312,21 @@ typedef struct perftest_config { bool use_ctp; uint32_t jetty_id; int32_t wait_jfc_timeout; + + bool uboe; + perftest_net_addr_t sip; + bool uboe_sip; + perftest_net_addr_t dip; + bool uboe_dip; + uint8_t smac[URMA_MAC_BYTES]; + uint8_t dmac[URMA_MAC_BYTES]; + uint16_t vlan_id; + bool uboe_vlan; + uint8_t dscp; + bool uboe_dscp; + uint8_t sl; + bool uboe_sl; + urma_huge_page_size_t huge_page; bool use_huge_page; bool enable_aggr_mode; diff --git a/src/urma/tools/urma_perftest/perftest_resources.c b/src/urma/tools/urma_perftest/perftest_resources.c index ebbce54..3c5a927 100644 --- a/src/urma/tools/urma_perftest/perftest_resources.c +++ b/src/urma/tools/urma_perftest/perftest_resources.c @@ -974,6 +974,8 @@ static void free_tp_info(perftest_context_t *ctx) ctx->tp_info = NULL; } + + static int create_tp_info(perftest_context_t *ctx, perftest_comm_t *comm, perftest_config_t *cfg) { if (!cfg->tp_aware) { @@ -1011,6 +1013,40 @@ static int create_tp_info(perftest_context_t *ctx, perftest_comm_t *comm, perfte (void)fprintf(stderr, "Failed to get tpid list, ret:%d, tp_cnt:%u!\n", ret, tp_cnt); goto free_buf; } + if (cfg->uboe) { + uint32_t set_tp_attr_flag = PERFTEST_SET_ATTR_BITMAP_UBOE; + uint8_t set_tp_attr_cnt = PRTFTEST_SET_ATTR_CNT_UBOE; + if (cfg->use_ctp) { + (void)fprintf(stderr, "ctp is not supported by uboe!\n"); + goto free_buf; + } + if (!cfg->uboe_dip || !cfg->uboe_sip) { + (void)fprintf(stderr, "uboe module need parametres: sip, dip, optional parametres: dscp, vlan, sl\n"); + goto free_buf; + } + ret = urma_get_smac(ctx->urma_ctx, cfg->smac); + if (ret != URMA_SUCCESS) { + (void)fprintf(stderr, "Failed to get smac, ret:%d\n", ret); + goto free_buf; + } + urma_net_addr_t net_addr; + net_addr.sin_family = AF_INET; + net_addr.in4.s_addr = cfg->dip.in4.addr; + ret = urma_get_dmac(ctx->urma_ctx, &net_addr, cfg->dmac); + if (ret != URMA_SUCCESS) { + (void)fprintf(stderr, "Failed to get dmac, ret:%d\n", ret); + goto free_buf; + } + + urma_tp_attr_value_t tp_attr = {0}; + create_tp_info_get_attr_uboe(cfg, &tp_attr,&set_tp_attr_flag, &set_tp_attr_cnt); + ret = urma_set_tp_attr(ctx->urma_ctx, ctx->tp_info[i].tp_handle, set_tp_attr_cnt, + set_tp_attr_flag, &tp_attr); + if (ret != URMA_SUCCESS) { + (void)fprintf(stderr, "Failed to set_tp_attr, ret:%d\n", ret); + foto free_buf; + } + } } return 0; -- Gitee