* [Qemu-devel] [PULL v4 00/52] Ivshmem patches
@ 2015-10-14 14:49 Marc-André Lureau
2015-10-16 11:26 ` Peter Maydell
2015-10-19 14:22 ` Peter Maydell
0 siblings, 2 replies; 9+ messages in thread
From: Marc-André Lureau @ 2015-10-14 14:49 UTC (permalink / raw)
To: QEMU
Cc: Peter Maydell, Andrew Jones, Claudio Fontana, Stefan Hajnoczi,
Paolo Bonzini, cam
[-- Attachment #1: Type: text/plain, Size: 5608 bytes --]
The following changes since commit c49d3411faae8ffaab8f7e5db47405a008411c10:
Merge remote-tracking branch
'remotes/armbru/tags/pull-qapi-2015-10-12' into staging (2015-10-13
10:42:06 +0100)
are available in the git repository at:
https://github.com/elmarco/qemu tags/ivshmem-pull-request
for you to fetch changes up to e229096d2e43e823e30dde1b6cac6d863abd30f9:
doc: document ivshmem & hugepages (2015-10-14 12:43:39 +0200)
----------------------------------------------------------------
v4:
- fix server for posix compatibility
- fix macos test failure with double ftruncate()
- replace custom pow2 code with pow2ceil()
- make server silent again (--verbose)
- make server verbose earlier
- use g_test_verbose() instead of QTEST_LOG
- fix x86 build warnings
- make server test more flexible to timeout with 5s max
- the diff with v3 is attached
----------------------------------------------------------------
Andreas Färber (1):
tests: Add ivshmem qtest
David Marchand (3):
contrib: add ivshmem client and server
docs: update ivshmem device spec
ivshmem: add check on protocol version in QEMU
Marc-André Lureau (48):
config: enable ivshmem on POSIX
char: add qemu_chr_free()
msix: add VMSTATE_MSIX_TEST
ivhsmem: read do not accept more than sizeof(long)
ivshmem: fix number of bytes to push to fifo
ivshmem: factor out the incoming fifo handling
ivshmem: remove unnecessary dup()
ivshmem: remove superflous ivshmem_attr field
ivshmem: remove useless doorbell field
ivshmem: more qdev conversion
ivshmem: remove last exit(1)
ivshmem: limit maximum number of peers to G_MAXUINT16
ivshmem: simplify around increase_dynamic_storage()
ivshmem: allocate eventfds in resize_peers()
ivshmem: remove useless ivshmem_update_irq() val argument
ivshmem: initialize max_peer to -1
ivshmem: remove max_peer field
ivshmem: improve debug messages
ivshmem: improve error handling
ivshmem: print error on invalid peer id
ivshmem: simplify a bit the code
ivshmem: use common return
ivshmem: use common is_power_of_2()
ivshmem: migrate with VMStateDescription
ivshmem: shmfd can be 0
ivshmem: check shm isn't already initialized
ivshmem: add device description
ivshmem: fix pci_ivshmem_exit()
ivshmem: replace 'guest' for 'peer' appropriately
ivshmem: error on too many eventfd received
ivshmem: reset mask on device reset
util: const event_notifier_get_fd() argument
ivshmem-client: check the number of vectors
ivshmem-server: use a uint16 for client ID
ivshmem-server: fix hugetlbfs support
contrib: remove unnecessary strdup()
msix: implement pba write (but read-only)
qtest: add qtest_add_abrt_handler()
glib-compat: add 2.38/2.40/2.46 asserts
tests: add ivshmem qtest
ivshmem: do not keep shm_fd open
ivshmem: use qemu_strtosz()
ivshmem: add hostmem backend
ivshmem: remove EventfdEntry.vector
ivshmem: rename MSI eventfd_table
ivshmem: use kvm irqfd for msi notifications
ivshmem: use little-endian int64_t for the protocol
doc: document ivshmem & hugepages
Makefile | 8 +
Makefile.objs | 5 +
configure | 1 +
contrib/ivshmem-client/Makefile.objs | 1 +
contrib/ivshmem-client/ivshmem-client.c | 446
++++++++++++++++++++++++++++++++++
contrib/ivshmem-client/ivshmem-client.h | 213 +++++++++++++++++
contrib/ivshmem-client/main.c | 240 +++++++++++++++++++
contrib/ivshmem-server/Makefile.objs | 1 +
contrib/ivshmem-server/ivshmem-server.c | 491
+++++++++++++++++++++++++++++++++++++
contrib/ivshmem-server/ivshmem-server.h | 167 +++++++++++++
contrib/ivshmem-server/main.c | 263 ++++++++++++++++++++
default-configs/pci.mak | 2 +-
docs/specs/ivshmem_device_spec.txt | 127 +++++++---
hw/misc/ivshmem.c | 837
++++++++++++++++++++++++++++++++++++++++++++--------------------
hw/pci/msix.c | 6 +
include/glib-compat.h | 61 +++++
include/hw/misc/ivshmem.h | 25 ++
include/hw/pci/msix.h | 16 +-
include/qemu/event_notifier.h | 2 +-
include/sysemu/char.h | 10 +-
qemu-char.c | 9 +-
qemu-doc.texi | 23 +-
tests/Makefile | 3 +
tests/ivshmem-test.c | 483
+++++++++++++++++++++++++++++++++++++
tests/libqtest.c | 37 ++-
tests/libqtest.h | 2 +
util/event_notifier-posix.c | 2 +-
27 files changed, 3160 insertions(+), 321 deletions(-)
create mode 100644 contrib/ivshmem-client/Makefile.objs
create mode 100644 contrib/ivshmem-client/ivshmem-client.c
create mode 100644 contrib/ivshmem-client/ivshmem-client.h
create mode 100644 contrib/ivshmem-client/main.c
create mode 100644 contrib/ivshmem-server/Makefile.objs
create mode 100644 contrib/ivshmem-server/ivshmem-server.c
create mode 100644 contrib/ivshmem-server/ivshmem-server.h
create mode 100644 contrib/ivshmem-server/main.c
create mode 100644 include/hw/misc/ivshmem.h
create mode 100644 tests/ivshmem-test.c
--
Marc-André Lureau
[-- Attachment #2: ivshmem.diff --]
[-- Type: text/plain, Size: 8699 bytes --]
diff --git a/contrib/ivshmem-server/ivshmem-server.c b/contrib/ivshmem-server/ivshmem-server.c
index f143d41..5e5239c 100644
--- a/contrib/ivshmem-server/ivshmem-server.c
+++ b/contrib/ivshmem-server/ivshmem-server.c
@@ -191,7 +191,7 @@ ivshmem_server_handle_new_conn(IvshmemServer *server)
QTAILQ_FOREACH(other_peer, &server->peer_list, next) {
for (i = 0; i < peer->vectors_count; i++) {
ivshmem_server_send_one_msg(other_peer->sock_fd, peer->id,
- event_notifier_get_fd(&peer->vectors[i]));
+ peer->vectors[i].wfd);
}
}
@@ -199,7 +199,7 @@ ivshmem_server_handle_new_conn(IvshmemServer *server)
QTAILQ_FOREACH(other_peer, &server->peer_list, next) {
for (i = 0; i < peer->vectors_count; i++) {
ivshmem_server_send_one_msg(peer->sock_fd, other_peer->id,
- event_notifier_get_fd(&other_peer->vectors[i]));
+ other_peer->vectors[i].wfd);
}
}
@@ -232,15 +232,14 @@ static int
ivshmem_server_ftruncate(int fd, unsigned shmsize)
{
int ret;
+ struct stat mapstat;
/* align shmsize to next power of 2 */
- shmsize--;
- shmsize |= shmsize >> 1;
- shmsize |= shmsize >> 2;
- shmsize |= shmsize >> 4;
- shmsize |= shmsize >> 8;
- shmsize |= shmsize >> 16;
- shmsize++;
+ shmsize = pow2ceil(shmsize);
+
+ if (fstat(fd, &mapstat) != -1 && mapstat.st_size == shmsize) {
+ return 0;
+ }
while (shmsize <= IVSHMEM_SERVER_MAX_HUGEPAGE_SIZE) {
ret = ftruncate(fd, shmsize);
@@ -262,6 +261,7 @@ ivshmem_server_init(IvshmemServer *server, const char *unix_sock_path,
int ret;
memset(server, 0, sizeof(*server));
+ server->verbose = verbose;
ret = snprintf(server->unix_sock_path, sizeof(server->unix_sock_path),
"%s", unix_sock_path);
@@ -278,7 +278,6 @@ ivshmem_server_init(IvshmemServer *server, const char *unix_sock_path,
server->shm_size = shm_size;
server->n_vectors = n_vectors;
- server->verbose = verbose;
QTAILQ_INIT(&server->peer_list);
@@ -299,10 +298,6 @@ static long gethugepagesize(const char *path)
} 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;
}
@@ -326,16 +321,22 @@ ivshmem_server_start(IvshmemServer *server)
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) {
gchar *filename = g_strdup_printf("%s/ivshmem.XXXXXX", server->shm_path);
- fprintf(stdout, "Using hugepages: %s\n", server->shm_path);
+ IVSHMEM_SERVER_DEBUG(server, "Using hugepages: %s\n", server->shm_path);
shm_fd = mkstemp(filename);
unlink(filename);
g_free(filename);
} else
#endif
{
- fprintf(stdout, "Using POSIX shared memory: %s\n", server->shm_path);
+ 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);
}
diff --git a/default-configs/pci.mak b/default-configs/pci.mak
index 7e10903..f250119 100644
--- a/default-configs/pci.mak
+++ b/default-configs/pci.mak
@@ -35,5 +35,5 @@ CONFIG_SDHCI=y
CONFIG_EDU=y
CONFIG_VGA=y
CONFIG_VGA_PCI=y
-CONFIG_IVSHMEM=$(CONFIG_KVM)
+CONFIG_IVSHMEM=$(CONFIG_POSIX)
CONFIG_ROCKER=y
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index 227a4db..b18f422 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -623,13 +623,14 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
}
if (incoming_posn < -1) {
- IVSHMEM_DPRINTF("invalid incoming_posn %ld\n", incoming_posn);
+ IVSHMEM_DPRINTF("invalid incoming_posn %" PRId64 "\n", incoming_posn);
return;
}
/* pick off s->server_chr->msgfd and store it, posn should accompany msg */
incoming_fd = qemu_chr_fe_get_msgfd(s->server_chr);
- IVSHMEM_DPRINTF("posn is %ld, fd is %d\n", incoming_posn, incoming_fd);
+ IVSHMEM_DPRINTF("posn is %" PRId64 ", fd is %d\n",
+ incoming_posn, incoming_fd);
/* make sure we have enough space for this peer */
if (incoming_posn >= s->nb_peers) {
@@ -651,7 +652,7 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
s->vm_id = incoming_posn;
} else {
/* otherwise an fd == -1 means an existing peer has gone away */
- IVSHMEM_DPRINTF("posn %ld has gone away\n", incoming_posn);
+ IVSHMEM_DPRINTF("posn %" PRId64 " has gone away\n", incoming_posn);
close_peer_eventfds(s, incoming_posn);
}
return;
@@ -697,7 +698,6 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
/* each peer has an associated array of eventfds, and we keep
* track of how many eventfds received so far */
/* get a new eventfd: */
- /* get a new eventfd */
if (peer->nb_eventfds >= s->vectors) {
error_report("Too many eventfd received, device has %d vectors",
s->vectors);
@@ -708,7 +708,7 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
new_eventfd = peer->nb_eventfds++;
/* this is an eventfd for a particular peer VM */
- IVSHMEM_DPRINTF("eventfds[%ld][%d] = %d\n", incoming_posn,
+ IVSHMEM_DPRINTF("eventfds[%" PRId64 "][%d] = %d\n", incoming_posn,
new_eventfd, incoming_fd);
event_notifier_init_fd(&peer->eventfds[new_eventfd], incoming_fd);
fcntl_setfl(incoming_fd, O_NONBLOCK); /* msix/irqfd poll non block */
diff --git a/tests/Makefile b/tests/Makefile
index e7b0218..73403eb 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -149,7 +149,7 @@ gcov-files-pci-y += hw/display/virtio-gpu-pci.c
gcov-files-pci-$(CONFIG_VIRTIO_VGA) += hw/display/virtio-vga.c
check-qtest-pci-y += tests/intel-hda-test$(EXESUF)
gcov-files-pci-y += hw/audio/intel-hda.c hw/audio/hda-codec.c
-check-qtest-pci-$(CONFIG_IVSHMEM) += tests/ivshmem-test$(EXESUF)
+check-qtest-pci-$(CONFIG_POSIX) += tests/ivshmem-test$(EXESUF)
gcov-files-pci-y += hw/misc/ivshmem.c
check-qtest-i386-y = tests/endianness-test$(EXESUF)
diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c
index a57fb08..efaa6e3 100644
--- a/tests/ivshmem-test.c
+++ b/tests/ivshmem-test.c
@@ -288,11 +288,12 @@ static void test_ivshmem_server(void)
IvshmemServer server;
int ret, vm1, vm2;
int nvectors = 2;
+ guint64 end_time = g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND;
memset(tmpshmem, 0x42, TMPSHMSIZE);
ret = ivshmem_server_init(&server, tmpserver, tmpshm,
TMPSHMSIZE, nvectors,
- getenv("QTEST_LOG") != NULL);
+ g_test_verbose());
g_assert_cmpint(ret, ==, 0);
ret = ivshmem_server_start(&server);
@@ -315,7 +316,7 @@ static void test_ivshmem_server(void)
g_assert(thread.thread != NULL);
/* waiting until mapping is done */
- while (true) {
+ while (g_get_monotonic_time() < end_time) {
g_usleep(1000);
if (qtest_readb(s1->qtest, (uintptr_t)s1->mem_base) == 0x42 &&
@@ -337,8 +338,10 @@ static void test_ivshmem_server(void)
ret = qpci_msix_pending(s1->dev, 0);
g_assert_cmpuint(ret, ==, 0);
out_reg(s2, DOORBELL, vm1 << 16);
- g_usleep(10000);
- ret = qpci_msix_pending(s1->dev, 0);
+ do {
+ g_usleep(10000);
+ ret = qpci_msix_pending(s1->dev, 0);
+ } while (ret == 0 && g_get_monotonic_time() < end_time);
g_assert_cmpuint(ret, !=, 0);
/* ping vm1 -> vm2 */
@@ -346,15 +349,13 @@ static void test_ivshmem_server(void)
ret = qpci_msix_pending(s2->dev, 0);
g_assert_cmpuint(ret, ==, 0);
out_reg(s1, DOORBELL, vm2 << 16);
- g_usleep(10000);
- ret = qpci_msix_pending(s2->dev, 0);
+ do {
+ g_usleep(10000);
+ ret = qpci_msix_pending(s2->dev, 0);
+ } while (ret == 0 && g_get_monotonic_time() < end_time);
g_assert_cmpuint(ret, !=, 0);
- /* remove vm2 */
qtest_quit(s2->qtest);
- /* XXX wait enough time for vm1 to be notified */
- g_usleep(1000);
-
qtest_quit(s1->qtest);
if (qemu_write_full(thread.pipe[1], "q", 1) != 1) {
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PULL v4 00/52] Ivshmem patches
2015-10-14 14:49 [Qemu-devel] [PULL v4 00/52] Ivshmem patches Marc-André Lureau
@ 2015-10-16 11:26 ` Peter Maydell
2015-10-16 14:47 ` Peter Maydell
2015-10-19 15:57 ` Peter Maydell
2015-10-19 14:22 ` Peter Maydell
1 sibling, 2 replies; 9+ messages in thread
From: Peter Maydell @ 2015-10-16 11:26 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Andrew Jones, Claudio Fontana, QEMU, Stefan Hajnoczi,
Paolo Bonzini, cam
On 14 October 2015 at 15:49, Marc-André Lureau
<marcandre.lureau@gmail.com> wrote:
> The following changes since commit c49d3411faae8ffaab8f7e5db47405a008411c10:
>
> Merge remote-tracking branch
> 'remotes/armbru/tags/pull-qapi-2015-10-12' into staging (2015-10-13
> 10:42:06 +0100)
>
> are available in the git repository at:
>
> https://github.com/elmarco/qemu tags/ivshmem-pull-request
>
> for you to fetch changes up to e229096d2e43e823e30dde1b6cac6d863abd30f9:
>
> doc: document ivshmem & hugepages (2015-10-14 12:43:39 +0200)
>
> ----------------------------------------------------------------
> v4:
> - fix server for posix compatibility
> - fix macos test failure with double ftruncate()
> - replace custom pow2 code with pow2ceil()
> - make server silent again (--verbose)
> - make server verbose earlier
> - use g_test_verbose() instead of QTEST_LOG
> - fix x86 build warnings
> - make server test more flexible to timeout with 5s max
> - the diff with v3 is attached
>
> ----------------------------------------------------------------
On 32-bit ARM the test-ivshmem program got stuck somehow (it had been running
for an hour when I killed it). It didn't write anything to the log,
I'm afraid.
thanks
-- PMM
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PULL v4 00/52] Ivshmem patches
2015-10-16 11:26 ` Peter Maydell
@ 2015-10-16 14:47 ` Peter Maydell
2015-10-17 21:14 ` Peter Maydell
2015-10-19 15:57 ` Peter Maydell
1 sibling, 1 reply; 9+ messages in thread
From: Peter Maydell @ 2015-10-16 14:47 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Andrew Jones, Claudio Fontana, QEMU, Stefan Hajnoczi,
Paolo Bonzini, cam
On 16 October 2015 at 12:26, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 14 October 2015 at 15:49, Marc-André Lureau
> <marcandre.lureau@gmail.com> wrote:
>> The following changes since commit c49d3411faae8ffaab8f7e5db47405a008411c10:
>>
>> Merge remote-tracking branch
>> 'remotes/armbru/tags/pull-qapi-2015-10-12' into staging (2015-10-13
>> 10:42:06 +0100)
>>
>> are available in the git repository at:
>>
>> https://github.com/elmarco/qemu tags/ivshmem-pull-request
>>
>> for you to fetch changes up to e229096d2e43e823e30dde1b6cac6d863abd30f9:
>>
>> doc: document ivshmem & hugepages (2015-10-14 12:43:39 +0200)
>>
>> ----------------------------------------------------------------
>> v4:
>> - fix server for posix compatibility
>> - fix macos test failure with double ftruncate()
>> - replace custom pow2 code with pow2ceil()
>> - make server silent again (--verbose)
>> - make server verbose earlier
>> - use g_test_verbose() instead of QTEST_LOG
>> - fix x86 build warnings
>> - make server test more flexible to timeout with 5s max
>> - the diff with v3 is attached
>>
>> ----------------------------------------------------------------
>
> On 32-bit ARM the test-ivshmem program got stuck somehow (it had been running
> for an hour when I killed it). It didn't write anything to the log,
> I'm afraid.
This may be something funny with this build machine; I will put
this back on my list to try again at some point.
-- PMM
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PULL v4 00/52] Ivshmem patches
2015-10-16 14:47 ` Peter Maydell
@ 2015-10-17 21:14 ` Peter Maydell
0 siblings, 0 replies; 9+ messages in thread
From: Peter Maydell @ 2015-10-17 21:14 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Andrew Jones, Claudio Fontana, QEMU, Stefan Hajnoczi,
Paolo Bonzini, cam
On 16 October 2015 at 15:47, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 16 October 2015 at 12:26, Peter Maydell <peter.maydell@linaro.org> wrote:
>> On 14 October 2015 at 15:49, Marc-André Lureau
>> <marcandre.lureau@gmail.com> wrote:
>>> The following changes since commit c49d3411faae8ffaab8f7e5db47405a008411c10:
>>>
>>> Merge remote-tracking branch
>>> 'remotes/armbru/tags/pull-qapi-2015-10-12' into staging (2015-10-13
>>> 10:42:06 +0100)
>>>
>>> are available in the git repository at:
>>>
>>> https://github.com/elmarco/qemu tags/ivshmem-pull-request
>>>
>>> for you to fetch changes up to e229096d2e43e823e30dde1b6cac6d863abd30f9:
>>>
>>> doc: document ivshmem & hugepages (2015-10-14 12:43:39 +0200)
>>>
>>> ----------------------------------------------------------------
>>> v4:
>>> - fix server for posix compatibility
>>> - fix macos test failure with double ftruncate()
>>> - replace custom pow2 code with pow2ceil()
>>> - make server silent again (--verbose)
>>> - make server verbose earlier
>>> - use g_test_verbose() instead of QTEST_LOG
>>> - fix x86 build warnings
>>> - make server test more flexible to timeout with 5s max
>>> - the diff with v3 is attached
>>>
>>> ----------------------------------------------------------------
>>
>> On 32-bit ARM the test-ivshmem program got stuck somehow (it had been running
>> for an hour when I killed it). It didn't write anything to the log,
>> I'm afraid.
>
> This may be something funny with this build machine; I will put
> this back on my list to try again at some point.
Nope, retry gave the same thing -- test-ivshmem running for hours,
using 100% CPU. Sorry, no backtrace, I don't have gdb on that box
right now (I will ask for it to be installed).
thanks
-- PMM
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PULL v4 00/52] Ivshmem patches
2015-10-14 14:49 [Qemu-devel] [PULL v4 00/52] Ivshmem patches Marc-André Lureau
2015-10-16 11:26 ` Peter Maydell
@ 2015-10-19 14:22 ` Peter Maydell
1 sibling, 0 replies; 9+ messages in thread
From: Peter Maydell @ 2015-10-19 14:22 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Andrew Jones, Claudio Fontana, QEMU, Stefan Hajnoczi,
Paolo Bonzini, cam
On 14 October 2015 at 15:49, Marc-André Lureau
<marcandre.lureau@gmail.com> wrote:
> The following changes since commit c49d3411faae8ffaab8f7e5db47405a008411c10:
>
> Merge remote-tracking branch
> 'remotes/armbru/tags/pull-qapi-2015-10-12' into staging (2015-10-13
> 10:42:06 +0100)
>
> are available in the git repository at:
>
> https://github.com/elmarco/qemu tags/ivshmem-pull-request
>
> for you to fetch changes up to e229096d2e43e823e30dde1b6cac6d863abd30f9:
>
> doc: document ivshmem & hugepages (2015-10-14 12:43:39 +0200)
NB that you'll need to rebase this before resubmitting, as
kvm_irqchip_update_msi_route now has an extra argument.
I'm going to have a look at the test case hangs I've been seeing.
thanks
-- PMM
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PULL v4 00/52] Ivshmem patches
2015-10-16 11:26 ` Peter Maydell
2015-10-16 14:47 ` Peter Maydell
@ 2015-10-19 15:57 ` Peter Maydell
2015-10-26 9:28 ` Marc-André Lureau
1 sibling, 1 reply; 9+ messages in thread
From: Peter Maydell @ 2015-10-19 15:57 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Andrew Jones, Claudio Fontana, QEMU, Stefan Hajnoczi,
Paolo Bonzini, cam
On 16 October 2015 at 12:26, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 32-bit ARM the test-ivshmem program got stuck somehow (it had been running
> for an hour when I killed it). It didn't write anything to the log,
> I'm afraid.
What is happening here is that we are looping infinitely in
mktempshmem() because shm_open() returns -1 with errno ENOSYS,
and there's no code in the loop that stops the loop on anything
except shm_open succeeding, or even prints anything out about
shm_open failing.
I think this is failing for me because my system's chroot doesn't have
/dev/shm mounted. It would be nice if we could at a minimum handle
this reasonably gracefully...
thanks
-- PMM
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PULL v4 00/52] Ivshmem patches
2015-10-19 15:57 ` Peter Maydell
@ 2015-10-26 9:28 ` Marc-André Lureau
2015-10-26 9:58 ` Peter Maydell
0 siblings, 1 reply; 9+ messages in thread
From: Marc-André Lureau @ 2015-10-26 9:28 UTC (permalink / raw)
To: Peter Maydell
Cc: Andrew Jones, Claudio Fontana, QEMU, Stefan Hajnoczi,
Paolo Bonzini, cam
Hi Peter,
On Mon, Oct 19, 2015 at 5:57 PM, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> What is happening here is that we are looping infinitely in
> mktempshmem() because shm_open() returns -1 with errno ENOSYS,
> and there's no code in the loop that stops the loop on anything
> except shm_open succeeding, or even prints anything out about
> shm_open failing.
>
> I think this is failing for me because my system's chroot doesn't have
> /dev/shm mounted. It would be nice if we could at a minimum handle
> this reasonably gracefully...
The following diff works for me:
diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c
index efaa6e3..c8f0cf0 100644
--- a/tests/ivshmem-test.c
+++ b/tests/ivshmem-test.c
@@ -441,13 +441,18 @@ static gchar *mktempshm(int size, int *fd)
}
g_free(name);
+
+ if (errno != EEXIST) {
+ perror("shm_open");
+ return NULL;
+ }
}
}
int main(int argc, char **argv)
{
int ret, fd;
gchar dir[] = "/tmp/ivshmem-test.XXXXXX";
#if !GLIB_CHECK_VERSION(2, 31, 0)
if (!g_thread_supported()) {
@@ -460,6 +465,9 @@ int main(int argc, char **argv)
qtest_add_abrt_handler(abrt_handler, NULL);
/* shm */
tmpshm = mktempshm(TMPSHMSIZE, &fd);
+ if (!tmpshm) {
+ return 0;
+ }
tmpshmem = mmap(0, TMPSHMSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
g_assert(tmpshmem != MAP_FAILED);
/* server */
I rebased and updated the tag.
--
Marc-André Lureau
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PULL v4 00/52] Ivshmem patches
2015-10-26 9:28 ` Marc-André Lureau
@ 2015-10-26 9:58 ` Peter Maydell
2015-10-26 10:06 ` Marc-André Lureau
0 siblings, 1 reply; 9+ messages in thread
From: Peter Maydell @ 2015-10-26 9:58 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Andrew Jones, Claudio Fontana, QEMU, Stefan Hajnoczi,
Paolo Bonzini, cam
On 26 October 2015 at 09:28, Marc-André Lureau
<marcandre.lureau@gmail.com> wrote:
> Hi Peter,
>
> On Mon, Oct 19, 2015 at 5:57 PM, Peter Maydell <peter.maydell@linaro.org> wrote:
>>
>> What is happening here is that we are looping infinitely in
>> mktempshmem() because shm_open() returns -1 with errno ENOSYS,
>> and there's no code in the loop that stops the loop on anything
>> except shm_open succeeding, or even prints anything out about
>> shm_open failing.
>>
>> I think this is failing for me because my system's chroot doesn't have
>> /dev/shm mounted. It would be nice if we could at a minimum handle
>> this reasonably gracefully...
>
> The following diff works for me:
>
> diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c
> index efaa6e3..c8f0cf0 100644
> --- a/tests/ivshmem-test.c
> +++ b/tests/ivshmem-test.c
> @@ -441,13 +441,18 @@ static gchar *mktempshm(int size, int *fd)
> }
>
> g_free(name);
> +
> + if (errno != EEXIST) {
> + perror("shm_open");
> + return NULL;
> + }
> }
> }
>
> int main(int argc, char **argv)
> {
> int ret, fd;
> gchar dir[] = "/tmp/ivshmem-test.XXXXXX";
>
> #if !GLIB_CHECK_VERSION(2, 31, 0)
> if (!g_thread_supported()) {
> @@ -460,6 +465,9 @@ int main(int argc, char **argv)
> qtest_add_abrt_handler(abrt_handler, NULL);
> /* shm */
> tmpshm = mktempshm(TMPSHMSIZE, &fd);
> + if (!tmpshm) {
> + return 0;
> + }
> tmpshmem = mmap(0, TMPSHMSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
> g_assert(tmpshmem != MAP_FAILED);
> /* server */
This will print a cryptic error message and then not fail the test,
which is not great. Maybe that's ok for the moment in the interests
of not keeping this huge patchset out of tree for too long[*], but
we should look at what glib's test framework provides in the way
of being able to report "skipped this test" outcomes.
[*] Incidentally this whole saga demonstrates why my general
recommendation is to keep pull requests at much less than
50 patches...
> I rebased and updated the tag.
If you mean by this "please retry the pull" you should send a fresh
coverletter email so my scripts will pick it up...
thanks
-- PMM
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PULL v4 00/52] Ivshmem patches
2015-10-26 9:58 ` Peter Maydell
@ 2015-10-26 10:06 ` Marc-André Lureau
0 siblings, 0 replies; 9+ messages in thread
From: Marc-André Lureau @ 2015-10-26 10:06 UTC (permalink / raw)
To: Peter Maydell
Cc: Andrew Jones, Claudio Fontana, QEMU, Stefan Hajnoczi,
Paolo Bonzini, cam
Hi
On Mon, Oct 26, 2015 at 10:58 AM, Peter Maydell
<peter.maydell@linaro.org> wrote:
> This will print a cryptic error message and then not fail the test,
> which is not great. Maybe that's ok for the moment in the interests
> of not keeping this huge patchset out of tree for too long[*], but
> we should look at what glib's test framework provides in the way
> of being able to report "skipped this test" outcomes.
g_test_skip() is since 2.38 (and can't be added in compat, because it
uses internal variable etc)
Furthermore, the shm error is a precondition for all the tests, it
doesn't fit well with g_test_skip() which is inside the individual
unit tests.
> [*] Incidentally this whole saga demonstrates why my general
> recommendation is to keep pull requests at much less than
> 50 patches...
>
>> I rebased and updated the tag.
>
> If you mean by this "please retry the pull" you should send a fresh
> coverletter email so my scripts will pick it up...
ok
--
Marc-André Lureau
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2015-10-26 10:06 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-10-14 14:49 [Qemu-devel] [PULL v4 00/52] Ivshmem patches Marc-André Lureau
2015-10-16 11:26 ` Peter Maydell
2015-10-16 14:47 ` Peter Maydell
2015-10-17 21:14 ` Peter Maydell
2015-10-19 15:57 ` Peter Maydell
2015-10-26 9:28 ` Marc-André Lureau
2015-10-26 9:58 ` Peter Maydell
2015-10-26 10:06 ` Marc-André Lureau
2015-10-19 14:22 ` Peter Maydell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).