On Sun, Nov 16, 2014 at 03:06:15AM +0000, Chi, Xiaobo (NSN - CN/Hangzhou) wrote: > Hi, Bruce and Neil, > Do you indicate that to add one program arg, such as "--mem-only", to let the > rte_eal_init()only to do those memory initializing things? I am worrying that > this would make rte_eal_init() more complex due to the "--mem-only" should be > judged here and there, even in some sub-functions. >
Where, apart from rte_eal_init() and parse_args, would it need to be added? Unless it's a very long list of functions that need to be changed, I would still expect the flag solution to be easier to maintain than a new set of functions. Regards, /Bruce > brgs, > chi xiaobo > > -----Original Message----- > From: ext Neil Horman [mailto:nhorman at tuxdriver.com] > Sent: Friday, November 14, 2014 9:54 PM > To: Bruce Richardson > Cc: Chi, Xiaobo (NSN - CN/Hangzhou); dev at dpdk.org > Subject: Re: [dpdk-dev] one lightwight rte_eal_init() for SECONDARY processes > which only use sharedmemory > > On Fri, Nov 14, 2014 at 10:48:21AM +0000, Bruce Richardson wrote: > > 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 > > > +1, that seems like a more compatible approach. > Neil > > > > > > 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 > > > > > > > > > > >