aboutsummaryrefslogtreecommitdiff
path: root/contrib/ivshmem-server/ivshmem-server.c
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2016-03-15 19:34:18 +0100
committerMarkus Armbruster <armbru@redhat.com>2016-03-18 17:34:40 +0100
commit3625c739eaf304fdf8ab3552ea6140cce07962a2 (patch)
tree1e00501ce39ec56cea2598f3e0d656b0d4200825 /contrib/ivshmem-server/ivshmem-server.c
parente3ad72965a86b19df5d011117e186c62893085ef (diff)
downloadqemu-3625c739eaf304fdf8ab3552ea6140cce07962a2.zip
qemu-3625c739eaf304fdf8ab3552ea6140cce07962a2.tar.gz
qemu-3625c739eaf304fdf8ab3552ea6140cce07962a2.tar.bz2
ivshmem-server: Don't overload POSIX shmem and file name
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> Message-Id: <1458066895-20632-4-git-send-email-armbru@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Diffstat (limited to 'contrib/ivshmem-server/ivshmem-server.c')
-rw-r--r--contrib/ivshmem-server/ivshmem-server.c56
1 files changed, 10 insertions, 46 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) {