[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 03/40] ivshmem-server: Don't overload POSIX s
From: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH v3 03/40] ivshmem-server: Don't overload POSIX shmem and file name |
Date: |
Fri, 18 Mar 2016 16:04:21 +0100 |
On Tue, Mar 15, 2016 at 7:34 PM, Markus Armbruster <address@hidden> wrote:
> 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 <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
> ---
> 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-server/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 <sys/mman.h>
> #include <sys/socket.h>
> #include <sys/un.h>
> -#ifdef CONFIG_LINUX
> -#include <sys/vfs.h>
> -#endif
>
> #include "ivshmem-server.h"
>
> @@ -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_vectors,
> + 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;
> }
>
> + server->use_shm_open = use_shm_open;
> server->shm_size = shm_size;
> server->n_vectors = n_vectors;
>
> @@ -286,31 +285,6 @@ ivshmem_server_init(IvshmemServer *server, const char
> *unix_sock_path,
> return 0;
> }
>
> -#ifdef CONFIG_LINUX
> -
> -#define HUGETLBFS_MAGIC 0x958458f6
> -
> -static long gethugepagesize(const char *path)
> -{
> - struct statfs fs;
> - int ret;
> -
> - do {
> - ret = statfs(path, &fs);
> - } while (ret != 0 && errno == EINTR);
> -
> - if (ret != 0) {
> - return -1;
> - }
> -
> - if (fs.f_type != 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;
>
> /* open shm file */
> -#ifdef CONFIG_LINUX
> - long hpagesize;
> -
> - hpagesize = gethugepagesize(server->shm_path);
> - if (hpagesize < 0 && errno != 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 = shm_open(server->shm_path, O_CREAT | O_RDWR, S_IRWXU);
> + } else {
> gchar *filename = g_strdup_printf("%s/ivshmem.XXXXXX",
> server->shm_path);
> - IVSHMEM_SERVER_DEBUG(server, "Using hugepages: %s\n",
> server->shm_path);
> + IVSHMEM_SERVER_DEBUG(server, "Using file-backed shared memory: %s\n",
> + server->shm_path);
> shm_fd = mkstemp(filename);
> unlink(filename);
> g_free(filename);
> - } else
> -#endif
> - {
> - IVSHMEM_SERVER_DEBUG(server, "Using POSIX shared memory: %s\n",
> - server->shm_path);
> - shm_fd = shm_open(server->shm_path, O_CREAT|O_RDWR, S_IRWXU);
> }
>
> if (shm_fd < 0) {
> diff --git a/contrib/ivshmem-server/ivshmem-server.h
> b/contrib/ivshmem-server/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_vectors,
> + const char *shm_path, bool use_shm_open,
> + size_t shm_size, unsigned n_vectors,
> bool verbose);
>
> /**
> 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 <unix-socket-path>: path to the unix socket to listen to\n"
> " default " IVSHMEM_SERVER_DEFAULT_UNIX_SOCK_PATH "\n"
> - " -m <shm-path>: POSIX shared memory object name or a hugetlbfs
> mount point\n"
> + " -M <shm-name>: POSIX shared memory object to use\n"
> " default " IVSHMEM_SERVER_DEFAULT_SHM_PATH "\n"
> + " -m <dir-name>: where to create shared memory\n"
> " -l <size>: 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 = NULL;
>
> - while ((c = getopt(argc, argv, "hvFp:S:m:l:n:")) != -1) {
> + while ((c = getopt(argc, argv, "hvFp:S:m:M:l:n:")) != -1) {
>
> switch (c) {
> case 'h': /* help */
> @@ -93,8 +95,10 @@ ivshmem_server_parse_args(IvshmemServerArgs *args, int
> argc, char *argv[])
> args->unix_socket_path = optarg;
> break;
>
> - case 'm': /* shm path */
> + case 'M': /* shm name */
> + case 'm': /* dir name */
> args->shm_path = optarg;
> + args->use_shm_open = c == 'M';
> break;
>
> case 'l': /* shm size */
> @@ -190,6 +194,7 @@ main(int argc, char *argv[])
> .pid_file = IVSHMEM_SERVER_DEFAULT_PID_FILE,
> .unix_socket_path = IVSHMEM_SERVER_DEFAULT_UNIX_SOCK_PATH,
> .shm_path = IVSHMEM_SERVER_DEFAULT_SHM_PATH,
> + .use_shm_open = true,
> .shm_size = IVSHMEM_SERVER_DEFAULT_SHM_SIZE,
> .n_vectors = IVSHMEM_SERVER_DEFAULT_N_VECTORS,
> };
> @@ -217,7 +222,8 @@ main(int argc, char *argv[])
> }
>
> /* init the ivshms structure */
> - if (ivshmem_server_init(&server, args.unix_socket_path, args.shm_path,
> + 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 = g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND;
>
> memset(tmpshmem, 0x42, TMPSHMSIZE);
> - ret = ivshmem_server_init(&server, tmpserver, tmpshm,
> + ret = ivshmem_server_init(&server, tmpserver, tmpshm, true,
> TMPSHMSIZE, nvectors,
> g_test_verbose());
> g_assert_cmpint(ret, ==, 0);
> --
> 2.4.3
>
>
--
Marc-André Lureau
- [Qemu-devel] [PATCH v3 14/40] ivshmem: Drop ivshmem_event() stub, (continued)
- [Qemu-devel] [PATCH v3 14/40] ivshmem: Drop ivshmem_event() stub, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 08/40] ivshmem-test: Clean up wait for devices to become operational, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 07/40] ivshmem-test: Improve test case /ivshmem/single, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 24/40] ivshmem: Plug leaks on unplug, fix peer disconnect, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 19/40] ivshmem: Clean up MSI-X conditions, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 06/40] tests/libqos/pci-pc: Fix qpci_pc_iomap() to map BARs aligned, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 12/40] ivshmem: Compile debug prints unconditionally to prevent bit-rot, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 09/40] ivshmem-test: Improve test cases /ivshmem/server-*, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 03/40] ivshmem-server: Don't overload POSIX shmem and file name, Markus Armbruster, 2016/03/15
- Re: [Qemu-devel] [PATCH v3 03/40] ivshmem-server: Don't overload POSIX shmem and file name,
Marc-André Lureau <=
- [Qemu-devel] [PATCH v3 13/40] ivshmem: Clean up after commit 9940c32, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 17/40] ivshmem: Failed realize() can leave migration blocker behind, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 20/40] ivshmem: Leave INTx alone when using MSI-X, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 25/40] ivshmem: Receive shared memory synchronously in realize(), Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 18/40] ivshmem: Clean up register callbacks, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 11/40] ivshmem: Add missing newlines to debug printfs, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 23/40] ivshmem: Disentangle ivshmem_read(), Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 22/40] ivshmem: Simplify rejection of invalid peer ID from server, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 35/40] ivshmem: Replace int role_val by OnOffAuto master, Markus Armbruster, 2016/03/15
- [Qemu-devel] [PATCH v3 15/40] ivshmem: Don't destroy the chardev on version mismatch, Markus Armbruster, 2016/03/15