From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41633) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1agxmH-0006Tm-8n for qemu-devel@nongnu.org; Fri, 18 Mar 2016 13:01:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1agxmE-00082A-GS for qemu-devel@nongnu.org; Fri, 18 Mar 2016 13:01:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:44302) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1agxmE-00081q-7y for qemu-devel@nongnu.org; Fri, 18 Mar 2016 13:01:30 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id CD78E7F6C1 for ; Fri, 18 Mar 2016 17:01:29 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-34.ams2.redhat.com [10.36.116.34]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2IH1R1l010040 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 18 Mar 2016 13:01:29 -0400 From: Markus Armbruster Date: Fri, 18 Mar 2016 18:00:50 +0100 Message-Id: <1458320487-19603-4-git-send-email-armbru@redhat.com> In-Reply-To: <1458320487-19603-1-git-send-email-armbru@redhat.com> References: <1458320487-19603-1-git-send-email-armbru@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 03/40] ivshmem-server: Don't overload POSIX shmem and file name List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Option -m NAME is interpreted as directory name if we can statfs() it and its on hugetlbfs. Else it's interpreted as POSIX shared memory object name. This is nuts. Always interpret -m as directory. Create new -M for POSIX shared memory. Last of -m or -M wins. Signed-off-by: Markus Armbruster Message-Id: <1458066895-20632-4-git-send-email-armbru@redhat.com> Reviewed-by: Marc-Andr=C3=A9 Lureau --- contrib/ivshmem-server/ivshmem-server.c | 56 ++++++---------------------= ------ contrib/ivshmem-server/ivshmem-server.h | 4 ++- contrib/ivshmem-server/main.c | 14 ++++++--- tests/ivshmem-test.c | 2 +- 4 files changed, 24 insertions(+), 52 deletions(-) diff --git a/contrib/ivshmem-server/ivshmem-server.c b/contrib/ivshmem-se= rver/ivshmem-server.c index bfd0fad..172db78 100644 --- a/contrib/ivshmem-server/ivshmem-server.c +++ b/contrib/ivshmem-server/ivshmem-server.c @@ -12,9 +12,6 @@ #include #include #include -#ifdef CONFIG_LINUX -#include -#endif =20 #include "ivshmem-server.h" =20 @@ -257,7 +254,8 @@ ivshmem_server_ftruncate(int fd, unsigned shmsize) /* Init a new ivshmem server */ int ivshmem_server_init(IvshmemServer *server, const char *unix_sock_path, - const char *shm_path, size_t shm_size, unsigned n_ve= ctors, + const char *shm_path, bool use_shm_open, + size_t shm_size, unsigned n_vectors, bool verbose) { int ret; @@ -278,6 +276,7 @@ ivshmem_server_init(IvshmemServer *server, const char= *unix_sock_path, return -1; } =20 + server->use_shm_open =3D use_shm_open; server->shm_size =3D shm_size; server->n_vectors =3D n_vectors; =20 @@ -286,31 +285,6 @@ ivshmem_server_init(IvshmemServer *server, const cha= r *unix_sock_path, return 0; } =20 -#ifdef CONFIG_LINUX - -#define HUGETLBFS_MAGIC 0x958458f6 - -static long gethugepagesize(const char *path) -{ - struct statfs fs; - int ret; - - do { - ret =3D statfs(path, &fs); - } while (ret !=3D 0 && errno =3D=3D EINTR); - - if (ret !=3D 0) { - return -1; - } - - if (fs.f_type !=3D HUGETLBFS_MAGIC) { - return -1; - } - - return fs.f_bsize; -} -#endif - /* open shm, create and bind to the unix socket */ int ivshmem_server_start(IvshmemServer *server) @@ -319,27 +293,17 @@ ivshmem_server_start(IvshmemServer *server) int shm_fd, sock_fd, ret; =20 /* open shm file */ -#ifdef CONFIG_LINUX - long hpagesize; - - hpagesize =3D gethugepagesize(server->shm_path); - if (hpagesize < 0 && errno !=3D ENOENT) { - IVSHMEM_SERVER_DEBUG(server, "cannot stat shm file %s: %s\n", - server->shm_path, strerror(errno)); - } - - if (hpagesize > 0) { + if (server->use_shm_open) { + IVSHMEM_SERVER_DEBUG(server, "Using POSIX shared memory: %s\n", + server->shm_path); + shm_fd =3D shm_open(server->shm_path, O_CREAT | O_RDWR, S_IRWXU)= ; + } else { gchar *filename =3D g_strdup_printf("%s/ivshmem.XXXXXX", server-= >shm_path); - IVSHMEM_SERVER_DEBUG(server, "Using hugepages: %s\n", server->sh= m_path); + IVSHMEM_SERVER_DEBUG(server, "Using file-backed shared memory: %= s\n", + server->shm_path); shm_fd =3D mkstemp(filename); unlink(filename); g_free(filename); - } else -#endif - { - IVSHMEM_SERVER_DEBUG(server, "Using POSIX shared memory: %s\n", - server->shm_path); - shm_fd =3D shm_open(server->shm_path, O_CREAT|O_RDWR, S_IRWXU); } =20 if (shm_fd < 0) { diff --git a/contrib/ivshmem-server/ivshmem-server.h b/contrib/ivshmem-se= rver/ivshmem-server.h index e9de8a3..3851639 100644 --- a/contrib/ivshmem-server/ivshmem-server.h +++ b/contrib/ivshmem-server/ivshmem-server.h @@ -66,6 +66,7 @@ typedef struct IvshmemServer { char unix_sock_path[PATH_MAX]; /**< path to unix socket */ int sock_fd; /**< unix sock file descriptor */ char shm_path[PATH_MAX]; /**< path to shm */ + bool use_shm_open; size_t shm_size; /**< size of shm */ int shm_fd; /**< shm file descriptor */ unsigned n_vectors; /**< number of vectors */ @@ -89,7 +90,8 @@ typedef struct IvshmemServer { */ int ivshmem_server_init(IvshmemServer *server, const char *unix_sock_path, - const char *shm_path, size_t shm_size, unsigned n_ve= ctors, + const char *shm_path, bool use_shm_open, + size_t shm_size, unsigned n_vectors, bool verbose); =20 /** diff --git a/contrib/ivshmem-server/main.c b/contrib/ivshmem-server/main.= c index 3332a8c..5afa8ee 100644 --- a/contrib/ivshmem-server/main.c +++ b/contrib/ivshmem-server/main.c @@ -29,6 +29,7 @@ typedef struct IvshmemServerArgs { const char *pid_file; const char *unix_socket_path; const char *shm_path; + bool use_shm_open; uint64_t shm_size; unsigned n_vectors; } IvshmemServerArgs; @@ -44,8 +45,9 @@ ivshmem_server_usage(const char *progname) " default " IVSHMEM_SERVER_DEFAULT_PID_FILE "\n" " -S : path to the unix socket to listen t= o\n" " default " IVSHMEM_SERVER_DEFAULT_UNIX_SOCK_PATH "\n" - " -m : POSIX shared memory object name or a hugetl= bfs mount point\n" + " -M : POSIX shared memory object to use\n" " default " IVSHMEM_SERVER_DEFAULT_SHM_PATH "\n" + " -m : where to create shared memory\n" " -l : size of shared memory in bytes\n" " suffixes K, M and G can be used, e.g. 1K means 1024\n" " default %u\n" @@ -69,7 +71,7 @@ ivshmem_server_parse_args(IvshmemServerArgs *args, int = argc, char *argv[]) unsigned long long v; Error *err =3D NULL; =20 - while ((c =3D getopt(argc, argv, "hvFp:S:m:l:n:")) !=3D -1) { + while ((c =3D getopt(argc, argv, "hvFp:S:m:M:l:n:")) !=3D -1) { =20 switch (c) { case 'h': /* help */ @@ -93,8 +95,10 @@ ivshmem_server_parse_args(IvshmemServerArgs *args, int= argc, char *argv[]) args->unix_socket_path =3D optarg; break; =20 - case 'm': /* shm path */ + case 'M': /* shm name */ + case 'm': /* dir name */ args->shm_path =3D optarg; + args->use_shm_open =3D c =3D=3D 'M'; break; =20 case 'l': /* shm size */ @@ -190,6 +194,7 @@ main(int argc, char *argv[]) .pid_file =3D IVSHMEM_SERVER_DEFAULT_PID_FILE, .unix_socket_path =3D IVSHMEM_SERVER_DEFAULT_UNIX_SOCK_PATH, .shm_path =3D IVSHMEM_SERVER_DEFAULT_SHM_PATH, + .use_shm_open =3D true, .shm_size =3D IVSHMEM_SERVER_DEFAULT_SHM_SIZE, .n_vectors =3D IVSHMEM_SERVER_DEFAULT_N_VECTORS, }; @@ -217,7 +222,8 @@ main(int argc, char *argv[]) } =20 /* init the ivshms structure */ - if (ivshmem_server_init(&server, args.unix_socket_path, args.shm_pat= h, + if (ivshmem_server_init(&server, args.unix_socket_path, + args.shm_path, args.use_shm_open, args.shm_size, args.n_vectors, args.verbose)= < 0) { fprintf(stderr, "cannot init server\n"); goto err; diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c index e184c67..4efa433 100644 --- a/tests/ivshmem-test.c +++ b/tests/ivshmem-test.c @@ -294,7 +294,7 @@ static void test_ivshmem_server(bool msi) guint64 end_time =3D g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND= ; =20 memset(tmpshmem, 0x42, TMPSHMSIZE); - ret =3D ivshmem_server_init(&server, tmpserver, tmpshm, + ret =3D ivshmem_server_init(&server, tmpserver, tmpshm, true, TMPSHMSIZE, nvectors, g_test_verbose()); g_assert_cmpint(ret, =3D=3D, 0); --=20 2.4.3