diff options
| author | Lu Qiuwen <[email protected]> | 2021-03-02 10:17:05 +0800 |
|---|---|---|
| committer | Lu Qiuwen <[email protected]> | 2021-03-02 10:17:05 +0800 |
| commit | cee158a3cc5ef5187f68ac5bcf7c4ff91a646d28 (patch) | |
| tree | 9f88814fb38d5086bbdc55dd22a4420e34f58f6d | |
| parent | 4627eb7f0893465a6264a18a35fa26bfa48b7368 (diff) | |
增加支持virtio-user的EAL选项和设备扫描实现。
| -rw-r--r-- | docker/Dockerfile | 1 | ||||
| -rwxr-xr-x | docker/create-build-env.sh | 2 | ||||
| -rwxr-xr-x | docker/create-virtio-env.sh | 8 | ||||
| -rw-r--r-- | docker/mrglobal.conf | 23 | ||||
| -rw-r--r-- | service/src/core.c | 30 | ||||
| -rw-r--r-- | service/src/phydev.c | 42 |
6 files changed, 106 insertions, 0 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..15a0e61 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1 @@ +FROM git.mesalab.cn:7443/mesa_platform/marsio-build-env:master diff --git a/docker/create-build-env.sh b/docker/create-build-env.sh new file mode 100755 index 0000000..550ad6d --- /dev/null +++ b/docker/create-build-env.sh @@ -0,0 +1,2 @@ +docker build . +docker run --name marsio-build-container -v $(pwd)/../:/marsio -it git.mesalab.cn:7443/mesa_platform/marsio-build-env:master /bin/bash diff --git a/docker/create-virtio-env.sh b/docker/create-virtio-env.sh new file mode 100755 index 0000000..d2b1d25 --- /dev/null +++ b/docker/create-virtio-env.sh @@ -0,0 +1,8 @@ +docker build . + +sudo sh -c "echo 16 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages" + +sudo mkdir -p /var/tmp/huge_1G +sudo mount -t hugetlbfs nodev -o pagesize=1G /var/tmp/huge_1G + +docker run --name marsio-virtio-container --cpus=4 -v /tmp/sock0:/var/run/usvhost0 -v /var/tmp/huge_1G:/var/tmp/huge_1G -v $(pwd)/../:/marsio -it git.mesalab.cn:7443/mesa_platform/marsio-build-env:master /bin/bash diff --git a/docker/mrglobal.conf b/docker/mrglobal.conf new file mode 100644 index 0000000..419e260 --- /dev/null +++ b/docker/mrglobal.conf @@ -0,0 +1,23 @@ +[device] + +[service] +# lcore id for i/o service, use comma to split +iocore=12,13,14,15 +#distmode=0 +#hashmode=0 + +[eal] +virtaddr=0x7f40c4a00000 +loglevel=7 + +[keepalive] +check_spinlock=1 + +#[ctrlzone] +#ctrlzone0=janus,64 + +[pool] +create_mode=3 +sz_direct_pktmbuf=4194304 +sz_indirect_pktmbuf=8192 +sz_cache=256 diff --git a/service/src/core.c b/service/src/core.c index 620e0d1..37b0503 100644 --- a/service/src/core.c +++ b/service/src/core.c @@ -328,6 +328,36 @@ static void sc_eal_init(struct sc_main * sc, const char * cmd) WRITE_ARG("--no-huge"); } + unsigned int en_no_pci = 0; + MESA_load_profile_uint_def(sc->local_cfgfile, "eal", "nopci", &en_no_pci, 0); + + if (en_no_pci > 0) + { + WRITE_ARG("--no-pci"); + } + + unsigned int mem = 0; + ret = MESA_load_profile_uint_nodef(sc->local_cfgfile, "eal", "mem", &mem); + + char str_mem[MR_STRING_MAX]; + snprintf(str_mem, sizeof(str_mem), "%u", mem); + + if(ret >= 0) + { + WRITE_ARG("-m"); + WRITE_ARG(str_mem); + } + + char str_file_prefix[MR_STRING_MAX]; + ret = MESA_load_profile_string_nodef(sc->local_cfgfile, "eal", "file-prefix", + str_file_prefix, sizeof(str_file_prefix)); + + if (ret >= 0) + { + WRITE_ARG("--file-prefix"); + WRITE_ARG(str_file_prefix); + } + // DPDK和SYSTEMD的日志级别差1 unsigned int loglevel = g_logger_level + 1; MESA_load_profile_uint_def(sc->local_cfgfile, "eal", "loglevel", &loglevel, loglevel); diff --git a/service/src/phydev.c b/service/src/phydev.c index 350ffca..720b32d 100644 --- a/service/src/phydev.c +++ b/service/src/phydev.c @@ -670,6 +670,42 @@ static int phydev_scan_raw_socket(struct sc_main * sc, struct phydev_main * phyd return RT_SUCCESS; } +/* VIRTIO Devices */ +static int phydev_scan_virtio_user(struct sc_main * sc, struct phydev_main * phydev_main) +{ + char virtio_syms[MR_SYMBOL_MAX][MR_PHYDEV_MAX] = {{0}}; + unsigned int nr_virtio_syms = 0; + phydev_query_device_list(sc, "virtio_user", virtio_syms, &nr_virtio_syms); + + if(nr_virtio_syms < 0) + { + return RT_SUCCESS; + } + + for(int i = 0; i < nr_virtio_syms; i++) + { + uint16_t port_id; + char str_attach_args[MR_STRING_MAX]; + + snprintf(str_attach_args, sizeof(str_attach_args), + "virtio_user%d,queues=%d,path=/var/run/usvhost%d", i, sc->nr_serv_thread, i); + + int ret = rte_eth_dev_attach(str_attach_args, &port_id); + if (ret < 0) + { + MR_ERROR("Attaching virtio-user device %s failed, Errno = %d", virtio_syms[i], ret); + return RT_ERR; + } + + struct phydev * phydev = phydev_alloc(phydev_main, port_id); + snprintf(phydev->symbol, sizeof(phydev->symbol), "%s", virtio_syms[i]); + snprintf(phydev->info.symbol, sizeof(phydev->info.symbol), "%s", virtio_syms[i]); + phydev->port_id = port_id; + } + + return RT_SUCCESS; +} + /* 设备扫描,根据目前的设备启用情况修正物理设备链 */ static int phydev_scan_uio(struct phydev_main * phydev_main) { @@ -806,6 +842,12 @@ int phydev_init(struct sc_main * sc) return RT_ERR; } + if (phydev_scan_virtio_user(sc, sc->phydev_main) < 0) + { + MR_ERROR("Physical device in virtio-user scan failed."); + return RT_ERR; + } + struct phydev * phydev_iter; TAILQ_FOREACH(phydev_iter, &sc->phydev_main->device_list, next) { |
