From 31abbd7554c311406121a0916e18084699ac9083 Mon Sep 17 00:00:00 2001 From: Xiaozhou Liu Date: Wed, 28 Mar 2018 16:24:32 +0800 Subject: [PATCH] Fix a segmentation fault bug when used with DPDK. When DPDK is used we have: lkl_hijack_netdev_create() --> lkl_netdev_dpdk_create() --> rte_eal_init() --> rte_eal_intr_init() rte_eal_intr_init() creates threads to use lkl_ops, but lkl_ops will only be initialized in later call to lkl_start_kernel(). So LKL crashes with SIGSEGV received. Fix by switching calls to lkl_hijack_netdev_create()/lkl_start_kernel(). Signed-off-by: Xiaozhou Liu --- tools/lkl/lib/hijack/init.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/lkl/lib/hijack/init.c b/tools/lkl/lib/hijack/init.c index 9d41ada735d736..e7a277a6a2a936 100644 --- a/tools/lkl/lib/hijack/init.c +++ b/tools/lkl/lib/hijack/init.c @@ -463,6 +463,14 @@ hijack_init(void) if (single_cpu_mode == 2) PinToFirstCpu(&ori_cpu); + ret = lkl_start_kernel(&lkl_host_ops, cfg->boot_cmdline); + if (ret) { + fprintf(stderr, "can't start kernel: %s\n", lkl_strerror(ret)); + return; + } + + lkl_running = 1; + for (ifidx = 0; ifidx < cfg->ifnum; ifidx++) { ret = lkl_hijack_netdev_create(cfg, ifidx); if (ret < 0) @@ -483,14 +491,6 @@ hijack_init(void) } #endif - ret = lkl_start_kernel(&lkl_host_ops, cfg->boot_cmdline); - if (ret) { - fprintf(stderr, "can't start kernel: %s\n", lkl_strerror(ret)); - return; - } - - lkl_running = 1; - /* initialize epoll manage list */ memset(dual_fds, -1, sizeof(int) * LKL_FD_OFFSET);