Message ID | 1374765505-14356-5-git-send-email-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
Reviewed-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> > aio_poll(ctx, true) will soon block if any fd handlers have been set. > Previously it would only block when .io_flush() returned true. > > This means that callers must check their wait condition *before* > aio_poll() to avoid deadlock. > > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > tests/test-aio.c | 26 +++++++++++++++++--------- > 1 file changed, 17 insertions(+), 9 deletions(-) > > diff --git a/tests/test-aio.c b/tests/test-aio.c > index c173870..20bf5e6 100644 > --- a/tests/test-aio.c > +++ b/tests/test-aio.c > @@ -15,6 +15,13 @@ > > AioContext *ctx; > > +typedef struct { > + EventNotifier e; > + int n; > + int active; > + bool auto_set; > +} EventNotifierTestData; > + > /* Wait until there are no more BHs or AIO requests */ > static void wait_for_aio(void) > { > @@ -23,6 +30,14 @@ static void wait_for_aio(void) > } > } > > +/* Wait until event notifier becomes inactive */ > +static void wait_until_inactive(EventNotifierTestData *data) > +{ > + while (data->active > 0) { > + aio_poll(ctx, true); > + } > +} > + > /* Simple callbacks for testing. */ > > typedef struct { > @@ -50,13 +65,6 @@ static void bh_delete_cb(void *opaque) > } > } > > -typedef struct { > - EventNotifier e; > - int n; > - int active; > - bool auto_set; > -} EventNotifierTestData; > - > static int event_active_cb(EventNotifier *e) > { > EventNotifierTestData *data = container_of(e, EventNotifierTestData, e); > @@ -281,7 +289,7 @@ static void test_flush_event_notifier(void) > g_assert_cmpint(data.active, ==, 9); > g_assert(aio_poll(ctx, false)); > > - wait_for_aio(); > + wait_until_inactive(&data); > g_assert_cmpint(data.n, ==, 10); > g_assert_cmpint(data.active, ==, 0); > g_assert(!aio_poll(ctx, false)); > @@ -325,7 +333,7 @@ static void test_wait_event_notifier_noflush(void) > g_assert_cmpint(data.n, ==, 2); > > event_notifier_set(&dummy.e); > - wait_for_aio(); > + wait_until_inactive(&dummy); > g_assert_cmpint(data.n, ==, 2); > g_assert_cmpint(dummy.n, ==, 1); > g_assert_cmpint(dummy.active, ==, 0); >
Reviewed-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> > aio_poll(ctx, true) will soon block if any fd handlers have been set. > Previously it would only block when .io_flush() returned true. > > This means that callers must check their wait condition *before* > aio_poll() to avoid deadlock. > > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > tests/test-aio.c | 26 +++++++++++++++++--------- > 1 file changed, 17 insertions(+), 9 deletions(-) > > diff --git a/tests/test-aio.c b/tests/test-aio.c > index c173870..20bf5e6 100644 > --- a/tests/test-aio.c > +++ b/tests/test-aio.c > @@ -15,6 +15,13 @@ > > AioContext *ctx; > > +typedef struct { > + EventNotifier e; > + int n; > + int active; > + bool auto_set; > +} EventNotifierTestData; > + > /* Wait until there are no more BHs or AIO requests */ > static void wait_for_aio(void) > { > @@ -23,6 +30,14 @@ static void wait_for_aio(void) > } > } > > +/* Wait until event notifier becomes inactive */ > +static void wait_until_inactive(EventNotifierTestData *data) > +{ > + while (data->active > 0) { > + aio_poll(ctx, true); > + } > +} > + > /* Simple callbacks for testing. */ > > typedef struct { > @@ -50,13 +65,6 @@ static void bh_delete_cb(void *opaque) > } > } > > -typedef struct { > - EventNotifier e; > - int n; > - int active; > - bool auto_set; > -} EventNotifierTestData; > - > static int event_active_cb(EventNotifier *e) > { > EventNotifierTestData *data = container_of(e, EventNotifierTestData, e); > @@ -281,7 +289,7 @@ static void test_flush_event_notifier(void) > g_assert_cmpint(data.active, ==, 9); > g_assert(aio_poll(ctx, false)); > > - wait_for_aio(); > + wait_until_inactive(&data); > g_assert_cmpint(data.n, ==, 10); > g_assert_cmpint(data.active, ==, 0); > g_assert(!aio_poll(ctx, false)); > @@ -325,7 +333,7 @@ static void test_wait_event_notifier_noflush(void) > g_assert_cmpint(data.n, ==, 2); > > event_notifier_set(&dummy.e); > - wait_for_aio(); > + wait_until_inactive(&dummy); > g_assert_cmpint(data.n, ==, 2); > g_assert_cmpint(dummy.n, ==, 1); > g_assert_cmpint(dummy.active, ==, 0); >
diff --git a/tests/test-aio.c b/tests/test-aio.c index c173870..20bf5e6 100644 --- a/tests/test-aio.c +++ b/tests/test-aio.c @@ -15,6 +15,13 @@ AioContext *ctx; +typedef struct { + EventNotifier e; + int n; + int active; + bool auto_set; +} EventNotifierTestData; + /* Wait until there are no more BHs or AIO requests */ static void wait_for_aio(void) { @@ -23,6 +30,14 @@ static void wait_for_aio(void) } } +/* Wait until event notifier becomes inactive */ +static void wait_until_inactive(EventNotifierTestData *data) +{ + while (data->active > 0) { + aio_poll(ctx, true); + } +} + /* Simple callbacks for testing. */ typedef struct { @@ -50,13 +65,6 @@ static void bh_delete_cb(void *opaque) } } -typedef struct { - EventNotifier e; - int n; - int active; - bool auto_set; -} EventNotifierTestData; - static int event_active_cb(EventNotifier *e) { EventNotifierTestData *data = container_of(e, EventNotifierTestData, e); @@ -281,7 +289,7 @@ static void test_flush_event_notifier(void) g_assert_cmpint(data.active, ==, 9); g_assert(aio_poll(ctx, false)); - wait_for_aio(); + wait_until_inactive(&data); g_assert_cmpint(data.n, ==, 10); g_assert_cmpint(data.active, ==, 0); g_assert(!aio_poll(ctx, false)); @@ -325,7 +333,7 @@ static void test_wait_event_notifier_noflush(void) g_assert_cmpint(data.n, ==, 2); event_notifier_set(&dummy.e); - wait_for_aio(); + wait_until_inactive(&dummy); g_assert_cmpint(data.n, ==, 2); g_assert_cmpint(dummy.n, ==, 1); g_assert_cmpint(dummy.active, ==, 0);