Message ID | 1458066895-20632-4-git-send-email-armbru@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Mar 15, 2016 at 7:34 PM, Markus Armbruster <armbru@redhat.com> 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 <armbru@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > 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 > >
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);
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 <armbru@redhat.com> --- 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(-)