All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Jones <drjones@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Cc: cam@cs.ualberta.ca,
	"Marc-André Lureau" <marcandre.lureau@gmail.com>,
	qemu-devel@nongnu.org, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2 33/45] ivshmem-server: fix hugetlbfs support
Date: Tue, 28 Jul 2015 09:33:47 +0200	[thread overview]
Message-ID: <20150728073347.GA3629@hawk.localdomain> (raw)
In-Reply-To: <1438043577-28636-34-git-send-email-marcandre.lureau@redhat.com>

On Tue, Jul 28, 2015 at 02:32:45AM +0200, Marc-André Lureau wrote:
> From: Marc-André Lureau <marcandre.lureau@gmail.com>
> 
> As pointed out on the ML by Andrew Jones, glibc no longer permits
> creating POSIX shm on hugetlbfs directly. When given a hugetlbfs path,
> create a shareable file there.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  contrib/ivshmem-server/ivshmem-server.c | 47 ++++++++++++++++++++++++++++++++-
>  contrib/ivshmem-server/ivshmem-server.h |  3 +--
>  contrib/ivshmem-server/main.c           |  5 ++--
>  3 files changed, 49 insertions(+), 6 deletions(-)
> 
> diff --git a/contrib/ivshmem-server/ivshmem-server.c b/contrib/ivshmem-server/ivshmem-server.c
> index 972fda2..4bf774b 100644
> --- a/contrib/ivshmem-server/ivshmem-server.c
> +++ b/contrib/ivshmem-server/ivshmem-server.c
> @@ -11,6 +11,7 @@
>  #include <sys/socket.h>
>  #include <sys/un.h>
>  #include <sys/eventfd.h>
> +#include <sys/vfs.h>
>  
>  #include "qemu-common.h"
>  #include "qemu/queue.h"
> @@ -271,15 +272,59 @@ ivshmem_server_init(IvshmemServer *server, const char *unix_sock_path,
>      return 0;
>  }
>  
> +#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) {
> +        if (errno != ENOENT) {
> +            fprintf(stderr, "cannot stat shm file %s: %s\n", path,
> +                    strerror(errno));
> +        }
> +        return -1;
> +    }
> +
> +    if (fs.f_type != HUGETLBFS_MAGIC) {
> +        return -1;
> +    }
> +
> +    return fs.f_bsize;
> +}
> +
> +
> +
few extra lines here
>  /* open shm, create and bind to the unix socket */
>  int
>  ivshmem_server_start(IvshmemServer *server)
>  {
>      struct sockaddr_un sun;
>      int shm_fd, sock_fd, ret;
> +    long hpagesize;
> +    gchar *filename;
>  
>      /* open shm file */
> -    shm_fd = shm_open(server->shm_path, O_CREAT|O_RDWR, S_IRWXU);
> +    hpagesize = gethugepagesize(server->shm_path);
> +    if (hpagesize > 0) {
> +        if (server->shm_size < hpagesize) {
should be >, but isn't this forcing the shared memory to be less than
equal to the size of a single hugepage? I think we should allow up to
nr-pages * page-size.

Also, I'm not sure we want the dependency, but what about libhugetlbfs?
It has hugetlbfs_test_path

> +            fprintf(stderr, "hugepage must be at least of size: %ld\n",
> +                    hpagesize);
> +            return -1;
> +        }
> +        filename = g_strdup_printf("%s/ivshmem.XXXXXX", server->shm_path);
> +        shm_fd = mkstemp(filename);

Shouldn't we change the perms for shm_fd to match the non-hugetlbfs
case? Or change the non-hugetlbfs case to match mkstemp? Actually,
probably the later, because I don't think we want the region to have
execute perms, or do we? Also, I guess the plan is to pass the hugetlbfs
file descriptor around if other host processes need to know where the
memory is, as we never allow a full path. Should we do the same for shm?
i.e. keep them anonymous too and always pass file descriptors?

> +        unlink(filename);
> +        g_free(filename);
> +    } else {
> +        shm_fd = shm_open(server->shm_path, O_CREAT|O_RDWR, S_IRWXU);
> +    }
> +
>      if (shm_fd < 0) {
>          fprintf(stderr, "cannot open shm file %s: %s\n", server->shm_path,
>                  strerror(errno));
> diff --git a/contrib/ivshmem-server/ivshmem-server.h b/contrib/ivshmem-server/ivshmem-server.h
> index 2176d5e..e9b0e7a 100644
> --- a/contrib/ivshmem-server/ivshmem-server.h
> +++ b/contrib/ivshmem-server/ivshmem-server.h
> @@ -81,8 +81,7 @@ typedef struct IvshmemServer {
>   * @server:         A pointer to an uninitialized IvshmemServer structure
>   * @unix_sock_path: The pointer to the unix socket file name
>   * @shm_path:       Path to the shared memory. The path corresponds to a POSIX
> - *                  shm name. To use a real file, for instance in a hugetlbfs,
> - *                  it is possible to use /../../abspath/to/file.
> + *                  shm name or a hugetlbfs mount point.
>   * @shm_size:       Size of shared memory
>   * @n_vectors:      Number of interrupt vectors per client
>   * @verbose:        True to enable verbose mode
> diff --git a/contrib/ivshmem-server/main.c b/contrib/ivshmem-server/main.c
> index 84ffc4d..cd8d9ed 100644
> --- a/contrib/ivshmem-server/main.c
> +++ b/contrib/ivshmem-server/main.c
> @@ -47,9 +47,8 @@ ivshmem_server_usage(const char *name, int code)
>                      "     to listen to.\n"
>                      "     Default=%s\n", IVSHMEM_SERVER_DEFAULT_UNIX_SOCK_PATH);
>      fprintf(stderr, "  -m <shm_path>: path to the shared memory.\n"
> -                    "     The path corresponds to a POSIX shm name. To use a\n"
> -                    "     real file, for instance in a hugetlbfs, use\n"
> -                    "     /../../abspath/to/file.\n"
> +                    "     The path corresponds to a POSIX shm name or a\n"
> +                    "     hugetlbfs mount point.\n"
>                      "     default=%s\n", IVSHMEM_SERVER_DEFAULT_SHM_PATH);
>      fprintf(stderr, "  -l <size>: size of shared memory in bytes. The suffix\n"
>                      "     K, M and G can be used (ex: 1K means 1024).\n"
> -- 
> 2.4.3
> 
> 

Thanks,
drew

  reply	other threads:[~2015-07-28  7:33 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-28  0:32 [Qemu-devel] [PATCH v2 00/45] ivshmem improvements (for 2.5) Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 01/45] char: add qemu_chr_free() Marc-André Lureau
2015-07-29  7:40   ` Paolo Bonzini
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 02/45] msix: add VMSTATE_MSIX_TEST Marc-André Lureau
2015-07-29  7:41   ` Paolo Bonzini
2015-07-29  8:28     ` Marc-André Lureau
2015-07-29  8:31       ` Paolo Bonzini
2015-07-29 10:14         ` Marc-André Lureau
2015-07-29 10:50           ` Paolo Bonzini
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 03/45] ivhsmem: read do not accept more than sizeof(long) Marc-André Lureau
2015-07-29  7:47   ` Paolo Bonzini
2015-07-29  8:26     ` Marc-André Lureau
2015-07-29  8:30       ` Paolo Bonzini
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 04/45] ivshmem: fix number of bytes to push to fifo Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 05/45] ivshmem: factor out the incoming fifo handling Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 06/45] ivshmem: remove unnecessary dup() Marc-André Lureau
2015-07-29 19:10   ` Eric Blake
2015-07-30 13:11     ` Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 07/45] ivshmem: remove superflous ivshmem_attr field Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 08/45] ivshmem: remove useless doorbell field Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 09/45] ivshmem: more qdev conversion Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 10/45] ivshmem: remove last exit(1) Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 11/45] ivshmem: increase_dynamic_storage() improvements Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 12/45] ivshmem: remove useless ivshmem_update_irq() val argument Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 13/45] ivshmem: initialize max_peer to -1 Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 14/45] ivshmem: remove max_peer field Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 15/45] ivshmem: improve debug messages Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 16/45] ivshmem: improve error Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 17/45] ivshmem: print error on invalid peer id Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 18/45] ivshmem: add a warning if eventfd value is 0 Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 19/45] ivshmem: beautify a bit the code Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 20/45] ivshmem: use common return Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 21/45] ivshmem: use common is_power_of_2() Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 22/45] ivshmem: migrate with VMStateDescription Marc-André Lureau
2015-08-26 11:27   ` Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 23/45] ivshmem: shmfd can be 0 Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 24/45] ivshmem: check shm isn't already initialized Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 25/45] ivshmem: add device description Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 26/45] ivshmem: fix pci_ivshmem_exit() Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 27/45] ivshmem: replace 'guest' for 'peer' appropriately Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 28/45] ivshmem: error on too many eventfd received Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 29/45] ivshmem: reset mask on device reset Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 30/45] contrib: add ivshmem client and server Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 31/45] ivshmem-client: check the number of vectors Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 32/45] ivshmem-server: use a uint16 for client ID Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 33/45] ivshmem-server: fix hugetlbfs support Marc-André Lureau
2015-07-28  7:33   ` Andrew Jones [this message]
2015-07-28 18:02     ` Marc-André Lureau
2015-07-29  6:30       ` Andrew Jones
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 34/45] docs: update ivshmem device spec Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 35/45] ivshmem: add check on protocol version in QEMU Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 36/45] contrib: remove unnecessary strdup() Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 37/45] msix: implement pba write (but read-only) Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 38/45] qtest: add qtest_add_abrt_handler() Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 39/45] tests: add ivshmem qtest Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 40/45] ivshmem: do not keep shm_fd open Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 41/45] ivshmem: rename ivshmem_get_size/parse_mem_size Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 42/45] ivshmem: add hostmem backend Marc-André Lureau
2015-07-28  7:47   ` Andrew Jones
2015-07-28 18:04     ` Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 43/45] ivshmem: remove EventfdEntry.vector Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 44/45] ivshmem: rename MSI eventfd_table Marc-André Lureau
2015-07-28  0:32 ` [Qemu-devel] [PATCH v2 45/45] ivshmem: use kvm irqfd for msi notifications Marc-André Lureau
2015-08-26 11:26 ` [Qemu-devel] [PATCH v2 00/45] ivshmem improvements (for 2.5) Marc-André Lureau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150728073347.GA3629@hawk.localdomain \
    --to=drjones@redhat.com \
    --cc=cam@cs.ualberta.ca \
    --cc=marcandre.lureau@gmail.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.