qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: John Snow <jsnow@redhat.com>, qemu-devel@nongnu.org
Cc: kwolf@redhat.com, marc.mari.barcelo@gmail.com, armbru@redhat.com,
	stefanha@redhat.com, mreitz@redhat.com
Subject: Re: [Qemu-devel] [PATCH 03/14] libqos: create libqos.c
Date: Mon, 19 Jan 2015 18:11:45 +0100	[thread overview]
Message-ID: <54BD3AD1.2040306@redhat.com> (raw)
In-Reply-To: <1421120079-987-4-git-send-email-jsnow@redhat.com>



On 13/01/2015 04:34, John Snow wrote:
> The intent of this file is to serve as a misc. utilities file to be
> shared amongst tests that are utilizing libqos facilities.
> 
> In a later patch, migration test helpers will be added to libqos.c that
> will allow simplified testing of migration cases where libqos is
> "Just Enough OS" for migrations testing.
> 
> The addition of the AHCIQState structure will also allow us to eliminate
> global variables inside of qtests to manage allocators and test instances
> in a better, more functional way.
> 
> libqos.c:
>         - Add qtest_boot
>         - Add qtest_shutdown
> 
> libqos.h:
>         - Create QOSState structure for allocator and QTestState.
> 
> ahci-test.c:
>         - Move qtest_boot and qtest_shutdown to libqos.c/h
>         - Create AHCIQState to interface with new qtest_boot/shutdown prototypes
>         - Modify tests slightly to use new types.
> 
> For now, the new object file is only linked to ahci-test, because it still
> relies on pc architecture specific code in libqos. The next two patches will
> reorganize the code to be more general.
> 
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
>  tests/Makefile        |  2 +-
>  tests/ahci-test.c     | 95 +++++++++++++++++++++------------------------------
>  tests/libqos/ahci.h   |  5 +++
>  tests/libqos/libqos.c | 48 ++++++++++++++++++++++++++
>  tests/libqos/libqos.h | 26 ++++++++++++++
>  5 files changed, 119 insertions(+), 57 deletions(-)
>  create mode 100644 tests/libqos/libqos.c
>  create mode 100644 tests/libqos/libqos.h
> 
> diff --git a/tests/Makefile b/tests/Makefile
> index 77f995d..c5b3b21 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -314,7 +314,7 @@ tests/endianness-test$(EXESUF): tests/endianness-test.o
>  tests/spapr-phb-test$(EXESUF): tests/spapr-phb-test.o $(libqos-obj-y)
>  tests/fdc-test$(EXESUF): tests/fdc-test.o
>  tests/ide-test$(EXESUF): tests/ide-test.o $(libqos-pc-obj-y)
> -tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y)
> +tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y) tests/libqos/libqos.o
>  tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o
>  tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
>  tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o $(libqos-obj-y)
> diff --git a/tests/ahci-test.c b/tests/ahci-test.c
> index fe903dd..a498cbb 100644
> --- a/tests/ahci-test.c
> +++ b/tests/ahci-test.c
> @@ -29,6 +29,7 @@
>  #include <glib.h>
>  
>  #include "libqtest.h"
> +#include "libqos/libqos.h"
>  #include "libqos/ahci.h"
>  #include "libqos/pci-pc.h"
>  #include "libqos/malloc-pc.h"
> @@ -136,58 +137,40 @@ static void free_ahci_device(QPCIDevice *ahci)
>  /*** Test Setup & Teardown ***/
>  
>  /**
> - * Launch QEMU with the given command line,
> - * and then set up interrupts and our guest malloc interface.
> - */
> -static void qtest_boot(const char *cmdline_fmt, ...)
> -{
> -    va_list ap;
> -    char *cmdline;
> -
> -    va_start(ap, cmdline_fmt);
> -    cmdline = g_strdup_vprintf(cmdline_fmt, ap);
> -    va_end(ap);
> -
> -    qtest_start(cmdline);
> -    qtest_irq_intercept_in(global_qtest, "ioapic");
> -    guest_malloc = pc_alloc_init();
> -
> -    g_free(cmdline);
> -}
> -
> -/**
> - * Tear down the QEMU instance.
> - */
> -static void qtest_shutdown(void)
> -{
> -    g_free(guest_malloc);
> -    guest_malloc = NULL;
> -    qtest_end();
> -}
> -
> -/**
>   * Start a Q35 machine and bookmark a handle to the AHCI device.
>   */
> -static QPCIDevice *ahci_boot(void)
> +static AHCIQState *ahci_boot(void)
>  {
> -    qtest_boot("-drive if=none,id=drive0,file=%s,cache=writeback,serial=%s,"
> -               "format=raw"
> -               " -M q35 "
> -               "-device ide-hd,drive=drive0 "
> -               "-global ide-hd.ver=%s",
> -               tmp_path, "testdisk", "version");
> +    AHCIQState *s;
> +    const char *cli;
> +
> +    s = g_malloc0(sizeof(AHCIQState));
> +
> +    cli = "-drive if=none,id=drive0,file=%s,cache=writeback,serial=%s"
> +        ",format=raw"
> +        " -M q35 "
> +        "-device ide-hd,drive=drive0 "
> +        "-global ide-hd.ver=%s";
> +    s->parent = qtest_boot(cli, tmp_path, "testdisk", "version");
>  
>      /* Verify that we have an AHCI device present. */
> -    return get_ahci_device();
> +    s->dev = get_ahci_device();
> +
> +    /* Stopgap: Copy the allocator reference */
> +    guest_malloc = s->parent->alloc;
> +
> +    return s;
>  }
>  
>  /**
>   * Clean up the PCI device, then terminate the QEMU instance.
>   */
> -static void ahci_shutdown(QPCIDevice *ahci)
> +static void ahci_shutdown(AHCIQState *ahci)
>  {
> -    free_ahci_device(ahci);
> -    qtest_shutdown();
> +    QOSState *qs = ahci->parent;
> +    free_ahci_device(ahci->dev);
> +    g_free(ahci);
> +    qtest_shutdown(qs);
>  }
>  
>  /*** Logical Device Initialization ***/
> @@ -1104,7 +1087,7 @@ static void ahci_test_identify(QPCIDevice *ahci, void *hba_base)
>   */
>  static void test_sanity(void)
>  {
> -    QPCIDevice *ahci;
> +    AHCIQState *ahci;
>      ahci = ahci_boot();
>      ahci_shutdown(ahci);
>  }
> @@ -1115,9 +1098,9 @@ static void test_sanity(void)
>   */
>  static void test_pci_spec(void)
>  {
> -    QPCIDevice *ahci;
> +    AHCIQState *ahci;
>      ahci = ahci_boot();
> -    ahci_test_pci_spec(ahci);
> +    ahci_test_pci_spec(ahci->dev);
>      ahci_shutdown(ahci);
>  }
>  
> @@ -1127,10 +1110,10 @@ static void test_pci_spec(void)
>   */
>  static void test_pci_enable(void)
>  {
> -    QPCIDevice *ahci;
> +    AHCIQState *ahci;
>      void *hba_base;
>      ahci = ahci_boot();
> -    ahci_pci_enable(ahci, &hba_base);
> +    ahci_pci_enable(ahci->dev, &hba_base);
>      ahci_shutdown(ahci);
>  }
>  
> @@ -1140,12 +1123,12 @@ static void test_pci_enable(void)
>   */
>  static void test_hba_spec(void)
>  {
> -    QPCIDevice *ahci;
> +    AHCIQState *ahci;
>      void *hba_base;
>  
>      ahci = ahci_boot();
> -    ahci_pci_enable(ahci, &hba_base);
> -    ahci_test_hba_spec(ahci, hba_base);
> +    ahci_pci_enable(ahci->dev, &hba_base);
> +    ahci_test_hba_spec(ahci->dev, hba_base);
>      ahci_shutdown(ahci);
>  }
>  
> @@ -1155,12 +1138,12 @@ static void test_hba_spec(void)
>   */
>  static void test_hba_enable(void)
>  {
> -    QPCIDevice *ahci;
> +    AHCIQState *ahci;
>      void *hba_base;
>  
>      ahci = ahci_boot();
> -    ahci_pci_enable(ahci, &hba_base);
> -    ahci_hba_enable(ahci, hba_base);
> +    ahci_pci_enable(ahci->dev, &hba_base);
> +    ahci_hba_enable(ahci->dev, hba_base);
>      ahci_shutdown(ahci);
>  }
>  
> @@ -1170,13 +1153,13 @@ static void test_hba_enable(void)
>   */
>  static void test_identify(void)
>  {
> -    QPCIDevice *ahci;
> +    AHCIQState *ahci;
>      void *hba_base;
>  
>      ahci = ahci_boot();
> -    ahci_pci_enable(ahci, &hba_base);
> -    ahci_hba_enable(ahci, hba_base);
> -    ahci_test_identify(ahci, hba_base);
> +    ahci_pci_enable(ahci->dev, &hba_base);
> +    ahci_hba_enable(ahci->dev, hba_base);
> +    ahci_test_identify(ahci->dev, hba_base);
>      ahci_shutdown(ahci);
>  }
>  
> diff --git a/tests/libqos/ahci.h b/tests/libqos/ahci.h
> index 6564c5a..bc5f45d 100644
> --- a/tests/libqos/ahci.h
> +++ b/tests/libqos/ahci.h
> @@ -245,6 +245,11 @@
>  
>  /*** Structures ***/
>  
> +typedef struct AHCIQState {
> +    QOSState *parent;
> +    QPCIDevice *dev;
> +} AHCIQState;
> +
>  /**
>   * Generic FIS structure.
>   */
> diff --git a/tests/libqos/libqos.c b/tests/libqos/libqos.c
> new file mode 100644
> index 0000000..c478bc9
> --- /dev/null
> +++ b/tests/libqos/libqos.c
> @@ -0,0 +1,48 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <glib.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <sys/wait.h>
> +
> +#include "libqtest.h"
> +#include "libqos/libqos.h"
> +#include "libqos/pci.h"
> +#include "libqos/malloc-pc.h"
> +
> +/*** Test Setup & Teardown ***/
> +
> +/**
> + * Launch QEMU with the given command line,
> + * and then set up interrupts and our guest malloc interface.
> + */
> +QOSState *qtest_boot(const char *cmdline_fmt, ...)
> +{
> +    QOSState *qs = g_malloc(sizeof(QOSState));
> +    char *cmdline;
> +    va_list ap;
> +
> +    va_start(ap, cmdline_fmt);
> +    cmdline = g_strdup_vprintf(cmdline_fmt, ap);
> +    va_end(ap);
> +
> +    qs->qts = qtest_start(cmdline);
> +    qtest_irq_intercept_in(global_qtest, "ioapic");
> +    qs->alloc = pc_alloc_init();
> +
> +    g_free(cmdline);
> +    return qs;
> +}
> +
> +/**
> + * Tear down the QEMU instance.
> + */
> +void qtest_shutdown(QOSState *qs)
> +{
> +    if (qs->alloc) {
> +        pc_alloc_uninit(qs->alloc);
> +        qs->alloc = NULL;
> +    }
> +    qtest_quit(qs->qts);
> +    g_free(qs);
> +}
> diff --git a/tests/libqos/libqos.h b/tests/libqos/libqos.h
> new file mode 100644
> index 0000000..7a106f2
> --- /dev/null
> +++ b/tests/libqos/libqos.h
> @@ -0,0 +1,26 @@
> +#ifndef __libqos_h
> +#define __libqos_h
> +
> +#include "libqtest.h"
> +#include "libqos/pci.h"
> +#include "libqos/malloc-pc.h"
> +
> +typedef struct QOSState {
> +    QTestState *qts;
> +    QGuestAllocator *alloc;
> +} QOSState;
> +
> +QOSState *qtest_boot(const char *cmdline_fmt, ...);
> +void qtest_shutdown(QOSState *qs);
> +
> +static inline uint64_t qmalloc(QOSState *q, size_t bytes)
> +{
> +    return guest_alloc(q->alloc, bytes);
> +}
> +
> +static inline void qfree(QOSState *q, uint64_t addr)
> +{
> +    guest_free(q->alloc, addr);
> +}
> +
> +#endif
> 

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

  reply	other threads:[~2015-01-19 17:11 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-13  3:34 [Qemu-devel] [PATCH 00/14] ahci-test preliminary refactoring John Snow
2015-01-13  3:34 ` [Qemu-devel] [PATCH 01/14] libqos: Split apart pc_alloc_init John Snow
2015-01-13  8:54   ` Marc Marí
2015-01-13 16:29     ` John Snow
2015-01-19 17:07   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 02/14] qtest/ahci: Create ahci.h John Snow
2015-01-19 17:06   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 03/14] libqos: create libqos.c John Snow
2015-01-19 17:11   ` Paolo Bonzini [this message]
2015-01-13  3:34 ` [Qemu-devel] [PATCH 04/14] libqos: add qtest_vboot John Snow
2015-01-19 17:01   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 05/14] libqos: add alloc_init_flags John Snow
2015-01-19 17:01   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 06/14] libqos: add pc specific interface John Snow
2015-01-19 17:03   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 07/14] qtest/ahci: Store hba_base in AHCIQState John Snow
2015-01-19 17:15   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 08/14] qtest/ahci: finalize AHCIQState consolidation John Snow
2015-01-19 17:16   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 09/14] qtest/ahci: remove pcibus global John Snow
2015-01-19 17:05   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 10/14] qtest/ahci: remove guest_malloc global John Snow
2015-01-19 17:07   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 11/14] libqos/ahci: Functional register helpers John Snow
2015-01-19 17:09   ` Paolo Bonzini
2015-01-19 17:36     ` John Snow
2015-01-13  3:34 ` [Qemu-devel] [PATCH 12/14] qtest/ahci: remove getter/setter macros John Snow
2015-01-19 17:10   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 13/14] qtest/ahci: Bookmark FB and CLB pointers John Snow
2015-01-19 17:10   ` Paolo Bonzini
2015-01-13  3:34 ` [Qemu-devel] [PATCH 14/14] libqos/ahci: create libqos/ahci.c John Snow
2015-01-19 17:15   ` Paolo Bonzini
2015-01-19 17:48     ` John Snow
2015-01-19 17:59     ` Markus Armbruster

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=54BD3AD1.2040306@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=armbru@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=marc.mari.barcelo@gmail.com \
    --cc=mreitz@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 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).