On Wed, Nov 12, 2014 at 03:22:37AM +0000, Chi, Xiaobo (NSN - CN/Hangzhou) wrote: > Hi, > Background: > What we are doing now is port make telecom network element to be cloud based. > For one of our product, DPDK is applied not only for fastpath/dataplane > processing, but also for Distributed Message eXchange (DMX) between different > processes/applications which may located in different VM even different host. > for such a DMX system, in one VM, we have one DPDK based dmxdemo (which acts > as the PRIMARY) which is in charge of distribute message between different > applications, and dozens of applications (act as SECONDARY) to use DPDK based > rte_tx_ring/rte_rx_ring/mempool/memzone to send receive messages to dmxdemo. > > Problem: > Here, these DPDK based SECONDARY processes need only the DPDK's hugepage > based sharememory mechanism and it's upper libs (such as ring, mempool, > etc.), they need not cpu core pinning, iopl privilege changing , pci device, > timer, alarm, interrupt, shared_driver_list, core_info, threads for each > core, etc. Then, for such kind of SECONDARY processes, the current > rte_eal_init() is too heavy. > I have seen some others also met similar troubles. > > Solution: > I write one light weight rte_eal_init(), called rte_eal_secondary_mem_init() > as following. It only initializes shared memory and mandatory resources. I > expect your review and hope these code can be merged into DPDK main branch. >
Rather than writing a whole new API and arg parsing function, might it be better to implement this just as an additional EAL flag that prevents the existing eal_init function from doing all tasks? /Bruce > static void eal_secondary_mem_parse_args(int argc, char **argv) > { > static struct option lgopts[] = { > {OPT_HUGE_DIR, 1, 0, 0}, > {OPT_FILE_PREFIX, 1, 0, 0}, > {0, 0, 0, 0} > }; > > int opt; > int option_index; > > while ((opt = getopt_long(argc, argv, "", lgopts, &option_index)) != > EOF) { > > if (!opt ) { > if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) { > internal_config.hugepage_dir = optarg; > } > else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) { > internal_config.hugefile_prefix = optarg; > } > } > } > } > > int rte_eal_secondary_mem_init( int argc, char **argv ) > { > static rte_atomic32_t run_once = RTE_ATOMIC32_INIT(0); > const char *logid; > > if (!rte_atomic32_test_and_set(&run_once)) > return -1; > > logid = strrchr(argv[0], '/'); > logid = strdup(logid ? logid + 1: argv[0]); > > if (rte_eal_log_early_init() < 0) > rte_panic("Cannot init early logs\n"); > > memset( &internal_config, 0, sizeof( struct internal_config ) ); > /*this is only for secondary PRBs */ > internal_config.process_type = RTE_PROC_SECONDARY; > internal_config.hugefile_prefix = HUGEFILE_PREFIX_DEFAULT; > internal_config.hugepage_dir = NULL; > /* user can freely define the hugefile_prefix and hugepage_dir */ > eal_secondary_mem_parse_args( argc, argv ); > > RTE_LOG(INFO, EAL, "prefix=%s, dir=%s.\n",internal_config.hugefile_prefix, > internal_config.hugepage_dir ); > > /* To share memory config with PRIMARY process */ > internal_config.no_shconf = 0; > rte_config_init(); > > if (rte_eal_memory_init() < 0) > rte_panic("Cannot init memory\n"); > > if (rte_eal_memzone_init() < 0) > rte_panic("Cannot init memzone\n"); > > if (rte_eal_log_init(logid, LOG_DAEMON ) < 0) > rte_panic("Cannot init logs\n"); > > return 0; > } > > brgs, > chi xiaobo > > >