This is really useful, thank you!

Best regards,
Igor Ryzhov

> 12 ????. 2014 ?., ? 6:22, Chi, Xiaobo (NSN - CN/Hangzhou) <xiaobo.chi at 
> nsn.com> ???????(?):
> 
> 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.
> 
> 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
> 
> 
> 

Reply via email to