Fixes LP: #1546565
*Update*
- - with the split libs it now nees to be listed in
+ - with the split libs it now needs to be listed in
lib/librte_eal/linuxapp/eal/rte_eal_version.map to work on link steps
- please note that upstream gravitates towards not extending but creating a
new the API in DPDK as long term solution (will take a while)
So over time we have to check when we can drop it at the price of a config
transition - likely OVS 2.6 won't need it anymore.
+*Update*
+ - the handling and lifecycle of this changed in Openvswitch 2.7 so we can no
+ more use internal_config.
+ - Also the upstreaming was aborted as that now clearly goes towards client
+ mode vhost sockets for this (and other issues).
+ - But until that is fully working we have to carry the workaround.
+ - Updated to work with Openvswitch 2.7 (and backward compatible to 2.6)
+
+*Update*
+ - in 17.05 the patch now needs to be hooked up on a different place in vhost
+ socket.c
+ - also the former rebase dropped a create socket call which is now restored
+
Forwarded: yes
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
-Last-Update: 2016-09-28
+Last-Update: 2017-08-23
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
-@@ -156,6 +156,25 @@
+@@ -133,6 +133,25 @@ See the DPDK Getting Started Guides for
Use malloc instead of hugetlbfs.
----------------------------
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
-@@ -95,6 +95,8 @@
- {OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM },
+@@ -78,6 +78,8 @@ eal_long_options[] = {
{OPT_VMWARE_TSC_MAP, 0, NULL, OPT_VMWARE_TSC_MAP_NUM },
- {OPT_XEN_DOM0, 0, NULL, OPT_XEN_DOM0_NUM },
+ {OPT_LEGACY_MEM, 0, NULL, OPT_LEGACY_MEM_NUM },
+ {OPT_SINGLE_FILE_SEGMENTS, 0, NULL, OPT_SINGLE_FILE_SEGMENTS_NUM},
+ {OPT_VHOST_OWNER, 1, NULL, OPT_VHOST_OWNER_NUM },
+ {OPT_VHOST_PERM, 1, NULL, OPT_VHOST_PERM_NUM },
{0, 0, NULL, 0 }
};
-@@ -161,6 +163,8 @@
- #endif
- internal_cfg->vmware_tsc_map = 0;
- internal_cfg->create_uio_dev = 0;
-+ internal_cfg->vhost_sock_owner = NULL;
-+ internal_cfg->vhost_sock_perm = NULL;
- }
-
- static int
---- a/lib/librte_eal/common/eal_internal_cfg.h
-+++ b/lib/librte_eal/common/eal_internal_cfg.h
-@@ -82,6 +82,8 @@
- volatile enum rte_intr_mode vfio_intr_mode;
- const char *hugefile_prefix; /**< the base filename of hugetlbfs files */
- const char *hugepage_dir; /**< specific hugetlbfs directory to use */
-+ const char *vhost_sock_owner; /**< owner:group of vhost_user sockets */
-+ const char *vhost_sock_perm; /**< permissions of vhost_user sockets */
-
- unsigned num_hugepage_sizes; /**< how many sizes on this system */
- struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];
--- a/lib/librte_eal/common/eal_options.h
+++ b/lib/librte_eal/common/eal_options.h
-@@ -83,6 +83,10 @@
- OPT_VMWARE_TSC_MAP_NUM,
- #define OPT_XEN_DOM0 "xen-dom0"
- OPT_XEN_DOM0_NUM,
+@@ -63,6 +63,10 @@ enum {
+ OPT_LEGACY_MEM_NUM,
+ #define OPT_SINGLE_FILE_SEGMENTS "single-file-segments"
+ OPT_SINGLE_FILE_SEGMENTS_NUM,
+#define OPT_VHOST_OWNER "vhost-owner"
+ OPT_VHOST_OWNER_NUM,
+#define OPT_VHOST_PERM "vhost-perm"
--- a/lib/librte_eal/common/include/rte_eal.h
+++ b/lib/librte_eal/common/include/rte_eal.h
-@@ -286,6 +286,11 @@
- #define RTE_INIT(func) \
- static void __attribute__((constructor, used)) func(void)
+@@ -498,6 +498,11 @@ enum rte_iova_mode rte_eal_iova_mode(voi
+ const char *
+ rte_eal_mbuf_user_pool_ops(void);
+/**
+ * Set owner/permissions on sockets if requested on EAL commandline
#endif
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
-@@ -53,6 +53,9 @@
+@@ -23,6 +23,9 @@
#if defined(RTE_ARCH_X86)
#include <sys/io.h>
#endif
+#include <pwd.h>
+#include <grp.h>
+ #include <rte_compat.h>
#include <rte_common.h>
- #include <rte_debug.h>
-@@ -356,6 +359,8 @@
- " --"OPT_CREATE_UIO_DEV" Create /dev/uioX (usually done by hotplug)\n"
+@@ -89,6 +92,12 @@ struct lcore_config lcore_config[RTE_MAX
+ /* internal configuration */
+ struct internal_config internal_config;
+
++/* workaround to be able to create the sockets under a certain set of
++ * owner/permissions as specified to EAL until solved upstream */
++static uid_t debian_vhost_sock_uid = (uid_t)-1;
++static gid_t debian_vhost_sock_gid = (gid_t)-1;
++static mode_t debian_vhost_sock_perm = 0;
++
+ /* used by rte_rdtsc() */
+ int rte_cycles_vmware_tsc_map;
+
+@@ -408,6 +417,8 @@ eal_usage(const char *prgname)
" --"OPT_VFIO_INTR" Interrupt mode for VFIO (legacy|msi|msix)\n"
- " --"OPT_XEN_DOM0" Support running on Xen dom0 without hugetlbfs\n"
+ " --"OPT_LEGACY_MEM" Legacy memory mode (no dynamic allocation, contiguous segments)\n"
+ " --"OPT_SINGLE_FILE_SEGMENTS" Put all hugepage memory in single files\n"
+ " --"OPT_VHOST_OWNER" Create vhost-user sockets with this owner:group\n"
+ " --"OPT_VHOST_PERM" Create vhost-user sockets with these permissions\n"
"\n");
/* Allow the application to print its usage message too if hook is set */
if ( rte_application_usage_hook ) {
-@@ -611,6 +616,14 @@
- internal_config.create_uio_dev = 1;
- break;
-
-+ case OPT_VHOST_OWNER_NUM:
-+ internal_config.vhost_sock_owner = optarg;
-+ break;
-+
-+ case OPT_VHOST_PERM_NUM:
-+ internal_config.vhost_sock_perm = optarg;
-+ break;
-+
- default:
- if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
- RTE_LOG(ERR, EAL, "Option %c is not supported "
-@@ -995,3 +1008,172 @@
- /* Module has been found */
- return 1;
+@@ -566,6 +577,121 @@ eal_log_level_parse(int argc, char **arg
+ optarg = old_optarg;
}
-+
+
+/* Try to double the size of '*buf', return true
+ * if successful, and '*sizep' will be updated with
+ * the new size. Otherwise, return false. */
+ free(user_search);
+ return e;
+}
++
+ /* Parse the argument given in the command line of the application */
+ static int
+ eal_parse_args(int argc, char **argv)
+@@ -668,6 +794,26 @@ eal_parse_args(int argc, char **argv)
+ strdup(optarg);
+ break;
+
++ case OPT_VHOST_OWNER_NUM:
++ if (get_owners_from_str(optarg, &debian_vhost_sock_uid,
++ &debian_vhost_sock_gid)) {
++ RTE_LOG(ERR, EAL,"vhost-user socket unable to get"
++ " specified user/group: %s\n", optarg);
++ debian_vhost_sock_uid = (uid_t)-1;
++ debian_vhost_sock_gid = (gid_t)-1;
++ }
++ else {
++ RTE_LOG(INFO, EAL,"socket owner specified as %s (%d:%d)\n",
++ optarg, debian_vhost_sock_uid, debian_vhost_sock_gid);
++ }
++ break;
++
++ case OPT_VHOST_PERM_NUM:
++ debian_vhost_sock_perm = (mode_t)strtoul(optarg, NULL, 0);
++ RTE_LOG(INFO, EAL,"socket perm specified as '%#o' from '%s'\n",
++ debian_vhost_sock_perm, optarg);
++ break;
++
+ default:
+ if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
+ RTE_LOG(ERR, EAL, "Option %c is not supported "
+@@ -1145,3 +1291,47 @@ rte_eal_check_module(const char *module_
+ /* Module has been found */
+ return 1;
+ }
+
+static void
+vhost_set_permissions(const char *vhost_sock_location)
+{
-+ unsigned long int mode = strtoul(internal_config.vhost_sock_perm, NULL, 0);
-+ int err = chmod(vhost_sock_location, (mode_t)mode);
++ int err = chmod(vhost_sock_location, debian_vhost_sock_perm);
+ if (err) {
+ RTE_LOG(ERR, EAL,"vhost-user socket cannot set"
-+ " permissions to %s (%s).\n",
-+ internal_config.vhost_sock_perm, strerror(err));
++ " permissions to %#o (%s).\n",
++ debian_vhost_sock_perm, strerror(err));
+ return;
+ }
+ RTE_LOG(INFO, EAL,"Socket %s changed permissions"
-+ " to %s\n", vhost_sock_location,
-+ internal_config.vhost_sock_perm);
++ " to %#o\n", vhost_sock_location,
++ debian_vhost_sock_perm);
+}
+
+static void
+vhost_set_ownership(const char *vhost_sock_location)
+{
-+ uid_t vhuid=0;
-+ gid_t vhgid=0;
-+
-+ if (get_owners_from_str(internal_config.vhost_sock_owner, &vhuid, &vhgid)) {
-+ RTE_LOG(ERR, EAL,"vhost-user socket unable to get"
-+ " specified user/group: %s\n",
-+ internal_config.vhost_sock_owner);
-+ return;
-+ }
-+
-+ int err = chown(vhost_sock_location, vhuid, vhgid);
++ int err = chown(vhost_sock_location, debian_vhost_sock_uid, debian_vhost_sock_gid);
+ if (err) {
+ RTE_LOG(ERR, EAL,"vhost-user socket unable to set"
-+ " ownership to %s (%s).\n",
-+ internal_config.vhost_sock_owner, strerror(err));
++ " ownership to %d:%d (%s).\n",
++ debian_vhost_sock_uid, debian_vhost_sock_gid,
++ strerror(err));
+ return;
+ }
+
+ RTE_LOG(INFO, EAL,"Socket %s changed ownership"
-+ " to %s.\n", vhost_sock_location,
-+ internal_config.vhost_sock_owner);
++ " to %d:%d.\n", vhost_sock_location,
++ debian_vhost_sock_uid, debian_vhost_sock_gid);
+}
+
+void
+rte_eal_set_socket_permissions(const char *path)
+{
-+ if (internal_config.vhost_sock_perm) {
++ if (debian_vhost_sock_perm != 0) {
+ vhost_set_permissions(path);
+ }
+
-+ if (internal_config.vhost_sock_owner) {
++ if (debian_vhost_sock_uid != (uid_t)-1 || debian_vhost_sock_gid != (gid_t)-1) {
+ vhost_set_ownership(path);
+ }
+}
---- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
-+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
-@@ -120,6 +120,7 @@
- rte_keepalive_register_core;
- rte_xen_dom0_supported;
- rte_xen_mem_phy2mch;
+--- a/lib/librte_eal/rte_eal_version.map
++++ b/lib/librte_eal/rte_eal_version.map
+@@ -116,6 +116,7 @@ DPDK_16.04 {
+
+ rte_cpu_get_flag_name;
+ rte_eal_primary_proc_alive;
+ rte_eal_set_socket_permissions;
- } DPDK_2.1;
+ } DPDK_2.2;
--- a/lib/librte_vhost/socket.c
+++ b/lib/librte_vhost/socket.c
-@@ -98,6 +98,8 @@
+@@ -77,6 +77,8 @@ struct vhost_user {
pthread_mutex_t mutex;
};
#define MAX_VIRTIO_BACKLOG 128
static void vhost_user_server_new_connection(int fd, void *data, int *remove);
-@@ -645,6 +647,7 @@
- vsocket->is_server = true;
+@@ -374,6 +376,7 @@ vhost_user_start_server(struct vhost_use
+ goto err;
}
- ret = create_unix_socket(vsocket);
+
+ rte_eal_set_socket_permissions(path);
- if (ret < 0) {
- free(vsocket->path);
- free(vsocket);
+ return 0;
+
+ err: