All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration
@ 2017-10-30 16:32 Vladimir Sementsov-Ogievskiy
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 01/14] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor() Vladimir Sementsov-Ogievskiy
                   ` (16 more replies)
  0 siblings, 17 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:32 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Hi all!

There is a new version of dirty bitmap postcopy migration series.

v8

clone: tag postcopy-v8 from https://src.openvz.org/scm/~vsementsov/qemu.git
online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=postcopy-v8

- rebased on master
- patches 01-03 from v7 are already merged to master
- patch order is changed to make it possible to merge block/dirty-bitmap patches
  in separate if is needed
01: new patch
03: fixed to use _locked version of bdrv_release_dirty_bitmap
06: qapi-schema.json -> qapi/migration.json
    2.9 -> 2.11
10: protocol changed a bit:
  instead of 1 byte "bitmap enabled flag" this byte becomes just "flags"
  and have "enabled", "persistent" and "autoloading" flags inside.
  also, make all migrated bitmaps to be not persistent (to prevent their
  storing on source vm)
14: new patch


patches status:
01-04 - are only about block/dirty-bitmap and have no r-b. Fam, John, Paolo (about bitmap lock),
    please look at. These patches are ok to be merged in separate (but before 05-14)
other patches are about migration
05-09 has Juan's r-b (and some of them has John's and Eric's r-bs)
10 - the main patch (dirty bitmaps migration), has no r-b.
11 - preparation for tests, not related to migration directly, has Max's r-b, ok to be merged
    separately (but before 12-14)
12-14 - tests, 12 and 13 have Max's r-b, 14 is new


v7

clone: tag postcopy-v7 from https://src.openvz.org/scm/~vsementsov/qemu.git
online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=postcopy-v7

- rebased on dirty-bitmap byte-based interfaces
    (based on git://repo.or.cz/qemu/ericb.git branch nbd-byte-dirty-v4)
- migration of persistent bitmaps should fail for shared storage migration for now,
  as persistent dirty bitmaps are stored/load on inactivate/invalidate-cache.
  also, even for non-shared storage migration there would be useless saving of dirty
  bitmaps on source. This all will be optimized later.

01: staff from include/migration/vmstate.h moved to include/migration/register.h (rebase)
03: some structural changes due to rebase - drop r-b
04: staff from include/migration/vmstate.h moved to include/migration/register.h (rebase)
    staff from include/sysemu/sysemu.h moved to migration/savevm.h (rebase)
05: fix patch header: block -> block/dirty-bitmap
    add locking, drop r-b
06: staff from include/migration/migration.h moved to migration/migration.h (rebase)
07: add locking, drop r-b
09: staff from include/migration/qemu-file.h moved to migration/qemu-file.h (rebase)
10: staff from include/migration/vmstate.h moved to include/migration/register.h (rebase)
11: new patch
12: a lot of changes/fixes (mostly by Fam's comments) + rebase
    header-definition movement
    remove include <assert.h>
    add some includes
    fix/refactor bitmap flags send
    byte-based interface for dirty bitmaps (rebase)
    froze bitmaps on source
    init_dirty_bitmap_migration can return error, if some of bitmaps are already
      frozen
    bdrv_ref drives with bitmaps
    fprintf -> error_report
    check version_id in _load function

v6:

clone: tag postcopy-v6 from https://src.openvz.org/scm/~vsementsov/qemu.git
online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=postcopy-v6

rebase on master.

03 - tiny contextual change

12 - little change, but it should be reviewed. Call of init_dirty_bitmap_incoming_migration()
    (which only initialize mutex) moved from start of process_incoming_migration_co (it was
    immediately after "mis = migration_incoming_state_new(f)") to migration_incoming_get_current()
    to stay with initialization code.
    I remove r-b's, but hope that this will not be a problem. The only change in this patch - is moved
    call of init_dirty_bitmap_incoming_migration.
    I do so because of recent

commit b4b076daf324894dd288cbdb67ff1e3c7434df7b
Author: Juan Quintela <quintela@redhat.com>
Date:   Mon Jan 23 22:32:06 2017 +0100

    migration: create Migration Incoming State at init time

15 - add Max's r-b

v5:

clone: tag postcopy-v5 from https://src.openvz.org/scm/~vsementsov/qemu.git
online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=postcopy-v5

- move 'signed-off' over 'reviewed-by' in patches.

03,04 - add comments. Hope they will be ok for you, so add Juan's r-b.
    If not ok - let me know and I'll resend.

06,08,12 - add Max's r-b
07,09,10,11,12 - add Juan's r-b

14 - used last version of this patch from qcow2-bitmap series with 
     Max's r-b. It has contextual changes due to different base.

15 - fix 041 iotest, add default node-name only if path is specified and
     node-name is not specified
16 - handle whitespaces
       s/"exec: cat " + fifo/"exec: cat '" + fifo + "'"/
     fix indentation
     add Max's r-b
17 - fix typos, wrong size in comment, s/md5/sha256/
     add Max's r-b

v4:

clone: tag postcopy-v4 from https://src.openvz.org/scm/~vsementsov/qemu.git
online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=postcopy-v4

reroll, to fix "failed automatic build test"

rebase on master!

07: since 2.8 -> since 2.9
14: fix build of test-hbitmap
    since 2.8 -> since 2.9 and small rewording of comment (this change was not done for
    same patch in may parallels series about qcow2 bitmap extension)

v3:

rebased on Max's block branch: https://github.com/XanClic/qemu/commits/block
clone: tag postcopy-v3 from https://src.openvz.org/scm/~vsementsov/qemu.git
online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=postcopy-v3

01  - r-b by Juan
02  - r-b by Juan and David
04  - fix indent
07  - s/since 2.6/since 2.8/
10  - change variable name s/buf/str/
12  - improve copyright message and move it up
      fix memory loss (thanks to Juan)
      switch from DPRINTF to trace events
14* - switch to sha256 and qcrypto_hash_*
      separate qmp command x-debug-block-dirty-bitmap-sha256
16  - use path_suffix for multi-vm test
      fix indent
      fix copyright
      use x-debug-block-dirty-bitmap-sha256 instead of md5
17  - use x-debug-block-dirty-bitmap-sha256 instead of md5
      remove not existing 170 test from qemu-iotests/group

*Note: patch 14 is also used in my second series 'qcow2 persistent dirty bitmaps'


v2:
some bugs fixed, iotests a bit changed and merged into one test.
based on block-next (https://github.com/XanClic/qemu/commits/block-next)
clone: tag postcopy-v2 from https://src.openvz.org/scm/~vsementsov/qemu.git
online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=refs%2Ftags%2Fpostcopy-v2

v1:

These series are derived from my 'Dirty bitmaps migration' series. The
core idea is switch to postcopy migration and drop usage of meta
bitmaps.

These patches provide dirty bitmap postcopy migration feature. Only
named dirty bitmaps are to be migrated. Migration may be enabled using
migration capabilities.

The overall method (thanks to John Snow):

1. migrate bitmaps meta data in .save_live_setup
   - create/find related bitmaps on target
   - disable them
   - create successors (anonimous children) only for enabled migrated
     bitmaps
2. do nothing in precopy stage
3. just before target vm start: enable successors, created in (1)
4. migrate bitmap data
5. reclaime bitmaps (merge successors to their parents)
6. enable bitmaps (only bitmaps, which was enabled in source)


Some patches are unchnaged from (v7) of 'Dirty bitmaps migration'
(DBMv7). I've left Reviewed-by's for them, if you don't like it, say me
and I'll drop them in the following version.

So, relatively to last DBMv7: 

01-04: new patches, splitting common postcopy migration out of ram
       postcopy migration
   05: equal to DBMv7.05
   06: new
   07: equal to DBMv7.06
   08: new
   09: equal to DBMv7.07
   10: new
   11: derived from DBMv7.08, see below
12-15: equal to DBMv7.09-12
   16: derived from DBMv7.13
       - switch from fifo to socket, as postcopy don't work with fifo
         for now
       - change parameters: size, granularity, regions
       - add time.sleep, to wait for postcopy migration phase (bad
         temporary solution.
       - drop Reviewed-by
   17: new

   11: the core patch of the series, it is derived from
       [DBMv7.08: migration: add migration_block-dirty-bitmap.c]
       There are a lot of changes related to switching from precopy to
       postcopy, but functions related to migration stream itself
       (structs, send/load sequences) are mostly unchnaged.

       So, changes, to switch from precopy to postcopy:
       - removed all staff related to meta bitmaps and dirty phase!!!
       - add dirty_bitmap_mig_enable_successors, and call it before
         target vm start in loadvm_postcopy_handle_run
       - add enabled_bitmaps list of bitmaps for
         dirty_bitmap_mig_enable_successors

       - enabled flag is send with start bitmap chunk instead of
         completion chunk
       - sectors_per_chunk is calculated directly from CHUNK_SIZE, not
         using meta bitmap granularity

       - dirty_bitmap_save_iterate: remove dirty_phase, move bulk_phase
         to postcopy stage
       - dirty_bitmap_save_pending: remove dirty phase related pending,
         switch pending to non-postcopyable
       - dirty_bitmap_load_start: get enabled flag and prepare
         successors for enabled bitmaps, also add them to
         enabled_bitmaps list
       - dirty_bitmap_load_complete: for enabled bitmaps: merge them
         with successors and enable

       - savevm handlers:
         * remove separate savevm_dirty_bitmap_live_iterate_handlers state
           (it was bad idea, any way), and move its save_live_iterate to
           savevm_dirty_bitmap_handlers
         * add is_active_iterate savevm handler, which allows iterations
           only in postcopy stage (after stopping source vm)
         * add has_postcopy savevm handler. (ofcourse, just returning true)
         * use save_live_complete_postcopy instead of
           save_live_complete_precopy

       Other changes:
       - some debug output changed
       - remove MIN_LIVE_SIZE, is_live_iterative and related staff (it
         was needed to omit iterations if bitmap data is small, possibly
         this should be reimplemented)

Vladimir Sementsov-Ogievskiy (14):
  block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor()
  block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
  block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor
  block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
  migration: introduce postcopy-only pending
  qapi: add dirty-bitmaps migration capability
  migration: include migrate_dirty_bitmaps in migrate_postcopy
  migration/qemu-file: add qemu_put_counted_string()
  migration: add is_active_iterate handler
  migration: add postcopy migration of dirty bitmaps
  iotests: add default node-name
  iotests: add dirty bitmap migration test
  iotests: add dirty bitmap postcopy test
  iotests: add persistent bitmap migration test

 qapi/migration.json            |   6 +-
 include/block/dirty-bitmap.h   |   4 +
 include/migration/misc.h       |   3 +
 include/migration/register.h   |  18 +-
 migration/migration.h          |   4 +
 migration/qemu-file.h          |   2 +
 migration/savevm.h             |   5 +-
 block/dirty-bitmap.c           |  69 +++-
 migration/block-dirty-bitmap.c | 734 +++++++++++++++++++++++++++++++++++++++++
 migration/block.c              |   7 +-
 migration/migration.c          |  29 +-
 migration/qemu-file.c          |  13 +
 migration/ram.c                |   9 +-
 migration/savevm.c             |  20 +-
 vl.c                           |   1 +
 migration/Makefile.objs        |   1 +
 migration/trace-events         |  16 +-
 tests/qemu-iotests/169         | 155 +++++++++
 tests/qemu-iotests/169.out     |   5 +
 tests/qemu-iotests/group       |   1 +
 tests/qemu-iotests/iotests.py  |   9 +-
 21 files changed, 1077 insertions(+), 34 deletions(-)
 create mode 100644 migration/block-dirty-bitmap.c
 create mode 100755 tests/qemu-iotests/169
 create mode 100644 tests/qemu-iotests/169.out

-- 
2.11.1

^ permalink raw reply	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 01/14] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor()
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:32 ` Vladimir Sementsov-Ogievskiy
  2017-11-10  0:47   ` John Snow
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap Vladimir Sementsov-Ogievskiy
                   ` (15 subsequent siblings)
  16 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:32 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Enabling bitmap successor is necessary to enable successors of bitmaps
being migrated before target vm start.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 include/block/dirty-bitmap.h | 1 +
 block/dirty-bitmap.c         | 8 ++++++++
 2 files changed, 9 insertions(+)

diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
index 3579a7597c..93d4336505 100644
--- a/include/block/dirty-bitmap.h
+++ b/include/block/dirty-bitmap.h
@@ -20,6 +20,7 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
                                            BdrvDirtyBitmap *bitmap,
                                            Error **errp);
+void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap);
 BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs,
                                         const char *name);
 void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap);
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
index bd04e991b1..81adbeb6d4 100644
--- a/block/dirty-bitmap.c
+++ b/block/dirty-bitmap.c
@@ -237,6 +237,14 @@ int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
     return 0;
 }
 
+/* Called with BQL taken. */
+void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap)
+{
+    qemu_mutex_lock(bitmap->mutex);
+    bdrv_enable_dirty_bitmap(bitmap->successor);
+    qemu_mutex_unlock(bitmap->mutex);
+}
+
 /**
  * For a bitmap with a successor, yield our name to the successor,
  * delete the old bitmap, and return a handle to the new bitmap.
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 01/14] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor() Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:32 ` Vladimir Sementsov-Ogievskiy
  2017-11-10 22:52   ` John Snow
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 03/14] block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor Vladimir Sementsov-Ogievskiy
                   ` (14 subsequent siblings)
  16 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:32 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

It is needed to realize bdrv_dirty_bitmap_release_successor in
the following patch.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 block/dirty-bitmap.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
index 81adbeb6d4..981f99d362 100644
--- a/block/dirty-bitmap.c
+++ b/block/dirty-bitmap.c
@@ -326,13 +326,13 @@ static bool bdrv_dirty_bitmap_has_name(BdrvDirtyBitmap *bitmap)
     return !!bdrv_dirty_bitmap_name(bitmap);
 }
 
-/* Called with BQL taken.  */
-static void bdrv_do_release_matching_dirty_bitmap(
+/* Called within bdrv_dirty_bitmap_lock..unlock */
+static void bdrv_do_release_matching_dirty_bitmap_locked(
     BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
     bool (*cond)(BdrvDirtyBitmap *bitmap))
 {
     BdrvDirtyBitmap *bm, *next;
-    bdrv_dirty_bitmaps_lock(bs);
+
     QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
         if ((!bitmap || bm == bitmap) && (!cond || cond(bm))) {
             assert(!bm->active_iterators);
@@ -344,18 +344,33 @@ static void bdrv_do_release_matching_dirty_bitmap(
             g_free(bm);
 
             if (bitmap) {
-                goto out;
+                return;
             }
         }
     }
+
     if (bitmap) {
         abort();
     }
+}
 
-out:
+/* Called with BQL taken.  */
+static void bdrv_do_release_matching_dirty_bitmap(
+    BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
+    bool (*cond)(BdrvDirtyBitmap *bitmap))
+{
+    bdrv_dirty_bitmaps_lock(bs);
+    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, cond);
     bdrv_dirty_bitmaps_unlock(bs);
 }
 
+/* Called within bdrv_dirty_bitmap_lock..unlock */
+static void bdrv_release_dirty_bitmap_locked(BlockDriverState *bs,
+                                             BdrvDirtyBitmap *bitmap)
+{
+    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, NULL);
+}
+
 /* Called with BQL taken.  */
 void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
 {
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 03/14] block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 01/14] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor() Vladimir Sementsov-Ogievskiy
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:32 ` Vladimir Sementsov-Ogievskiy
  2017-11-13 22:17   ` John Snow
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen Vladimir Sementsov-Ogievskiy
                   ` (13 subsequent siblings)
  16 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:32 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

To just release successor and unfreeze bitmap without any additional
work.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
---
 include/block/dirty-bitmap.h |  2 ++
 block/dirty-bitmap.c         | 14 ++++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
index 93d4336505..a9e2a92e4f 100644
--- a/include/block/dirty-bitmap.h
+++ b/include/block/dirty-bitmap.h
@@ -20,6 +20,8 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
                                            BdrvDirtyBitmap *bitmap,
                                            Error **errp);
+void bdrv_dirty_bitmap_release_successor(BlockDriverState *bs,
+                                         BdrvDirtyBitmap *bitmap);
 void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap);
 BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs,
                                         const char *name);
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
index 981f99d362..7578863aa1 100644
--- a/block/dirty-bitmap.c
+++ b/block/dirty-bitmap.c
@@ -431,6 +431,20 @@ void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
     bitmap->disabled = false;
 }
 
+/* Called with BQL taken. */
+void bdrv_dirty_bitmap_release_successor(BlockDriverState *bs,
+                                         BdrvDirtyBitmap *parent)
+{
+    qemu_mutex_lock(parent->mutex);
+
+    if (parent->successor) {
+        bdrv_release_dirty_bitmap_locked(bs, parent->successor);
+        parent->successor = NULL;
+    }
+
+    qemu_mutex_unlock(parent->mutex);
+}
+
 BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
 {
     BdrvDirtyBitmap *bm;
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (2 preceding siblings ...)
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 03/14] block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:32 ` Vladimir Sementsov-Ogievskiy
  2017-11-13 23:32   ` John Snow
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending Vladimir Sementsov-Ogievskiy
                   ` (12 subsequent siblings)
  16 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:32 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Make it possible to set bitmap 'frozen' without a successor.
This is needed to protect the bitmap during outgoing bitmap postcopy
migration.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 include/block/dirty-bitmap.h |  1 +
 block/dirty-bitmap.c         | 22 ++++++++++++++++++++--
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
index a9e2a92e4f..ae6d697850 100644
--- a/include/block/dirty-bitmap.h
+++ b/include/block/dirty-bitmap.h
@@ -39,6 +39,7 @@ uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
 uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap);
 bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
 bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
+void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool frozen);
 const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
 int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
 DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap);
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
index 7578863aa1..67fc6bd6e0 100644
--- a/block/dirty-bitmap.c
+++ b/block/dirty-bitmap.c
@@ -40,6 +40,8 @@ struct BdrvDirtyBitmap {
     QemuMutex *mutex;
     HBitmap *bitmap;            /* Dirty bitmap implementation */
     HBitmap *meta;              /* Meta dirty bitmap */
+    bool frozen;                /* Bitmap is frozen, it can't be modified
+                                   through QMP */
     BdrvDirtyBitmap *successor; /* Anonymous child; implies frozen status */
     char *name;                 /* Optional non-empty unique ID */
     int64_t size;               /* Size of the bitmap, in bytes */
@@ -183,13 +185,22 @@ const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap)
 /* Called with BQL taken.  */
 bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
 {
-    return bitmap->successor;
+    return bitmap->frozen;
+}
+
+/* Called with BQL taken.  */
+void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool frozen)
+{
+    qemu_mutex_lock(bitmap->mutex);
+    assert(bitmap->successor == NULL);
+    bitmap->frozen = frozen;
+    qemu_mutex_unlock(bitmap->mutex);
 }
 
 /* Called with BQL taken.  */
 bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
 {
-    return !(bitmap->disabled || bitmap->successor);
+    return !(bitmap->disabled || (bitmap->successor != NULL));
 }
 
 /* Called with BQL taken.  */
@@ -234,6 +245,7 @@ int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
 
     /* Install the successor and freeze the parent */
     bitmap->successor = child;
+    bitmap->frozen = true;
     return 0;
 }
 
@@ -266,6 +278,8 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
     name = bitmap->name;
     bitmap->name = NULL;
     successor->name = name;
+    assert(bitmap->frozen);
+    bitmap->frozen = false;
     bitmap->successor = NULL;
     successor->persistent = bitmap->persistent;
     bitmap->persistent = false;
@@ -298,6 +312,8 @@ BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
         return NULL;
     }
     bdrv_release_dirty_bitmap(bs, successor);
+    assert(parent->frozen);
+    parent->frozen = false;
     parent->successor = NULL;
 
     return parent;
@@ -439,6 +455,8 @@ void bdrv_dirty_bitmap_release_successor(BlockDriverState *bs,
 
     if (parent->successor) {
         bdrv_release_dirty_bitmap_locked(bs, parent->successor);
+        assert(parent->frozen);
+        parent->frozen = false;
         parent->successor = NULL;
     }
 
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (3 preceding siblings ...)
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-10-30 17:31   ` Dr. David Alan Gilbert
  2017-10-30 18:19   ` [Qemu-devel] [PATCH v8.1 " Vladimir Sementsov-Ogievskiy
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 06/14] qapi: add dirty-bitmaps migration capability Vladimir Sementsov-Ogievskiy
                   ` (11 subsequent siblings)
  16 siblings, 2 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

There would be savevm states (dirty-bitmap) which can migrate only in
postcopy stage. The corresponding pending is introduced here.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---
 include/migration/register.h | 17 +++++++++++++++--
 migration/savevm.h           |  5 +++--
 migration/block.c            |  7 ++++---
 migration/migration.c        | 15 ++++++++-------
 migration/ram.c              |  9 +++++----
 migration/savevm.c           | 13 ++++++++-----
 migration/trace-events       |  2 +-
 7 files changed, 44 insertions(+), 24 deletions(-)

diff --git a/include/migration/register.h b/include/migration/register.h
index f4f7bdc177..9436a87678 100644
--- a/include/migration/register.h
+++ b/include/migration/register.h
@@ -37,8 +37,21 @@ typedef struct SaveVMHandlers {
     int (*save_setup)(QEMUFile *f, void *opaque);
     void (*save_live_pending)(QEMUFile *f, void *opaque,
                               uint64_t threshold_size,
-                              uint64_t *non_postcopiable_pending,
-                              uint64_t *postcopiable_pending);
+                              uint64_t *res_precopy_only,
+                              uint64_t *res_compatible,
+                              uint64_t *res_postcopy_only);
+    /* Note for save_live_pending:
+     * - res_precopy_only is for data which must be migrated in precopy phase
+     *     or in stopped state, in other words - before target vm start
+     * - res_compatible is for data which may be migrated in any phase
+     * - res_postcopy_only is for data which must be migrated in postcopy phase
+     *     or in stopped state, in other words - after source vm stop
+     *
+     * Sum of res_postcopy_only, res_compatible and res_postcopy_only is the
+     * whole amount of pending data.
+     */
+
+
     LoadStateHandler *load_state;
     int (*load_setup)(QEMUFile *f, void *opaque);
     int (*load_cleanup)(void *opaque);
diff --git a/migration/savevm.h b/migration/savevm.h
index 295c4a1f2c..cf4f0d37ca 100644
--- a/migration/savevm.h
+++ b/migration/savevm.h
@@ -38,8 +38,9 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f);
 int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only,
                                        bool inactivate_disks);
 void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size,
-                               uint64_t *res_non_postcopiable,
-                               uint64_t *res_postcopiable);
+                               uint64_t *res_precopy_only,
+                               uint64_t *res_compatible,
+                               uint64_t *res_postcopy_only);
 void qemu_savevm_send_ping(QEMUFile *f, uint32_t value);
 void qemu_savevm_send_open_return_path(QEMUFile *f);
 int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len);
diff --git a/migration/block.c b/migration/block.c
index 3282809583..39dfa567e8 100644
--- a/migration/block.c
+++ b/migration/block.c
@@ -865,8 +865,9 @@ static int block_save_complete(QEMUFile *f, void *opaque)
 }
 
 static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
-                               uint64_t *non_postcopiable_pending,
-                               uint64_t *postcopiable_pending)
+                               uint64_t *res_precopy_only,
+                               uint64_t *res_compatible,
+                               uint64_t *res_postcopy_only)
 {
     /* Estimate pending number of bytes to send */
     uint64_t pending;
@@ -887,7 +888,7 @@ static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
 
     DPRINTF("Enter save live pending  %" PRIu64 "\n", pending);
     /* We don't do postcopy */
-    *non_postcopiable_pending += pending;
+    *res_precopy_only += pending;
 }
 
 static int block_load(QEMUFile *f, void *opaque, int version_id)
diff --git a/migration/migration.c b/migration/migration.c
index 4de3b551fe..e6c9be3cca 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2216,20 +2216,21 @@ static void *migration_thread(void *opaque)
         uint64_t pending_size;
 
         if (!qemu_file_rate_limit(s->to_dst_file)) {
-            uint64_t pend_post, pend_nonpost;
+            uint64_t pend_pre, pend_compat, pend_post;
 
-            qemu_savevm_state_pending(s->to_dst_file, threshold_size,
-                                      &pend_nonpost, &pend_post);
-            pending_size = pend_nonpost + pend_post;
+            qemu_savevm_state_pending(s->to_dst_file, threshold_size, &pend_pre,
+                                      &pend_compat, &pend_post);
+            pending_size = pend_pre + pend_compat + pend_post;
             trace_migrate_pending(pending_size, threshold_size,
-                                  pend_post, pend_nonpost);
+                                  pend_pre, pend_compat, pend_post);
             if (pending_size && pending_size >= threshold_size) {
                 /* Still a significant amount to transfer */
 
                 if (migrate_postcopy() &&
                     s->state != MIGRATION_STATUS_POSTCOPY_ACTIVE &&
-                    pend_nonpost <= threshold_size &&
-                    atomic_read(&s->start_postcopy)) {
+                    pend_pre <= threshold_size &&
+                    (atomic_read(&s->start_postcopy) ||
+                     (pend_pre + pend_compat <= threshold_size))) {
 
                     if (!postcopy_start(s, &old_vm_running)) {
                         current_active_state = MIGRATION_STATUS_POSTCOPY_ACTIVE;
diff --git a/migration/ram.c b/migration/ram.c
index 8620aa400a..1b664a2d9a 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -2358,8 +2358,9 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
 }
 
 static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
-                             uint64_t *non_postcopiable_pending,
-                             uint64_t *postcopiable_pending)
+                             uint64_t *res_precopy_only,
+                             uint64_t *res_compatible,
+                             uint64_t *res_postcopy_only)
 {
     RAMState **temp = opaque;
     RAMState *rs = *temp;
@@ -2379,9 +2380,9 @@ static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
 
     if (migrate_postcopy_ram()) {
         /* We can do postcopy, and all the data is postcopiable */
-        *postcopiable_pending += remaining_size;
+        *res_compatible += remaining_size;
     } else {
-        *non_postcopiable_pending += remaining_size;
+        *res_precopy_only += remaining_size;
     }
 }
 
diff --git a/migration/savevm.c b/migration/savevm.c
index 4a88228614..f6b62cb202 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1218,13 +1218,15 @@ int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only,
  * for units that can't do postcopy.
  */
 void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size,
-                               uint64_t *res_non_postcopiable,
-                               uint64_t *res_postcopiable)
+                               uint64_t *res_precopy_only,
+                               uint64_t *res_compatible,
+                               uint64_t *res_postcopy_only)
 {
     SaveStateEntry *se;
 
-    *res_non_postcopiable = 0;
-    *res_postcopiable = 0;
+    *res_precopy_only = 0;
+    *res_compatible = 0;
+    *res_postcopy_only = 0;
 
 
     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
@@ -1237,7 +1239,8 @@ void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size,
             }
         }
         se->ops->save_live_pending(f, se->opaque, threshold_size,
-                                   res_non_postcopiable, res_postcopiable);
+                                   res_precopy_only, res_compatible,
+                                   res_postcopy_only);
     }
 }
 
diff --git a/migration/trace-events b/migration/trace-events
index 6f29fcc686..a04fffb877 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -86,7 +86,7 @@ migrate_fd_cleanup(void) ""
 migrate_fd_error(const char *error_desc) "error=%s"
 migrate_fd_cancel(void) ""
 migrate_handle_rp_req_pages(const char *rbname, size_t start, size_t len) "in %s at 0x%zx len 0x%zx"
-migrate_pending(uint64_t size, uint64_t max, uint64_t post, uint64_t nonpost) "pending size %" PRIu64 " max %" PRIu64 " (post=%" PRIu64 " nonpost=%" PRIu64 ")"
+migrate_pending(uint64_t size, uint64_t max, uint64_t pre, uint64_t compat, uint64_t post) "pending size %" PRIu64 " max %" PRIu64 " (pre = %" PRIu64 " compat=%" PRIu64 " post=%" PRIu64 ")"
 migrate_send_rp_message(int msg_type, uint16_t len) "%d: len %d"
 migration_completion_file_err(void) ""
 migration_completion_postcopy_end(void) ""
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 06/14] qapi: add dirty-bitmaps migration capability
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (4 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 07/14] migration: include migrate_dirty_bitmaps in migrate_postcopy Vladimir Sementsov-Ogievskiy
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---
 qapi/migration.json   | 6 +++++-
 migration/migration.h | 1 +
 migration/migration.c | 9 +++++++++
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/qapi/migration.json b/qapi/migration.json
index bbc4671ded..ee0ad0b3ad 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -352,12 +352,16 @@
 #
 # @x-multifd: Use more than one fd for migration (since 2.11)
 #
+# @dirty-bitmaps: If enabled, QEMU will migrate named dirty bitmaps.
+#                 (since 2.11)
+#
 # Since: 1.2
 ##
 { 'enum': 'MigrationCapability',
   'data': ['xbzrle', 'rdma-pin-all', 'auto-converge', 'zero-blocks',
            'compress', 'events', 'postcopy-ram', 'x-colo', 'release-ram',
-           'block', 'return-path', 'pause-before-switchover', 'x-multifd' ] }
+           'block', 'return-path', 'pause-before-switchover', 'x-multifd',
+           'dirty-bitmaps' ] }
 
 ##
 # @MigrationCapabilityStatus:
diff --git a/migration/migration.h b/migration/migration.h
index 663415fe48..50d1f01346 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -181,6 +181,7 @@ bool migrate_postcopy(void);
 bool migrate_release_ram(void);
 bool migrate_postcopy_ram(void);
 bool migrate_zero_blocks(void);
+bool migrate_dirty_bitmaps(void);
 
 bool migrate_auto_converge(void);
 bool migrate_use_multifd(void);
diff --git a/migration/migration.c b/migration/migration.c
index e6c9be3cca..1526cd4bff 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1544,6 +1544,15 @@ int migrate_decompress_threads(void)
     return s->parameters.decompress_threads;
 }
 
+bool migrate_dirty_bitmaps(void)
+{
+    MigrationState *s;
+
+    s = migrate_get_current();
+
+    return s->enabled_capabilities[MIGRATION_CAPABILITY_DIRTY_BITMAPS];
+}
+
 bool migrate_use_events(void)
 {
     MigrationState *s;
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 07/14] migration: include migrate_dirty_bitmaps in migrate_postcopy
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (5 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 06/14] qapi: add dirty-bitmaps migration capability Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-11-14  0:19   ` John Snow
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 08/14] migration/qemu-file: add qemu_put_counted_string() Vladimir Sementsov-Ogievskiy
                   ` (9 subsequent siblings)
  16 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Enable postcopy if dirty bitmap migration is endabled.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---
 migration/migration.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/migration/migration.c b/migration/migration.c
index 1526cd4bff..e973837bfd 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1487,7 +1487,7 @@ bool migrate_postcopy_ram(void)
 
 bool migrate_postcopy(void)
 {
-    return migrate_postcopy_ram();
+    return migrate_postcopy_ram() || migrate_dirty_bitmaps();
 }
 
 bool migrate_auto_converge(void)
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 08/14] migration/qemu-file: add qemu_put_counted_string()
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (6 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 07/14] migration: include migrate_dirty_bitmaps in migrate_postcopy Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 09/14] migration: add is_active_iterate handler Vladimir Sementsov-Ogievskiy
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Add function opposite to qemu_get_counted_string.
qemu_put_counted_string puts one-byte length of the string (string
should not be longer than 255 characters), and then it puts the string,
without last zero byte.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---
 migration/qemu-file.h |  2 ++
 migration/qemu-file.c | 13 +++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index aae4e5ed36..f4f356ab12 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -174,4 +174,6 @@ size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
                              ram_addr_t offset, size_t size,
                              uint64_t *bytes_sent);
 
+void qemu_put_counted_string(QEMUFile *f, const char *name);
+
 #endif
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index 2ab2bf362d..e85f501f86 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -734,6 +734,19 @@ size_t qemu_get_counted_string(QEMUFile *f, char buf[256])
 }
 
 /*
+ * Put a string with one preceding byte containing its length. The length of
+ * the string should be less than 256.
+ */
+void qemu_put_counted_string(QEMUFile *f, const char *str)
+{
+    size_t len = strlen(str);
+
+    assert(len < 256);
+    qemu_put_byte(f, len);
+    qemu_put_buffer(f, (const uint8_t *)str, len);
+}
+
+/*
  * Set the blocking state of the QEMUFile.
  * Note: On some transports the OS only keeps a single blocking state for
  *       both directions, and thus changing the blocking on the main
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 09/14] migration: add is_active_iterate handler
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (7 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 08/14] migration/qemu-file: add qemu_put_counted_string() Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-11-14  0:29   ` John Snow
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps Vladimir Sementsov-Ogievskiy
                   ` (7 subsequent siblings)
  16 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Only-postcopy savevm states (dirty-bitmap) don't need live iteration, so
to disable them and stop transporting empty sections there is a new
savevm handler.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---
 include/migration/register.h | 1 +
 migration/savevm.c           | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/include/migration/register.h b/include/migration/register.h
index 9436a87678..cafbeb64b5 100644
--- a/include/migration/register.h
+++ b/include/migration/register.h
@@ -25,6 +25,7 @@ typedef struct SaveVMHandlers {
     /* This runs both outside and inside the iothread lock.  */
     bool (*is_active)(void *opaque);
     bool (*has_postcopy)(void *opaque);
+    bool (*is_active_iterate)(void *opaque);
 
     /* This runs outside the iothread lock in the migration case, and
      * within the lock in the savevm case.  The callback had better only
diff --git a/migration/savevm.c b/migration/savevm.c
index f6b62cb202..9bbfb3fa1b 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1026,6 +1026,11 @@ int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy)
                 continue;
             }
         }
+        if (se->ops && se->ops->is_active_iterate) {
+            if (!se->ops->is_active_iterate(se->opaque)) {
+                continue;
+            }
+        }
         /*
          * In the postcopy phase, any device that doesn't know how to
          * do postcopy should have saved it's state in the _complete
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (8 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 09/14] migration: add is_active_iterate handler Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-11-15  1:58   ` John Snow
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 11/14] iotests: add default node-name Vladimir Sementsov-Ogievskiy
                   ` (6 subsequent siblings)
  16 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Postcopy migration of dirty bitmaps. Only named dirty bitmaps,
associated with root nodes and non-root named nodes are migrated.

If destination qemu is already containing a dirty bitmap with the same name
as a migrated bitmap (for the same node), then, if their granularities are
the same the migration will be done, otherwise the error will be generated.

If destination qemu doesn't contain such bitmap it will be created.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 include/migration/misc.h       |   3 +
 migration/migration.h          |   3 +
 migration/block-dirty-bitmap.c | 734 +++++++++++++++++++++++++++++++++++++++++
 migration/migration.c          |   3 +
 migration/savevm.c             |   2 +
 vl.c                           |   1 +
 migration/Makefile.objs        |   1 +
 migration/trace-events         |  14 +
 8 files changed, 761 insertions(+)
 create mode 100644 migration/block-dirty-bitmap.c

diff --git a/include/migration/misc.h b/include/migration/misc.h
index c079b7771b..9cc539e232 100644
--- a/include/migration/misc.h
+++ b/include/migration/misc.h
@@ -55,4 +55,7 @@ bool migration_has_failed(MigrationState *);
 bool migration_in_postcopy_after_devices(MigrationState *);
 void migration_global_dump(Monitor *mon);
 
+/* migration/block-dirty-bitmap.c */
+void dirty_bitmap_mig_init(void);
+
 #endif
diff --git a/migration/migration.h b/migration/migration.h
index 50d1f01346..4e3ad04664 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -211,4 +211,7 @@ void migrate_send_rp_pong(MigrationIncomingState *mis,
 void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
                               ram_addr_t start, size_t len);
 
+void dirty_bitmap_mig_before_vm_start(void);
+void init_dirty_bitmap_incoming_migration(void);
+
 #endif
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
new file mode 100644
index 0000000000..53cb20045d
--- /dev/null
+++ b/migration/block-dirty-bitmap.c
@@ -0,0 +1,734 @@
+/*
+ * Block dirty bitmap postcopy migration
+ *
+ * Copyright IBM, Corp. 2009
+ * Copyright (c) 2016-2017 Parallels International GmbH
+ *
+ * Authors:
+ *  Liran Schour   <lirans@il.ibm.com>
+ *  Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ * This file is derived from migration/block.c, so it's author and IBM copyright
+ * are here, although content is quite different.
+ *
+ * Contributions after 2012-01-13 are licensed under the terms of the
+ * GNU GPL, version 2 or (at your option) any later version.
+ *
+ *                                ***
+ *
+ * Here postcopy migration of dirty bitmaps is realized. Only named dirty
+ * bitmaps, associated with root nodes and non-root named nodes are migrated.
+ *
+ * If destination qemu is already containing a dirty bitmap with the same name
+ * as a migrated bitmap (for the same node), then, if their granularities are
+ * the same the migration will be done, otherwise the error will be generated.
+ *
+ * If destination qemu doesn't contain such bitmap it will be created.
+ *
+ * format of migration:
+ *
+ * # Header (shared for different chunk types)
+ * 1, 2 or 4 bytes: flags (see qemu_{put,put}_flags)
+ * [ 1 byte: node name size ] \  flags & DEVICE_NAME
+ * [ n bytes: node name     ] /
+ * [ 1 byte: bitmap name size ] \  flags & BITMAP_NAME
+ * [ n bytes: bitmap name     ] /
+ *
+ * # Start of bitmap migration (flags & START)
+ * header
+ * be64: granularity
+ * 1 byte: bitmap flags (corresponds to BdrvDirtyBitmap)
+ *   bit 0    -  bitmap is enabled
+ *   bit 1    -  bitmap is persistent
+ *   bit 2    -  bitmap is autoloading
+ *   bits 3-7 - reserved, must be zero
+ *
+ * # Complete of bitmap migration (flags & COMPLETE)
+ * header
+ *
+ * # Data chunk of bitmap migration
+ * header
+ * be64: start sector
+ * be32: number of sectors
+ * [ be64: buffer size  ] \ ! (flags & ZEROES)
+ * [ n bytes: buffer    ] /
+ *
+ * The last chunk in stream should contain flags & EOS. The chunk may skip
+ * device and/or bitmap names, assuming them to be the same with the previous
+ * chunk.
+ */
+
+#include "qemu/osdep.h"
+#include "block/block.h"
+#include "block/block_int.h"
+#include "sysemu/block-backend.h"
+#include "qemu/main-loop.h"
+#include "qemu/error-report.h"
+#include "migration/misc.h"
+#include "migration/migration.h"
+#include "migration/qemu-file.h"
+#include "migration/vmstate.h"
+#include "migration/register.h"
+#include "qemu/hbitmap.h"
+#include "sysemu/sysemu.h"
+#include "qemu/cutils.h"
+#include "qapi/error.h"
+#include "trace.h"
+
+#define CHUNK_SIZE     (1 << 10)
+
+/* Flags occupy one, two or four bytes (Big Endian). The size is determined as
+ * follows:
+ * in first (most significant) byte bit 8 is clear  -->  one byte
+ * in first byte bit 8 is set    -->  two or four bytes, depending on second
+ *                                    byte:
+ *    | in second byte bit 8 is clear  -->  two bytes
+ *    | in second byte bit 8 is set    -->  four bytes
+ */
+#define DIRTY_BITMAP_MIG_FLAG_EOS           0x01
+#define DIRTY_BITMAP_MIG_FLAG_ZEROES        0x02
+#define DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME   0x04
+#define DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME   0x08
+#define DIRTY_BITMAP_MIG_FLAG_START         0x10
+#define DIRTY_BITMAP_MIG_FLAG_COMPLETE      0x20
+#define DIRTY_BITMAP_MIG_FLAG_BITS          0x40
+
+#define DIRTY_BITMAP_MIG_EXTRA_FLAGS        0x80
+
+#define DIRTY_BITMAP_MIG_START_FLAG_ENABLED          0x01
+#define DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT       0x02
+#define DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD         0x04
+#define DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK    0xf8
+
+typedef struct DirtyBitmapMigBitmapState {
+    /* Written during setup phase. */
+    BlockDriverState *bs;
+    const char *node_name;
+    BdrvDirtyBitmap *bitmap;
+    uint64_t total_sectors;
+    uint64_t sectors_per_chunk;
+    QSIMPLEQ_ENTRY(DirtyBitmapMigBitmapState) entry;
+    uint8_t flags;
+
+    /* For bulk phase. */
+    bool bulk_completed;
+    uint64_t cur_sector;
+} DirtyBitmapMigBitmapState;
+
+typedef struct DirtyBitmapMigState {
+    QSIMPLEQ_HEAD(dbms_list, DirtyBitmapMigBitmapState) dbms_list;
+
+    bool bulk_completed;
+
+    /* for send_bitmap_bits() */
+    BlockDriverState *prev_bs;
+    BdrvDirtyBitmap *prev_bitmap;
+} DirtyBitmapMigState;
+
+typedef struct DirtyBitmapLoadState {
+    uint32_t flags;
+    char node_name[256];
+    char bitmap_name[256];
+    BlockDriverState *bs;
+    BdrvDirtyBitmap *bitmap;
+} DirtyBitmapLoadState;
+
+static DirtyBitmapMigState dirty_bitmap_mig_state;
+
+typedef struct DirtyBitmapLoadBitmapState {
+    BlockDriverState *bs;
+    BdrvDirtyBitmap *bitmap;
+    bool migrated;
+} DirtyBitmapLoadBitmapState;
+static GSList *enabled_bitmaps;
+QemuMutex finish_lock;
+
+void init_dirty_bitmap_incoming_migration(void)
+{
+    qemu_mutex_init(&finish_lock);
+}
+
+static uint32_t qemu_get_bitmap_flags(QEMUFile *f)
+{
+    uint8_t flags = qemu_get_byte(f);
+    if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
+        flags = flags << 8 | qemu_get_byte(f);
+        if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
+            flags = flags << 16 | qemu_get_be16(f);
+        }
+    }
+
+    return flags;
+}
+
+static void qemu_put_bitmap_flags(QEMUFile *f, uint32_t flags)
+{
+    /* The code currently do not send flags more than one byte */
+    assert(!(flags & (0xffffff00 | DIRTY_BITMAP_MIG_EXTRA_FLAGS)));
+
+    qemu_put_byte(f, flags);
+}
+
+static void send_bitmap_header(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
+                               uint32_t additional_flags)
+{
+    BlockDriverState *bs = dbms->bs;
+    BdrvDirtyBitmap *bitmap = dbms->bitmap;
+    uint32_t flags = additional_flags;
+    trace_send_bitmap_header_enter();
+
+    if (bs != dirty_bitmap_mig_state.prev_bs) {
+        dirty_bitmap_mig_state.prev_bs = bs;
+        flags |= DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME;
+    }
+
+    if (bitmap != dirty_bitmap_mig_state.prev_bitmap) {
+        dirty_bitmap_mig_state.prev_bitmap = bitmap;
+        flags |= DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME;
+    }
+
+    qemu_put_bitmap_flags(f, flags);
+
+    if (flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
+        qemu_put_counted_string(f, dbms->node_name);
+    }
+
+    if (flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
+        qemu_put_counted_string(f, bdrv_dirty_bitmap_name(bitmap));
+    }
+}
+
+static void send_bitmap_start(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
+{
+    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_START);
+    qemu_put_be32(f, bdrv_dirty_bitmap_granularity(dbms->bitmap));
+    qemu_put_byte(f, dbms->flags);
+}
+
+static void send_bitmap_complete(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
+{
+    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_COMPLETE);
+}
+
+static void send_bitmap_bits(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
+                             uint64_t start_sector, uint32_t nr_sectors)
+{
+    /* align for buffer_is_zero() */
+    uint64_t align = 4 * sizeof(long);
+    uint64_t unaligned_size =
+        bdrv_dirty_bitmap_serialization_size(
+            dbms->bitmap, start_sector << BDRV_SECTOR_BITS,
+            (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
+    uint64_t buf_size = (unaligned_size + align - 1) & ~(align - 1);
+    uint8_t *buf = g_malloc0(buf_size);
+    uint32_t flags = DIRTY_BITMAP_MIG_FLAG_BITS;
+
+    bdrv_dirty_bitmap_serialize_part(
+        dbms->bitmap, buf, start_sector << BDRV_SECTOR_BITS,
+        (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
+
+    if (buffer_is_zero(buf, buf_size)) {
+        g_free(buf);
+        buf = NULL;
+        flags |= DIRTY_BITMAP_MIG_FLAG_ZEROES;
+    }
+
+    trace_send_bitmap_bits(flags, start_sector, nr_sectors, buf_size);
+
+    send_bitmap_header(f, dbms, flags);
+
+    qemu_put_be64(f, start_sector);
+    qemu_put_be32(f, nr_sectors);
+
+    /* if a block is zero we need to flush here since the network
+     * bandwidth is now a lot higher than the storage device bandwidth.
+     * thus if we queue zero blocks we slow down the migration. */
+    if (flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
+        qemu_fflush(f);
+    } else {
+        qemu_put_be64(f, buf_size);
+        qemu_put_buffer(f, buf, buf_size);
+    }
+
+    g_free(buf);
+}
+
+
+/* Called with iothread lock taken.  */
+
+static int init_dirty_bitmap_migration(void)
+{
+    BlockDriverState *bs;
+    BdrvDirtyBitmap *bitmap;
+    DirtyBitmapMigBitmapState *dbms;
+    BdrvNextIterator it;
+
+    dirty_bitmap_mig_state.bulk_completed = false;
+    dirty_bitmap_mig_state.prev_bs = NULL;
+    dirty_bitmap_mig_state.prev_bitmap = NULL;
+
+    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
+        if (!bdrv_get_device_or_node_name(bs)) {
+            /* not named non-root node */
+            continue;
+        }
+
+        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
+             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
+            if (!bdrv_dirty_bitmap_name(bitmap)) {
+                continue;
+            }
+
+            if (bdrv_dirty_bitmap_frozen(bitmap)) {
+                error_report("Can't migrate frozen dirty bitmap: '%s",
+                             bdrv_dirty_bitmap_name(bitmap));
+                return -1;
+            }
+        }
+    }
+
+    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
+        if (!bdrv_get_device_or_node_name(bs)) {
+            /* not named non-root node */
+            continue;
+        }
+
+        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
+             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
+            if (!bdrv_dirty_bitmap_name(bitmap)) {
+                continue;
+            }
+
+            bdrv_ref(bs);
+            bdrv_dirty_bitmap_set_frozen(bitmap, true);
+
+            dbms = g_new0(DirtyBitmapMigBitmapState, 1);
+            dbms->bs = bs;
+            dbms->node_name = bdrv_get_node_name(bs);
+            if (!dbms->node_name || dbms->node_name[0] == '\0') {
+                dbms->node_name = bdrv_get_device_name(bs);
+            }
+            dbms->bitmap = bitmap;
+            dbms->total_sectors = bdrv_nb_sectors(bs);
+            dbms->sectors_per_chunk = CHUNK_SIZE * 8 *
+                bdrv_dirty_bitmap_granularity(bitmap) >> BDRV_SECTOR_BITS;
+            if (bdrv_dirty_bitmap_enabled(bitmap)) {
+                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_ENABLED;
+            }
+            if (bdrv_dirty_bitmap_get_persistance(bitmap)) {
+                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
+            }
+            if (bdrv_dirty_bitmap_get_autoload(bitmap)) {
+                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD;
+            }
+
+            bdrv_dirty_bitmap_set_persistance(bitmap, false);
+
+            QSIMPLEQ_INSERT_TAIL(&dirty_bitmap_mig_state.dbms_list,
+                                 dbms, entry);
+        }
+    }
+
+    return 0;
+}
+
+/* Called with no lock taken.  */
+static void bulk_phase_send_chunk(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
+{
+    uint32_t nr_sectors = MIN(dbms->total_sectors - dbms->cur_sector,
+                             dbms->sectors_per_chunk);
+
+    send_bitmap_bits(f, dbms, dbms->cur_sector, nr_sectors);
+
+    dbms->cur_sector += nr_sectors;
+    if (dbms->cur_sector >= dbms->total_sectors) {
+        dbms->bulk_completed = true;
+    }
+}
+
+/* Called with no lock taken.  */
+static void bulk_phase(QEMUFile *f, bool limit)
+{
+    DirtyBitmapMigBitmapState *dbms;
+
+    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
+        while (!dbms->bulk_completed) {
+            bulk_phase_send_chunk(f, dbms);
+            if (limit && qemu_file_rate_limit(f)) {
+                return;
+            }
+        }
+    }
+
+    dirty_bitmap_mig_state.bulk_completed = true;
+}
+
+/* Called with iothread lock taken.  */
+static void dirty_bitmap_mig_cleanup(void)
+{
+    DirtyBitmapMigBitmapState *dbms;
+
+    while ((dbms = QSIMPLEQ_FIRST(&dirty_bitmap_mig_state.dbms_list)) != NULL) {
+        QSIMPLEQ_REMOVE_HEAD(&dirty_bitmap_mig_state.dbms_list, entry);
+        bdrv_dirty_bitmap_set_frozen(dbms->bitmap, false);
+        bdrv_unref(dbms->bs);
+        g_free(dbms);
+    }
+}
+
+/* for SaveVMHandlers */
+static void dirty_bitmap_save_cleanup(void *opaque)
+{
+    dirty_bitmap_mig_cleanup();
+}
+
+static int dirty_bitmap_save_iterate(QEMUFile *f, void *opaque)
+{
+    trace_dirty_bitmap_save_iterate(migration_in_postcopy());
+
+    if (migration_in_postcopy() && !dirty_bitmap_mig_state.bulk_completed) {
+        bulk_phase(f, true);
+    }
+
+    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
+
+    return dirty_bitmap_mig_state.bulk_completed;
+}
+
+/* Called with iothread lock taken.  */
+
+static int dirty_bitmap_save_complete(QEMUFile *f, void *opaque)
+{
+    DirtyBitmapMigBitmapState *dbms;
+    trace_dirty_bitmap_save_complete_enter();
+
+    if (!dirty_bitmap_mig_state.bulk_completed) {
+        bulk_phase(f, false);
+    }
+
+    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
+        send_bitmap_complete(f, dbms);
+    }
+
+    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
+
+    trace_dirty_bitmap_save_complete_finish();
+
+    dirty_bitmap_mig_cleanup();
+    return 0;
+}
+
+static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque,
+                                      uint64_t max_size,
+                                      uint64_t *res_precopy_only,
+                                      uint64_t *res_compatible,
+                                      uint64_t *res_postcopy_only)
+{
+    DirtyBitmapMigBitmapState *dbms;
+    uint64_t pending = 0;
+
+    qemu_mutex_lock_iothread();
+
+    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
+        uint64_t gran = bdrv_dirty_bitmap_granularity(dbms->bitmap);
+        uint64_t sectors = dbms->bulk_completed ? 0 :
+                           dbms->total_sectors - dbms->cur_sector;
+
+        pending += (sectors * BDRV_SECTOR_SIZE + gran - 1) / gran;
+    }
+
+    qemu_mutex_unlock_iothread();
+
+    trace_dirty_bitmap_save_pending(pending, max_size);
+
+    *res_postcopy_only += pending;
+}
+
+/* First occurrence of this bitmap. It should be created if doesn't exist */
+static int dirty_bitmap_load_start(QEMUFile *f, DirtyBitmapLoadState *s)
+{
+    Error *local_err = NULL;
+    uint32_t granularity = qemu_get_be32(f);
+    uint8_t flags = qemu_get_byte(f);
+
+    if (!s->bitmap) {
+        s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
+                                             s->bitmap_name, &local_err);
+        if (!s->bitmap) {
+            error_report_err(local_err);
+            return -EINVAL;
+        }
+    } else {
+        uint32_t dest_granularity =
+            bdrv_dirty_bitmap_granularity(s->bitmap);
+        if (dest_granularity != granularity) {
+            error_report("Error: "
+                         "Migrated bitmap granularity (%" PRIu32 ") "
+                         "doesn't match the destination bitmap '%s' "
+                         "granularity (%" PRIu32 ")",
+                         granularity,
+                         bdrv_dirty_bitmap_name(s->bitmap),
+                         dest_granularity);
+            return -EINVAL;
+        }
+    }
+
+    if (flags & DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK) {
+        error_report("Unknown flags in migrated dirty bitmap header: %x",
+                     flags);
+        return -EINVAL;
+    }
+
+    if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) {
+        bdrv_dirty_bitmap_set_persistance(s->bitmap, true);
+    }
+    if (flags & DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD) {
+        bdrv_dirty_bitmap_set_autoload(s->bitmap, true);
+    }
+
+    bdrv_disable_dirty_bitmap(s->bitmap);
+    if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
+        DirtyBitmapLoadBitmapState *b;
+
+        bdrv_dirty_bitmap_create_successor(s->bs, s->bitmap, &local_err);
+        if (local_err) {
+            error_report_err(local_err);
+            return -EINVAL;
+        }
+
+        b = g_new(DirtyBitmapLoadBitmapState, 1);
+        b->bs = s->bs;
+        b->bitmap = s->bitmap;
+        b->migrated = false;
+        enabled_bitmaps = g_slist_prepend(enabled_bitmaps, b);
+    }
+
+    return 0;
+}
+
+void dirty_bitmap_mig_before_vm_start(void)
+{
+    GSList *item;
+
+    qemu_mutex_lock(&finish_lock);
+
+    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
+        DirtyBitmapLoadBitmapState *b = item->data;
+
+        if (b->migrated) {
+            bdrv_enable_dirty_bitmap(b->bitmap);
+        } else {
+            bdrv_dirty_bitmap_enable_successor(b->bitmap);
+        }
+
+        g_free(b);
+    }
+
+    g_slist_free(enabled_bitmaps);
+    enabled_bitmaps = NULL;
+
+    qemu_mutex_unlock(&finish_lock);
+}
+
+static void dirty_bitmap_load_complete(QEMUFile *f, DirtyBitmapLoadState *s)
+{
+    GSList *item;
+    trace_dirty_bitmap_load_complete();
+    bdrv_dirty_bitmap_deserialize_finish(s->bitmap);
+
+    qemu_mutex_lock(&finish_lock);
+
+    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
+        DirtyBitmapLoadBitmapState *b = item->data;
+
+        if (b->bitmap == s->bitmap) {
+            b->migrated = true;
+        }
+    }
+
+    if (bdrv_dirty_bitmap_frozen(s->bitmap)) {
+        if (enabled_bitmaps == NULL) {
+            /* in postcopy */
+            AioContext *aio_context = bdrv_get_aio_context(s->bs);
+            aio_context_acquire(aio_context);
+
+            bdrv_reclaim_dirty_bitmap(s->bs, s->bitmap, &error_abort);
+            bdrv_enable_dirty_bitmap(s->bitmap);
+
+            aio_context_release(aio_context);
+        } else {
+            /* target not started, successor is empty */
+            bdrv_dirty_bitmap_release_successor(s->bs, s->bitmap);
+        }
+    }
+
+    qemu_mutex_unlock(&finish_lock);
+}
+
+static int dirty_bitmap_load_bits(QEMUFile *f, DirtyBitmapLoadState *s)
+{
+    uint64_t first_byte = qemu_get_be64(f) << BDRV_SECTOR_BITS;
+    uint64_t nr_bytes = (uint64_t)qemu_get_be32(f) << BDRV_SECTOR_BITS;
+    trace_dirty_bitmap_load_bits_enter(first_byte >> BDRV_SECTOR_BITS,
+                                       nr_bytes >> BDRV_SECTOR_BITS);
+
+    if (s->flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
+        trace_dirty_bitmap_load_bits_zeroes();
+        bdrv_dirty_bitmap_deserialize_zeroes(s->bitmap, first_byte, nr_bytes,
+                                             false);
+    } else {
+        uint8_t *buf;
+        uint64_t buf_size = qemu_get_be64(f);
+        uint64_t needed_size =
+            bdrv_dirty_bitmap_serialization_size(s->bitmap,
+                                                 first_byte, nr_bytes);
+
+        if (needed_size > buf_size) {
+            error_report("Error: Migrated bitmap granularity doesn't "
+                         "match the destination bitmap '%s' granularity",
+                         bdrv_dirty_bitmap_name(s->bitmap));
+            return -EINVAL;
+        }
+
+        buf = g_malloc(buf_size);
+        qemu_get_buffer(f, buf, buf_size);
+        bdrv_dirty_bitmap_deserialize_part(s->bitmap, buf, first_byte, nr_bytes,
+                                           false);
+        g_free(buf);
+    }
+
+    return 0;
+}
+
+static int dirty_bitmap_load_header(QEMUFile *f, DirtyBitmapLoadState *s)
+{
+    Error *local_err = NULL;
+    s->flags = qemu_get_bitmap_flags(f);
+    trace_dirty_bitmap_load_header(s->flags);
+
+    if (s->flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
+        if (!qemu_get_counted_string(f, s->node_name)) {
+            error_report("Unable to read node name string");
+            return -EINVAL;
+        }
+        s->bs = bdrv_lookup_bs(s->node_name, s->node_name, &local_err);
+        if (!s->bs) {
+            error_report_err(local_err);
+            return -EINVAL;
+        }
+    } else if (!s->bs) {
+        error_report("Error: block device name is not set");
+        return -EINVAL;
+    }
+
+    if (s->flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
+        if (!qemu_get_counted_string(f, s->bitmap_name)) {
+            error_report("Unable to read node name string");
+            return -EINVAL;
+        }
+        s->bitmap = bdrv_find_dirty_bitmap(s->bs, s->bitmap_name);
+
+        /* bitmap may be NULL here, it wouldn't be an error if it is the
+         * first occurrence of the bitmap */
+        if (!s->bitmap && !(s->flags & DIRTY_BITMAP_MIG_FLAG_START)) {
+            error_report("Error: unknown dirty bitmap "
+                         "'%s' for block device '%s'",
+                         s->bitmap_name, s->node_name);
+            return -EINVAL;
+        }
+    } else if (!s->bitmap) {
+        error_report("Error: block device name is not set");
+        return -EINVAL;
+    }
+
+    return 0;
+}
+
+static int dirty_bitmap_load(QEMUFile *f, void *opaque, int version_id)
+{
+    static DirtyBitmapLoadState s;
+    int ret = 0;
+
+    trace_dirty_bitmap_load_enter();
+
+    if (version_id != 1) {
+        return -EINVAL;
+    }
+
+    do {
+        dirty_bitmap_load_header(f, &s);
+
+        if (s.flags & DIRTY_BITMAP_MIG_FLAG_START) {
+            ret = dirty_bitmap_load_start(f, &s);
+        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_COMPLETE) {
+            dirty_bitmap_load_complete(f, &s);
+        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_BITS) {
+            ret = dirty_bitmap_load_bits(f, &s);
+        }
+
+        if (!ret) {
+            ret = qemu_file_get_error(f);
+        }
+
+        if (ret) {
+            return ret;
+        }
+    } while (!(s.flags & DIRTY_BITMAP_MIG_FLAG_EOS));
+
+    trace_dirty_bitmap_load_success();
+    return 0;
+}
+
+static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
+{
+    DirtyBitmapMigBitmapState *dbms = NULL;
+    if (init_dirty_bitmap_migration() < 0) {
+        return -1;
+    }
+
+    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
+        send_bitmap_start(f, dbms);
+    }
+    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
+
+    return 0;
+}
+
+static bool dirty_bitmap_is_active(void *opaque)
+{
+    return migrate_dirty_bitmaps();
+}
+
+static bool dirty_bitmap_is_active_iterate(void *opaque)
+{
+    return dirty_bitmap_is_active(opaque) && !runstate_is_running();
+}
+
+static bool dirty_bitmap_has_postcopy(void *opaque)
+{
+    return true;
+}
+
+static SaveVMHandlers savevm_dirty_bitmap_handlers = {
+    .save_setup = dirty_bitmap_save_setup,
+    .save_live_complete_postcopy = dirty_bitmap_save_complete,
+    .save_live_complete_precopy = dirty_bitmap_save_complete,
+    .has_postcopy = dirty_bitmap_has_postcopy,
+    .save_live_pending = dirty_bitmap_save_pending,
+    .save_live_iterate = dirty_bitmap_save_iterate,
+    .is_active_iterate = dirty_bitmap_is_active_iterate,
+    .load_state = dirty_bitmap_load,
+    .save_cleanup = dirty_bitmap_save_cleanup,
+    .is_active = dirty_bitmap_is_active,
+};
+
+void dirty_bitmap_mig_init(void)
+{
+    QSIMPLEQ_INIT(&dirty_bitmap_mig_state.dbms_list);
+
+    register_savevm_live(NULL, "dirty-bitmap", 0, 1,
+                         &savevm_dirty_bitmap_handlers,
+                         &dirty_bitmap_mig_state);
+}
diff --git a/migration/migration.c b/migration/migration.c
index e973837bfd..66e9cf03cd 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -150,6 +150,9 @@ MigrationIncomingState *migration_incoming_get_current(void)
         memset(&mis_current, 0, sizeof(MigrationIncomingState));
         qemu_mutex_init(&mis_current.rp_mutex);
         qemu_event_init(&mis_current.main_thread_load_event, false);
+
+        init_dirty_bitmap_incoming_migration();
+
         once = true;
     }
     return &mis_current;
diff --git a/migration/savevm.c b/migration/savevm.c
index 9bbfb3fa1b..b0c37ef9f1 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1673,6 +1673,8 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
 
     trace_loadvm_postcopy_handle_run_vmstart();
 
+    dirty_bitmap_mig_before_vm_start();
+
     if (autostart) {
         /* Hold onto your hats, starting the CPU */
         vm_start();
diff --git a/vl.c b/vl.c
index ec299099ff..3d393aaf2c 100644
--- a/vl.c
+++ b/vl.c
@@ -4642,6 +4642,7 @@ int main(int argc, char **argv, char **envp)
 
     blk_mig_init();
     ram_mig_init();
+    dirty_bitmap_mig_init();
 
     /* If the currently selected machine wishes to override the units-per-bus
      * property of its default HBA interface type, do so now. */
diff --git a/migration/Makefile.objs b/migration/Makefile.objs
index 99e038024d..c83ec47ba8 100644
--- a/migration/Makefile.objs
+++ b/migration/Makefile.objs
@@ -6,6 +6,7 @@ common-obj-y += qemu-file.o global_state.o
 common-obj-y += qemu-file-channel.o
 common-obj-y += xbzrle.o postcopy-ram.o
 common-obj-y += qjson.o
+common-obj-y += block-dirty-bitmap.o
 
 common-obj-$(CONFIG_RDMA) += rdma.o
 
diff --git a/migration/trace-events b/migration/trace-events
index a04fffb877..e9eb8078d4 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -227,3 +227,17 @@ colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'"
 colo_send_message(const char *msg) "Send '%s' message"
 colo_receive_message(const char *msg) "Receive '%s' message"
 colo_failover_set_state(const char *new_state) "new state %s"
+
+# migration/block-dirty-bitmap.c
+send_bitmap_header_enter(void) ""
+send_bitmap_bits(uint32_t flags, uint64_t start_sector, uint32_t nr_sectors, uint64_t data_size) "\n   flags:        0x%x\n   start_sector: %" PRIu64 "\n   nr_sectors:   %" PRIu32 "\n   data_size:    %" PRIu64 "\n"
+dirty_bitmap_save_iterate(int in_postcopy) "in postcopy: %d"
+dirty_bitmap_save_complete_enter(void) ""
+dirty_bitmap_save_complete_finish(void) ""
+dirty_bitmap_save_pending(uint64_t pending, uint64_t max_size) "pending %" PRIu64 " max: %" PRIu64
+dirty_bitmap_load_complete(void) ""
+dirty_bitmap_load_bits_enter(uint64_t first_sector, uint32_t nr_sectors) "chunk: %" PRIu64 " %" PRIu32
+dirty_bitmap_load_bits_zeroes(void) ""
+dirty_bitmap_load_header(uint32_t flags) "flags 0x%x"
+dirty_bitmap_load_enter(void) ""
+dirty_bitmap_load_success(void) ""
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 11/14] iotests: add default node-name
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (9 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 12/14] iotests: add dirty bitmap migration test Vladimir Sementsov-Ogievskiy
                   ` (5 subsequent siblings)
  16 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

When testing migration, auto-generated by qemu node-names differs in
source and destination qemu and migration fails. After this patch,
auto-generated by iotest nodenames will be the same.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
 tests/qemu-iotests/iotests.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index 6f057904a9..95454c1893 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -216,6 +216,8 @@ class VM(qtest.QEMUQtestMachine):
             options.append('file=%s' % path)
             options.append('format=%s' % format)
             options.append('cache=%s' % cachemode)
+            if 'node-name' not in opts:
+                options.append('node-name=drivenode%d' % self._num_drives)
 
         if opts:
             options.append(opts)
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 12/14] iotests: add dirty bitmap migration test
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (10 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 11/14] iotests: add default node-name Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 13/14] iotests: add dirty bitmap postcopy test Vladimir Sementsov-Ogievskiy
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

The test starts two vms (vm_a, vm_b), create dirty bitmap in
the first one, do several writes to corresponding device and
then migrate vm_a to vm_b with dirty bitmaps.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
 tests/qemu-iotests/169     | 86 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/169.out |  5 +++
 tests/qemu-iotests/group   |  1 +
 3 files changed, 92 insertions(+)
 create mode 100755 tests/qemu-iotests/169
 create mode 100644 tests/qemu-iotests/169.out

diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
new file mode 100755
index 0000000000..7630ecbe51
--- /dev/null
+++ b/tests/qemu-iotests/169
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+#
+# Tests for dirty bitmaps migration.
+#
+# Copyright (C) Vladimir Sementsov-Ogievskiy 2015-2016
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+import os
+import iotests
+import time
+from iotests import qemu_img
+
+disk_a = os.path.join(iotests.test_dir, 'disk_a')
+disk_b = os.path.join(iotests.test_dir, 'disk_b')
+fifo = os.path.join(iotests.test_dir, 'mig_fifo')
+
+class TestDirtyBitmapMigration(iotests.QMPTestCase):
+
+    def setUp(self):
+        size = 0x400000000 # 1G
+        os.mkfifo(fifo)
+        qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
+        qemu_img('create', '-f', iotests.imgfmt, disk_b, str(size))
+        self.vm_a = iotests.VM(path_suffix='a').add_drive(disk_a)
+        self.vm_b = iotests.VM(path_suffix='b').add_drive(disk_b)
+        self.vm_b.add_incoming("exec: cat '" + fifo + "'")
+        self.vm_a.launch()
+        self.vm_b.launch()
+
+    def tearDown(self):
+        self.vm_a.shutdown()
+        self.vm_b.shutdown()
+        os.remove(disk_a)
+        os.remove(disk_b)
+        os.remove(fifo)
+
+    def test_migration(self):
+        granularity = 512
+        regions = [
+            { 'start': 0,           'count': 0x100000 },
+            { 'start': 0x100000000, 'count': 0x200000  },
+            { 'start': 0x399900000, 'count': 0x100000  }
+            ]
+
+        result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
+                               name='bitmap', granularity=granularity)
+        self.assert_qmp(result, 'return', {});
+
+        for r in regions:
+            self.vm_a.hmp_qemu_io('drive0',
+                                  'write %d %d' % (r['start'], r['count']))
+
+        result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
+                               node='drive0', name='bitmap')
+        sha256 = result['return']['sha256']
+
+        result = self.vm_a.qmp('migrate-set-capabilities',
+                               capabilities=[{'capability': 'dirty-bitmaps',
+                                              'state': True}])
+        self.assert_qmp(result, 'return', {})
+
+        result = self.vm_a.qmp('migrate', uri='exec:cat>' + fifo)
+        self.assertNotEqual(self.vm_a.event_wait("STOP"), None)
+        self.assertNotEqual(self.vm_b.event_wait("RESUME"), None)
+        time.sleep(2)
+
+        result = self.vm_b.qmp('x-debug-block-dirty-bitmap-sha256',
+                               node='drive0', name='bitmap')
+        self.assert_qmp(result, 'return/sha256', sha256);
+
+
+if __name__ == '__main__':
+    iotests.main()
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
new file mode 100644
index 0000000000..ae1213e6f8
--- /dev/null
+++ b/tests/qemu-iotests/169.out
@@ -0,0 +1,5 @@
+.
+----------------------------------------------------------------------
+Ran 1 tests
+
+OK
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index 24e5ad1b79..96e173abb3 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -169,6 +169,7 @@
 162 auto quick
 163 rw auto quick
 165 rw auto quick
+169 rw auto quick
 170 rw auto quick
 171 rw auto quick
 172 auto
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 13/14] iotests: add dirty bitmap postcopy test
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (11 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 12/14] iotests: add dirty bitmap migration test Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 14/14] iotests: add persistent bitmap migration test Vladimir Sementsov-Ogievskiy
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Test
- start two vms (vm_a, vm_b)

- in a
    - do writes from set A
    - do writes from set B
    - fix bitmap sha256
    - clear bitmap
    - do writes from set A
    - start migration
- than, in b
    - wait vm start (postcopy should start)
    - do writes from set B
    - check bitmap sha256

The test should verify postcopy migration and then merging with delta
(changes in target, during postcopy process).

Reduce supported cache modes to only 'none', because with cache on time
from source.STOP to target.RESUME is unpredictable and we can fail with
timout while waiting for target.RESUME.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
 tests/qemu-iotests/169        | 74 +++++++++++++++++++++++++++++++++++++------
 tests/qemu-iotests/169.out    |  4 +--
 tests/qemu-iotests/iotests.py |  7 +++-
 3 files changed, 72 insertions(+), 13 deletions(-)

diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
index 7630ecbe51..4ecef2f23f 100755
--- a/tests/qemu-iotests/169
+++ b/tests/qemu-iotests/169
@@ -29,8 +29,14 @@ fifo = os.path.join(iotests.test_dir, 'mig_fifo')
 
 class TestDirtyBitmapMigration(iotests.QMPTestCase):
 
-    def setUp(self):
-        size = 0x400000000 # 1G
+    def tearDown(self):
+        self.vm_a.shutdown()
+        self.vm_b.shutdown()
+        os.remove(disk_a)
+        os.remove(disk_b)
+        os.remove(fifo)
+
+    def init(self, size):
         os.mkfifo(fifo)
         qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
         qemu_img('create', '-f', iotests.imgfmt, disk_b, str(size))
@@ -40,14 +46,8 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
         self.vm_a.launch()
         self.vm_b.launch()
 
-    def tearDown(self):
-        self.vm_a.shutdown()
-        self.vm_b.shutdown()
-        os.remove(disk_a)
-        os.remove(disk_b)
-        os.remove(fifo)
-
     def test_migration(self):
+        self.init(0x400000000) # 1G
         granularity = 512
         regions = [
             { 'start': 0,           'count': 0x100000 },
@@ -81,6 +81,60 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
                                node='drive0', name='bitmap')
         self.assert_qmp(result, 'return/sha256', sha256);
 
+    def test_postcopy(self):
+        self.init(0x4000000000) # 256G
+        write_size = 0x40000000
+        granularity = 512
+        chunk = 4096
+
+        result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
+                               name='bitmap', granularity=granularity)
+        self.assert_qmp(result, 'return', {});
+
+        s = 0
+        while s < write_size:
+            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
+            s += 0x10000
+        s = 0x8000
+        while s < write_size:
+            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
+            s += 0x10000
+
+        result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
+                               node='drive0', name='bitmap')
+        sha256 = result['return']['sha256']
+
+        result = self.vm_a.qmp('block-dirty-bitmap-clear', node='drive0',
+                               name='bitmap')
+        self.assert_qmp(result, 'return', {});
+        s = 0
+        while s < write_size:
+            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
+            s += 0x10000
+
+        result = self.vm_a.qmp('migrate-set-capabilities',
+                               capabilities=[{'capability': 'dirty-bitmaps',
+                                              'state': True}])
+        self.assert_qmp(result, 'return', {})
+
+        result = self.vm_a.qmp('migrate', uri='exec:cat>' + fifo)
+        self.assertNotEqual(self.vm_a.event_wait("STOP"), None)
+        self.assertNotEqual(self.vm_b.event_wait("RESUME"), None)
+
+        s = 0x8000
+        while s < write_size:
+            self.vm_b.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
+            s += 0x10000
+
+        result = self.vm_b.qmp('query-block');
+        while len(result['return'][0]['dirty-bitmaps']) > 1:
+            time.sleep(2)
+            result = self.vm_b.qmp('query-block');
+
+        result = self.vm_b.qmp('x-debug-block-dirty-bitmap-sha256',
+                               node='drive0', name='bitmap')
+
+        self.assert_qmp(result, 'return/sha256', sha256);
 
 if __name__ == '__main__':
-    iotests.main()
+    iotests.main(supported_fmts=['qcow2'], supported_cache_modes=['none'])
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
index ae1213e6f8..fbc63e62f8 100644
--- a/tests/qemu-iotests/169.out
+++ b/tests/qemu-iotests/169.out
@@ -1,5 +1,5 @@
-.
+..
 ----------------------------------------------------------------------
-Ran 1 tests
+Ran 2 tests
 
 OK
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index 95454c1893..88f73d6441 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -432,6 +432,10 @@ def verify_platform(supported_oses=['linux']):
     if True not in [sys.platform.startswith(x) for x in supported_oses]:
         notrun('not suitable for this OS: %s' % sys.platform)
 
+def verify_cache_mode(supported_cache_modes=[]):
+    if supported_cache_modes and (cachemode not in supported_cache_modes):
+        notrun('not suitable for this cache mode: %s' % cachemode)
+
 def supports_quorum():
     return 'quorum' in qemu_img_pipe('--help')
 
@@ -440,7 +444,7 @@ def verify_quorum():
     if not supports_quorum():
         notrun('quorum support missing')
 
-def main(supported_fmts=[], supported_oses=['linux']):
+def main(supported_fmts=[], supported_oses=['linux'], supported_cache_modes=[]):
     '''Run tests'''
 
     global debug
@@ -457,6 +461,7 @@ def main(supported_fmts=[], supported_oses=['linux']):
     verbosity = 1
     verify_image_format(supported_fmts)
     verify_platform(supported_oses)
+    verify_cache_mode(supported_cache_modes)
 
     # We need to filter out the time taken from the output so that qemu-iotest
     # can reliably diff the results against master output.
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8 14/14] iotests: add persistent bitmap migration test
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (12 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 13/14] iotests: add dirty bitmap postcopy test Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:33 ` Vladimir Sementsov-Ogievskiy
  2017-10-30 16:54 ` [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration no-reply
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 16:33 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

Test that persistent bitmap migrates and its persistance property
migrates too.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 tests/qemu-iotests/169     | 21 ++++++++++++++++++---
 tests/qemu-iotests/169.out |  4 ++--
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
index 4ecef2f23f..b0270f40f7 100755
--- a/tests/qemu-iotests/169
+++ b/tests/qemu-iotests/169
@@ -46,7 +46,7 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
         self.vm_a.launch()
         self.vm_b.launch()
 
-    def test_migration(self):
+    def do_test_migration(self, persistent=False):
         self.init(0x400000000) # 1G
         granularity = 512
         regions = [
@@ -55,8 +55,13 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
             { 'start': 0x399900000, 'count': 0x100000  }
             ]
 
-        result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
-                               name='bitmap', granularity=granularity)
+        if persistent:
+            result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
+                                   name='bitmap', granularity=granularity,
+                                   persistent=True, autoload=True)
+        else:
+            result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
+                                   name='bitmap', granularity=granularity)
         self.assert_qmp(result, 'return', {});
 
         for r in regions:
@@ -77,10 +82,20 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
         self.assertNotEqual(self.vm_b.event_wait("RESUME"), None)
         time.sleep(2)
 
+        if persistent:
+            self.vm_b.shutdown()
+            self.vm_b.launch()
+
         result = self.vm_b.qmp('x-debug-block-dirty-bitmap-sha256',
                                node='drive0', name='bitmap')
         self.assert_qmp(result, 'return/sha256', sha256);
 
+    def test_migration(self):
+        self.do_test_migration()
+
+    def test_migration_persistent(self):
+        self.do_test_migration(persistent=True)
+
     def test_postcopy(self):
         self.init(0x4000000000) # 256G
         write_size = 0x40000000
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
index fbc63e62f8..8d7e996700 100644
--- a/tests/qemu-iotests/169.out
+++ b/tests/qemu-iotests/169.out
@@ -1,5 +1,5 @@
-..
+...
 ----------------------------------------------------------------------
-Ran 2 tests
+Ran 3 tests
 
 OK
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (13 preceding siblings ...)
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 14/14] iotests: add persistent bitmap migration test Vladimir Sementsov-Ogievskiy
@ 2017-10-30 16:54 ` no-reply
  2017-10-30 16:55 ` no-reply
  2017-10-30 18:22 ` Vladimir Sementsov-Ogievskiy
  16 siblings, 0 replies; 44+ messages in thread
From: no-reply @ 2017-10-30 16:54 UTC (permalink / raw)
  To: vsementsov; +Cc: famz, qemu-block, qemu-devel, kwolf, peter.maydell

Hi,

This series failed build test on ppc host. Please find the details below.

Subject: [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration
Type: series
Message-id: 20171030163309.75770-1-vsementsov@virtuozzo.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash
# Testing script will be invoked under the git checkout with
# HEAD pointing to a commit that has the patches applied on top of "base"
# branch
set -e
echo "=== ENV ==="
env
echo "=== PACKAGES ==="
rpm -qa
echo "=== TEST BEGIN ==="
INSTALL=$PWD/install
BUILD=$PWD/build
mkdir -p $BUILD $INSTALL
SRC=$PWD
cd $BUILD
$SRC/configure --prefix=$INSTALL
make -j100
# XXX: we need reliable clean up
# make check -j100 V=1
make install
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 - [tag update]      patchew/150822818243.26242.12993827911736928961.stgit@bahia.lan -> patchew/150822818243.26242.12993827911736928961.stgit@bahia.lan
 - [tag update]      patchew/20171027104037.8319-1-eblake@redhat.com -> patchew/20171027104037.8319-1-eblake@redhat.com
 - [tag update]      patchew/20171029125338.25988-1-kwolf@redhat.com -> patchew/20171029125338.25988-1-kwolf@redhat.com
 - [tag update]      patchew/20171030102830.4469-1-kraxel@redhat.com -> patchew/20171030102830.4469-1-kraxel@redhat.com
 * [new tag]         patchew/20171030163309.75770-1-vsementsov@virtuozzo.com -> patchew/20171030163309.75770-1-vsementsov@virtuozzo.com
Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc'
Submodule 'pixman' (git://anongit.freedesktop.org/pixman) registered for path 'pixman'
Submodule 'roms/SLOF' (git://git.qemu-project.org/SLOF.git) registered for path 'roms/SLOF'
Submodule 'roms/ipxe' (git://git.qemu-project.org/ipxe.git) registered for path 'roms/ipxe'
Submodule 'roms/openbios' (git://git.qemu-project.org/openbios.git) registered for path 'roms/openbios'
Submodule 'roms/openhackware' (git://git.qemu-project.org/openhackware.git) registered for path 'roms/openhackware'
Submodule 'roms/qemu-palcode' (git://github.com/rth7680/qemu-palcode.git) registered for path 'roms/qemu-palcode'
Submodule 'roms/seabios' (git://git.qemu-project.org/seabios.git/) registered for path 'roms/seabios'
Submodule 'roms/sgabios' (git://git.qemu-project.org/sgabios.git) registered for path 'roms/sgabios'
Submodule 'roms/u-boot' (git://git.qemu-project.org/u-boot.git) registered for path 'roms/u-boot'
Submodule 'roms/vgabios' (git://git.qemu-project.org/vgabios.git/) registered for path 'roms/vgabios'
Cloning into 'dtc'...
Submodule path 'dtc': checked out '65cc4d2748a2c2e6f27f1cf39e07a5dbabd80ebf'
Cloning into 'pixman'...
Submodule path 'pixman': checked out '87eea99e443b389c978cf37efc52788bf03a0ee0'
Cloning into 'roms/SLOF'...
Submodule path 'roms/SLOF': checked out 'e3d05727a074619fc12d0a67f05cf2c42c875cce'
Cloning into 'roms/ipxe'...
Submodule path 'roms/ipxe': checked out '04186319181298083ef28695a8309028b26fe83c'
Cloning into 'roms/openbios'...
Submodule path 'roms/openbios': checked out 'e79bca64838c96ec44fd7acd508879c5284233dd'
Cloning into 'roms/openhackware'...
Submodule path 'roms/openhackware': checked out 'c559da7c8eec5e45ef1f67978827af6f0b9546f5'
Cloning into 'roms/qemu-palcode'...
Submodule path 'roms/qemu-palcode': checked out 'c87a92639b28ac42bc8f6c67443543b405dc479b'
Cloning into 'roms/seabios'...
Submodule path 'roms/seabios': checked out 'e2fc41e24ee0ada60fc511d60b15a41b294538be'
Cloning into 'roms/sgabios'...
Submodule path 'roms/sgabios': checked out '23d474943dcd55d0550a3d20b3d30e9040a4f15b'
Cloning into 'roms/u-boot'...
Submodule path 'roms/u-boot': checked out '2072e7262965bb48d7fffb1e283101e6ed8b21a8'
Cloning into 'roms/vgabios'...
Submodule path 'roms/vgabios': checked out '19ea12c230ded95928ecaef0db47a82231c2e485'
warning: unable to rmdir pixman: Directory not empty
Switched to a new branch 'test'
M	dtc
M	roms/SLOF
M	roms/ipxe
M	roms/openbios
M	roms/qemu-palcode
M	roms/seabios
M	roms/sgabios
M	roms/u-boot
b200358 iotests: add persistent bitmap migration test
2bc0dad iotests: add dirty bitmap postcopy test
a572a25 iotests: add dirty bitmap migration test
012af82 iotests: add default node-name
d0573d2 migration: add postcopy migration of dirty bitmaps
1c5318d migration: add is_active_iterate handler
7697c9a migration/qemu-file: add qemu_put_counted_string()
b4e20bb migration: include migrate_dirty_bitmaps in migrate_postcopy
272f21c qapi: add dirty-bitmaps migration capability
7f3bb03 migration: introduce postcopy-only pending
c8f365f block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
93cb6f1 block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor
92ce534 block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
abf3538 block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor()

=== OUTPUT BEGIN ===
=== ENV ===
XDG_SESSION_ID=6109
SHELL=/bin/sh
USER=patchew
PATCHEW=/home/patchew/patchew/patchew-cli -s http://patchew.org --nodebug
PATH=/usr/bin:/bin
PWD=/var/tmp/patchew-tester-tmp-845hv716/src
LANG=en_US.UTF-8
HOME=/home/patchew
SHLVL=2
LOGNAME=patchew
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/env
=== PACKAGES ===
plymouth-core-libs-0.8.9-0.28.20140113.el7.centos.ppc64le
vim-common-7.4.160-2.el7.ppc64le
perl-Test-Simple-0.98-243.el7.noarch
hplip-common-3.15.9-3.el7.ppc64le
valgrind-3.12.0-8.el7.ppc64le
gamin-0.1.10-16.el7.ppc64le
libpeas-loader-python-1.20.0-1.el7.ppc64le
telepathy-filesystem-0.0.2-6.el7.noarch
colord-libs-1.3.4-1.el7.ppc64le
kbd-legacy-1.15.5-13.el7.noarch
perl-CPAN-Meta-YAML-0.008-14.el7.noarch
libvirt-daemon-driver-nwfilter-3.2.0-14.el7.ppc64le
ntsysv-1.7.4-1.el7.ppc64le
kernel-bootwrapper-3.10.0-693.el7.ppc64le
telepathy-farstream-0.6.0-5.el7.ppc64le
kdenetwork-common-4.10.5-8.el7_0.noarch
elfutils-devel-0.168-8.el7.ppc64le
pm-utils-1.4.1-27.el7.ppc64le
perl-Error-0.17020-2.el7.noarch
usbmuxd-1.1.0-1.el7.ppc64le
bzip2-devel-1.0.6-13.el7.ppc64le
blktrace-1.0.5-8.el7.ppc64le
gnome-keyring-pam-3.20.0-3.el7.ppc64le
tzdata-java-2017b-1.el7.noarch
perl-devel-5.16.3-292.el7.ppc64le
gnome-getting-started-docs-3.22.0-1.el7.noarch
perl-Log-Message-Simple-0.10-2.el7.noarch
totem-pl-parser-3.10.7-1.el7.ppc64le
lohit-oriya-fonts-2.5.4.1-3.el7.noarch
python-coverage-3.6-0.5.b3.el7.ppc64le
java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.ppc64le
mailcap-2.1.41-2.el7.noarch
perl-CPANPLUS-0.91.38-4.el7.noarch
fprintd-pam-0.5.0-4.0.el7_0.ppc64le
less-458-9.el7.ppc64le
gupnp-igd-0.2.4-1.el7.ppc64le
thai-scalable-waree-fonts-0.5.0-7.el7.noarch
python-di-0.3-2.el7.noarch
yelp-libs-3.22.0-1.el7.ppc64le
vte-profile-0.46.2-1.el7.ppc64le
gpm-libs-1.20.7-5.el7.ppc64le
gnome-clocks-3.22.1-1.el7.ppc64le
p11-kit-trust-0.23.5-3.el7.ppc64le
gssproxy-0.7.0-4.el7.ppc64le
gnu-free-mono-fonts-20120503-8.el7.noarch
python-dateutil-1.5-7.el7.noarch
gucharmap-libs-3.18.2-1.el7.ppc64le
glibc-common-2.17-196.el7.ppc64le
libreport-plugin-mantisbt-2.1.11-38.el7.centos.ppc64le
motif-devel-2.3.4-8.1.el7_3.ppc64le
celt051-0.5.1.3-8.el7.ppc64le
radvd-1.9.2-9.el7.ppc64le
lohit-tamil-fonts-2.5.3-2.el7.noarch
python-ipaddress-1.0.16-2.el7.noarch
anaconda-widgets-21.48.22.121-1.el7.centos.ppc64le
zlib-1.2.7-17.el7.ppc64le
libstdc++-devel-4.8.5-16.el7.ppc64le
system-config-printer-1.4.1-19.el7.ppc64le
mozjs24-24.2.0-7.el7.ppc64le
device-mapper-multipath-libs-0.4.9-111.el7.ppc64le
wqy-microhei-fonts-0.2.0-0.12.beta.el7.noarch
python-schedutils-0.4-6.el7.ppc64le
gnome-bluetooth-3.20.1-1.el7.ppc64le
nss-util-3.28.4-3.el7.ppc64le
dotconf-1.3-8.el7.ppc64le
ibus-rawcode-1.3.2-3.el7.ppc64le
abattis-cantarell-fonts-0.0.25-1.el7.noarch
sssd-common-1.15.2-50.el7.ppc64le
sil-padauk-fonts-2.8-5.el7.noarch
bind-utils-9.9.4-50.el7.ppc64le
sox-14.4.1-6.el7.ppc64le
libSM-1.2.2-2.el7.ppc64le
libtiff-devel-4.0.3-27.el7_3.ppc64le
plymouth-system-theme-0.8.9-0.28.20140113.el7.centos.ppc64le
python-libs-2.7.5-58.el7.ppc64le
sssd-1.15.2-50.el7.ppc64le
rfkill-0.4-9.el7.ppc64le
cyrus-sasl-md5-2.1.26-21.el7.ppc64le
libXtst-devel-1.2.3-1.el7.ppc64le
avahi-libs-0.6.31-17.el7.ppc64le
ruby-2.0.0.648-30.el7.ppc64le
seahorse-3.20.0-1.el7.ppc64le
python-six-1.9.0-2.el7.noarch
gpgme-1.3.2-5.el7.ppc64le
iwl7260-firmware-22.0.7.0-56.el7.noarch
libsss_certmap-1.15.2-50.el7.ppc64le
xorg-x11-drv-wacom-0.34.2-2.el7.ppc64le
libXau-1.0.8-2.1.el7.ppc64le
shadow-utils-4.1.5.1-24.el7.ppc64le
evolution-ews-3.22.6-6.el7.ppc64le
libsecret-0.18.5-2.el7.ppc64le
perl-Module-Signature-0.73-2.el7.noarch
rootfiles-8.1-11.el7.noarch
trace-cmd-2.6.0-8.el7.ppc64le
hamcrest-1.3-6.el7.noarch
gawk-4.0.2-4.el7_3.1.ppc64le
usermode-1.111-5.el7.ppc64le
gnome-terminal-nautilus-3.22.1-2.el7.ppc64le
gvfs-client-1.30.4-3.el7.ppc64le
yum-utils-1.1.31-42.el7.noarch
iwl3945-firmware-15.32.2.9-56.el7.noarch
perl-Archive-Zip-1.30-11.el7.noarch
spice-glib-0.33-6.el7.ppc64le
augeas-libs-1.4.0-2.el7.ppc64le
openlmi-providers-0.5.0-4.el7.ppc64le
gnome-color-manager-3.22.2-1.el7.ppc64le
imsettings-libs-1.6.3-9.el7.ppc64le
nss-softokn-devel-3.28.3-6.el7.ppc64le
python34-3.4.5-4.el7.ppc64le
perl-DBI-1.627-4.el7.ppc64le
plymouth-plugin-label-0.8.9-0.28.20140113.el7.centos.ppc64le
binutils-2.25.1-31.base.el7.ppc64le
libsss_nss_idmap-1.15.2-50.el7.ppc64le
gvfs-smb-1.30.4-3.el7.ppc64le
freetype-devel-2.4.11-15.el7.ppc64le
libXi-1.7.9-1.el7.ppc64le
perl-Text-Diff-1.41-5.el7.noarch
gcr-devel-3.20.0-1.el7.ppc64le
numactl-libs-2.0.9-6.el7_2.ppc64le
hardlink-1.0-19.el7.ppc64le
gnome-disk-utility-3.22.1-1.el7.ppc64le
mariadb-libs-5.5.56-2.el7.ppc64le
libnotify-0.7.7-1.el7.ppc64le
perl-TimeDate-2.30-2.el7.noarch
soprano-devel-2.9.2-3.el7.ppc64le
pixman-0.34.0-1.el7.ppc64le
kmod-20-15.el7.ppc64le
qt3-PostgreSQL-3.3.8b-51.el7.ppc64le
python2-pyasn1-0.1.9-7.el7.noarch
libXt-1.1.5-3.el7.ppc64le
perl-Font-AFM-1.20-13.el7.noarch
ibus-1.5.3-13.el7.ppc64le
findutils-4.5.11-5.el7.ppc64le
ibus-libs-1.5.3-13.el7.ppc64le
iprutils-2.4.14.1-1.el7.ppc64le
libpwquality-1.2.3-4.el7.ppc64le
libXrender-devel-0.9.10-1.el7.ppc64le
perl-IO-stringy-2.110-22.el7.noarch
kdelibs-4.14.8-6.el7_3.ppc64le
flac-libs-1.3.0-5.el7_1.ppc64le
device-mapper-event-libs-1.02.140-8.el7.ppc64le
gnutls-devel-3.3.26-9.el7.ppc64le
libXau-devel-1.0.8-2.1.el7.ppc64le
gstreamer1-plugins-base-1.10.4-1.el7.ppc64le
perl-HTML-Tree-5.03-2.el7.noarch
kdenetwork-kopete-4.10.5-8.el7_0.ppc64le
libepoxy-1.3.1-1.el7.ppc64le
mesa-libGLES-17.0.1-6.20170307.el7.ppc64le
qt-postgresql-4.8.5-13.el7.ppc64le
fontconfig-devel-2.10.95-11.el7.ppc64le
java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.ppc64le
libXfont-1.5.2-1.el7.ppc64le
libkexiv2-4.10.5-3.el7.ppc64le
openjpeg-libs-1.5.1-17.el7.ppc64le
iscsi-initiator-utils-6.2.0.874-4.el7.ppc64le
NetworkManager-adsl-1.8.0-9.el7.ppc64le
libgtop2-2.34.2-1.el7.ppc64le
libXdamage-devel-1.1.4-4.1.el7.ppc64le
ipset-libs-6.29-1.el7.ppc64le
kde-runtime-drkonqi-4.10.5-8.el7.ppc64le
e2fsprogs-libs-1.42.9-10.el7.ppc64le
dhclient-4.2.5-58.el7.centos.ppc64le
usbutils-007-5.el7.ppc64le
python-ethtool-0.8-5.el7.ppc64le
gstreamer1-plugins-bad-free-1.10.4-2.el7.ppc64le
fftw-libs-double-3.3.3-8.el7.ppc64le
kdenetwork-krdc-4.10.5-8.el7_0.ppc64le
fuse-libs-2.9.2-8.el7.ppc64le
pciutils-3.5.1-2.el7.ppc64le
at-3.1.13-22.el7.ppc64le
python-IPy-0.75-6.el7.noarch
libXp-1.0.2-2.1.el7.ppc64le
vim-minimal-7.4.160-2.el7.ppc64le
kdesdk-kmtrace-4.10.5-6.el7.ppc64le
libraw1394-2.1.0-2.el7.ppc64le
libdrm-devel-2.4.74-1.el7.ppc64le
irqbalance-1.0.7-10.el7.ppc64le
fipscheck-lib-1.4.1-6.el7.ppc64le
gvfs-1.30.4-3.el7.ppc64le
libiscsi-1.9.0-7.el7.ppc64le
motif-2.3.4-8.1.el7_3.ppc64le
keyutils-1.5.8-3.el7.ppc64le
NetworkManager-ppp-1.8.0-9.el7.ppc64le
systemtap-3.1-3.el7.ppc64le
boost-serialization-1.53.0-27.el7.ppc64le
grilo-0.3.3-1.el7.ppc64le
rpm-4.11.3-25.el7.ppc64le
kdegraphics-libs-4.10.5-3.el7.noarch
libfontenc-1.1.3-3.el7.ppc64le
perl-Git-1.8.3.1-11.el7.noarch
rubygem-abrt-0.3.0-1.el7.noarch
tcl-8.5.13-8.el7.ppc64le
gtksourceview3-3.22.2-1.el7.ppc64le
cmake-2.8.12.2-2.el7.ppc64le
pulseaudio-utils-10.0-3.el7.ppc64le
libusal-1.1.11-23.el7.ppc64le
grub2-ppc64le-2.02-0.64.el7.centos.ppc64le
libreport-plugin-mailx-2.1.11-38.el7.centos.ppc64le
libvisual-0.4.0-16.el7.ppc64le
metacity-2.34.13-7.el7.ppc64le
redland-virtuoso-1.0.16-6.el7.ppc64le
nautilus-3.22.3-3.el7.ppc64le
pciutils-libs-3.5.1-2.el7.ppc64le
soprano-2.9.2-3.el7.ppc64le
mariadb-devel-5.5.56-2.el7.ppc64le
libxkbcommon-x11-0.7.1-1.el7.ppc64le
farstream02-0.2.3-3.el7.ppc64le
redhat-rpm-config-9.1.0-76.el7.centos.noarch
skkdic-20130104-6.T1435.el7.noarch
perl-HTTP-Tiny-0.033-3.el7.noarch
lvm2-libs-2.02.171-8.el7.ppc64le
perl-XML-Grove-0.46alpha-52.el7.noarch
boost-devel-1.53.0-27.el7.ppc64le
pycairo-1.8.10-8.el7.ppc64le
popt-devel-1.13-16.el7.ppc64le
gnome-settings-daemon-3.22.2-5.el7.ppc64le
perl-Socket-2.010-4.el7.ppc64le
numad-0.5-17.20150602git.el7.ppc64le
e2fsprogs-devel-1.42.9-10.el7.ppc64le
libsecret-devel-0.18.5-2.el7.ppc64le
libXv-devel-1.0.11-1.el7.ppc64le
libchewing-0.3.4-6.el7.ppc64le
gnome-shell-extension-places-menu-3.22.2-10.el7.noarch
perl-Time-HiRes-1.9725-3.el7.ppc64le
openchange-2.3-2.el7.ppc64le
audit-libs-devel-2.7.6-3.el7.ppc64le
python-dmidecode-3.12.2-1.el7.ppc64le
libmediaart-1.9.1-1.el7.ppc64le
elfutils-default-yama-scope-0.168-8.el7.noarch
quota-4.01-14.el7.ppc64le
perl-threads-1.87-4.el7.ppc64le
realmd-0.16.1-9.el7.ppc64le
nautilus-sendto-3.8.4-1.el7.ppc64le
gstreamer-0.10.36-7.el7.ppc64le
cairo-gobject-devel-1.14.8-2.el7.ppc64le
abrt-libs-2.1.11-48.el7.centos.ppc64le
libvirt-daemon-driver-storage-iscsi-3.2.0-14.el7.ppc64le
perl-Pod-Parser-1.61-2.el7.noarch
python-devel-2.7.5-58.el7.ppc64le
mpfr-devel-3.1.1-4.el7.ppc64le
kernel-headers-3.10.0-693.el7.ppc64le
powerpc-utils-python-1.2.1-9.el7.noarch
linux-firmware-20170606-56.gitc990aae.el7.noarch
libqmi-1.16.0-1.el7.ppc64le
libvirt-libs-3.2.0-14.el7.ppc64le
perl-Digest-1.17-245.el7.noarch
libgcab1-0.7-3.el7.ppc64le
flex-2.5.37-3.el7.ppc64le
tzdata-2017b-1.el7.noarch
phonon-4.6.0-10.el7.ppc64le
anaconda-tui-21.48.22.121-1.el7.centos.ppc64le
libmbim-utils-1.14.0-2.el7.ppc64le
gnutls-utils-3.3.26-9.el7.ppc64le
perl-Parse-CPAN-Meta-1.4404-5.el7.noarch
flite-1.3-22.el7.ppc64le
nfs4-acl-tools-0.3.3-15.el7.ppc64le
poppler-data-0.4.6-3.el7.noarch
gvfs-fuse-1.30.4-3.el7.ppc64le
gnome-software-3.22.7-1.el7.ppc64le
perl-ExtUtils-ParseXS-3.18-3.el7.noarch
libvirt-python-3.2.0-3.el7.ppc64le
perl-Module-Load-Conditional-0.54-3.el7.noarch
python-netifaces-0.10.4-3.el7.ppc64le
swig-2.0.10-5.el7.ppc64le
ipa-client-common-4.5.0-20.el7.centos.noarch
cheese-libs-3.22.1-1.el7.ppc64le
gnome-tweak-tool-3.22.0-1.el7.noarch
perl-ExtUtils-CBuilder-0.28.2.6-292.el7.noarch
libsoup-devel-2.56.0-3.el7.ppc64le
perl-IO-Zlib-1.10-292.el7.noarch
fros-1.0-2.el7.noarch
lohit-devanagari-fonts-2.5.3-4.el7.noarch
grub2-ppc64le-modules-2.02-0.64.el7.centos.noarch
libgdata-0.17.8-1.el7.ppc64le
evince-nautilus-3.22.1-5.el7.ppc64le
perl-ExtUtils-Embed-1.30-292.el7.noarch
dleyna-connector-dbus-0.2.0-2.el7.ppc64le
libiec61883-1.2.0-10.el7.ppc64le
python-lxml-3.2.1-4.el7.ppc64le
liberation-serif-fonts-1.07.2-15.el7.noarch
tigervnc-license-1.8.0-1.el7.noarch
gnome-packagekit-3.22.1-2.el7.ppc64le
hpijs-3.15.9-3.el7.ppc64le
libmodman-2.0.1-8.el7.ppc64le
ntp-4.2.6p5-25.el7.centos.2.ppc64le
gmp-devel-6.0.0-15.el7.ppc64le
pyxattr-0.5.1-5.el7.ppc64le
sil-abyssinica-fonts-1.200-6.el7.noarch
ncurses-libs-5.9-13.20130511.el7.ppc64le
gnome-dictionary-libs-3.20.0-1.el7.ppc64le
kdesdk-devel-4.10.5-6.el7.ppc64le
libreport-rhel-anaconda-bugzilla-2.1.11-38.el7.centos.ppc64le
libvirt-daemon-config-network-3.2.0-14.el7.ppc64le
boost-iostreams-1.53.0-27.el7.ppc64le
python-ply-3.4-11.el7.noarch
ucs-miscfixed-fonts-0.3-11.el7.noarch
info-5.1-4.el7.ppc64le
libXxf86misc-devel-1.0.3-7.1.el7.ppc64le
ibus-qt-1.3.2-4.el7.ppc64le
gnome-video-effects-0.4.3-1.el7.noarch
bridge-utils-1.5-9.el7.ppc64le
make-3.82-23.el7.ppc64le
pywbem-0.7.0-25.20130827svn625.el7.noarch
pnm2ppa-1.04-28.el7.ppc64le
chkconfig-1.7.4-1.el7.ppc64le
at-spi2-atk-devel-2.22.0-2.el7.ppc64le
freeglut-devel-2.8.1-3.el7.ppc64le
jbigkit-libs-2.0-11.el7.ppc64le
sssd-ipa-1.15.2-50.el7.ppc64le
openssl-libs-1.0.2k-8.el7.ppc64le
ldns-1.6.16-10.el7.ppc64le
rdate-1.4-25.el7.ppc64le
libdb-5.3.21-20.el7.ppc64le
evince-libs-3.22.1-5.el7.ppc64le
empathy-3.12.12-4.el7.ppc64le
rubygem-json-1.7.7-30.el7.ppc64le
dmraid-1.0.0.rc16-28.el7.ppc64le
libblkid-2.23.2-43.el7.ppc64le
logrotate-3.8.6-14.el7.ppc64le
iwl105-firmware-18.168.6.1-56.el7.noarch
grep-2.20-3.el7.ppc64le
xorg-x11-drv-synaptics-1.9.0-1.el7.ppc64le
iowatcher-1.0-6.el7.ppc64le
rubygem-net-http-persistent-2.8-5.el7.noarch
setroubleshoot-plugins-3.0.65-1.el7.noarch
atk-2.22.0-3.el7.ppc64le
libcacard-2.5.2-2.el7.ppc64le
iwl6050-firmware-41.28.5.1-56.el7.noarch
lcms2-2.6-3.el7.ppc64le
tigervnc-server-minimal-1.8.0-1.el7.ppc64le
gvfs-goa-1.30.4-3.el7.ppc64le
authconfig-6.2.8-30.el7.ppc64le
yum-plugin-fastestmirror-1.1.31-42.el7.noarch
dbus-python-1.1.1-9.el7.ppc64le
perl-Archive-Tar-1.92-2.el7.noarch
iwl5000-firmware-8.83.5.1_1-56.el7.noarch
libacl-2.2.51-12.el7.ppc64le
farstream-0.1.2-8.el7.ppc64le
ppc64-utils-0.14-16.el7.ppc64le
servicelog-1.1.14-3.el7.ppc64le
python2-ipaclient-4.5.0-20.el7.centos.noarch
libpeas-1.20.0-1.el7.ppc64le
perl-TermReadKey-2.30-20.el7.ppc64le
hdparm-9.43-5.el7.ppc64le
libicu-50.1.2-15.el7.ppc64le
polkit-qt-0.103.0-10.el7_0.ppc64le
gnome-weather-3.20.2-1.el7.noarch
libmspack-0.5-0.5.alpha.el7.ppc64le
libkkc-data-0.3.1-9.el7.ppc64le
hicolor-icon-theme-0.12-7.el7.noarch
perl-Newt-1.08-36.el7.ppc64le
libexif-0.6.21-6.el7.ppc64le
gtk3-devel-3.22.10-4.el7.ppc64le
gvfs-mtp-1.30.4-3.el7.ppc64le
ncompress-4.2.4.4-3.el7.ppc64le
libXcomposite-0.4.4-4.1.el7.ppc64le
python-decorator-3.4.0-3.el7.noarch
perl-Business-ISBN-Data-20120719.001-2.el7.noarch
cpio-2.11-24.el7.ppc64le
mesa-libGLU-9.0.0-4.el7.ppc64le
baobab-3.22.1-1.el7.ppc64le
device-mapper-libs-1.02.140-8.el7.ppc64le
libXtst-1.2.3-1.el7.ppc64le
ModemManager-glib-1.6.0-2.el7.ppc64le
perl-HTML-Parser-3.71-4.el7.ppc64le
libical-1.0.1-1.el7.ppc64le
xorg-x11-xinit-1.3.4-1.el7.ppc64le
gstreamer1-plugins-base-devel-1.10.4-1.el7.ppc64le
libdrm-2.4.74-1.el7.ppc64le
libXfixes-devel-5.0.3-1.el7.ppc64le
python-gssapi-1.2.0-3.el7.ppc64le
perl-Text-Unidecode-0.04-20.el7.noarch
hunspell-1.3.2-15.el7.ppc64le
kde-settings-19-23.5.el7.centos.noarch
perl-App-cpanminus-1.6922-2.el7.noarch
parted-3.1-28.el7.ppc64le
mesa-libGL-17.0.1-6.20170307.el7.ppc64le
elfutils-libelf-devel-0.168-8.el7.ppc64le
perl-Net-LibIDN-0.12-15.el7.ppc64le
apr-1.4.8-3.el7.ppc64le
kdepimlibs-4.10.5-4.el7.ppc64le
virt-top-1.0.8-23.el7.ppc64le
samba-client-libs-4.6.2-8.el7.ppc64le
gstreamer-plugins-base-0.10.36-10.el7.ppc64le
json-glib-devel-1.2.6-1.el7.ppc64le
perl-autodie-2.16-2.el7.noarch
tar-1.26-32.el7.ppc64le
ksysguard-libs-4.11.19-8.el7.ppc64le
rdma-core-devel-13-7.el7.ppc64le
accountsservice-0.6.45-2.el7.ppc64le
libxklavier-5.4-7.el7.ppc64le
libxml2-devel-2.9.1-6.el7_2.3.ppc64le
ghostscript-fonts-5.50-32.el7.noarch
libassuan-2.1.0-3.el7.ppc64le
libkipi-devel-4.10.5-3.el7.ppc64le
python-smbc-1.0.13-7.el7.ppc64le
initscripts-9.49.39-1.el7.ppc64le
qt3-3.3.8b-51.el7.ppc64le
yum-metadata-parser-1.1.4-10.el7.ppc64le
device-mapper-persistent-data-0.7.0-0.1.rc6.el7.ppc64le
adwaita-icon-theme-3.22.0-1.el7.noarch
kdepim-4.10.5-6.el7.ppc64le
postfix-2.10.1-6.el7.ppc64le
abrt-addon-pstoreoops-2.1.11-48.el7.centos.ppc64le
freerdp-libs-1.0.2-10.el7.ppc64le
langtable-python-0.0.31-3.el7.noarch
tcp_wrappers-7.6-77.el7.ppc64le
lm_sensors-libs-3.4.0-4.20160601gitf9185e5.el7.ppc64le
kde-style-oxygen-4.11.19-8.el7.ppc64le
powertop-2.3-12.el7.ppc64le
wpa_supplicant-2.6-5.el7.ppc64le
gtk3-3.22.10-4.el7.ppc64le
boost-python-1.53.0-27.el7.ppc64le
keyutils-libs-devel-1.5.8-3.el7.ppc64le
libdvdread-5.0.3-3.el7.ppc64le
im-chooser-common-1.6.4-4.el7.ppc64le
aic94xx-firmware-30-6.el7.noarch
media-player-info-17-4.el7.noarch
compat-gnome-desktop314-3.14.2-1.el7.ppc64le
harfbuzz-1.3.2-1.el7.ppc64le
libgcrypt-devel-1.5.3-14.el7.ppc64le
groff-base-1.22.2-8.el7.ppc64le
sane-backends-1.0.24-9.el7.ppc64le
setuptool-1.19.11-8.el7.ppc64le
ebtables-2.0.10-15.el7.ppc64le
libchamplain-0.12.15-1.el7.ppc64le
boost-math-1.53.0-27.el7.ppc64le
libuser-0.60-7.el7_1.ppc64le
boost-date-time-1.53.0-27.el7.ppc64le
espeak-1.47.11-4.el7.ppc64le
tbb-devel-4.1-9.20130314.el7.ppc64le
grub2-tools-minimal-2.02-0.64.el7.centos.ppc64le
gjs-1.46.0-1.el7.ppc64le
libsss_autofs-1.15.2-50.el7.ppc64le
deltarpm-3.6-3.el7.ppc64le
libnl-1.1.4-3.el7.ppc64le
libgpod-0.8.2-12.el7.ppc64le
postgresql-devel-9.2.21-1.el7.ppc64le
libibcm-13-7.el7.ppc64le
abrt-gui-libs-2.1.11-48.el7.centos.ppc64le
libxkbcommon-0.7.1-1.el7.ppc64le
passwd-0.79-4.el7.ppc64le
lsvpd-1.7.8-1.el7.ppc64le
fprintd-0.5.0-4.0.el7_0.ppc64le
hunspell-en-0.20121024-6.el7.noarch
qca-ossl-2.0.0-0.19.beta3.el7.ppc64le
libdmapsharing-2.9.37-1.el7.ppc64le
ortp-0.20.0-10.el7.ppc64le
python-pycurl-7.19.0-19.el7.ppc64le
perl-Pod-Escapes-1.04-292.el7.noarch
pcp-3.11.8-7.el7.ppc64le
libblkid-devel-2.23.2-43.el7.ppc64le
dracut-network-033-502.el7.ppc64le
pyatspi-2.20.3-1.el7.noarch
systemtap-sdt-devel-3.1-3.el7.ppc64le
check-0.9.9-5.el7.ppc64le
perl-threads-shared-1.43-6.el7.ppc64le
gnome-shell-extension-common-3.22.2-10.el7.noarch
gnome-icon-theme-symbolic-3.12.0-2.el7.noarch
abrt-cli-2.1.11-48.el7.centos.ppc64le
festival-speechtools-libs-1.2.96-28.el7.ppc64le
python-slip-dbus-0.4.0-2.el7.noarch
mesa-private-llvm-3.9.1-3.el7.ppc64le
perl-Time-Local-1.2300-2.el7.noarch
yelp-3.22.0-1.el7.ppc64le
fuse-devel-2.9.2-8.el7.ppc64le
dnsmasq-2.76-2.el7.ppc64le
festvox-slt-arctic-hts-0.20061229-28.el7.noarch
libtasn1-devel-4.10-1.el7.ppc64le
libgudev1-219-42.el7.ppc64le
perl-version-0.99.07-2.el7.ppc64le
libvirt-daemon-driver-qemu-3.2.0-14.el7.ppc64le
ps_mem-3.1-7.el7.noarch
rtkit-0.11-10.el7.ppc64le
abrt-gui-2.1.11-48.el7.centos.ppc64le
nettle-devel-2.7.1-8.el7.ppc64le
perl-ExtUtils-Manifest-1.61-244.el7.noarch
libreswan-3.20-3.el7.ppc64le
python-pyudev-0.15-9.el7.noarch
appstream-data-7-20170301.el7.noarch
powerpc-utils-1.3.3-4.el7.ppc64le
setup-2.8.71-7.el7.noarch
enscript-1.6.6-6.el7.ppc64le
libgexiv2-0.10.4-2.el7.ppc64le
perl-Digest-SHA-5.85-4.el7.ppc64le
upower-0.99.4-2.el7.ppc64le
dhcp-libs-4.2.5-58.el7.centos.ppc64le
kbd-1.15.5-13.el7.ppc64le
phonon-backend-gstreamer-4.6.3-3.el7.ppc64le
dejavu-fonts-common-2.33-6.el7.noarch
libaio-devel-0.3.109-13.el7.ppc64le
grubby-8.28-23.el7.ppc64le
perl-CPAN-Meta-2.120921-5.el7.noarch
libmusicbrainz5-5.0.1-9.el7.ppc64le
liberation-mono-fonts-1.07.2-15.el7.noarch
fcoe-utils-1.0.32-1.el7.ppc64le
gvfs-afc-1.30.4-3.el7.ppc64le
m17n-db-1.6.4-3.el7.noarch
time-1.7-45.el7.ppc64le
python-configobj-4.7.2-7.el7.noarch
perl-Log-Message-0.08-3.el7.noarch
glib-networking-2.50.0-1.el7.ppc64le
gcc-4.8.5-16.el7.ppc64le
gnome-classic-session-3.22.2-10.el7.noarch
libglade2-2.6.4-11.el7.ppc64le
langtable-data-0.0.31-3.el7.noarch
dejavu-serif-fonts-2.33-6.el7.noarch
python-requests-2.6.0-1.el7_1.noarch
perl-HTML-Tagset-3.20-15.el7.noarch
gssdp-1.0.1-1.el7.ppc64le
perl-CPANPLUS-Dist-Build-0.70-3.el7.noarch
brasero-nautilus-3.12.1-2.el7.ppc64le
evolution-data-server-3.22.7-6.el7.ppc64le
khmeros-fonts-common-5.0-17.el7.noarch
dejavu-sans-fonts-2.33-6.el7.noarch
python-kmod-0.9-4.el7.ppc64le
lzop-1.03-10.el7.ppc64le
telepathy-salut-0.8.1-6.el7.ppc64le
tbb-4.1-9.20130314.el7.ppc64le
kdegraphics-devel-4.10.5-3.el7.noarch
libcryptui-3.12.2-1.el7.ppc64le
ncurses-base-5.9-13.20130511.el7.noarch
lohit-nepali-fonts-2.5.3-2.el7.noarch
python-configshell-1.1.fb23-3.el7.noarch
acl-2.2.51-12.el7.ppc64le
python-rtslib-2.1.fb63-2.el7.noarch
libreport-plugin-rhtsupport-2.1.11-38.el7.centos.ppc64le
imsettings-qt-1.6.3-9.el7.ppc64le
webkitgtk3-2.4.11-2.el7.ppc64le
libsepol-2.5-6.el7.ppc64le
smc-meera-fonts-6.0-7.el7.noarch
python-mako-0.8.1-2.el7.noarch
pinentry-0.8.1-17.el7.ppc64le
alsa-tools-firmware-1.1.0-1.el7.ppc64le
libgdither-0.6-8.el7.ppc64le
ibus-libpinyin-1.6.91-4.el7.ppc64le
libXp-devel-1.0.2-2.1.el7.ppc64le
nspr-4.13.1-1.0.el7_3.ppc64le
cscope-15.8-10.el7.ppc64le
m2crypto-0.21.1-17.el7.ppc64le
libatomic-4.8.5-16.el7.ppc64le
opencc-0.4.3-3.el7.ppc64le
sbc-1.0-5.el7.ppc64le
SDL-devel-1.2.15-14.el7.ppc64le
vorbis-tools-1.4.0-12.el7.ppc64le
bzip2-libs-1.0.6-13.el7.ppc64le
google-crosextra-carlito-fonts-1.103-0.2.20130920.el7.noarch
nmap-ncat-6.40-7.el7.ppc64le
krb5-libs-1.15.1-8.el7.ppc64le
sssd-krb5-1.15.2-50.el7.ppc64le
cups-filters-libs-1.0.35-22.el7.ppc64le
virt-manager-1.4.1-7.el7.noarch
evince-3.22.1-5.el7.ppc64le
readline-6.2-10.el7.ppc64le
ctags-5.8-13.el7.ppc64le
sound-theme-freedesktop-0.8-3.el7.noarch
ruby-libs-2.0.0.648-30.el7.ppc64le
pth-2.0.7-23.el7.ppc64le
rubygems-2.0.14.1-30.el7.noarch
gnome-dictionary-3.20.0-1.el7.ppc64le
xorg-x11-drv-evdev-2.10.5-2.1.el7.ppc64le
audit-libs-2.7.6-3.el7.ppc64le
iwl135-firmware-18.168.6.1-56.el7.noarch
python-nss-0.16.0-3.el7.ppc64le
json-glib-1.2.6-1.el7.ppc64le
flatpak-libs-0.8.7-1.el7.ppc64le
libutempter-1.1.6-4.el7.ppc64le
ekiga-4.0.1-7.el7.ppc64le
easymock2-2.5.2-12.el7.noarch
keyutils-libs-1.5.8-3.el7.ppc64le
iwl1000-firmware-39.31.5.1-56.el7.noarch
teamd-1.25-5.el7.ppc64le
telepathy-glib-0.24.0-1.el7.ppc64le
PackageKit-yum-1.1.5-1.el7.centos.ppc64le
virt-what-1.13-10.el7.ppc64le
ppc64-diag-2.7.3-3.el7.ppc64le
libpurple-2.10.11-5.el7.ppc64le
libffi-3.0.13-18.el7.ppc64le
iwl2000-firmware-18.168.6.1-56.el7.noarch
perl-YAML-0.84-5.el7.noarch
libxml2-python-2.9.1-6.el7_2.3.ppc64le
lsscsi-0.27-6.el7.ppc64le
systemtap-client-3.1-3.el7.ppc64le
virt-viewer-5.0-7.el7.ppc64le
dbusmenu-qt-0.9.2-7.el7.ppc64le
libtar-1.2.11-29.el7.ppc64le
ccache-3.3.4-1.el7.ppc64le
perl-DBD-SQLite-1.39-3.el7.ppc64le
gnome-icon-theme-3.12.0-1.el7.noarch
gdk-pixbuf2-2.36.5-1.el7.ppc64le
libpath_utils-0.2.1-27.el7.ppc64le
gvfs-archive-1.30.4-3.el7.ppc64le
gnome-online-accounts-devel-3.22.5-1.el7.ppc64le
yajl-2.0.4-4.el7.ppc64le
perl-Pod-Coverage-0.23-3.el7.noarch
libselinux-python-2.5-11.el7.ppc64le
libX11-devel-1.6.5-1.el7.ppc64le
qrencode-libs-3.4.1-3.el7.ppc64le
gnome-system-log-3.9.90-3.el7.ppc64le
mesa-libGLU-devel-9.0.0-4.el7.ppc64le
boost-system-1.53.0-27.el7.ppc64le
perl-HTTP-Message-6.06-6.el7.noarch
cracklib-2.9.0-11.el7.ppc64le
libXcursor-1.1.14-8.el7.ppc64le
dbus-1.6.12-17.el7.ppc64le
libnotify-devel-0.7.7-1.el7.ppc64le
ibus-gtk3-1.5.3-13.el7.ppc64le
libv4l-0.9.5-4.el7.ppc64le
perl-Time-Piece-1.20.1-292.el7.ppc64le
cracklib-dicts-2.9.0-11.el7.ppc64le
startup-notification-0.12-8.el7.ppc64le
dconf-0.26.0-2.el7.ppc64le
net-snmp-devel-5.7.2-28.el7.ppc64le
kate-part-4.10.5-4.el7.ppc64le
orc-0.4.26-1.el7.ppc64le
kernel-devel-3.10.0-693.el7.ppc64le
avahi-gobject-0.6.31-17.el7.ppc64le
cairo-gobject-1.14.8-2.el7.ppc64le
httpd-2.4.6-67.el7.centos.ppc64le
subversion-1.7.14-10.el7.ppc64le
kdepimlibs-akonadi-4.10.5-4.el7.ppc64le
gdbm-1.10-8.el7.ppc64le
perl-File-CheckTree-4.42-3.el7.noarch
atk-devel-2.22.0-3.el7.ppc64le
java-1.8.0-openjdk-devel-1.8.0.131-11.b12.el7.ppc64le
abrt-dbus-2.1.11-48.el7.centos.ppc64le
qt-mysql-4.8.5-13.el7.ppc64le
libkdcraw-4.10.5-4.el7.ppc64le
libaio-0.3.109-13.el7.ppc64le
urw-fonts-2.4-16.el7.noarch
libgee06-0.6.8-3.el7.ppc64le
libXrandr-devel-1.5.1-2.el7.ppc64le
cronie-anacron-1.4.11-17.el7.ppc64le
mlocate-0.26-6.el7.ppc64le
kdesdk-okteta-devel-4.10.5-6.el7.ppc64le
iso-codes-3.46-2.el7.noarch
cpp-4.8.5-16.el7.ppc64le
e2fsprogs-1.42.9-10.el7.ppc64le
at-spi2-atk-2.22.0-2.el7.ppc64le
libstoragemgmt-python-clibs-1.4.0-3.el7.ppc64le
PackageKit-command-not-found-1.1.5-1.el7.centos.ppc64le
kdenetwork-kopete-devel-4.10.5-8.el7_0.ppc64le
libmnl-1.0.3-7.el7.ppc64le
tcp_wrappers-devel-7.6-77.el7.ppc64le
python-dns-1.12.0-4.20150617git465785f.el7.noarch
libXinerama-devel-1.1.3-2.1.el7.ppc64le
libibverbs-13-7.el7.ppc64le
net-tools-2.0-0.22.20131004git.el7.ppc64le
kde-workspace-libs-4.11.19-8.el7.ppc64le
libwebp-0.3.0-7.el7.ppc64le
libattr-devel-2.4.46-12.el7.ppc64le
libkadm5-1.15.1-8.el7.ppc64le
gcr-3.20.0-1.el7.ppc64le
colord-1.3.4-1.el7.ppc64le
rsyslog-8.24.0-12.el7.ppc64le
im-chooser-1.6.4-4.el7.ppc64le
boost-filesystem-1.53.0-27.el7.ppc64le
libgpg-error-devel-1.12-3.el7.ppc64le
harfbuzz-icu-1.3.2-1.el7.ppc64le
libpeas-gtk-1.20.0-1.el7.ppc64le
abrt-addon-python-2.1.11-48.el7.centos.ppc64le
selinux-policy-targeted-3.13.1-166.el7.noarch
libksane-4.10.5-4.el7.ppc64le
m4-1.4.16-10.el7.ppc64le
xmlrpc-c-client-1.32.5-1905.svn2451.el7.ppc64le
sysvinit-tools-2.88-14.dsf.el7.ppc64le
libnma-1.8.0-3.el7.ppc64le
os-prober-1.58-9.el7.ppc64le
libproxy-mozjs-0.4.11-10.el7.ppc64le
speech-dispatcher-0.7.1-15.el7.ppc64le
boost-signals-1.53.0-27.el7.ppc64le
python-ldap-2.4.15-2.el7.ppc64le
libvpx-1.3.0-5.el7_0.ppc64le
nm-connection-editor-1.8.0-3.el7.ppc64le
NetworkManager-team-1.8.0-9.el7.ppc64le
perf-3.10.0-693.el7.ppc64le
libgsf-1.14.26-7.el7.ppc64le
libpfm-4.7.0-4.el7.ppc64le
postgresql-9.2.21-1.el7.ppc64le
ethtool-4.8-1.el7.ppc64le
xorg-x11-server-utils-7.7-20.el7.ppc64le
attica-0.4.2-1.el7.ppc64le
xfsdump-3.1.4-1.el7.ppc64le
firewalld-filesystem-0.4.4.4-6.el7.noarch
libXfont2-2.0.1-2.el7.ppc64le
net-snmp-agent-libs-5.7.2-28.el7.ppc64le
tcl-devel-8.5.13-8.el7.ppc64le
libgxps-0.2.5-1.el7.ppc64le
cyrus-sasl-devel-2.1.26-21.el7.ppc64le
hmaccalc-0.9.13-4.el7.ppc64le
libwacom-data-0.24-1.el7.noarch
perl-Pod-Usage-1.63-3.el7.noarch
libitm-4.8.5-16.el7.ppc64le
python-yubico-1.2.3-1.el7.noarch
libXxf86vm-devel-1.1.4-1.el7.ppc64le
abrt-tui-2.1.11-48.el7.centos.ppc64le
pinfo-0.6.10-9.el7.ppc64le
gnome-shell-extension-user-theme-3.22.2-10.el7.noarch
perl-File-Path-2.09-2.el7.noarch
xorg-x11-fonts-Type1-7.5-9.el7.noarch
python-firewall-0.4.4.4-6.el7.noarch
libXres-1.0.7-2.1.el7.ppc64le
libcgroup-tools-0.41-13.el7.ppc64le
libnl-devel-1.1.4-3.el7.ppc64le
gnome-user-docs-3.22.0-1.el7.noarch
perl-Pod-Simple-3.28-4.el7.noarch
systemd-libs-219-42.el7.ppc64le
ncurses-devel-5.9-13.20130511.el7.ppc64le
mesa-libEGL-devel-17.0.1-6.20170307.el7.ppc64le
audit-2.7.6-3.el7.ppc64le
iotop-0.6-2.el7.noarch
libvirt-daemon-driver-storage-logical-3.2.0-14.el7.ppc64le
perl-Module-CoreList-2.76.02-292.el7.noarch
libmbim-1.14.0-2.el7.ppc64le
libgcc-4.8.5-16.el7.ppc64le
xdg-desktop-portal-0.5-2.el7.ppc64le
perl-Module-Load-0.24-3.el7.noarch
caribou-gtk3-module-0.4.21-1.el7.ppc64le
sqlite-devel-3.7.17-8.el7.ppc64le
centos-indexhtml-7-9.el7.centos.noarch
elfutils-0.168-8.el7.ppc64le
centos-release-7-4.1708.el7.centos.ppc64le
trousers-0.3.14-2.el7.ppc64le
perl-Thread-Queue-3.02-2.el7.noarch
python-meh-gui-0.25.2-1.el7.noarch
gom-0.3.2-1.el7.ppc64le
lldpad-1.0.1-3.git036e314.el7.ppc64le
libgusb-0.2.9-1.el7.ppc64le
liberation-fonts-common-1.07.2-15.el7.noarch
libimobiledevice-1.2.0-1.el7.ppc64le
perl-Module-Pluggable-4.8-3.el7.noarch
ghostscript-cups-9.07-28.el7.ppc64le
osinfo-db-tools-1.1.0-1.el7.ppc64le
kbd-misc-1.15.5-13.el7.noarch
dhcp-common-4.2.5-58.el7.centos.ppc64le
control-center-filesystem-3.22.2-5.el7.ppc64le
libvirt-glib-1.0.0-1.el7.ppc64le
perl-CPAN-Meta-Requirements-2.122-7.el7.noarch
PyQt4-4.10.1-13.el7.ppc64le
btrfs-progs-4.9.1-1.el7.ppc64le
anaconda-gui-21.48.22.121-1.el7.centos.ppc64le
libatasmart-0.19-6.el7.ppc64le
shared-desktop-ontologies-0.11.0-2.el7.noarch
libvirt-daemon-config-nwfilter-3.2.0-14.el7.ppc64le
autoconf-2.69-11.el7.noarch
gnome-terminal-3.22.1-2.el7.ppc64le
python-cups-1.9.63-6.el7.ppc64le
intltool-0.50.2-7.el7.noarch
glibc-headers-2.17-196.el7.ppc64le
kdesdk-common-4.10.5-6.el7.noarch
libvirt-daemon-driver-secret-3.2.0-14.el7.ppc64le
perl-Locale-Maketext-Simple-0.21-292.el7.noarch
gnome-keyring-3.20.0-3.el7.ppc64le
python-sss-murmur-1.15.2-50.el7.ppc64le
vim-enhanced-7.4.160-2.el7.ppc64le
perl-ExtUtils-MakeMaker-6.68-3.el7.noarch
emacs-filesystem-24.3-19.el7_3.noarch
libvncserver-0.9.9-9.el7_0.1.ppc64le
perl-Object-Accessor-0.42-292.el7.noarch
gnome-desktop3-3.22.2-2.el7.ppc64le
python-backports-1.0-8.el7.ppc64le
evolution-help-3.22.6-10.el7.noarch
systemtap-devel-3.1-3.el7.ppc64le
langtable-0.0.31-3.el7.noarch
geocode-glib-3.20.1-1.el7.ppc64le
perl-Compress-Raw-Bzip2-2.061-3.el7.ppc64le
pygtk2-libglade-2.24.0-9.el7.ppc64le
python-urllib3-1.10.2-3.el7.noarch
orca-3.6.3-4.el7.ppc64le
perl-File-Fetch-0.42-2.el7.noarch
latencytop-common-0.5-13.el7.ppc64le
geoclue2-libs-2.4.5-1.el7.ppc64le
perl-Module-Loaded-0.08-292.el7.noarch
webkitgtk4-2.14.7-2.el7.ppc64le
python-paste-1.7.5.1-9.20111221hg1498.el7.noarch
totem-nautilus-3.22.1-1.el7.ppc64le
libtool-2.4.2-22.el7_3.ppc64le
smc-fonts-common-6.0-7.el7.noarch
libnice-0.1.3-4.el7.ppc64le
libdvdnav-5.0.3-1.el7.ppc64le
folks-0.11.3-1.el7.ppc64le
python-ipaddr-2.1.11-1.el7.noarch
xorg-x11-utils-7.5-22.el7.ppc64le
oxygen-icon-theme-4.10.5-2.el7.noarch
libkkc-common-0.3.1-9.el7.noarch
libgovirt-0.3.3-5.el7.ppc64le
boost-timer-1.53.0-27.el7.ppc64le
gnome-packagekit-common-3.22.1-2.el7.ppc64le
javapackages-tools-3.4.1-11.el7.noarch
sane-backends-devel-1.0.24-9.el7.ppc64le
konkretcmpi-0.9.1-5.el7.ppc64le
perl-srpm-macros-1-8.el7.noarch
chrony-3.1-2.el7.centos.ppc64le
fuse-2.9.2-8.el7.ppc64le
evolution-3.22.6-10.el7.ppc64le
python-urwid-1.1.1-3.el7.ppc64le
shotwell-0.24.5-1.el7.ppc64le
libreport-web-2.1.11-38.el7.centos.ppc64le
glibc-2.17-196.el7.ppc64le
usb_modeswitch-data-20160612-2.el7.noarch
patch-2.7.1-8.el7.ppc64le
file-roller-3.22.3-1.el7.ppc64le
python-netaddr-0.7.5-7.el7.noarch
ibus-table-chinese-1.4.6-3.el7.noarch
libreport-plugin-reportuploader-2.1.11-38.el7.centos.ppc64le
pcre-8.32-17.el7.ppc64le
libvirt-daemon-driver-network-3.2.0-14.el7.ppc64le
cyrus-sasl-plain-2.1.26-21.el7.ppc64le
glade-libs-3.20.0-1.el7.ppc64le
python-markupsafe-0.11-10.el7.ppc64le
kdenetwork-devel-4.10.5-8.el7_0.noarch
libreport-plugin-ureport-2.1.11-38.el7.centos.ppc64le
dbus-libs-1.6.12-17.el7.ppc64le
alsa-firmware-1.0.28-2.el7.noarch
mozjs17-17.0.0-19.el7.ppc64le
avahi-ui-gtk3-0.6.31-17.el7.ppc64le
python-cffi-1.6.0-5.el7.ppc64le
xdg-user-dirs-gtk-0.10-4.el7.ppc64le
gavl-1.4.0-4.el7.ppc64le
libjpeg-turbo-1.2.90-5.el7.ppc64le
device-mapper-multipath-0.4.9-111.el7.ppc64le
libcdio-0.92-1.el7.ppc64le
pulseaudio-module-bluetooth-10.0-3.el7.ppc64le
pytalloc-2.1.9-1.el7.ppc64le
ibus-sayura-1.3.2-3.el7.ppc64le
checkpolicy-2.5-4.el7.ppc64le
libICE-1.0.9-9.el7.ppc64le
libvirt-daemon-driver-interface-3.2.0-14.el7.ppc64le
libunistring-0.9.3-9.el7.ppc64le
libXScrnSaver-devel-1.2.2-6.1.el7.ppc64le
openlmi-python-base-0.5.0-4.el7.noarch
PyQt4-devel-4.10.1-13.el7.ppc64le
libndp-1.2-7.el7.ppc64le
libxml2-2.9.1-6.el7_2.3.ppc64le
sssd-krb5-common-1.15.2-50.el7.ppc64le
ncurses-5.9-13.20130511.el7.ppc64le
icedax-1.1.11-23.el7.ppc64le
libmsn-4.2.1-7.el7.ppc64le
evolution-data-server-devel-3.22.7-6.el7.ppc64le
poppler-0.26.5-16.el7.ppc64le
sed-4.2.2-5.el7.ppc64le
sssd-ldap-1.15.2-50.el7.ppc64le
fontconfig-2.10.95-11.el7.ppc64le
pinentry-qt-0.8.1-17.el7.ppc64le
cyrus-sasl-scram-2.1.26-21.el7.ppc64le
paps-0.6.8-28.el7.1.ppc64le
libyaml-0.1.4-11.el7_0.ppc64le
libgpg-error-1.12-3.el7.ppc64le
sgpio-1.2.0.10-13.el7.ppc64le
alsa-lib-1.1.3-3.el7.ppc64le
gutenprint-5.2.9-18.el7.ppc64le
openslp-2.0.0-6.el7.ppc64le
ruby-irb-2.0.0.648-30.el7.noarch
libgcrypt-1.5.3-14.el7.ppc64le
python-blivet-0.61.15.65-1.el7.noarch
gzip-1.5-9.el7.ppc64le
xorg-x11-drv-void-1.4.1-2.el7.ppc64le
nss-pem-1.0.3-4.el7.ppc64le
rubygem-rdoc-4.0.0-30.el7.noarch
libcap-ng-0.7.5-4.el7.ppc64le
rpm-build-libs-4.11.3-25.el7.ppc64le
shared-mime-info-1.8-3.el7.ppc64le
xorg-x11-drv-v4l-0.2.0-47.el7.ppc64le
nss-tools-3.28.4-8.el7.ppc64le
libsemanage-2.5-8.el7.ppc64le
libxcb-1.12-1.el7.ppc64le
flatpak-0.8.7-1.el7.ppc64le
gstreamer1-1.10.4-2.el7.ppc64le
xorg-x11-drv-nouveau-1.0.13-3.el7.ppc64le
sgml-common-0.6.3-39.el7.noarch
util-linux-2.23.2-43.el7.ppc64le
libtdb-1.3.12-2.el7.ppc64le
rpm-devel-4.11.3-25.el7.ppc64le
gobject-introspection-1.50.0-1.el7.ppc64le
qdox-1.12.1-10.el7.noarch
libteam-1.25-5.el7.ppc64le
openssh-clients-7.4p1-11.el7.ppc64le
libattr-2.4.46-12.el7.ppc64le
python-meh-0.25.2-1.el7.noarch
avahi-glib-0.6.31-17.el7.ppc64le
rhino-1.7R5-1.el7.noarch
perl-Pod-Checker-1.60-2.el7.noarch
rarian-0.8.1-11.el7.ppc64le
gmp-6.0.0-15.el7.ppc64le
createrepo-0.9.9-28.el7.noarch
python-gobject-base-3.22.0-1.el7.ppc64le
telepathy-haze-0.8.0-1.el7.ppc64le
perl-Version-Requirements-0.101022-244.el7.noarch
tog-pegasus-2.14.1-5.el7.ppc64le
lua-5.1.4-15.el7.ppc64le
libburn-1.2.8-4.el7.ppc64le
openssl-1.0.2k-8.el7.ppc64le
dleyna-server-0.5.0-1.el7.ppc64le
perl-IO-HTML-1.00-2.el7.noarch
libsemanage-python-2.5-8.el7.ppc64le
libidn-1.28-4.el7.ppc64le
nss-devel-3.28.4-8.el7.ppc64le
net-snmp-libs-5.7.2-28.el7.ppc64le
paps-libs-0.6.8-28.el7.1.ppc64le
perl-DBIx-Simple-1.35-7.el7.noarch
lzo-minilzo-2.06-8.el7.ppc64le
libref_array-0.1.5-27.el7.ppc64le
libX11-1.6.5-1.el7.ppc64le
xdg-utils-1.1.0-0.17.20120809git.el7.noarch
harfbuzz-devel-1.3.2-1.el7.ppc64le
perl-CGI-3.63-4.el7.noarch
libini_config-1.3.0-27.el7.ppc64le
xmlrpc-c-1.32.5-1905.svn2451.el7.ppc64le
libXfixes-5.0.3-1.el7.ppc64le
glibmm24-2.50.0-1.el7.ppc64le
webkitgtk4-devel-2.14.7-2.el7.ppc64le
perl-Devel-Symdump-2.10-2.el7.noarch
libpipeline-1.2.3-3.el7.ppc64le
mpfr-3.1.1-4.el7.ppc64le
libXrandr-1.5.1-2.el7.ppc64le
cyrus-sasl-gssapi-2.1.26-21.el7.ppc64le
gtk2-devel-2.24.31-1.el7.ppc64le
perl-URI-1.60-9.el7.noarch
kpartx-0.4.9-111.el7.ppc64le
file-libs-5.11-33.el7.ppc64le
libXext-devel-1.3.3-3.el7.ppc64le
libSM-devel-1.2.2-2.el7.ppc64le
qt-devel-4.8.5-13.el7.ppc64le
perl-HTTP-Date-6.02-8.el7.noarch
dracut-033-502.el7.ppc64le
libtool-ltdl-2.4.2-22.el7_3.ppc64le
libcanberra-0.30-5.el7.ppc64le
python-enum34-1.0.4-1.el7.noarch
libxkbfile-devel-1.0.9-3.el7.ppc64le
perl-HTTP-Cookies-6.01-5.el7.noarch
polkit-0.112-12.el7_3.ppc64le
libtheora-1.1.1-8.el7.ppc64le
libXpm-3.5.12-1.el7.ppc64le
libevent-2.0.21-4.el7.ppc64le
ibus-gtk2-1.5.3-13.el7.ppc64le
kdelibs-common-4.14.8-6.el7_3.ppc64le
systemd-sysv-219-42.el7.ppc64le
diffutils-3.3-4.el7.ppc64le
libXv-1.0.11-1.el7.ppc64le
pam-1.1.8-18.el7.ppc64le
imsettings-gsettings-1.6.3-9.el7.ppc64le
perl-YAML-Tiny-1.51-6.el7.noarch
GConf2-3.2.6-8.el7.ppc64le
libtasn1-4.10-1.el7.ppc64le
libxkbfile-1.0.9-3.el7.ppc64le
gettext-libs-0.19.8.1-2.el7.ppc64le
kdelibs-ktexteditor-4.14.8-6.el7_3.ppc64le
perl-Env-1.04-2.el7.noarch
libpciaccess-0.13.4-3.el7_3.ppc64le
nss-softokn-3.28.3-6.el7.ppc64le
pango-1.40.4-1.el7.ppc64le
telepathy-logger-0.8.0-5.el7.ppc64le
nepomuk-core-4.10.5-5.el7.ppc64le
perl-Net-HTTP-6.06-2.el7.noarch
samba-common-4.6.2-8.el7.noarch
libsigc++20-2.10.0-1.el7.ppc64le
cogl-1.22.2-1.el7.ppc64le
pcre-devel-8.32-17.el7.ppc64le
kdenetwork-kopete-libs-4.10.5-8.el7_0.ppc64le
icoutils-0.31.3-1.el7_3.ppc64le
pyparted-3.9-13.el7.ppc64le
apr-util-1.5.2-6.el7.ppc64le
giflib-4.1.6-9.el7.ppc64le
expat-devel-2.1.0-10.el7_3.ppc64le
kdesdk-okteta-4.10.5-6.el7.ppc64le
papi-5.2.0-23.el7.ppc64le
abrt-python-2.1.11-48.el7.centos.ppc64le
lzo-2.06-8.el7.ppc64le
java-1.8.0-openjdk-1.8.0.131-11.b12.el7.ppc64le
libffi-devel-3.0.13-18.el7.ppc64le
kwin-libs-4.11.19-8.el7.ppc64le
xorg-x11-font-utils-7.5-20.el7.ppc64le
iscsi-initiator-utils-iscsiuio-6.2.0.874-4.el7.ppc64le
file-5.11-33.el7.ppc64le
libXft-devel-2.3.2-2.el7.ppc64le
libipa_hbac-1.15.2-50.el7.ppc64le
kwin-gles-libs-4.11.19-8.el7.ppc64le
libsamplerate-0.1.8-6.el7.ppc64le
cronie-1.4.11-17.el7.ppc64le
xml-common-0.6.3-39.el7.noarch
ghostscript-9.07-28.el7.ppc64le
libpinyin-data-0.9.93-4.el7.ppc64le
kde-runtime-libs-4.10.5-8.el7.ppc64le
ipset-6.29-1.el7.ppc64le
plymouth-0.8.9-0.28.20140113.el7.centos.ppc64le
taglib-1.8-7.20130218git.el7.ppc64le
at-spi2-core-2.22.0-1.el7.ppc64le
xfsprogs-4.5.0-12.el7.ppc64le
kdepim-runtime-4.10.5-3.el7.ppc64le
libusbmuxd-1.0.10-5.el7.ppc64le
libstoragemgmt-python-1.4.0-3.el7.noarch
libseccomp-2.3.1-3.el7.ppc64le
gstreamer1-plugins-good-1.10.4-2.el7.ppc64le
pyusb-1.0.0-0.11.b1.el7.noarch
nepomuk-core-devel-4.10.5-5.el7.ppc64le
libofa-0.9.3-24.el7.ppc64le
device-mapper-event-1.02.140-8.el7.ppc64le
librtas-2.0.1-1.el7.ppc64le
libXcomposite-devel-0.4.4-4.1.el7.ppc64le
audit-libs-python-2.7.6-3.el7.ppc64le
okular-libs-4.10.5-4.el7.ppc64le
gdisk-0.8.6-5.el7.ppc64le
libibumad-13-7.el7.ppc64le
libsndfile-1.0.25-10.el7.ppc64le
libXxf86misc-1.0.3-7.1.el7.ppc64le
pyparsing-1.5.6-9.el7.noarch
kdesdk-kmtrace-libs-4.10.5-6.el7.ppc64le
attr-2.4.46-12.el7.ppc64le
rpcbind-0.2.0-42.el7.ppc64le
slang-2.2.4-11.el7.ppc64le
gtk2-2.24.31-1.el7.ppc64le
libssh2-1.4.3-10.el7_2.1.ppc64le
kdesdk-kompare-4.10.5-6.el7.ppc64le
openssl-devel-1.0.2k-8.el7.ppc64le
bluez-5.44-2.el7.ppc64le
boost-thread-1.53.0-27.el7.ppc64le
clutter-gtk-1.8.2-1.el7.ppc64le
soundtouch-1.4.0-9.el7.ppc64le
ibus-table-1.5.0-5.el7.noarch
setools-libs-3.3.8-1.1.el7.ppc64le
ppp-2.4.5-33.el7.ppc64le
libvpd-2.2.5-1.el7.ppc64le
clutter-gst3-3.0.22-1.el7.ppc64le
boost-test-1.53.0-27.el7.ppc64le
libgphoto2-2.5.2-5.el7.ppc64le
libcurl-7.29.0-42.el7.ppc64le
libmtp-1.1.6-5.el7.ppc64le
unzip-6.0-16.el7.ppc64le
vte291-0.46.2-1.el7.ppc64le
boost-random-1.53.0-27.el7.ppc64le
hplip-libs-3.15.9-3.el7.ppc64le
openldap-2.4.44-5.el7.ppc64le
rsync-3.0.9-18.el7.ppc64le
psmisc-22.20-15.el7.ppc64le
compat-cheese314-3.14.2-1.el7.ppc64le
dosfstools-3.0.20-9.el7.ppc64le
sane-backends-drivers-cameras-1.0.24-9.el7.ppc64le
kde-filesystem-4-47.el7.ppc64le
cryptsetup-1.7.4-3.el7.ppc64le
boost-program-options-1.53.0-27.el7.ppc64le
libgnomekbd-3.22.0.1-1.el7.ppc64le
libsrtp-1.4.4-10.20101004cvs.el7.ppc64le
speech-dispatcher-python-0.7.1-15.el7.ppc64le
raptor2-2.0.9-3.el7.ppc64le
grub2-tools-2.02-0.64.el7.centos.ppc64le
libiodbc-3.52.7-7.el7.ppc64le
gtk-vnc2-0.7.0-2.el7.ppc64le
libdv-1.0.0-17.el7.ppc64le
libXxf86dga-1.1.4-2.1.el7.ppc64le
python-deltarpm-3.6-3.el7.ppc64le
ibacm-13-7.el7.ppc64le
opus-1.0.2-6.el7.ppc64le
system-config-printer-libs-1.4.1-19.el7.noarch
libthai-0.1.14-9.el7.ppc64le
tracker-1.10.5-4.el7.ppc64le
shared-desktop-ontologies-devel-0.11.0-2.el7.noarch
qt-4.8.5-13.el7.ppc64le
pcre2-10.23-2.el7.ppc64le
gtkspell3-3.0.3-4.el7.ppc64le
libevdev-1.5.6-1.el7.ppc64le
totem-3.22.1-1.el7.ppc64le
virtuoso-opensource-6.1.6-6.el7.ppc64le
strigi-libs-0.7.7-12.20120626.el7.ppc64le
boost-wave-1.53.0-27.el7.ppc64le
libXmu-devel-1.1.2-2.el7.ppc64le
iproute-3.10.0-87.el7.ppc64le
firewalld-0.4.4.4-6.el7.noarch
color-filesystem-1-13.el7.noarch
automoc-1.0-0.20.rc3.el7.ppc64le
perl-Pod-Perldoc-3.20-4.el7.noarch
poppler-utils-0.26.5-16.el7.ppc64le
boost-1.53.0-27.el7.ppc64le
pcp-libs-3.11.8-7.el7.ppc64le
pykickstart-1.99.66.12-1.el7.noarch
openldap-devel-2.4.44-5.el7.ppc64le
perl-Encode-2.51-7.el7.ppc64le
python-gobject-3.22.0-1.el7.ppc64le
krb5-workstation-1.15.1-8.el7.ppc64le
libwacom-0.24-1.el7.ppc64le
isomd5sum-1.0.10-5.el7.ppc64le
abrt-addon-vmcore-2.1.11-48.el7.centos.ppc64le
perl-constant-1.27-2.el7.noarch
compat-libcogl12-1.14.0-3.el7.ppc64le
python-libipa_hbac-1.15.2-50.el7.ppc64le
gdm-3.22.3-11.el7.ppc64le
gstreamer1-devel-1.10.4-2.el7.ppc64le
abrt-retrace-client-2.1.11-48.el7.centos.ppc64le
perl-Exporter-5.68-3.el7.noarch
libXpm-devel-3.5.12-1.el7.ppc64le
python2-pyasn1-modules-0.1.9-7.el7.noarch
gnome-shell-extension-alternate-tab-3.22.2-10.el7.noarch
ttmkfdir-3.0.9-42.el7.ppc64le
samba-libs-4.6.2-8.el7.ppc64le
perl-File-Temp-0.23.01-3.el7.noarch
brltty-4.5-15.el7.ppc64le
sos-3.4-6.el7.centos.noarch
gnome-shell-extension-window-list-3.22.2-10.el7.noarch
clucene-core-2.3.3.4-11.el7.ppc64le
osinfo-db-20170423-2.el7.noarch
perl-macros-5.16.3-292.el7.ppc64le
python-brlapi-0.6.0-15.el7.ppc64le
libselinux-devel-2.5-11.el7.ppc64le
quota-nls-4.01-14.el7.noarch
elfutils-libs-0.168-8.el7.ppc64le
oddjob-mkhomedir-0.31.5-4.el7.ppc64le
perl-5.16.3-292.el7.ppc64le
opal-3.10.10-4.el7.ppc64le
gstreamer-tools-0.10.36-7.el7.ppc64le
libvirt-daemon-driver-storage-scsi-3.2.0-14.el7.ppc64le
satyr-0.13-14.el7.ppc64le
polkit-docs-0.112-12.el7_3.noarch
perl-Compress-Raw-Zlib-2.061-4.el7.ppc64le
compat-libcogl-pango12-1.14.0-3.el7.ppc64le
alsa-lib-devel-1.1.3-3.el7.ppc64le
libvirt-daemon-driver-storage-mpath-3.2.0-14.el7.ppc64le
NetworkManager-libnm-1.8.0-9.el7.ppc64le
tcsh-6.18.01-15.el7.ppc64le
perl-XML-Dumper-0.81-17.el7.noarch
libpfm-devel-4.7.0-4.el7.ppc64le
unixODBC-devel-2.3.1-11.el7.ppc64le
rcs-5.9.0-5.el7.ppc64le
ltrace-0.7.91-14.el7.ppc64le
ed-1.9-4.el7.ppc64le
wqy-zenhei-fonts-0.9.46-11.el7.noarch
lohit-bengali-fonts-2.5.3-4.el7.noarch
paratype-pt-sans-fonts-20101909-3.el7.noarch
paktype-naskh-basic-fonts-4.1-3.el7.noarch
lklug-fonts-0.6-10.20090803cvs.el7.noarch
lohit-kannada-fonts-2.5.3-3.el7.noarch
cjkuni-uming-fonts-0.2.20080216.1-53.el7.noarch
vlgothic-fonts-20130607-2.el7.noarch
lohit-telugu-fonts-2.5.3-3.el7.noarch
gnu-free-serif-fonts-20120503-8.el7.noarch
jomolhari-fonts-0.003-17.el7.noarch
scl-utils-20130529-17.el7_1.ppc64le
diffstat-1.57-4.el7.ppc64le
xorg-x11-drivers-7.7-6.el7.ppc64le
setserial-2.17-33.el7.ppc64le
vinagre-3.22.0-8.el7.ppc64le
man-pages-overrides-7.4.3-1.el7.ppc64le
gedit-3.22.0-3.el7.ppc64le
iwl5150-firmware-8.24.2.2-56.el7.noarch
gnome-contacts-3.22.1-1.el7.ppc64le
words-3.0-22.el7.noarch
setroubleshoot-3.2.28-3.el7.ppc64le
iwl7265-firmware-22.0.7.0-56.el7.noarch
gnome-system-monitor-3.22.2-2.el7.ppc64le
man-pages-3.53-5.el7.noarch
librsvg2-devel-2.40.16-1.el7.ppc64le
gpg-pubkey-f4a80eb5-53a7ff4b
system-config-printer-udev-1.4.1-19.el7.ppc64le
gnome-calculator-3.22.3-1.el7.ppc64le
gvfs-afp-1.30.4-3.el7.ppc64le
latencytop-0.5-13.el7.ppc64le
gtk3-immodule-xim-3.22.10-4.el7.ppc64le
mousetweaks-3.12.0-1.el7.ppc64le
qt3-MySQL-3.3.8b-51.el7.ppc64le
xvattr-1.3-27.el7.ppc64le
yum-langpacks-0.4.2-7.el7.noarch
rpm-build-4.11.3-25.el7.ppc64le
virt-install-1.4.1-7.el7.noarch
samba-client-4.6.2-8.el7.ppc64le
qt-odbc-4.8.5-13.el7.ppc64le
NetworkManager-tui-1.8.0-9.el7.ppc64le
avahi-0.6.31-17.el7.ppc64le
httpd-manual-2.4.6-67.el7.centos.noarch
PackageKit-gstreamer-plugin-1.1.5-1.el7.centos.ppc64le
tuned-2.8.0-5.el7.noarch
qemu-guest-agent-2.8.0-2.el7.ppc64le
smartmontools-6.2-8.el7.ppc64le
openssh-server-7.4p1-11.el7.ppc64le
dracut-config-rescue-033-502.el7.ppc64le
openlmi-providers-devel-0.5.0-4.el7.ppc64le
oprofile-0.9.9-22.el7.ppc64le
gcc-c++-4.8.5-16.el7.ppc64le
perl-homedir-1.008010-4.el7.noarch
libgudev1-devel-219-42.el7.ppc64le
sudo-1.8.19p2-10.el7.ppc64le
libacl-devel-2.2.51-12.el7.ppc64le
perl-XML-Twig-3.44-2.el7.noarch
crash-trace-command-2.0-12.el7.ppc64le
crash-gcore-command-1.3.1-0.el7.ppc64le
libgnome-keyring-devel-3.12.0-1.el7.ppc64le
binutils-devel-2.25.1-31.base.el7.ppc64le
libcap-ng-devel-0.7.5-4.el7.ppc64le
bash-completion-2.1-6.el7.noarch
dstat-0.7.2-12.el7.noarch
wget-1.14-15.el7.ppc64le
gpg-pubkey-352c64e5-52ae6884
certmonger-0.78.4-3.el7.ppc64le
libatomic-static-4.8.5-16.el7.ppc64le
libicu-devel-50.1.2-15.el7.ppc64le
caribou-0.4.21-1.el7.ppc64le
grub2-common-2.02-0.64.el7.centos.noarch
plymouth-graphics-libs-0.8.9-0.28.20140113.el7.centos.ppc64le
kernel-3.10.0-693.el7.ppc64le
perl-Perl-OSType-1.003-3.el7.noarch
libvirt-daemon-3.2.0-14.el7.ppc64le
ledmon-0.80-2.el7.ppc64le
gupnp-av-0.12.10-1.el7.ppc64le
cups-1.6.3-29.el7.ppc64le
mozilla-filesystem-1.9-11.el7.ppc64le
libqmi-utils-1.16.0-1.el7.ppc64le
anaconda-core-21.48.22.121-1.el7.centos.ppc64le
perl-JSON-PP-2.27202-2.el7.noarch
libvirt-client-3.2.0-14.el7.ppc64le
numactl-devel-2.0.9-6.el7_2.ppc64le
cups-client-1.6.3-29.el7.ppc64le
mutter-3.22.3-11.el7.ppc64le
ipa-common-4.5.0-20.el7.centos.noarch
glibc-devel-2.17-196.el7.ppc64le
firefox-52.2.0-2.el7.centos.ppc64le
perl-Params-Check-0.38-2.el7.noarch
virt-manager-common-1.4.1-7.el7.noarch
indent-2.2.11-13.el7.ppc64le
python-linux-procfs-0.4.9-3.el7.noarch
gnome-session-3.22.3-4.el7.ppc64le
adwaita-cursor-theme-3.22.0-1.el7.noarch
perl-Archive-Extract-0.68-3.el7.noarch
gnome-initial-setup-3.22.1-4.el7.ppc64le
perl-IO-Compress-2.061-2.el7.noarch
geoclue2-2.4.5-1.el7.ppc64le
khmeros-base-fonts-5.0-17.el7.noarch
python-tempita-0.5.1-6.el7.noarch
gnome-online-accounts-3.22.5-1.el7.ppc64le
nhn-nanum-fonts-common-3.020-9.el7.noarch
gobject-introspection-devel-1.50.0-1.el7.ppc64le
rhythmbox-3.4.1-1.el7.ppc64le
libavc1394-0.5.3-14.el7.ppc64le
telepathy-gabble-0.18.1-4.el7.ppc64le
stix-fonts-1.1.0-5.el7.noarch
python-javapackages-3.4.1-11.el7.noarch
gnome-packagekit-installer-3.22.1-2.el7.ppc64le
mesa-filesystem-17.0.1-6.20170307.el7.ppc64le
konkretcmpi-python-0.9.1-5.el7.ppc64le
libsane-hpaio-3.15.9-3.el7.ppc64le
copy-jdk-configs-2.2-3.el7.noarch
usb_modeswitch-2.4.0-5.el7.ppc64le
nhn-nanum-gothic-fonts-3.020-9.el7.noarch
pytz-2016.10-2.el7.noarch
librsvg2-tools-2.40.16-1.el7.ppc64le
bash-4.2.46-28.el7.ppc64le
libreport-plugin-bugzilla-2.1.11-38.el7.centos.ppc64le
kde-workspace-devel-4.11.19-8.el7.ppc64le
libdb-devel-5.3.21-20.el7.ppc64le
fxload-2002_04_11-16.el7.ppc64le
google-crosextra-caladea-fonts-1.002-0.4.20130214.el7.noarch
python-pycparser-2.14-1.el7.noarch
libtimezonemap-0.4.4-1.el7.ppc64le
libcom_err-1.42.9-10.el7.ppc64le
frei0r-plugins-1.3-13.el7.ppc64le
ibus-m17n-1.3.4-13.el7.ppc64le
libcdio-paranoia-10.2+0.90-11.el7.ppc64le
netcf-libs-0.2.8-4.el7.ppc64le
lohit-punjabi-fonts-2.5.3-2.el7.noarch
cmpi-bindings-pywbem-0.9.5-6.el7.ppc64le
at-spi2-core-devel-2.22.0-1.el7.ppc64le
xz-libs-5.2.2-1.el7.ppc64le
libasyncns-0.8-7.el7.ppc64le
libcanberra-devel-0.30-5.el7.ppc64le
coreutils-8.22-18.el7.ppc64le
sssd-ad-1.15.2-50.el7.ppc64le
doxygen-1.8.5-3.el7.ppc64le
httpd-tools-2.4.6-67.el7.centos.ppc64le
libspectre-0.2.8-1.el7.ppc64le
cyrus-sasl-lib-2.1.26-21.el7.ppc64le
rubygem-bigdecimal-1.2.0-30.el7.ppc64le
icedtea-web-1.6.2-4.el7.ppc64le
libarchive-3.1.2-10.el7_2.ppc64le
python-pyblock-0.53-6.el7.ppc64le
byacc-1.9.20130304-3.el7.ppc64le
wodim-1.1.11-23.el7.ppc64le
xorg-x11-drv-qxl-0.1.5-3.el7.ppc64le
elfutils-libelf-0.168-8.el7.ppc64le
rubygem-thor-0.19.1-1.el7.noarch
file-roller-nautilus-3.22.3-1.el7.ppc64le
pkgconfig-0.27.1-4.el7.ppc64le
setroubleshoot-server-3.2.28-3.el7.ppc64le
iwl2030-firmware-18.168.6.1-56.el7.noarch
mailx-12.5-16.el7.ppc64le
xorg-x11-drv-fbdev-0.4.3-25.el7.ppc64le
libtevent-0.9.31-1.el7.ppc64le
policycoreutils-2.5-17.1.el7.ppc64le
java-1.7.0-openjdk-devel-1.7.0.141-2.6.10.5.el7.ppc64le
gsettings-desktop-schemas-3.22.0-1.el7.ppc64le
yum-3.4.3-154.el7.centos.noarch
iwl6000g2a-firmware-17.168.5.3-56.el7.noarch
perl-B-Lint-1.17-3.el7.noarch
gstreamer-plugins-bad-free-0.10.23-23.el7.ppc64le
libvorbis-1.3.3-8.el7.ppc64le
rarian-compat-0.8.1-11.el7.ppc64le
abrt-desktop-2.1.11-48.el7.centos.ppc64le
desktop-file-utils-0.23-1.el7.ppc64le
libiptcdata-1.0.4-11.el7.ppc64le
gpg-pubkey-f533f4fa-56585169
perl-DB_File-1.830-6.el7.ppc64le
compat-poppler022-qt-0.22.5-4.el7.ppc64le
libldb-1.1.29-1.el7.ppc64le
http-parser-2.7.1-1.el7.ppc64le
NetworkManager-libreswan-gnome-1.2.4-2.el7.ppc64le
centos-logos-70.0.6-3.el7.centos.noarch
libX11-common-1.6.5-1.el7.noarch
perl-FCGI-0.74-8.el7.ppc64le
pango-devel-1.40.4-1.el7.ppc64le
libbasicobjects-0.1.1-27.el7.ppc64le
libgfortran-4.8.5-16.el7.ppc64le
gtk2-immodule-xim-2.24.31-1.el7.ppc64le
libgnome-keyring-3.12.0-1.el7.ppc64le
libXrender-0.9.10-1.el7.ppc64le
perl-Business-ISBN-2.06-2.el7.noarch
freeglut-2.8.1-3.el7.ppc64le
libgomp-4.8.5-16.el7.ppc64le
device-mapper-1.02.140-8.el7.ppc64le
xdg-desktop-portal-gtk-0.5-1.el7.ppc64le
libudisks2-2.1.2-6.el7.ppc64le
pulseaudio-libs-10.0-3.el7.ppc64le
perl-HTTP-Daemon-6.01-5.el7.noarch
xorg-x11-xauth-1.0.9-1.el7.ppc64le
nettle-2.7.1-8.el7.ppc64le
polkit-pkla-compat-0.1-4.el7.ppc64le
startup-notification-devel-0.12-8.el7.ppc64le
genisoimage-1.1.11-23.el7.ppc64le
dbus-x11-1.6.12-17.el7.ppc64le
perl-Text-Soundex-3.04-4.el7.ppc64le
xdg-user-dirs-0.15-4.el7.ppc64le
jansson-2.10-1.el7.ppc64le
NetworkManager-glib-1.8.0-9.el7.ppc64le
rpm-sign-4.11.3-25.el7.ppc64le
gettext-0.19.8.1-2.el7.ppc64le
cairo-1.14.8-2.el7.ppc64le
perl-IO-Socket-SSL-1.94-6.el7.noarch
kdepimlibs-kxmlrpcclient-4.10.5-4.el7.ppc64le
libplist-1.12-3.el7.ppc64le
libwbclient-4.6.2-8.el7.ppc64le
cgdcbxd-1.0.2-7.el7.ppc64le
glib2-devel-2.50.3-3.el7.ppc64le
gdk-pixbuf2-devel-2.36.5-1.el7.ppc64le
theora-tools-1.1.1-8.el7.ppc64le
libkipi-4.10.5-3.el7.ppc64le
libmng-1.0.10-14.el7.ppc64le
abrt-addon-kerneloops-2.1.11-48.el7.centos.ppc64le
grub2-2.02-0.64.el7.centos.ppc64le
xz-devel-5.2.2-1.el7.ppc64le
xorg-x11-xkb-utils-7.7-12.el7.ppc64le
libverto-tevent-0.2.5-4.el7.ppc64le
libkdcraw-devel-4.10.5-4.el7.ppc64le
bzip2-1.0.6-13.el7.ppc64le
iputils-20160308-10.el7.ppc64le
cifs-utils-6.2-10.el7.ppc64le
libpinyin-0.9.93-4.el7.ppc64le
libao-1.1.0-8.el7.ppc64le
gdbm-devel-1.10-8.el7.ppc64le
kdepim-libs-4.10.5-6.el7.ppc64le
libxshmfence-1.2-1.el7.ppc64le
libstoragemgmt-1.4.0-3.el7.ppc64le
psacct-6.6.1-13.el7.ppc64le
pyliblzma-0.5.3-11.el7.ppc64le
libXcursor-devel-1.1.14-8.el7.ppc64le
hesiod-3.2.1-3.el7.ppc64le
okular-devel-4.10.5-4.el7.ppc64le
gsm-1.0.13-11.el7.ppc64le
telepathy-mission-control-5.16.3-3.el7.ppc64le
rng-tools-5-11.el7.ppc64le
python-chardet-2.2.1-1.el7_1.noarch
libcanberra-gtk3-0.30-5.el7.ppc64le
krb5-devel-1.15.1-8.el7.ppc64le
kdesdk-kompare-devel-4.10.5-6.el7.ppc64le
unixODBC-2.3.1-11.el7.ppc64le
dbus-devel-1.6.12-17.el7.ppc64le
kpatch-0.4.0-1.el7.noarch
graphite2-1.3.6-1.el7_2.ppc64le
nautilus-extensions-3.22.3-3.el7.ppc64le
libdb-utils-5.3.21-20.el7.ppc64le
sane-backends-libs-1.0.24-9.el7.ppc64le
zip-3.0-11.el7.ppc64le
mdadm-4.0-5.el7.ppc64le
memstomp-0.1.4-11.el7.ppc64le
libconfig-1.4.9-5.el7.ppc64le
clutter-gst2-2.0.18-1.el7.ppc64le
postgresql-libs-9.2.21-1.el7.ppc64le
gsound-1.0.2-2.el7.ppc64le
ilmbase-1.0.3-7.el7.ppc64le
udisks2-2.1.2-6.el7.ppc64le
perl-core-5.16.3-292.el7.ppc64le
pcsc-lite-libs-1.8.8-6.el7.ppc64le
gvnc-0.7.0-2.el7.ppc64le
qemu-img-1.5.3-141.el7.ppc64le
libappstream-glib-0.6.10-1.el7.ppc64le
sg3_utils-libs-1.37-12.el7.ppc64le
librdmacm-13-7.el7.ppc64le
adcli-0.8.1-3.el7.ppc64le
libnfnetlink-1.0.1-4.el7.ppc64le
colord-gtk-0.1.25-4.el7.ppc64le
libuser-python-0.60-7.el7_1.ppc64le
libfprint-0.5.0-4.el7.ppc64le
OpenEXR-libs-1.7.1-7.el7.ppc64le
attica-devel-0.4.2-1.el7.ppc64le
papi-devel-5.2.0-23.el7.ppc64le
m17n-lib-1.6.4-14.el7.ppc64le
qimageblitz-0.0.6-7.el7.ppc64le
python-urlgrabber-3.10-8.el7.noarch
pcp-selinux-3.11.8-7.el7.ppc64le
perl-Text-ParseWords-3.29-4.el7.noarch
apr-util-devel-1.5.2-6.el7.ppc64le
readline-devel-6.2-10.el7.ppc64le
python-kitchen-1.1.1-5.el7.noarch
gnome-abrt-0.3.4-8.el7.ppc64le
check-devel-0.9.9-5.el7.ppc64le
pulseaudio-gdm-hooks-10.0-3.el7.ppc64le
perl-Scalar-List-Utils-1.27-248.el7.ppc64le
abrt-addon-ccpp-2.1.11-48.el7.centos.ppc64le
gnome-icon-theme-extras-3.12.0-1.el7.noarch
python-slip-0.4.0-2.el7.noarch
brlapi-0.6.0-15.el7.ppc64le
qpdf-libs-5.0.1-3.el7.ppc64le
yelp-xsl-3.20.1-1.el7.noarch
perl-Storable-2.45-3.el7.ppc64le
libosinfo-1.0.0-1.el7.ppc64le
libcap-devel-2.22-9.el7.ppc64le
libepoxy-devel-1.3.1-1.el7.ppc64le
festival-1.96-28.el7.ppc64le
libusbx-1.0.20-1.el7.ppc64le
libvirt-daemon-driver-storage-disk-3.2.0-14.el7.ppc64le
perl-Test-Harness-3.28-3.el7.noarch
polkit-devel-0.112-12.el7_3.ppc64le
perl-Crypt-SSLeay-0.64-5.el7.ppc64le
libverto-devel-0.2.5-4.el7.ppc64le
caribou-gtk2-module-0.4.21-1.el7.ppc64le
vim-filesystem-7.4.160-2.el7.ppc64le
procps-ng-3.3.10-16.el7.ppc64le
NetworkManager-libreswan-1.2.4-2.el7.ppc64le
perl-Module-Metadata-1.000018-2.el7.noarch
pixman-devel-0.34.0-1.el7.ppc64le
patchutils-0.3.3-4.el7.ppc64le
filesystem-3.2-21.el7.ppc64le
cups-filesystem-1.6.3-29.el7.noarch
gettext-devel-0.19.8.1-2.el7.ppc64le
usbredir-0.7.1-2.el7.ppc64le
neon-0.30.0-3.el7.ppc64le
perl-LWP-MediaTypes-6.02-2.el7.noarch
python-qrcode-core-5.0.1-1.el7.noarch
hyphen-en-2.8.6-5.el7.noarch
gnu-free-fonts-common-20120503-8.el7.noarch
gtkmm30-3.22.0-1.el7.ppc64le
initial-setup-gui-0.3.9.40-1.el7.centos.ppc64le
libhugetlbfs-2.16-12.el7.ppc64le
subversion-libs-1.7.14-10.el7.ppc64le
perl-Encode-Locale-1.03-5.el7.noarch
python-inotify-0.9.4-4.el7.noarch
nano-2.3.1-10.el7.ppc64le
mobile-broadband-provider-info-1.20170310-1.el7.noarch
adwaita-gtk2-theme-3.22.2-1.el7.ppc64le
ipa-client-4.5.0-20.el7.centos.ppc64le
perl-IPC-Cmd-0.80-4.el7.noarch
libsoup-2.56.0-3.el7.ppc64le
perl-Term-UI-0.36-2.el7.noarch
python-setuptools-0.9.8-7.el7.noarch
dejavu-sans-mono-fonts-2.33-6.el7.noarch
bind-license-9.9.4-50.el7.noarch
webkitgtk4-jsc-2.14.7-2.el7.ppc64le
firewall-config-0.4.4.4-6.el7.noarch
perl-CPAN-1.9800-292.el7.noarch
gupnp-1.0.1-1.el7.ppc64le
boost-graph-1.53.0-27.el7.ppc64le
python-perf-3.10.0-693.el7.ppc64le
overpass-fonts-2.1-1.el7.noarch
thai-scalable-fonts-common-0.5.0-7.el7.noarch
webkitgtk4-jsc-devel-2.14.7-2.el7.ppc64le
pulseaudio-module-x11-10.0-3.el7.ppc64le
marisa-0.2.4-4.el7.ppc64le
gnutls-c++-3.3.26-9.el7.ppc64le
ca-certificates-2017.2.14-71.el7.noarch
python-idna-2.4-1.el7.noarch
strace-4.12-4.el7.ppc64le
nss-softokn-freebl-3.28.3-6.el7.ppc64le
vino-3.22.0-3.el7.ppc64le
libXaw-devel-1.0.13-4.el7.ppc64le
libreport-centos-2.1.11-38.el7.centos.ppc64le
alsa-utils-1.1.3-2.el7.ppc64le
libnl3-cli-3.2.28-4.el7.ppc64le
python-iniparse-0.4-9.el7.noarch
traceroute-2.0.22-2.el7.ppc64le
libselinux-2.5-11.el7.ppc64le
keybinder3-0.3.0-1.el7.ppc64le
kdepim-devel-4.10.5-6.el7.ppc64le
pakchois-0.4-10.el7.ppc64le
cryptsetup-python-1.7.4-3.el7.ppc64le
libjpeg-turbo-devel-1.2.90-5.el7.ppc64le
python-jwcrypto-0.2.1-1.el7.noarch
lohit-malayalam-fonts-2.5.3-2.el7.noarch
libpng-1.5.13-7.el7_2.ppc64le
freerdp-plugins-1.0.2-10.el7.ppc64le
ibus-chewing-1.4.4-14.el7.ppc64le
libfastjson-0.99.4-2.el7.ppc64le
libsss_sudo-1.15.2-50.el7.ppc64le
redhat-menus-12.0.2-8.el7.noarch
bind-libs-9.9.4-50.el7.ppc64le
gnu-free-sans-fonts-20120503-8.el7.noarch
libuuid-2.23.2-43.el7.ppc64le
festival-freebsoft-utils-0.10-7.el7.noarch
unique3-devel-3.0.2-8.el7.ppc64le
compat-poppler022-0.22.5-4.el7.ppc64le
sssd-proxy-1.15.2-50.el7.ppc64le
python-2.7.5-58.el7.ppc64le
libwvstreams-4.6.1-11.el7.ppc64le
lrzsz-0.12.20-36.el7.ppc64le
sqlite-3.7.17-8.el7.ppc64le
xorg-x11-server-common-1.19.3-11.el7.ppc64le
sushi-3.21.91-1.el7.ppc64le
rubygem-psych-2.0.0-30.el7.ppc64le
gnupg2-2.0.22-4.el7.ppc64le
libmount-2.23.2-43.el7.ppc64le
nss-3.28.4-8.el7.ppc64le
iwl3160-firmware-22.0.7.0-56.el7.noarch
libnl3-3.2.28-4.el7.ppc64le
xorg-x11-drv-ati-7.7.1-3.20160928git3fc839ff.el7.ppc64le
evolution-mapi-3.22.6-1.el7.ppc64le
libservicelog-1.1.17-2.el7.ppc64le
perl-PAR-Dist-0.49-2.el7.noarch
dbus-glib-0.100-7.el7.ppc64le
docbook-style-xsl-1.78.1-3.el7.noarch
iwl100-firmware-39.31.5.1-56.el7.noarch
libxslt-1.1.28-5.el7.ppc64le
junit-4.11-8.el7.noarch
gnome-session-xsession-3.22.3-4.el7.ppc64le
selinux-policy-3.13.1-166.el7.noarch
PackageKit-1.1.5-1.el7.centos.ppc64le
zlib-devel-1.2.7-17.el7.ppc64le
perl-libxml-perl-0.08-19.el7.noarch
iwl4965-firmware-228.61.2.24-56.el7.noarch
p11-kit-0.23.5-3.el7.ppc64le
spice-gtk3-0.33-6.el7.ppc64le
pygobject3-devel-3.22.0-1.el7.ppc64le
systemtap-runtime-3.1-3.el7.ppc64le
nss-softokn-freebl-devel-3.28.3-6.el7.ppc64le
libgee-0.18.1-1.el7.ppc64le
perl-PlRPC-0.2020-14.el7.noarch
python34-libs-3.4.5-4.el7.ppc64le
json-c-0.11-4.el7_0.ppc64le
plymouth-plugin-two-step-0.8.9-0.28.20140113.el7.centos.ppc64le
gnome-font-viewer-3.22.0-1.el7.ppc64le
sssd-client-1.15.2-50.el7.ppc64le
libXext-1.3.3-3.el7.ppc64le
nspr-devel-4.13.1-1.0.el7_3.ppc64le
perl-Algorithm-Diff-1.1902-17.el7.noarch
tcp_wrappers-libs-7.6-77.el7.ppc64le
libgdata-devel-0.17.8-1.el7.ppc64le
gnome-screenshot-3.22.0-1.el7.ppc64le
mtdev-1.1.5-5.el7.ppc64le
mesa-libEGL-17.0.1-6.20170307.el7.ppc64le
libpng-devel-1.5.13-7.el7_2.ppc64le
perl-Digest-SHA1-2.13-9.el7.ppc64le
libdhash-0.4.3-27.el7.ppc64le
phonon-devel-4.6.0-10.el7.ppc64le
qt3-ODBC-3.3.8b-51.el7.ppc64le
systemd-219-42.el7.ppc64le
libXinerama-1.1.3-2.1.el7.ppc64le
gdb-7.6.1-100.el7.ppc64le
perl-File-Listing-6.04-7.el7.noarch
jasper-libs-1.900.1-31.el7.ppc64le
ibus-setup-1.5.3-13.el7.noarch
spice-vdagent-0.14.0-14.el7.ppc64le
PackageKit-glib-1.1.5-1.el7.centos.ppc64le
libXmu-1.1.2-2.el7.ppc64le
atkmm-2.24.2-1.el7.ppc64le
perl-Sys-Syslog-0.33-3.el7.ppc64le
libXdmcp-1.1.2-6.el7.ppc64le
kdelibs-devel-4.14.8-6.el7_3.ppc64le
targetcli-2.1.fb46-1.el7.noarch
libcgroup-0.41-13.el7.ppc64le
qt-x11-4.8.5-13.el7.ppc64le
libxcb-devel-1.12-1.el7.ppc64le
perl-HTML-Format-2.10-7.el7.noarch
libsss_idmap-1.15.2-50.el7.ppc64le
kactivities-4.10.5-3.el7.ppc64le
httpd-devel-2.4.6-67.el7.centos.ppc64le
abrt-2.1.11-48.el7.centos.ppc64le
java-1.7.0-openjdk-headless-1.7.0.141-2.6.10.5.el7.ppc64le
apr-devel-1.4.8-3.el7.ppc64le
cdparanoia-10.2-17.el7.ppc64le
libpcap-1.5.3-9.el7.ppc64le
libkworkspace-4.11.19-8.el7.ppc64le
dbus-glib-devel-0.100-7.el7.ppc64le
crontabs-1.11-6.20121102git.el7.noarch
libXi-devel-1.7.9-1.el7.ppc64le
gnome-menus-3.13.3-3.el7.ppc64le
libieee1284-devel-0.2.11-15.el7.ppc64le
kmod-libs-20-15.el7.ppc64le
kde-runtime-4.10.5-8.el7.ppc64le
mod_ssl-2.4.6-67.el7.centos.ppc64le
cyrus-sasl-2.1.26-21.el7.ppc64le
libXScrnSaver-1.2.2-6.1.el7.ppc64le
python-augeas-0.5.0-2.el7.noarch
LibRaw-0.14.8-5.el7.20120830git98d925.ppc64le
hyphen-2.8.6-5.el7.ppc64le
kdenetwork-krdc-libs-4.10.5-8.el7_0.ppc64le
opal-prd-5.5.0-1.el7.ppc64le
rdma-core-13-7.el7.ppc64le
pulseaudio-10.0-3.el7.ppc64le
python-sssdconfig-1.15.2-50.el7.noarch
libisofs-1.2.8-4.el7.ppc64le
libverto-0.2.5-4.el7.ppc64le
kdesdk-kmtrace-devel-4.10.5-6.el7.ppc64le
systemd-devel-219-42.el7.ppc64le
mesa-dri-drivers-17.0.1-6.20170307.el7.ppc64le
clutter-1.26.0-1.el7.ppc64le
fipscheck-1.4.1-6.el7.ppc64le
dwz-0.11-3.el7.ppc64le
boost-regex-1.53.0-27.el7.ppc64le
libXaw-1.0.13-4.el7.ppc64le
gcc-gfortran-4.8.5-16.el7.ppc64le
systemd-python-219-42.el7.ppc64le
zenity-3.22.0-1.el7.ppc64le
boost-atomic-1.53.0-27.el7.ppc64le
rpm-libs-4.11.3-25.el7.ppc64le
GeoIP-1.5.0-11.el7.ppc64le
libksane-devel-4.10.5-4.el7.ppc64le
rubygem-bundler-1.7.8-3.el7.noarch
git-1.8.3.1-11.el7.ppc64le
brasero-libs-3.12.1-2.el7.ppc64le
c-ares-1.10.0-3.el7.ppc64le
libnfsidmap-0.25-17.el7.ppc64le
cdparanoia-libs-10.2-17.el7.ppc64le
tk-8.5.13-6.el7.ppc64le
libhugetlbfs-devel-2.16-12.el7.ppc64le
NetworkManager-wifi-1.8.0-9.el7.ppc64le
libcanberra-gtk2-0.30-5.el7.ppc64le
hostname-3.13-3.el7.ppc64le
redland-1.0.16-6.el7.ppc64le
libdaemon-0.14-7.el7.ppc64le
brasero-3.12.1-2.el7.ppc64le
cups-devel-1.6.3-29.el7.ppc64le
qca2-2.0.3-7.el7.ppc64le
pangomm-2.40.1-1.el7.ppc64le
libnetfilter_conntrack-1.0.6-1.el7_3.ppc64le
sip-devel-4.14.6-4.el7.ppc64le
perl-parent-0.225-244.el7.noarch
libkkc-0.3.1-9.el7.ppc64le
crypto-utils-2.4.1-42.el7.ppc64le
lvm2-2.02.171-8.el7.ppc64le
poppler-glib-0.26.5-16.el7.ppc64le
crash-7.1.9-2.el7.ppc64le
libbluray-0.2.3-5.el7.ppc64le
perl-Filter-1.49-3.el7.ppc64le
control-center-3.22.2-5.el7.ppc64le
c-ares-devel-1.10.0-3.el7.ppc64le
sysstat-10.1.5-12.el7.ppc64le
mesa-libGL-devel-17.0.1-6.20170307.el7.ppc64le
python-pwquality-1.2.3-4.el7.ppc64le
liblouis-python-2.5.2-10.el7.noarch
perl-PathTools-3.40-5.el7.ppc64le
gnome-shell-extension-apps-menu-3.22.2-10.el7.noarch
hunspell-devel-1.3.2-15.el7.ppc64le
policycoreutils-python-2.5-17.1.el7.ppc64le
libwnck3-3.20.1-1.el7.ppc64le
gsettings-desktop-schemas-devel-3.22.0-1.el7.ppc64le
lsof-4.87-4.el7.ppc64le
perl-Getopt-Long-2.40-2.el7.noarch
nfs-utils-1.3.0-0.48.el7.ppc64le
mtr-0.85-7.el7.ppc64le
autofs-5.0.7-69.el7.ppc64le
cairo-devel-1.14.8-2.el7.ppc64le
xorg-x11-xbitmaps-1.1.1-6.el7.noarch
libreport-2.1.11-38.el7.centos.ppc64le
perl-XML-Parser-2.41-10.el7.ppc64le
libvirt-daemon-driver-storage-3.2.0-14.el7.ppc64le
python2-caribou-0.4.21-1.el7.noarch
fontpackages-filesystem-1.44-8.el7.noarch
perl-Test-Pod-1.48-3.el7.noarch
libuuid-devel-2.23.2-43.el7.ppc64le
perl-Package-Constants-0.02-292.el7.noarch
gnutls-3.3.26-9.el7.ppc64le
libreport-cli-2.1.11-38.el7.centos.ppc64le
gettext-common-devel-0.19.8.1-2.el7.noarch
cups-filters-1.0.35-22.el7.ppc64le
xkeyboard-config-2.20-1.el7.noarch
bison-3.0.4-1.el7.ppc64le
compat-libcolord1-1.0.4-1.el7.ppc64le
perl-Digest-MD5-2.52-3.el7.ppc64le
gnutls-dane-3.3.26-9.el7.ppc64le
libusbx-devel-1.0.20-1.el7.ppc64le
initial-setup-0.3.9.40-1.el7.centos.ppc64le
libchamplain-gtk-0.12.15-1.el7.ppc64le
libreport-filesystem-2.1.11-38.el7.centos.ppc64le
m17n-contrib-1.1.14-3.el7.noarch
newt-python-0.52.15-4.el7.ppc64le
perl-Locale-Maketext-1.23-3.el7.noarch
libvirt-daemon-driver-nodedev-3.2.0-14.el7.ppc64le
perl-ExtUtils-Install-1.58-292.el7.noarch
libvirt-3.2.0-14.el7.ppc64le
gnome-themes-standard-3.22.2-1.el7.ppc64le
gl-manpages-1.1-7.20130122.el7.noarch
lohit-gujarati-fonts-2.5.3-2.el7.noarch
python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch
perl-local-lib-1.008010-4.el7.noarch
rest-0.8.0-1.el7.ppc64le
perl-Module-Build-0.40.05-2.el7.noarch
ibus-kkc-1.5.18-7.el7.ppc64le
webkitgtk4-plugin-process-gtk2-2.14.7-2.el7.ppc64le
basesystem-10.0-7.el7.centos.noarch
madan-fonts-2.000-11.el7.noarch
python-beaker-1.5.4-10.el7.noarch
boost-locale-1.53.0-27.el7.ppc64le
dleyna-core-0.5.0-1.el7.ppc64le
liberation-sans-fonts-1.07.2-15.el7.noarch
tk-devel-8.5.13-6.el7.ppc64le
gnome-packagekit-updater-3.22.1-2.el7.ppc64le
cim-schema-2.33.0-6.el7.noarch
lohit-assamese-fonts-2.5.3-2.el7.noarch
tagsoup-1.2.1-8.el7.noarch
libshout-2.2.2-11.el7.ppc64le
ntpdate-4.2.6p5-25.el7.centos.2.ppc64le
libproxy-0.4.11-10.el7.ppc64le
gvfs-gphoto2-1.30.4-3.el7.ppc64le
gspell-1.2.3-1.el7.ppc64le
libstdc++-4.8.5-16.el7.ppc64le
sil-nuosu-fonts-2.1.1-5.el7.noarch
python-ntplib-0.3.2-1.el7.noarch
bc-1.06.95-13.el7.ppc64le
libvirt-daemon-driver-lxc-3.2.0-14.el7.ppc64le
libreport-anaconda-2.1.11-38.el7.centos.ppc64le
kdepimlibs-devel-4.10.5-4.el7.ppc64le
unique3-3.0.2-8.el7.ppc64le
freetype-2.4.11-15.el7.ppc64le
lohit-marathi-fonts-2.5.3-2.el7.noarch
python2-cryptography-1.7.2-1.el7.ppc64le
libss-1.42.9-10.el7.ppc64le
kernel-tools-libs-3.10.0-693.el7.ppc64le
libsysfs-2.1.0-16.el7.ppc64le
ibus-hangul-1.4.2-10.el7.ppc64le
freerdp-1.0.2-10.el7.ppc64le
popt-1.13-16.el7.ppc64le
open-sans-fonts-1.10-1.el7.noarch
bind-libs-lite-9.9.4-50.el7.ppc64le
lksctp-tools-1.0.17-2.el7.ppc64le
sssd-common-pac-1.15.2-50.el7.ppc64le
libtiff-4.0.3-27.el7_3.ppc64le
gnome-desktop3-devel-3.22.2-2.el7.ppc64le
cdrdao-1.2.3-20.el7.ppc64le
expat-2.1.0-10.el7_3.ppc64le
latrace-0.5.11-6.1.el7.ppc64le
perl-Net-SSLeay-1.55-6.el7.ppc64le
cups-libs-1.6.3-29.el7.ppc64le
dmraid-events-1.0.0.rc16-28.el7.ppc64le
rubygem-io-console-0.4.2-30.el7.ppc64le
gutenprint-cups-5.2.9-18.el7.ppc64le
xorg-x11-server-Xorg-1.19.3-11.el7.ppc64le
libtalloc-2.1.9-1.el7.ppc64le
iwl6000g2b-firmware-17.168.5.2-56.el7.noarch
nss-sysinit-3.28.4-8.el7.ppc64le
glib2-2.50.3-3.el7.ppc64le
rpm-python-4.11.3-25.el7.ppc64le
ustr-1.0.4-16.el7.ppc64le
gucharmap-3.18.2-1.el7.ppc64le
xorg-x11-drv-dummy-0.3.7-1.el7.ppc64le
libogg-1.3.0-7.el7.ppc64le
iwl6000-firmware-9.221.4.1-56.el7.noarch
docbook-dtds-1.0-60.el7.noarch
xorg-x11-proto-devel-7.7-20.el7.noarch
pygpgme-0.3-9.el7.ppc64le
openssh-7.4p1-11.el7.ppc64le
cheese-3.22.1-1.el7.ppc64le
jline-1.0-8.el7.noarch
libcap-2.22-9.el7.ppc64le
ivtv-firmware-20080701-26.el7.noarch
perl-Pod-LaTeX-0.61-2.el7.noarch
enchant-1.6.0-8.el7.ppc64le
python2-ipalib-4.5.0-20.el7.centos.noarch
tog-pegasus-libs-2.14.1-5.el7.ppc64le
firstboot-19.12-1.el7.ppc64le
gupnp-dlna-0.10.5-1.el7.ppc64le
which-2.20-7.el7.ppc64le
epel-release-7-9.noarch
perl-Net-Daemon-0.48-5.el7.noarch
libcroco-0.6.11-1.el7.ppc64le
liboauth-devel-0.9.7-4.el7.ppc64le
libhangul-0.1.0-8.el7.ppc64le
eog-3.20.5-2.el7.ppc64le
plymouth-theme-charge-0.8.9-0.28.20140113.el7.centos.ppc64le
libcollection-0.6.2-27.el7.ppc64le
perl-Locale-Codes-3.26-2.el7.noarch
pygobject2-2.28.6-11.el7.ppc64le
libXdamage-1.1.4-4.1.el7.ppc64le
libestr-0.1.9-2.el7.ppc64le
PackageKit-gtk3-module-1.1.5-1.el7.centos.ppc64le
libgweather-devel-3.20.4-1.el7.ppc64le
xz-5.2.2-1.el7.ppc64le
perl-WWW-RobotRules-6.02-5.el7.noarch
libICE-devel-1.0.9-9.el7.ppc64le
libXft-2.3.2-2.el7.ppc64le
cryptsetup-libs-1.7.4-3.el7.ppc64le
alsa-plugins-pulseaudio-1.1.1-1.el7.ppc64le
glx-utils-8.2.0-3.el7.ppc64le
speex-1.2-0.19.rc1.el7.ppc64le
perl-HTTP-Negotiate-6.01-5.el7.noarch
libtirpc-0.2.4-0.10.el7.ppc64le
pulseaudio-libs-glib2-10.0-3.el7.ppc64le
mesa-libgbm-17.0.1-6.20170307.el7.ppc64le
pulseaudio-libs-devel-10.0-3.el7.ppc64le
imsettings-1.6.3-9.el7.ppc64le
hunspell-en-US-0.20121024-6.el7.noarch
perl-IO-Socket-IP-0.21-4.el7.noarch
nss-util-devel-3.28.4-3.el7.ppc64le
libXxf86vm-1.1.4-1.el7.ppc64le
hwdata-0.252-8.6.el7.ppc64le
kernel-tools-3.10.0-693.el7.ppc64le
nepomuk-core-libs-4.10.5-5.el7.ppc64le
exiv2-libs-0.23-6.el7.ppc64le
perl-libwww-perl-6.05-2.el7.noarch
p11-kit-devel-0.23.5-3.el7.ppc64le
librsvg2-2.40.16-1.el7.ppc64le
libsmbclient-4.6.2-8.el7.ppc64le
abrt-console-notification-2.1.11-48.el7.centos.ppc64le
kdesdk-okteta-libs-4.10.5-6.el7.ppc64le
boost-chrono-1.53.0-27.el7.ppc64le
iw-4.3-1.el7.ppc64le
libcom_err-devel-1.42.9-10.el7.ppc64le
akonadi-1.9.2-4.el7.ppc64le
accountsservice-libs-0.6.45-2.el7.ppc64le
wvdial-1.61-9.el7.ppc64le
libkexiv2-devel-4.10.5-3.el7.ppc64le
libmpc-1.0.1-3.el7.ppc64le
lm_sensors-devel-3.4.0-4.20160601gitf9185e5.el7.ppc64le
meanwhile-1.1.0-12.el7.ppc64le
libXt-devel-1.1.5-3.el7.ppc64le
plymouth-scripts-0.8.9-0.28.20140113.el7.centos.ppc64le
mod_fcgid-2.3.9-4.el7.ppc64le
kdepim-runtime-libs-4.10.5-3.el7.ppc64le
mesa-libglapi-17.0.1-6.20170307.el7.ppc64le
hunspell-en-GB-0.20121024-6.el7.noarch
sip-4.14.6-4.el7.ppc64le
cairomm-1.12.0-1.el7.ppc64le
abrt-addon-xorg-2.1.11-48.el7.centos.ppc64le
ModemManager-1.6.0-2.el7.ppc64le
kdenetwork-krdc-devel-4.10.5-8.el7_0.ppc64le
libieee1284-0.2.11-15.el7.ppc64le
highlight-3.13-3.el7.ppc64le
pyOpenSSL-0.13.1-3.el7.ppc64le
gtk-update-icon-cache-3.22.10-4.el7.ppc64le
NetworkManager-1.8.0-9.el7.ppc64le
crda-3.13_2016.02.08-1.el7.ppc64le
kdesdk-kompare-libs-4.10.5-6.el7.ppc64le
newt-0.52.15-4.el7.ppc64le
xcb-util-0.4.0-2.el7.ppc64le
automake-1.13.4-3.el7.noarch
libgweather-3.20.4-1.el7.ppc64le
lockdev-1.0.4-0.13.20111007git.el7.ppc64le
man-db-2.6.3-9.el7.ppc64le
gd-2.0.35-26.el7.ppc64le
exempi-2.2.0-8.el7.ppc64le
curl-7.29.0-42.el7.ppc64le
snappy-1.1.0-3.el7.ppc64le
libreport-gtk-2.1.11-38.el7.centos.ppc64le
unbound-libs-1.4.20-34.el7.ppc64le
tcpdump-4.9.0-5.el7.ppc64le
sane-backends-drivers-scanners-1.0.24-9.el7.ppc64le
libedit-3.0-12.20121213cvs.el7.ppc64le
liboauth-0.9.7-4.el7.ppc64le
libmpcdec-1.2.6-12.el7.ppc64le
libnm-gtk-1.8.0-3.el7.ppc64le
grub2-tools-extra-2.02-0.64.el7.centos.ppc64le
libitm-devel-4.8.5-16.el7.ppc64le
libdmx-1.1.3-3.el7.ppc64le
wavpack-4.60.1-9.el7.ppc64le
rasqal-0.9.30-4.el7.ppc64le
autogen-libopts-5.18-5.el7.ppc64le
gnome-bluetooth-libs-3.20.1-1.el7.ppc64le
qt-settings-19-23.5.el7.centos.noarch
libxslt-devel-1.1.28-5.el7.ppc64le
grilo-plugins-0.3.4-1.el7.ppc64le
SDL-1.2.15-14.el7.ppc64le
sip-macros-4.14.6-4.el7.ppc64le
iptables-1.4.21-18.0.1.el7.centos.ppc64le
gstreamer-plugins-good-0.10.31-13.el7.ppc64le
qjson-0.8.1-4.el7.ppc64le
perl-Test-Pod-Coverage-1.08-21.el7.noarch
pcp-conf-3.11.8-7.el7.ppc64le
perl-podlators-2.5.1-3.el7.noarch
libcurl-devel-7.29.0-42.el7.ppc64le
graphite2-devel-1.3.6-1.el7_2.ppc64le
pygtk2-2.24.0-9.el7.ppc64le
kexec-tools-2.0.14-17.el7.ppc64le
iptables-devel-1.4.21-18.0.1.el7.centos.ppc64le
gnome-shell-3.22.3-17.el7.ppc64le
perl-Carp-1.26-244.el7.noarch
liblouis-2.5.2-10.el7.ppc64le
dvd+rw-tools-7.1-15.el7.ppc64le
ptlib-2.10.10-6.el7.ppc64le
samba-common-libs-4.6.2-8.el7.ppc64le
gvfs-devel-1.30.4-3.el7.ppc64le
gnome-shell-extension-launch-new-instance-3.22.2-10.el7.noarch
perl-libs-5.16.3-292.el7.ppc64le
libselinux-utils-2.5-11.el7.ppc64le
libsepol-devel-2.5-6.el7.ppc64le
festival-lib-1.96-28.el7.ppc64le
oddjob-0.31.5-4.el7.ppc64le
latencytop-tui-0.5-13.el7.ppc64le
libvirt-daemon-driver-storage-core-3.2.0-14.el7.ppc64le
perl-Data-Dumper-2.145-3.el7.ppc64le
libreport-python-2.1.11-38.el7.centos.ppc64le
libical-devel-1.0.1-1.el7.ppc64le
libmx-1.4.7-10.el7.ppc64le
cups-pk-helper-0.2.6-2.el7.ppc64le
=== TEST BEGIN ===
Install prefix    /var/tmp/patchew-tester-tmp-845hv716/src/install
BIOS directory    /var/tmp/patchew-tester-tmp-845hv716/src/install/share/qemu
firmware path     /var/tmp/patchew-tester-tmp-845hv716/src/install/share/qemu-firmware
binary directory  /var/tmp/patchew-tester-tmp-845hv716/src/install/bin
library directory /var/tmp/patchew-tester-tmp-845hv716/src/install/lib
module directory  /var/tmp/patchew-tester-tmp-845hv716/src/install/lib/qemu
libexec directory /var/tmp/patchew-tester-tmp-845hv716/src/install/libexec
include directory /var/tmp/patchew-tester-tmp-845hv716/src/install/include
config directory  /var/tmp/patchew-tester-tmp-845hv716/src/install/etc
local state directory   /var/tmp/patchew-tester-tmp-845hv716/src/install/var
Manual directory  /var/tmp/patchew-tester-tmp-845hv716/src/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /var/tmp/patchew-tester-tmp-845hv716/src
GIT submodules    ui/keycodemapdb dtc capstone
C compiler        cc
Host C compiler   cc
C++ compiler      c++
Objective-C compiler cc
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/include/pixman-1   -I$(SRC_PATH)/dtc/libfdt -Werror -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include   -DNCURSES_WIDECHAR   -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wendif-labels -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/include/p11-kit-1       -I/usr/include/libpng15   -I$(SRC_PATH)/capstone/include
LDFLAGS           -Wl,--warn-common -m64 -g 
make              make
install           install
python            python -B
smbd              /usr/sbin/smbd
module support    no
host CPU          ppc64
host big endian   no
target list       aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblazeel-softmmu microblaze-softmmu mips64el-softmmu mips64-softmmu mipsel-softmmu mips-softmmu moxie-softmmu nios2-softmmu or1k-softmmu ppc64-softmmu ppcemb-softmmu ppc-softmmu s390x-softmmu sh4eb-softmmu sh4-softmmu sparc64-softmmu sparc-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensaeb-softmmu xtensa-softmmu aarch64-linux-user alpha-linux-user armeb-linux-user arm-linux-user cris-linux-user hppa-linux-user i386-linux-user m68k-linux-user microblazeel-linux-user microblaze-linux-user mips64el-linux-user mips64-linux-user mipsel-linux-user mips-linux-user mipsn32el-linux-user mipsn32-linux-user nios2-linux-user or1k-linux-user ppc64abi32-linux-user ppc64le-linux-user ppc64-linux-user ppc-linux-user s390x-linux-user sh4eb-linux-user sh4-linux-user sparc32plus-linux-user sparc64-linux-user sparc-linux-user tilegx-linux-user x86_64-linux-user
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
SDL support       yes (1.2.15)
GTK support       yes (3.22.10)
GTK GL support    no
VTE support       no 
TLS priority      NORMAL
GNUTLS support    yes
GNUTLS rnd        yes
libgcrypt         no
libgcrypt kdf     no
nettle            yes (2.7.1)
nettle kdf        yes
libtasn1          yes
curses support    yes
virgl support     no
curl support      yes
mingw32 support   no
Audio drivers     oss
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    yes
Multipath support no
VNC support       yes
VNC SASL support  yes
VNC JPEG support  yes
VNC PNG support   yes
xen support       no
brlapi support    no
bluez  support    no
Documentation     no
PIE               no
vde support       no
netmap support    no
Linux AIO support yes
ATTR/XATTR support yes
Install blobs     yes
KVM support       yes
HAX support       no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
RDMA support      yes
fdt support       yes
preadv support    yes
fdatasync         yes
madvise           yes
posix_madvise     yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
vhost-vsock support yes
vhost-user support yes
Trace backends    log
spice support     no 
rbd support       no
xfsctl support    no
smartcard support no
libusb            yes
usb net redir     no
OpenGL support    no
OpenGL dmabufs    no
libiscsi support  no
libnfs support    no
build guest agent yes
QGA VSS support   no
QGA w32 disk info no
QGA MSI support   no
seccomp support   no
coroutine backend ucontext
coroutine pool    yes
debug stack usage no
crypto afalg      no
GlusterFS support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   no
TPM passthrough   no
TPM emulator      yes
QOM debugging     yes
Live block migration yes
lzo support       no
snappy support    no
bzip2 support     yes
NUMA host support yes
tcmalloc support  no
jemalloc support  no
avx2 optimization no
replication support yes
VxHS block device no
capstone          git
  GEN     aarch64-softmmu/config-devices.mak.tmp
  GEN     alpha-softmmu/config-devices.mak.tmp
  GEN     arm-softmmu/config-devices.mak.tmp
  GEN     cris-softmmu/config-devices.mak.tmp
  GEN     i386-softmmu/config-devices.mak.tmp
  GEN     lm32-softmmu/config-devices.mak.tmp
  GEN     m68k-softmmu/config-devices.mak.tmp
  GEN     microblazeel-softmmu/config-devices.mak.tmp
  GEN     mips64el-softmmu/config-devices.mak.tmp
  GEN     microblaze-softmmu/config-devices.mak.tmp
  GEN     mips64-softmmu/config-devices.mak.tmp
  GEN     moxie-softmmu/config-devices.mak.tmp
  GEN     mipsel-softmmu/config-devices.mak.tmp
  GEN     mips-softmmu/config-devices.mak.tmp
  GEN     ppcemb-softmmu/config-devices.mak.tmp
  GEN     nios2-softmmu/config-devices.mak.tmp
  GEN     ppc64-softmmu/config-devices.mak.tmp
  GEN     sh4eb-softmmu/config-devices.mak.tmp
  GEN     s390x-softmmu/config-devices.mak.tmp
  GEN     ppc-softmmu/config-devices.mak.tmp
  GEN     or1k-softmmu/config-devices.mak.tmp
  GEN     sh4-softmmu/config-devices.mak.tmp
  GEN     sparc64-softmmu/config-devices.mak.tmp
  GEN     sparc-softmmu/config-devices.mak.tmp
  GEN     tricore-softmmu/config-devices.mak.tmp
  GEN     unicore32-softmmu/config-devices.mak.tmp
  GEN     x86_64-softmmu/config-devices.mak.tmp
  GEN     xtensaeb-softmmu/config-devices.mak.tmp
  GEN     xtensa-softmmu/config-devices.mak.tmp
  GEN     aarch64-linux-user/config-devices.mak.tmp
  GEN     armeb-linux-user/config-devices.mak.tmp
  GEN     alpha-linux-user/config-devices.mak.tmp
  GEN     lm32-softmmu/config-devices.mak
  GEN     cris-linux-user/config-devices.mak.tmp
  GEN     cris-softmmu/config-devices.mak
  GEN     arm-linux-user/config-devices.mak.tmp
  GEN     hppa-linux-user/config-devices.mak.tmp
  GEN     microblaze-softmmu/config-devices.mak
  GEN     m68k-linux-user/config-devices.mak.tmp
  GEN     i386-linux-user/config-devices.mak.tmp
  GEN     m68k-softmmu/config-devices.mak
  GEN     microblaze-linux-user/config-devices.mak.tmp
  GEN     moxie-softmmu/config-devices.mak
  GEN     ppc64-linux-user/config-devices.mak.tmp
  GEN     mipsel-linux-user/config-devices.mak.tmp
  GEN     microblazeel-linux-user/config-devices.mak.tmp
  GEN     mips64el-linux-user/config-devices.mak.tmp
  GEN     mipsn32-linux-user/config-devices.mak.tmp
  GEN     or1k-linux-user/config-devices.mak.tmp
  GEN     ppc64abi32-linux-user/config-devices.mak.tmp
  GEN     mips-linux-user/config-devices.mak.tmp
  GEN     s390x-linux-user/config-devices.mak.tmp
  GEN     mips64-linux-user/config-devices.mak.tmp
  GEN     ppc-linux-user/config-devices.mak.tmp
  GEN     ppc64le-linux-user/config-devices.mak.tmp
  GEN     mipsn32el-linux-user/config-devices.mak.tmp
  GEN     nios2-linux-user/config-devices.mak.tmp
  GEN     arm-softmmu/config-devices.mak
  GEN     microblazeel-softmmu/config-devices.mak
  GEN     nios2-softmmu/config-devices.mak
  GEN     ppc-softmmu/config-devices.mak
  GEN     s390x-softmmu/config-devices.mak
  GEN     sh4eb-softmmu/config-devices.mak
  GEN     arm-linux-user/config-devices.mak
  GEN     or1k-linux-user/config-devices.mak
  GEN     sh4eb-linux-user/config-devices.mak.tmp
  GEN     sh4-linux-user/config-devices.mak.tmp
  GEN     sparc32plus-linux-user/config-devices.mak.tmp
  GEN     sparc-linux-user/config-devices.mak.tmp
  GEN     tilegx-linux-user/config-devices.mak.tmp
  GEN     or1k-softmmu/config-devices.mak
  GEN     mipsn32-linux-user/config-devices.mak
  GEN     x86_64-linux-user/config-devices.mak.tmp
  GEN     config-host.h
  GIT     ui/keycodemapdb dtc capstone
  GEN     qemu-options.def
  GEN     i386-linux-user/config-devices.mak
  GEN     qapi-event.h
  GEN     qmp-marshal.c
  GEN     qapi-types.h
  GEN     qapi-visit.h
  GEN     sh4-linux-user/config-devices.mak
  GEN     qapi-visit.c
  GEN     qapi-event.c
  GEN     qmp-introspect.h
  GEN     qmp-introspect.c
  GEN     qapi-types.c
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-helpers.c
  GEN     trace/generated-tcg-tracers.h
  GEN     sparc32plus-linux-user/config-devices.mak
  GEN     trace/generated-helpers.h
  GEN     tricore-softmmu/config-devices.mak
  GEN     module_block.h
  GEN     sh4-softmmu/config-devices.mak
  GEN     alpha-linux-user/config-devices.mak
  GEN     tests/test-qapi-types.h
  GEN     tests/test-qapi-visit.h
  GEN     x86_64-softmmu/config-devices.mak
  GEN     sparc-softmmu/config-devices.mak
  GEN     tests/test-qmp-commands.h
  GEN     ppc64-softmmu/config-devices.mak
  GEN     unicore32-softmmu/config-devices.mak
  GEN     ppc-linux-user/config-devices.mak
  GEN     s390x-linux-user/config-devices.mak
  GEN     tests/test-qapi-event.h
  GEN     trace-root.h
  GEN     tests/test-qmp-introspect.h
  GEN     microblazeel-linux-user/config-devices.mak
  GEN     crypto/trace.h
  GEN     io/trace.h
  GEN     m68k-linux-user/config-devices.mak
  GEN     sparc64-linux-user/config-devices.mak.tmp
  GEN     migration/trace.h
  GEN     util/trace.h
  GEN     qmp-commands.h
  GEN     alpha-softmmu/config-devices.mak
  GEN     i386-softmmu/config-devices.mak
  GEN     mips64-softmmu/config-devices.mak
  GEN     xtensaeb-softmmu/config-devices.mak
  GEN     ppcemb-softmmu/config-devices.mak
  GEN     mips64el-softmmu/config-devices.mak
  GEN     sparc64-softmmu/config-devices.mak
  GEN     mipsel-softmmu/config-devices.mak
  GEN     aarch64-linux-user/config-devices.mak
  GEN     aarch64-softmmu/config-devices.mak
  GEN     armeb-linux-user/config-devices.mak
  GEN     cris-linux-user/config-devices.mak
  GEN     hppa-linux-user/config-devices.mak
  GEN     microblaze-linux-user/config-devices.mak
  GEN     mips64el-linux-user/config-devices.mak
  GEN     mips-softmmu/config-devices.mak
  GEN     mips64-linux-user/config-devices.mak
  GEN     xtensa-softmmu/config-devices.mak
  GEN     mipsel-linux-user/config-devices.mak
  GEN     mips-linux-user/config-devices.mak
  GEN     mipsn32el-linux-user/config-devices.mak
  GEN     nios2-linux-user/config-devices.mak
  GEN     ppc64abi32-linux-user/config-devices.mak
  GEN     ppc64le-linux-user/config-devices.mak
  GEN     sh4eb-linux-user/config-devices.mak
  GEN     sparc64-linux-user/config-devices.mak
  GEN     ppc64-linux-user/config-devices.mak
  GEN     sparc-linux-user/config-devices.mak
  GEN     tilegx-linux-user/config-devices.mak
  GEN     x86_64-linux-user/config-devices.mak
  GEN     block/trace.h
  GEN     chardev/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/net/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/display/trace.h
  GEN     hw/input/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/xen/trace.h
  GEN     hw/ide/trace.h
  GEN     ui/trace.h
  GEN     audio/trace.h
  GEN     net/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/mips/trace.h
  GEN     target/sparc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/ppc/trace.h
  GEN     qom/trace.h
  GEN     linux-user/trace.h
  GEN     qapi/trace.h
  GEN     accel/tcg/trace.h
  GEN     accel/kvm/trace.h
  GEN     nbd/trace.h
  GEN     scsi/trace.h
  GEN     trace-root.c
  GEN     util/trace.c
  GEN     crypto/trace.c
  GEN     io/trace.c
  GEN     migration/trace.c
  GEN     block/trace.c
  GEN     chardev/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/net/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/display/trace.c
  GEN     hw/input/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/xen/trace.c
  GEN     hw/ide/trace.c
  GEN     ui/trace.c
  GEN     audio/trace.c
  GEN     net/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/mips/trace.c
  GEN     target/sparc/trace.c
  GEN     target/s390x/trace.c
  GEN     target/ppc/trace.c
  GEN     qom/trace.c
  GEN     linux-user/trace.c
  GEN     qapi/trace.c
  GEN     accel/tcg/trace.c
  GEN     accel/kvm/trace.c
  GEN     nbd/trace.c
  GEN     scsi/trace.c
  GEN     config-all-devices.mak
mkdir -p dtc/libfdt
mkdir -p dtc/tests
  GEN     ui/input-keymap-linux-to-qcode.c
  GEN     ui/input-keymap-qcode-to-qnum.c
  GEN     ui/input-keymap-qnum-to-qcode.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/dumptrees.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/trees.S
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/testutils.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/value-labels.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/truncated_property.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/asm_tree_dump.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/overlay_bad_fixup.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/check_path.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/overlay.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/subnode_iterate.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/integer-expressions.c
  CC      cs.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/property_iterate.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/path_offset_aliases.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/utilfdt_test.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/dtbs_equal_unordered.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/add_subnode_with_nops.c
  CC      utils.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/dtb_reverse.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/dtbs_equal_ordered.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/extra-terminating-null.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/incbin.c
  CC      SStream.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/boot-cpuid.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/phandle_format.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/path-references.c
  CC      MCInstrDesc.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/appendprop2.c
  CC      MCRegisterInfo.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/appendprop1.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/string_escapes.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/propname_escapes.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/references.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/del_node.c
  CC      arch/ARM/ARMDisassembler.o
  CC      arch/ARM/ARMMapping.o
  CC      arch/ARM/ARMInstPrinter.o
  CC      arch/ARM/ARMModule.o
  CC      arch/AArch64/AArch64BaseInfo.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/del_property.c
  CC      arch/AArch64/AArch64InstPrinter.o
  CC      arch/AArch64/AArch64Mapping.o
  CC      arch/AArch64/AArch64Disassembler.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/setprop.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/set_name.c
  CC      arch/AArch64/AArch64Module.o
  CC      arch/Mips/MipsInstPrinter.o
  CC      arch/Mips/MipsDisassembler.o
  CC      arch/Mips/MipsMapping.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/rw_tree1.c
  CC      arch/Mips/MipsModule.o
  CC      arch/PowerPC/PPCDisassembler.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/nopulate.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/open_pack.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/move_and_save.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/sw_tree1.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/mangle-layout.c
  CC      arch/PowerPC/PPCInstPrinter.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/nop_node.c
  CC      arch/PowerPC/PPCModule.o
  CC      arch/PowerPC/PPCMapping.o
  CC      arch/Sparc/SparcDisassembler.o
  CC      arch/Sparc/SparcInstPrinter.o
  CC      arch/Sparc/SparcMapping.o
  CC      arch/Sparc/SparcModule.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/nop_property.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/setprop_inplace.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/stringlist.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/addr_size_cells.c
  CC      arch/SystemZ/SystemZDisassembler.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/notfound.c
  CC      arch/SystemZ/SystemZInstPrinter.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/char_literal.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/get_alias.c
  CC      arch/SystemZ/SystemZMapping.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/node_offset_by_compatible.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/node_check_compatible.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/sized_cells.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/node_offset_by_prop_value.c
  CC      arch/SystemZ/SystemZModule.o
  CC      arch/SystemZ/SystemZMCTargetDesc.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/node_offset_by_phandle.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/parent_offset.c
  CC      arch/X86/X86DisassemblerDecoder.o
  CC      arch/X86/X86Disassembler.o
  CC      arch/X86/X86ATTInstPrinter.o
  CC      arch/X86/X86Module.o
  CC      arch/XCore/XCoreDisassembler.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/supernode_atdepth_offset.c
  CC      arch/X86/X86Mapping.o
  CC      arch/X86/X86IntelInstPrinter.o
  CC      arch/XCore/XCoreInstPrinter.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/get_path.c
  CC      arch/XCore/XCoreMapping.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/get_phandle.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/getprop.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/get_name.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/path_offset.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/subnode_offset.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/root_node.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/find_property.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/tests/get_mem_rsv.c
  CC      arch/XCore/XCoreModule.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt_overlay.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt_addresses.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt_strerror.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt_empty_tree.c
  CC      MCInst.o
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt_sw.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt_rw.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt_wip.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt_ro.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/libfdt/fdt.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/util.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/fdtput.c
	 LEX convert-dtsv0-lexer.lex.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/srcpos.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/fdtdump.c
	 BISON dtc-parser.tab.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/fdtget.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/livetree.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/fstree.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/treesource.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/flattree.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/data.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/dtc.c
	 LEX dtc-lexer.lex.c
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/checks.c
	 DEP convert-dtsv0-lexer.lex.c
	 DEP dtc-parser.tab.c
	 DEP dtc-lexer.lex.c
	CHK version_gen.h
	UPD version_gen.h
	 DEP /var/tmp/patchew-tester-tmp-845hv716/src/dtc/util.c
	 CC libfdt/fdt.o
	 CC libfdt/fdt_ro.o
	 CC libfdt/fdt_wip.o
	 CC libfdt/fdt_sw.o
	 CC libfdt/fdt_rw.o
	 CC libfdt/fdt_strerror.o
	 CC libfdt/fdt_empty_tree.o
	 CC libfdt/fdt_addresses.o
	 CC libfdt/fdt_overlay.o
	 AR libfdt/libfdt.a
ar: creating libfdt/libfdt.a
a - libfdt/fdt.o
a - libfdt/fdt_ro.o
a - libfdt/fdt_wip.o
a - libfdt/fdt_sw.o
a - libfdt/fdt_rw.o
a - libfdt/fdt_strerror.o
a - libfdt/fdt_empty_tree.o
a - libfdt/fdt_addresses.o
a - libfdt/fdt_overlay.o
  AR      libcapstone.a
ar: creating /var/tmp/patchew-tester-tmp-845hv716/src/build/capstone/libcapstone.a
mkdir -p dtc/libfdt
mkdir -p dtc/tests
make[1]: `/var/tmp/patchew-tester-tmp-845hv716/src/build/capstone/libcapstone.a' is up to date.
  CC      tests/qemu-iotests/socket_scm_helper.o
  GEN     qga/qapi-generated/qga-qapi-types.h
  GEN     qga/qapi-generated/qga-qapi-visit.h
  GEN     qga/qapi-generated/qga-qmp-commands.h
  GEN     qga/qapi-generated/qga-qapi-types.c
  GEN     qga/qapi-generated/qga-qapi-visit.c
  GEN     qga/qapi-generated/qga-qmp-marshal.c
  CC      qapi-types.o
  CC      qapi-visit.o
  CC      qapi-event.o
  CC      qapi/qapi-visit-core.o
  CC      qmp-introspect.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnull.o
  CC      qobject/qnum.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qlist.o
  CC      qobject/qbool.o
  CC      qobject/qlit.o
  CC      qobject/qjson.o
  CC      qobject/qobject.o
  CC      qobject/json-lexer.o
  CC      qobject/json-parser.o
  CC      qobject/json-streamer.o
  CC      trace/control.o
  CC      util/osdep.o
  CC      trace/qmp.o
  CC      util/cutils.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/iohandler.o
  CC      util/compatfd.o
  CC      util/event_notifier-posix.o
  CC      util/mmap-alloc.o
  CC      util/oslib-posix.o
  CC      util/aio-posix.o
  CC      util/qemu-openpty.o
  CC      util/qemu-thread-posix.o
  CC      util/memfd.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/module.o
  CC      util/bitmap.o
  CC      util/bitops.o
  CC      util/hbitmap.o
  CC      util/host-utils.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/cacheinfo.o
  CC      util/error.o
  CC      util/qemu-error.o
  CC      util/id.o
  CC      util/iov.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/notify.o
  CC      util/qemu-option.o
  CC      util/qemu-progress.o
  CC      util/uuid.o
  CC      util/crc32c.o
  CC      util/keyval.o
  CC      util/hexdump.o
  CC      util/getauxval.o
  CC      util/throttle.o
  CC      util/rcu.o
  CC      util/readline.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-io.o
  CC      util/timed-average.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/buffer.o
  CC      util/coroutine-ucontext.o
  CC      util/log.o
  CC      util/base64.o
  CC      util/qdist.o
  CC      util/systemd.o
  CC      util/range.o
  CC      trace-root.o
  CC      util/qht.o
  CC      util/trace.o
  CC      util/stats64.o
  CC      io/trace.o
  CC      util/pagesize.o
  CC      crypto/trace.o
  CC      migration/trace.o
  CC      block/trace.o
  CC      chardev/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/intc/trace.o
  CC      hw/virtio/trace.o
  CC      hw/audio/trace.o
  CC      hw/misc/trace.o
  CC      hw/net/trace.o
  CC      hw/usb/trace.o
  CC      hw/scsi/trace.o
  CC      hw/nvram/trace.o
  CC      hw/input/trace.o
  CC      hw/timer/trace.o
  CC      hw/sparc/trace.o
  CC      hw/display/trace.o
  CC      hw/dma/trace.o
  CC      hw/sd/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/ppc/trace.o
  CC      hw/pci/trace.o
  CC      hw/s390x/trace.o
  CC      hw/vfio/trace.o
  CC      hw/acpi/trace.o
  CC      hw/arm/trace.o
  CC      hw/alpha/trace.o
  CC      hw/xen/trace.o
  CC      ui/trace.o
  CC      hw/ide/trace.o
  CC      audio/trace.o
  CC      net/trace.o
  CC      target/arm/trace.o
  CC      target/i386/trace.o
  CC      target/mips/trace.o
  CC      target/sparc/trace.o
  CC      target/s390x/trace.o
  CC      target/ppc/trace.o
  CC      qom/trace.o
  CC      linux-user/trace.o
  CC      qapi/trace.o
  CC      accel/tcg/trace.o
  CC      accel/kvm/trace.o
  CC      nbd/trace.o
  CC      scsi/trace.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/clock-warp.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/blk-commit-all.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/dump.o
  CC      stubs/error-printf.o
  CC      stubs/fdset.o
  CC      stubs/iothread.o
  CC      stubs/iothread-lock.o
  CC      stubs/gdbstub.o
  CC      stubs/is-daemonized.o
  CC      stubs/machine-init-done.o
  CC      stubs/get-vm-name.o
  CC      stubs/migr-blocker.o
  CC      stubs/change-state-handler.o
  CC      stubs/monitor.o
  CC      stubs/notify-event.o
  CC      stubs/qtest.o
  CC      stubs/linux-aio.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/set-fd-handler.o
  CC      stubs/slirp.o
  CC      stubs/sysbus.o
  CC      stubs/tpm.o
  CC      stubs/trace-control.o
  CC      stubs/uuid.o
  CC      stubs/vm-stop.o
  CC      stubs/vmstate.o
  CC      stubs/qmp_pc_dimm.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/vmgenid.o
  CC      stubs/xen-common.o
  CC      stubs/xen-hvm.o
  CC      stubs/pci-host-piix.o
  CC      qemu-nbd.o
  CC      block/raw-format.o
  CC      blockjob.o
  CC      contrib/ivshmem-server/ivshmem-server.o
  CC      qemu-io-cmds.o
  CC      replication.o
  CC      block/vdi.o
  CC      block/qcow2-cluster.o
  CC      block/vvfat.o
  CC      block/qcow.o
  CC      block/bochs.o
  CC      block/qcow2.o
  CC      block/vpc.o
  CC      block.o
  CC      block/qcow2-refcount.o
  CC      block/dmg.o
  CC      block/qcow2-cache.o
  CC      block/qed-l2-cache.o
  CC      contrib/ivshmem-client/ivshmem-client.o
  CC      block/cloop.o
  CC      block/qcow2-bitmap.o
  CC      block/vmdk.o
  CC      block/qed.o
  CC      block/qcow2-snapshot.o
  CC      contrib/ivshmem-client/main.o
  CC      contrib/ivshmem-server/main.o
  CC      block/qed-table.o
  CC      block/qed-cluster.o
  CC      block/qed-check.o
  CC      block/vhdx.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/parallels.o
  CC      block/blkdebug.o
  CC      block/quorum.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/qapi.o
  CC      block/file-posix.o
  CC      block/linux-aio.o
  CC      block/null.o
  CC      block/mirror.o
  CC      block/commit.o
  CC      block/io.o
  CC      block/throttle-groups.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/accounting.o
  CC      block/dirty-bitmap.o
  CC      block/write-threshold.o
  CC      block/backup.o
  CC      block/replication.o
  CC      block/throttle.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      scsi/utils.o
  CC      scsi/pr-manager.o
  CC      scsi/pr-manager-helper.o
  CC      block/curl.o
  CC      block/dmg-bz2.o
  CC      crypto/init.o
  CC      crypto/hash-nettle.o
  CC      crypto/hmac.o
  CC      crypto/hash.o
  CC      crypto/hmac-nettle.o
  CC      crypto/aes.o
  CC      crypto/desrfb.o
  CC      crypto/cipher.o
  CC      crypto/tlscreds.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/random-gnutls.o
  CC      crypto/pbkdf-nettle.o
  CC      crypto/ivgen.o
  CC      crypto/pbkdf.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/afsplit.o
  CC      crypto/block-qcow.o
  CC      crypto/block-luks.o
  CC      crypto/block.o
  CC      crypto/xts.o
  CC      io/channel.o
  CC      io/channel-buffer.o
  CC      io/channel-command.o
  CC      io/channel-file.o
  CC      io/channel-socket.o
  CC      io/channel-tls.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/dns-resolver.o
  CC      io/task.o
  CC      qom/object.o
  CC      qom/container.o
  CC      qom/qom-qobject.o
  CC      qom/object_interfaces.o
  GEN     qemu-img-cmds.h
  CC      qemu-io.o
  CC      fsdev/virtfs-proxy-helper.o
  CC      fsdev/9p-marshal.o
  CC      fsdev/9p-iov-marshal.o
  CC      scsi/qemu-pr-helper.o
  CC      qemu-bridge-helper.o
  CC      blockdev.o
  CC      bootdevice.o
  CC      blockdev-nbd.o
  CC      iothread.o
  CC      qdev-monitor.o
  CC      device-hotplug.o
  CC      os-posix.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      device_tree.o
  CC      qmp-marshal.o
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/audio.o
  CC      audio/sdlaudio.o
  CC      audio/noaudio.o
  CC      audio/ossaudio.o
  CC      audio/wavcapture.o
  CC      backends/rng.o
  CC      backends/rng-egd.o
  CC      backends/rng-random.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-ram.o
  CC      backends/hostmem-file.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      block/stream.o
  CC      chardev/msmouse.o
  CC      chardev/wctablet.o
  CC      chardev/testdev.o
  CC      disas/alpha.o
  CC      disas/arm.o
  CXX     disas/arm-a64.o
  CC      disas/cris.o
  CC      disas/hppa.o
  CC      disas/i386.o
  CC      disas/m68k.o
  CC      disas/microblaze.o
  CC      disas/nios2.o
  CC      disas/moxie.o
  CC      disas/ppc.o
  CC      disas/mips.o
  CC      disas/s390.o
  CC      disas/sh4.o
  CC      disas/sparc.o
  CC      disas/lm32.o
  CXX     disas/libvixl/vixl/utils.o
  CXX     disas/libvixl/vixl/compiler-intrinsics.o
  CXX     disas/libvixl/vixl/a64/instructions-a64.o
  CXX     disas/libvixl/vixl/a64/decoder-a64.o
  CXX     disas/libvixl/vixl/a64/disasm-a64.o
  CC      fsdev/qemu-fsdev.o
  CC      fsdev/qemu-fsdev-opts.o
  CC      fsdev/qemu-fsdev-throttle.o
  CC      fsdev/qemu-fsdev-dummy.o
  CC      hw/9pfs/9p.o
  CC      hw/9pfs/9p-util.o
  CC      hw/9pfs/9p-local.o
  CC      hw/9pfs/9p-xattr.o
  CC      hw/9pfs/9p-xattr-user.o
  CC      hw/9pfs/9p-posix-acl.o
  CC      hw/9pfs/coth.o
  CC      hw/9pfs/cofs.o
  CC      hw/9pfs/codir.o
  CC      hw/9pfs/cofile.o
  CC      hw/9pfs/coxattr.o
  CC      hw/9pfs/9p-synth.o
  CC      hw/9pfs/9p-handle.o
  CC      hw/9pfs/9p-proxy.o
  CC      hw/acpi/core.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/nvdimm.o
  CC      hw/acpi/vmgenid.o
  CC      hw/acpi/acpi_interface.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/bios-linker-loader.o
  CC      hw/acpi/aml-build.o
  CC      hw/acpi/ipmi.o
  CC      hw/acpi/acpi-stub.o
  CC      hw/acpi/ipmi-stub.o
  CC      hw/audio/sb16.o
  CC      hw/audio/es1370.o
  CC      hw/audio/ac97.o
  CC      hw/audio/fmopl.o
  CC      hw/audio/adlib.o
  CC      hw/audio/gus.o
  CC      hw/audio/gusemu_hal.o
  CC      hw/audio/gusemu_mixer.o
  CC      hw/audio/cs4231a.o
  CC      hw/audio/intel-hda.o
  CC      hw/audio/hda-codec.o
  CC      hw/audio/pcspk.o
  CC      hw/audio/wm8750.o
  CC      hw/audio/pl041.o
  CC      hw/audio/lm4549.o
  CC      hw/audio/cs4231.o
  CC      hw/audio/marvell_88w8618.o
  CC      hw/audio/milkymist-ac97.o
  CC      hw/audio/soundhw.o
  CC      hw/block/block.o
  CC      hw/block/cdrom.o
  CC      hw/block/hd-geometry.o
  CC      hw/block/fdc.o
  CC      hw/block/m25p80.o
  CC      hw/block/nand.o
  CC      hw/block/pflash_cfi01.o
  CC      hw/block/pflash_cfi02.o
  CC      hw/block/ecc.o
  CC      hw/block/onenand.o
  CC      hw/block/nvme.o
  CC      hw/bt/core.o
  CC      hw/bt/l2cap.o
  CC      hw/bt/sdp.o
  CC      hw/bt/hci.o
  CC      hw/bt/hid.o
  CC      hw/bt/hci-csr.o
  CC      hw/char/ipoctal232.o
  CC      hw/char/escc.o
  CC      hw/char/parallel.o
  CC      hw/char/pl011.o
  CC      hw/char/serial-isa.o
  CC      hw/char/serial.o
  CC      hw/char/serial-pci.o
  CC      hw/char/virtio-console.o
  CC      hw/char/xilinx_uartlite.o
  CC      hw/char/cadence_uart.o
  CC      hw/char/cmsdk-apb-uart.o
  CC      hw/char/etraxfs_ser.o
  CC      hw/char/debugcon.o
  CC      hw/char/grlib_apbuart.o
  CC      hw/char/imx_serial.o
  CC      hw/char/lm32_juart.o
  CC      hw/char/lm32_uart.o
  CC      hw/char/milkymist-uart.o
  CC      hw/char/sclpconsole.o
  CC      hw/char/sclpconsole-lm.o
  CC      hw/core/qdev.o
  CC      hw/core/qdev-properties.o
  CC      hw/core/bus.o
  CC      hw/core/reset.o
  CC      hw/core/fw-path-provider.o
  CC      hw/core/irq.o
  CC      hw/core/hotplug.o
  CC      hw/core/nmi.o
  CC      hw/core/stream.o
  CC      hw/core/ptimer.o
  CC      hw/core/empty_slot.o
  CC      hw/core/sysbus.o
  CC      hw/core/machine.o
  CC      hw/core/loader.o
  CC      hw/core/loader-fit.o
  CC      hw/core/qdev-properties-system.o
  CC      hw/core/register.o
  CC      hw/core/or-irq.o
  CC      hw/core/platform-bus.o
  CC      hw/cpu/core.o
  CC      hw/display/ads7846.o
  CC      hw/display/cirrus_vga.o
  CC      hw/display/g364fb.o
  CC      hw/display/jazz_led.o
  CC      hw/display/pl110.o
  CC      hw/display/ssd0303.o
  CC      hw/display/ssd0323.o
  CC      hw/display/vga-pci.o
  CC      hw/display/vga-isa.o
  CC      hw/display/vga-isa-mm.o
  CC      hw/display/vmware_vga.o
  CC      hw/display/blizzard.o
  CC      hw/display/exynos4210_fimd.o
  CC      hw/display/framebuffer.o
  CC      hw/display/milkymist-vgafb.o
  CC      hw/display/tc6393xb.o
  CC      hw/dma/puv3_dma.o
  CC      hw/dma/rc4030.o
  CC      hw/dma/pl080.o
  CC      hw/dma/pl330.o
  CC      hw/dma/i82374.o
  CC      hw/dma/i8257.o
  CC      hw/dma/xilinx_axidma.o
  CC      hw/dma/xlnx-zynq-devcfg.o
  CC      hw/dma/etraxfs_dma.o
  CC      hw/dma/sparc32_dma.o
  CC      hw/dma/sun4m_iommu.o
  CC      hw/gpio/max7310.o
  CC      hw/gpio/pl061.o
  CC      hw/gpio/puv3_gpio.o
  CC      hw/gpio/zaurus.o
  CC      hw/gpio/mpc8xxx.o
  CC      hw/gpio/gpio_key.o
  CC      hw/i2c/core.o
  CC      hw/i2c/smbus.o
  CC      hw/i2c/smbus_eeprom.o
  CC      hw/i2c/i2c-ddc.o
  CC      hw/i2c/versatile_i2c.o
  CC      hw/i2c/smbus_ich9.o
  CC      hw/i2c/pm_smbus.o
  CC      hw/i2c/bitbang_i2c.o
  CC      hw/i2c/exynos4210_i2c.o
  CC      hw/i2c/imx_i2c.o
  CC      hw/ide/atapi.o
  CC      hw/ide/core.o
  CC      hw/i2c/aspeed_i2c.o
  CC      hw/ide/qdev.o
  CC      hw/ide/pci.o
  CC      hw/ide/isa.o
  CC      hw/ide/piix.o
  CC      hw/ide/cmd646.o
  CC      hw/ide/macio.o
  CC      hw/ide/mmio.o
  CC      hw/ide/via.o
  CC      hw/ide/microdrive.o
  CC      hw/ide/ahci.o
  CC      hw/ide/ich.o
  CC      hw/input/adb.o
  CC      hw/input/hid.o
  CC      hw/input/lm832x.o
  CC      hw/input/pckbd.o
  CC      hw/input/pl050.o
  CC      hw/input/ps2.o
  CC      hw/input/stellaris_input.o
  CC      hw/input/tsc2005.o
  CC      hw/input/vmmouse.o
  CC      hw/input/virtio-input.o
  CC      hw/input/virtio-input-hid.o
  CC      hw/input/virtio-input-host.o
  CC      hw/intc/heathrow_pic.o
  CC      hw/intc/i8259_common.o
  CC      hw/intc/i8259.o
  CC      hw/intc/pl190.o
  CC      hw/intc/lm32_pic.o
  CC      hw/intc/xilinx_intc.o
  CC      hw/intc/realview_gic.o
  CC      hw/intc/puv3_intc.o
  CC      hw/intc/imx_avic.o
  CC      hw/intc/etraxfs_pic.o
  CC      hw/intc/slavio_intctl.o
  CC      hw/intc/ioapic_common.o
  CC      hw/intc/arm_gic_common.o
  CC      hw/intc/arm_gic.o
  CC      hw/intc/arm_gicv2m.o
  CC      hw/intc/arm_gicv3_common.o
  CC      hw/intc/arm_gicv3.o
  CC      hw/intc/arm_gicv3_dist.o
  CC      hw/intc/arm_gicv3_redist.o
  CC      hw/intc/arm_gicv3_its_common.o
  CC      hw/intc/openpic.o
  CC      hw/intc/intc.o
  CC      hw/ipack/ipack.o
  CC      hw/ipack/tpci200.o
  CC      hw/ipmi/ipmi.o
  CC      hw/ipmi/ipmi_bmc_sim.o
  CC      hw/ipmi/ipmi_bmc_extern.o
  CC      hw/ipmi/isa_ipmi_kcs.o
  CC      hw/isa/isa-bus.o
  CC      hw/ipmi/isa_ipmi_bt.o
  CC      hw/isa/apm.o
  CC      hw/isa/i82378.o
  CC      hw/isa/pc87312.o
  CC      hw/isa/piix4.o
  CC      hw/isa/vt82c686.o
  CC      hw/mem/nvdimm.o
  CC      hw/mem/pc-dimm.o
  CC      hw/misc/applesmc.o
  CC      hw/misc/max111x.o
  CC      hw/misc/tmp105.o
  CC      hw/misc/tmp421.o
  CC      hw/misc/debugexit.o
  CC      hw/misc/sga.o
  CC      hw/misc/pc-testdev.o
  CC      hw/misc/pci-testdev.o
  CC      hw/misc/edu.o
  CC      hw/misc/unimp.o
  CC      hw/misc/vmcoreinfo.o
  CC      hw/misc/arm_l2x0.o
  CC      hw/misc/arm_integrator_debug.o
  CC      hw/misc/a9scu.o
  CC      hw/misc/puv3_pm.o
  CC      hw/misc/macio/macio.o
  CC      hw/misc/arm11scu.o
  CC      hw/misc/macio/cuda.o
  CC      hw/misc/macio/mac_dbdma.o
  CC      hw/net/dp8393x.o
  CC      hw/net/ne2000.o
  CC      hw/net/eepro100.o
  CC      hw/net/pcnet-pci.o
  CC      hw/net/pcnet.o
  CC      hw/net/e1000x_common.o
  CC      hw/net/e1000.o
  CC      hw/net/net_tx_pkt.o
  CC      hw/net/net_rx_pkt.o
  CC      hw/net/e1000e.o
  CC      hw/net/e1000e_core.o
  CC      hw/net/rtl8139.o
  CC      hw/net/vmxnet3.o
  CC      hw/net/ne2000-isa.o
  CC      hw/net/lan9118.o
  CC      hw/net/opencores_eth.o
  CC      hw/net/smc91c111.o
  CC      hw/net/xgmac.o
  CC      hw/net/mipsnet.o
  CC      hw/net/xilinx_axienet.o
  CC      hw/net/allwinner_emac.o
  CC      hw/net/imx_fec.o
  CC      hw/net/cadence_gem.o
  CC      hw/net/stellaris_enet.o
  CC      hw/net/lance.o
  CC      hw/net/sunhme.o
  CC      hw/net/ftgmac100.o
  CC      hw/net/rocker/rocker_fp.o
  CC      hw/net/sungem.o
  CC      hw/net/rocker/rocker_desc.o
  CC      hw/net/rocker/rocker_world.o
  CC      hw/net/rocker/rocker_of_dpa.o
  CC      hw/net/rocker/rocker.o
  CC      hw/nvram/ds1225y.o
  CC      hw/nvram/chrp_nvram.o
  CC      hw/nvram/eeprom93xx.o
  CC      hw/nvram/mac_nvram.o
  CC      hw/nvram/fw_cfg.o
  CC      hw/pci-bridge/pci_bridge_dev.o
  CC      hw/pci-bridge/pcie_pci_bridge.o
  CC      hw/pci-bridge/pcie_root_port.o
  CC      hw/pci-bridge/gen_pcie_root_port.o
  CC      hw/pci-bridge/pci_expander_bridge.o
  CC      hw/pci-bridge/xio3130_upstream.o
  CC      hw/pci-bridge/xio3130_downstream.o
  CC      hw/pci-bridge/ioh3420.o
  CC      hw/pci-bridge/i82801b11.o
  CC      hw/pci-bridge/dec.o
  CC      hw/pci-host/pam.o
  CC      hw/pci-host/prep.o
  CC      hw/pci-host/grackle.o
  CC      hw/pci-host/uninorth.o
  CC      hw/pci-host/ppce500.o
  CC      hw/pci-host/versatile.o
  CC      hw/pci-host/apb.o
  CC      hw/pci-host/bonito.o
  CC      hw/pci-host/piix.o
  CC      hw/pci-host/q35.o
  CC      hw/pci-host/gpex.o
  CC      hw/pci-host/xilinx-pcie.o
  CC      hw/pci/pci.o
  CC      hw/pci/pci_bridge.o
  CC      hw/pci/msix.o
  CC      hw/pci/msi.o
  CC      hw/pci/shpc.o
  CC      hw/pci/slotid_cap.o
  CC      hw/pci/pci_host.o
  CC      hw/pci/pcie_host.o
  CC      hw/pci/pcie.o
  CC      hw/pci/pcie_aer.o
  CC      hw/pci/pcie_port.o
  CC      hw/pci/pci-stub.o
  CC      hw/pcmcia/pcmcia.o
  CC      hw/scsi/scsi-disk.o
  CC      hw/scsi/scsi-generic.o
  CC      hw/scsi/scsi-bus.o
  CC      hw/scsi/lsi53c895a.o
  CC      hw/scsi/mptsas.o
  CC      hw/scsi/mptconfig.o
  CC      hw/scsi/mptendian.o
  CC      hw/scsi/megasas.o
  CC      hw/scsi/vmw_pvscsi.o
  CC      hw/scsi/esp.o
  CC      hw/scsi/esp-pci.o
  CC      hw/sd/pl181.o
  CC      hw/sd/ssi-sd.o
  CC      hw/sd/sd.o
  CC      hw/sd/core.o
  CC      hw/sd/sdhci.o
  CC      hw/smbios/smbios.o
  CC      hw/smbios/smbios_type_38.o
  CC      hw/smbios/smbios-stub.o
  CC      hw/smbios/smbios_type_38-stub.o
  CC      hw/ssi/pl022.o
  CC      hw/ssi/ssi.o
  CC      hw/ssi/xilinx_spi.o
  CC      hw/ssi/xilinx_spips.o
  CC      hw/ssi/aspeed_smc.o
  CC      hw/ssi/stm32f2xx_spi.o
  CC      hw/ssi/mss-spi.o
  CC      hw/timer/arm_timer.o
  CC      hw/timer/arm_mptimer.o
  CC      hw/timer/armv7m_systick.o
  CC      hw/timer/a9gtimer.o
  CC      hw/timer/cadence_ttc.o
  CC      hw/timer/ds1338.o
  CC      hw/timer/hpet.o
  CC      hw/timer/i8254_common.o
  CC      hw/timer/m48t59.o
  CC      hw/timer/m48t59-isa.o
  CC      hw/timer/i8254.o
  CC      hw/timer/pl031.o
  CC      hw/timer/puv3_ost.o
  CC      hw/timer/twl92230.o
  CC      hw/timer/xilinx_timer.o
  CC      hw/timer/slavio_timer.o
  CC      hw/timer/etraxfs_timer.o
  CC      hw/timer/grlib_gptimer.o
  CC      hw/timer/imx_epit.o
  CC      hw/timer/imx_gpt.o
  CC      hw/timer/lm32_timer.o
  CC      hw/timer/milkymist-sysctl.o
  CC      hw/timer/stm32f2xx_timer.o
  CC      hw/timer/aspeed_timer.o
  CC      hw/timer/sun4v-rtc.o
  CC      hw/timer/cmsdk-apb-timer.o
  CC      hw/timer/mss-timer.o
  CC      hw/tpm/tpm_tis.o
  CC      hw/tpm/tpm_emulator.o
  CC      hw/tpm/tpm_util.o
  CC      hw/usb/core.o
  CC      hw/usb/combined-packet.o
  CC      hw/usb/bus.o
  CC      hw/usb/libhw.o
  CC      hw/usb/desc.o
  CC      hw/usb/desc-msos.o
  CC      hw/usb/hcd-uhci.o
  CC      hw/usb/hcd-ohci.o
  CC      hw/usb/hcd-ehci.o
  CC      hw/usb/hcd-ehci-pci.o
  CC      hw/usb/hcd-ehci-sysbus.o
  CC      hw/usb/hcd-xhci.o
  CC      hw/usb/hcd-xhci-nec.o
  CC      hw/usb/hcd-musb.o
  CC      hw/usb/dev-hub.o
  CC      hw/usb/dev-hid.o
  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
  CC      hw/usb/dev-uas.o
  CC      hw/usb/dev-audio.o
  CC      hw/usb/dev-serial.o
  CC      hw/usb/dev-network.o
  CC      hw/usb/dev-bluetooth.o
  CC      hw/usb/dev-smartcard-reader.o
  CC      hw/usb/dev-mtp.o
  CC      hw/usb/host-libusb.o
  CC      hw/usb/host-legacy.o
  CC      hw/usb/host-stub.o
  CC      hw/virtio/virtio-rng.o
  CC      hw/virtio/virtio-pci.o
  CC      hw/virtio/virtio-bus.o
  CC      hw/virtio/virtio-mmio.o
  CC      hw/virtio/vhost-stub.o
  CC      hw/watchdog/wdt_i6300esb.o
  CC      hw/watchdog/wdt_diag288.o
  CC      hw/watchdog/watchdog.o
  CC      hw/watchdog/wdt_aspeed.o
  CC      hw/watchdog/wdt_ib700.o
  CC      migration/migration.o
  CC      migration/socket.o
  CC      migration/fd.o
  CC      migration/exec.o
  CC      migration/tls.o
  CC      migration/channel.o
  CC      migration/savevm.o
  CC      migration/colo-comm.o
  CC      migration/colo.o
  CC      migration/vmstate.o
  CC      migration/vmstate-types.o
  CC      migration/page_cache.o
  CC      migration/colo-failover.o
  CC      migration/qemu-file.o
  CC      migration/global_state.o
  CC      migration/qemu-file-channel.o
  CC      migration/xbzrle.o
  CC      migration/postcopy-ram.o
  CC      migration/qjson.o
  CC      migration/block-dirty-bitmap.o
  CC      migration/rdma.o
  CC      migration/block.o
  CC      net/net.o
  CC      net/queue.o
  CC      net/checksum.o
  CC      net/util.o
  CC      net/hub.o
  CC      net/socket.o
  CC      net/dump.o
  CC      net/l2tpv3.o
  CC      net/eth.o
  CC      net/vhost-user.o
  CC      net/slirp.o
  CC      net/filter.o
  CC      net/filter-buffer.o
  CC      net/colo-compare.o
  CC      net/colo.o
  CC      net/filter-mirror.o
  CC      net/filter-rewriter.o
  CC      net/filter-replay.o
  CC      net/tap.o
  CC      net/tap-linux.o
  CC      qom/cpu.o
  CC      replay/replay.o
  CC      replay/replay-internal.o
  CC      replay/replay-events.o
  CC      replay/replay-input.o
  CC      replay/replay-time.o
  CC      replay/replay-char.o
  CC      replay/replay-snapshot.o
  CC      replay/replay-net.o
  CC      replay/replay-audio.o
  CC      slirp/cksum.o
  CC      slirp/if.o
  CC      slirp/ip_icmp.o
  CC      slirp/ip6_icmp.o
  CC      slirp/ip6_input.o
  CC      slirp/ip6_output.o
  CC      slirp/ip_input.o
  CC      slirp/ip_output.o
  CC      slirp/dnssearch.o
  CC      slirp/dhcpv6.o
  CC      slirp/slirp.o
  CC      slirp/mbuf.o
  CC      slirp/misc.o
  CC      slirp/sbuf.o
  CC      slirp/socket.o
  CC      slirp/tcp_input.o
  CC      slirp/tcp_output.o
  CC      slirp/tcp_subr.o
  CC      slirp/tcp_timer.o
  CC      slirp/udp.o
  CC      slirp/udp6.o
  CC      slirp/bootp.o
  CC      slirp/tftp.o
  CC      slirp/arp_table.o
  CC      slirp/ndp_table.o
  CC      slirp/ncsi.o
  CC      ui/keymaps.o
  CC      ui/console.o
  CC      ui/cursor.o
  CC      ui/qemu-pixman.o
  CC      ui/input-legacy.o
  CC      ui/input.o
  CC      ui/input-linux.o
  CC      ui/input-keymap.o
  CC      ui/sdl.o
  CC      ui/sdl_zoom.o
  CC      ui/curses.o
  CC      ui/vnc.o
  CC      ui/vnc-enc-zlib.o
  CC      ui/vnc-enc-hextile.o
  CC      ui/x_keymap.o
  CC      ui/vnc-enc-tight.o
  CC      ui/vnc-palette.o
  CC      ui/vnc-enc-zrle.o
  CC      ui/vnc-auth-vencrypt.o
  CC      ui/vnc-auth-sasl.o
  CC      ui/vnc-ws.o
  CC      ui/vnc-jobs.o
  CC      ui/gtk.o
  CC      chardev/char.o
  CC      chardev/char-fd.o
  CC      chardev/char-fe.o
  CC      chardev/char-file.o
  CC      chardev/char-mux.o
  CC      chardev/char-io.o
  CC      chardev/char-null.o
  CC      chardev/char-parallel.o
  CC      chardev/char-pipe.o
  CC      chardev/char-pty.o
  CC      chardev/char-ringbuf.o
  CC      chardev/char-serial.o
  CC      chardev/char-socket.o
  CC      chardev/char-stdio.o
  CC      chardev/char-udp.o
  CCAS    spapr-rtas/spapr-rtas.o
  Building spapr-rtas/spapr-rtas.img
  Building spapr-rtas/spapr-rtas.bin
rm spapr-rtas.img spapr-rtas.o
  LINK    tests/qemu-iotests/socket_scm_helper
  CC      qga/commands.o
  CC      qga/guest-agent-command-state.o
  CC      qga/main.o
  CC      qga/commands-posix.o
  CC      qga/channel-posix.o
  CC      qga/qapi-generated/qga-qapi-types.o
  CC      qga/qapi-generated/qga-qapi-visit.o
  CC      qga/qapi-generated/qga-qmp-marshal.o
  CC      qemu-img.o
  AR      libqemuutil.a
  LINK    qemu-ga
  LINK    ivshmem-client
  LINK    ivshmem-server
  LINK    qemu-nbd
  LINK    qemu-img
  LINK    qemu-io
  LINK    fsdev/virtfs-proxy-helper
  LINK    scsi/qemu-pr-helper
  LINK    qemu-bridge-helper
  GEN     m68k-linux-user/config-target.h
  GEN     mips64el-linux-user/config-target.h
  GEN     armeb-linux-user/config-target.h
  CC      mips64el-linux-user/exec.o
  CC      mips64el-linux-user/tcg/tcg.o
  CC      mips64el-linux-user/tcg/tcg-op.o
  CC      mips64el-linux-user/tcg/optimize.o
  CC      mips64el-linux-user/tcg/tcg-common.o
  CC      mips64el-linux-user/fpu/softfloat.o
  CC      mips64el-linux-user/disas.o
  GEN     arm-linux-user/config-target.h
  CC      mips64el-linux-user/gdbstub.o
  CC      mips64el-linux-user/thunk.o
  CC      armeb-linux-user/exec.o
  CC      armeb-linux-user/tcg/tcg.o
  CC      mips64el-linux-user/accel/stubs/hax-stub.o
  CC      mips64el-linux-user/accel/stubs/kvm-stub.o
  CC      mips64el-linux-user/accel/tcg/tcg-runtime.o
  CC      armeb-linux-user/tcg/tcg-op.o
  CC      mips64el-linux-user/accel/tcg/cpu-exec.o
  CC      mips64el-linux-user/accel/tcg/translate-all.o
  CC      armeb-linux-user/tcg/optimize.o
  CC      mips64el-linux-user/accel/tcg/translator.o
  CC      armeb-linux-user/fpu/softfloat.o
  GEN     aarch64-linux-user/config-target.h
  CC      armeb-linux-user/tcg/tcg-common.o
  CC      mips64el-linux-user/accel/tcg/user-exec.o
  CC      mips64el-linux-user/accel/tcg/user-exec-stub.o
  CC      mips64el-linux-user/linux-user/main.o
  GEN     or1k-linux-user/config-target.h
  CC      mips64el-linux-user/linux-user/syscall.o
  CC      mips64el-linux-user/accel/tcg/cpu-exec-common.o
  CC      armeb-linux-user/disas.o
  GEN     armeb-linux-user/gdbstub-xml.c
  CC      armeb-linux-user/gdbstub.o
  CC      mips64el-linux-user/linux-user/strace.o
  CC      mips64el-linux-user/linux-user/signal.o
  CC      armeb-linux-user/thunk.o
  CC      armeb-linux-user/accel/stubs/hax-stub.o
  CC      mips64el-linux-user/linux-user/mmap.o
  CC      armeb-linux-user/accel/stubs/kvm-stub.o
  CC      armeb-linux-user/accel/tcg/tcg-runtime.o
  CC      armeb-linux-user/accel/tcg/cpu-exec-common.o
  CC      aarch64-linux-user/exec.o
  CC      armeb-linux-user/accel/tcg/translate-all.o
  GEN     mipsel-linux-user/config-target.h
  CC      aarch64-linux-user/tcg/tcg.o
  CC      armeb-linux-user/accel/tcg/cpu-exec.o
  CC      mips64el-linux-user/linux-user/uaccess.o
  CC      mips64el-linux-user/linux-user/elfload.o
  CC      mips64el-linux-user/linux-user/linuxload.o
  CC      arm-linux-user/exec.o
  GEN     hppa-linux-user/config-target.h
  GEN     microblazeel-linux-user/config-target.h
  GEN     alpha-linux-user/config-target.h
  CC      mipsel-linux-user/exec.o
  CC      or1k-linux-user/exec.o
  GEN     cris-linux-user/config-target.h
  GEN     mipsn32el-linux-user/config-target.h
  GEN     microblaze-linux-user/config-target.h
  CC      alpha-linux-user/exec.o
  GEN     mips64-linux-user/config-target.h
  GEN     ppc-linux-user/config-target.h
  GEN     nios2-linux-user/config-target.h
  CC      microblazeel-linux-user/exec.o
  GEN     i386-linux-user/config-target.h
  GEN     x86_64-linux-user/config-target.h
  GEN     sh4-linux-user/config-target.h
  GEN     sparc32plus-linux-user/config-target.h
  GEN     sparc-linux-user/config-target.h
  CC      mips64-linux-user/exec.o
  CC      cris-linux-user/exec.o
  CC      hppa-linux-user/exec.o
  GEN     mipsn32-linux-user/config-target.h
  GEN     tilegx-linux-user/config-target.h
  CC      sh4-linux-user/exec.o
  CC      mipsn32el-linux-user/exec.o
  GEN     moxie-softmmu/hmp-commands.h
  GEN     ppc64le-linux-user/config-target.h
  GEN     sparc64-linux-user/config-target.h
  CC      m68k-linux-user/exec.o
  CC      microblaze-linux-user/exec.o
  GEN     mips-linux-user/config-target.h
  CC      ppc-linux-user/exec.o
  GEN     ppc64abi32-linux-user/config-target.h
  CC      x86_64-linux-user/exec.o
  CC      sparc64-linux-user/exec.o
  CC      sparc32plus-linux-user/exec.o
  CC      i386-linux-user/exec.o
  GEN     m68k-softmmu/hmp-commands.h
  CC      nios2-linux-user/exec.o
  CC      arm-linux-user/tcg/tcg.o
  CC      tilegx-linux-user/exec.o
  CC      sparc-linux-user/exec.o
  CC      ppc64le-linux-user/exec.o
  CC      s390x-linux-user/gen-features
  CC      ppc64abi32-linux-user/exec.o
  GEN     ppc64-linux-user/config-target.h
  CC      mipsn32-linux-user/exec.o
  CC      x86_64-linux-user/tcg/tcg.o
  CC      mips-linux-user/exec.o
  CC      ppc64le-linux-user/tcg/tcg.o
  GEN     moxie-softmmu/hmp-commands-info.h
  CC      ppc64-linux-user/exec.o
  GEN     lm32-softmmu/hmp-commands.h
  GEN     sh4eb-linux-user/config-target.h
  CC      sparc32plus-linux-user/tcg/tcg.o
  CC      sh4eb-linux-user/exec.o
  GEN     m68k-softmmu/hmp-commands-info.h
  CC      x86_64-linux-user/tcg/tcg-op.o
  GEN     moxie-softmmu/config-target.h
  CC      mips64-linux-user/tcg/tcg.o
  GEN     m68k-softmmu/config-target.h
  CC      mips64-linux-user/tcg/tcg-op.o
  CC      sparc64-linux-user/tcg/tcg.o
  GEN     cris-softmmu/hmp-commands.h
  GEN     unicore32-softmmu/hmp-commands.h
  CC      moxie-softmmu/exec.o
  CC      m68k-softmmu/exec.o
  GEN     or1k-softmmu/hmp-commands.h
  GEN     xtensaeb-softmmu/hmp-commands.h
  GEN     sh4-softmmu/hmp-commands.h
  GEN     lm32-softmmu/hmp-commands-info.h
  GEN     s390x-linux-user/config-target.h
  CC      ppc64-linux-user/tcg/tcg.o
  CC      mips64el-linux-user/linux-user/uname.o
  CC      alpha-linux-user/tcg/tcg.o
  CC      sh4-linux-user/tcg/tcg.o
  GEN     lm32-softmmu/config-target.h
  CC      ppc64le-linux-user/tcg/tcg-op.o
  CC      m68k-linux-user/tcg/tcg.o
  CC      microblazeel-linux-user/tcg/tcg.o
  GEN     xtensa-softmmu/hmp-commands.h
  CC      alpha-linux-user/tcg/tcg-op.o
  GEN     s390x-softmmu/hmp-commands.h
  CC      x86_64-linux-user/tcg/optimize.o
  GEN     s390x-linux-user/gen-features.h
  CC      sparc-linux-user/tcg/tcg.o
  CC      lm32-softmmu/exec.o
  CC      mips-linux-user/tcg/tcg.o
  GEN     mips64-softmmu/hmp-commands.h
  CC      m68k-softmmu/tcg/tcg.o
  GEN     microblazeel-softmmu/hmp-commands.h
  GEN     nios2-softmmu/hmp-commands.h
  GEN     cris-softmmu/hmp-commands-info.h
  GEN     or1k-softmmu/hmp-commands-info.h
  CC      hppa-linux-user/tcg/tcg.o
  CC      s390x-linux-user/exec.o
  GEN     sh4-softmmu/hmp-commands-info.h
  GEN     nios2-softmmu/hmp-commands-info.h
  GEN     arm-softmmu/hmp-commands.h
  CC      alpha-linux-user/tcg/optimize.o
  GEN     unicore32-softmmu/hmp-commands-info.h
  GEN     cris-softmmu/config-target.h
  GEN     xtensaeb-softmmu/hmp-commands-info.h
  CC      hppa-linux-user/tcg/tcg-op.o
  GEN     microblaze-softmmu/hmp-commands.h
  CC      mipsel-linux-user/tcg/tcg.o
  GEN     sh4eb-softmmu/hmp-commands.h
  GEN     s390x-softmmu/hmp-commands-info.h
  CC      ppc-linux-user/tcg/tcg.o
  CC      s390x-linux-user/tcg/tcg.o
  GEN     mips64-softmmu/hmp-commands-info.h
  CC      cris-softmmu/exec.o
  GEN     unicore32-softmmu/config-target.h
  GEN     xtensaeb-softmmu/config-target.h
  CC      ppc-linux-user/tcg/tcg-op.o
  CC      or1k-linux-user/tcg/tcg.o
  GEN     microblaze-softmmu/hmp-commands-info.h
  GEN     tricore-softmmu/hmp-commands.h
  CC      unicore32-softmmu/exec.o
  CC      sparc32plus-linux-user/tcg/tcg-op.o
  GEN     or1k-softmmu/config-target.h
  CC      m68k-linux-user/tcg/tcg-op.o
  GEN     alpha-softmmu/hmp-commands.h
  CC      mipsn32el-linux-user/tcg/tcg.o
  CC      m68k-linux-user/tcg/optimize.o
  CC      s390x-softmmu/gen-features
  GEN     ppc-softmmu/hmp-commands.h
  GEN     xtensa-softmmu/hmp-commands-info.h
  GEN     sh4-softmmu/config-target.h
  CC      cris-linux-user/tcg/tcg.o
  CC      microblaze-linux-user/tcg/tcg.o
  GEN     nios2-softmmu/config-target.h
  CC      mipsn32-linux-user/tcg/tcg.o
  GEN     arm-softmmu/hmp-commands-info.h
  CC      xtensaeb-softmmu/exec.o
  CC      microblaze-linux-user/tcg/tcg-op.o
  GEN     mips64-softmmu/config-target.h
  CC      i386-linux-user/tcg/tcg.o
  GEN     sparc-softmmu/hmp-commands.h
  GEN     mips64el-softmmu/hmp-commands.h
  CC      sh4-softmmu/exec.o
  CC      tilegx-linux-user/tcg/tcg.o
  GEN     sh4eb-softmmu/hmp-commands-info.h
  CC      cris-linux-user/tcg/tcg-op.o
  CC      or1k-softmmu/exec.o
  GEN     arm-softmmu/config-target.h
  GEN     i386-softmmu/hmp-commands.h
  CC      mipsn32-linux-user/tcg/tcg-op.o
  GEN     microblazeel-softmmu/hmp-commands-info.h
  CC      nios2-softmmu/exec.o
  CC      aarch64-linux-user/tcg/tcg-op.o
  CC      xtensaeb-softmmu/tcg/tcg.o
  CC      mipsn32-linux-user/tcg/optimize.o
  CC      mips64-softmmu/exec.o
  GEN     microblaze-softmmu/config-target.h
  CC      sh4-linux-user/tcg/tcg-op.o
  CC      sh4eb-linux-user/tcg/tcg.o
  GEN     mips-softmmu/hmp-commands.h
  GEN     mipsel-softmmu/hmp-commands.h
  CC      or1k-linux-user/tcg/tcg-op.o
  CC      hppa-linux-user/tcg/optimize.o
  GEN     xtensa-softmmu/config-target.h
  GEN     microblazeel-softmmu/config-target.h
  GEN     ppcemb-softmmu/hmp-commands.h
  CC      lm32-softmmu/tcg/tcg.o
  GEN     i386-softmmu/hmp-commands-info.h
  CC      arm-softmmu/exec.o
  GEN     alpha-softmmu/hmp-commands-info.h
  GEN     ppc-softmmu/hmp-commands-info.h
  CC      microblazeel-softmmu/exec.o
  GEN     sh4eb-softmmu/config-target.h
  CC      nios2-linux-user/tcg/tcg.o
  CC      microblaze-softmmu/exec.o
  GEN     s390x-softmmu/config-target.h
  GEN     tricore-softmmu/hmp-commands-info.h
  CC      xtensa-softmmu/exec.o
  CC      ppc64abi32-linux-user/tcg/tcg.o
  CC      x86_64-linux-user/tcg/tcg-common.o
  GEN     mips64el-softmmu/hmp-commands-info.h
  GEN     sparc-softmmu/hmp-commands-info.h
  GEN     s390x-softmmu/gen-features.h
  CC      sh4eb-softmmu/exec.o
  GEN     ppc64-softmmu/hmp-commands.h
  GEN     ppc-softmmu/config-target.h
  GEN     mips-softmmu/hmp-commands-info.h
  GEN     sparc-softmmu/config-target.h
  GEN     tricore-softmmu/config-target.h
  CC      s390x-softmmu/exec.o
  GEN     i386-softmmu/config-target.h
  CC      sparc-softmmu/exec.o
  GEN     alpha-softmmu/config-target.h
  CC      sh4eb-linux-user/tcg/tcg-op.o
  GEN     mips-softmmu/config-target.h
  CC      ppc-softmmu/exec.o
  GEN     ppcemb-softmmu/hmp-commands-info.h
  GEN     mipsel-softmmu/hmp-commands-info.h
  GEN     mips64el-softmmu/config-target.h
  CC      microblaze-softmmu/tcg/tcg.o
  CC      sh4eb-softmmu/tcg/tcg.o
  CC      tricore-softmmu/exec.o
  CC      i386-softmmu/exec.o
  CC      alpha-softmmu/exec.o
  GEN     mipsel-softmmu/config-target.h
  GEN     ppcemb-softmmu/config-target.h
  CC      mips-softmmu/exec.o
  GEN     ppc64-softmmu/hmp-commands-info.h
  CC      mips64el-softmmu/exec.o
  GEN     ppc64-softmmu/config-target.h
  CC      mipsel-softmmu/exec.o
  CC      mipsel-softmmu/tcg/tcg.o
  CC      ppcemb-softmmu/exec.o
  GEN     aarch64-softmmu/hmp-commands.h
  CC      microblazeel-softmmu/tcg/tcg.o
  CC      ppc64-softmmu/exec.o
  GEN     sparc64-softmmu/hmp-commands.h
  GEN     aarch64-softmmu/hmp-commands-info.h
  CC      sh4-softmmu/tcg/tcg.o
  CC      sh4eb-linux-user/tcg/optimize.o
  GEN     x86_64-softmmu/hmp-commands.h
  GEN     aarch64-softmmu/config-target.h
  CC      s390x-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/exec.o
  CC      s390x-softmmu/tcg/tcg-op.o
  CC      nios2-softmmu/tcg/tcg.o
  GEN     sparc64-softmmu/hmp-commands-info.h
  CC      hppa-linux-user/tcg/tcg-common.o
  GEN     x86_64-softmmu/hmp-commands-info.h
  CC      m68k-linux-user/tcg/tcg-common.o
  GEN     sparc64-softmmu/config-target.h
  CC      sparc64-softmmu/exec.o
  GEN     x86_64-softmmu/config-target.h
  CC      x86_64-softmmu/exec.o
  CC      x86_64-softmmu/tcg/tcg.o
  CC      mips-softmmu/tcg/tcg.o
  CC      armeb-linux-user/accel/tcg/translator.o
  CC      cris-linux-user/tcg/optimize.o
  CC      sh4eb-linux-user/tcg/tcg-common.o
  CC      ppcemb-softmmu/tcg/tcg.o
  CC      nios2-linux-user/tcg/tcg-op.o
  CC      tilegx-linux-user/tcg/tcg-op.o
  CC      ppc-softmmu/tcg/tcg.o
  CC      ppc64abi32-linux-user/tcg/tcg-op.o
  CC      nios2-softmmu/tcg/tcg-op.o
  CC      m68k-softmmu/tcg/tcg-op.o
  CC      m68k-linux-user/fpu/softfloat.o
  CC      microblaze-linux-user/tcg/optimize.o
  CC      aarch64-softmmu/tcg/tcg.o
  CC      ppc-softmmu/tcg/tcg-op.o
  CC      mips64-softmmu/tcg/tcg.o
  CC      unicore32-softmmu/tcg/tcg.o
  CC      sparc-linux-user/tcg/tcg-op.o
  CC      sh4-softmmu/tcg/tcg-op.o
  CC      microblaze-linux-user/tcg/tcg-common.o
  CC      or1k-softmmu/tcg/tcg.o
  CC      ppc-softmmu/tcg/optimize.o
  CC      xtensaeb-softmmu/tcg/tcg-op.o
  CC      xtensa-softmmu/tcg/tcg.o
  CC      s390x-linux-user/tcg/tcg-op.o
  CC      x86_64-linux-user/fpu/softfloat.o
  CC      mips-linux-user/tcg/tcg-op.o
  CC      lm32-softmmu/tcg/tcg-op.o
  CC      sparc32plus-linux-user/tcg/optimize.o
  CC      cris-softmmu/tcg/tcg.o
  CC      microblazeel-linux-user/tcg/tcg-op.o
  CC      microblaze-linux-user/fpu/softfloat.o
  CC      sh4-linux-user/tcg/optimize.o
  CC      alpha-linux-user/tcg/tcg-common.o
  CC      mips64-linux-user/tcg/optimize.o
  CC      arm-linux-user/tcg/tcg-op.o
  CC      arm-softmmu/tcg/tcg.o
  CC      sparc-softmmu/tcg/tcg.o
  CC      i386-linux-user/tcg/tcg-op.o
  CC      mipsel-linux-user/tcg/tcg-op.o
  CC      mipsel-softmmu/tcg/tcg-op.o
  CC      mipsn32el-linux-user/tcg/tcg-op.o
  CC      sparc32plus-linux-user/tcg/tcg-common.o
  CC      microblazeel-softmmu/tcg/tcg-op.o
  CC      sparc64-softmmu/tcg/tcg.o
  CC      hppa-linux-user/fpu/softfloat.o
  CC      xtensa-softmmu/tcg/tcg-op.o
  CC      lm32-softmmu/tcg/optimize.o
  CC      or1k-softmmu/tcg/tcg-op.o
  CC      alpha-softmmu/tcg/tcg.o
  CC      mips64-linux-user/tcg/tcg-common.o
  CC      sh4eb-softmmu/tcg/tcg-op.o
  CC      sparc32plus-linux-user/fpu/softfloat.o
  CC      alpha-linux-user/fpu/softfloat.o
  CC      aarch64-linux-user/tcg/optimize.o
  CC      ppc64le-linux-user/tcg/optimize.o
  CC      sparc64-linux-user/tcg/tcg-op.o
  CC      or1k-linux-user/tcg/optimize.o
  CC      xtensaeb-softmmu/tcg/optimize.o
  CC      mipsel-linux-user/tcg/optimize.o
  CC      cris-linux-user/tcg/tcg-common.o
  CC      m68k-softmmu/tcg/optimize.o
  CC      arm-softmmu/tcg/tcg-op.o
  CC      hppa-linux-user/disas.o
  CC      tricore-softmmu/tcg/tcg.o
  CC      ppc64-linux-user/tcg/tcg-op.o
  CC      tilegx-linux-user/tcg/optimize.o
  CC      hppa-linux-user/gdbstub.o
  CC      mipsel-linux-user/tcg/tcg-common.o
  CC      mips64-linux-user/fpu/softfloat.o
  CC      cris-linux-user/fpu/softfloat.o
  CC      sh4eb-linux-user/fpu/softfloat.o
  CC      s390x-softmmu/tcg/optimize.o
  CC      i386-softmmu/tcg/tcg.o
  CC      microblaze-softmmu/tcg/tcg-op.o
  CC      armeb-linux-user/accel/tcg/user-exec.o
  CC      ppcemb-softmmu/tcg/tcg-op.o
  CC      mipsn32-linux-user/tcg/tcg-common.o
  CC      mips-softmmu/tcg/tcg-op.o
  CC      sparc-linux-user/tcg/optimize.o
  CC      moxie-softmmu/tcg/tcg.o
  CC      ppc-linux-user/tcg/optimize.o
  CC      tilegx-linux-user/tcg/tcg-common.o
  CC      sh4-linux-user/tcg/tcg-common.o
  CC      hppa-linux-user/thunk.o
  CC      alpha-linux-user/disas.o
  CC      mipsn32el-linux-user/tcg/optimize.o
  CC      s390x-linux-user/tcg/optimize.o
  CC      i386-softmmu/tcg/tcg-op.o
  CC      microblaze-linux-user/disas.o
  CC      i386-linux-user/tcg/optimize.o
  CC      mipsn32-linux-user/fpu/softfloat.o
  CC      alpha-softmmu/tcg/tcg-op.o
  CC      i386-linux-user/tcg/tcg-common.o
  CC      ppc-linux-user/tcg/tcg-common.o
  CC      sparc64-linux-user/tcg/optimize.o
  CC      sh4-softmmu/tcg/optimize.o
  CC      mips64el-softmmu/tcg/tcg.o
  CC      sparc-softmmu/tcg/tcg-op.o
  CC      m68k-linux-user/disas.o
  CC      ppc-softmmu/tcg/tcg-common.o
  CC      sh4-softmmu/tcg/tcg-common.o
  CC      microblazeel-linux-user/tcg/optimize.o
  CC      sh4-linux-user/fpu/softfloat.o
  CC      tilegx-linux-user/fpu/softfloat.o
  CC      lm32-softmmu/tcg/tcg-common.o
  CC      mipsn32-linux-user/disas.o
  CC      arm-softmmu/tcg/optimize.o
  CC      or1k-linux-user/tcg/tcg-common.o
  CC      ppcemb-softmmu/tcg/optimize.o
  CC      i386-softmmu/tcg/optimize.o
  CC      microblazeel-linux-user/tcg/tcg-common.o
  CC      aarch64-linux-user/tcg/tcg-common.o
  CC      sh4eb-linux-user/disas.o
  CCAS    mips64el-linux-user/linux-user/safe-syscall.o
  CC      ppc64-softmmu/tcg/tcg.o
  CC      sparc64-linux-user/tcg/tcg-common.o
  CC      moxie-softmmu/tcg/tcg-op.o
  CC      ppc64-linux-user/tcg/optimize.o
  CC      tilegx-linux-user/disas.o
  CC      armeb-linux-user/accel/tcg/user-exec-stub.o
  CC      sparc64-linux-user/fpu/softfloat.o
  CC      nios2-linux-user/tcg/optimize.o
  CC      mips64el-softmmu/tcg/tcg-op.o
  CC      nios2-softmmu/tcg/optimize.o
  CC      unicore32-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/tcg/tcg-op.o
  CC      moxie-softmmu/tcg/optimize.o
  CC      cris-linux-user/disas.o
  CC      mipsn32-linux-user/gdbstub.o
  CC      cris-linux-user/gdbstub.o
  CC      mips-linux-user/tcg/optimize.o
  CC      mips64el-linux-user/target/mips/translate.o
  CC      or1k-linux-user/fpu/softfloat.o
  CC      armeb-linux-user/linux-user/main.o
  CC      mipsel-softmmu/tcg/optimize.o
  CC      s390x-softmmu/tcg/tcg-common.o
  CC      x86_64-softmmu/tcg/optimize.o
  CC      sparc64-softmmu/tcg/tcg-op.o
  CC      lm32-softmmu/fpu/softfloat.o
  CC      mips-softmmu/tcg/optimize.o
  CC      sh4eb-linux-user/gdbstub.o
  CC      sparc64-linux-user/disas.o
  CC      s390x-softmmu/fpu/softfloat.o
  CC      ppc64abi32-linux-user/tcg/optimize.o
  CC      ppc64le-linux-user/tcg/tcg-common.o
  CC      sparc64-linux-user/gdbstub.o
  CC      mipsn32el-linux-user/tcg/tcg-common.o
  CC      m68k-softmmu/tcg/tcg-common.o
  CC      m68k-softmmu/fpu/softfloat.o
  CC      aarch64-linux-user/fpu/softfloat.o
  CC      mips64el-softmmu/tcg/optimize.o
  CC      sh4eb-linux-user/thunk.o
  CC      sparc64-softmmu/tcg/optimize.o
  CC      mips64-softmmu/tcg/tcg-op.o
  CC      microblaze-softmmu/tcg/optimize.o
  CC      sparc64-linux-user/thunk.o
  CC      ppc64le-linux-user/fpu/softfloat.o
  CC      sh4eb-linux-user/accel/stubs/hax-stub.o
  CC      nios2-linux-user/tcg/tcg-common.o
  CC      sparc-linux-user/tcg/tcg-common.o
  CC      i386-linux-user/fpu/softfloat.o
  CC      aarch64-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/tcg/tcg-common.o
  CC      mips-linux-user/tcg/tcg-common.o
  CC      arm-linux-user/tcg/optimize.o
  CC      i386-softmmu/tcg/tcg-common.o
  CC      ppc-linux-user/fpu/softfloat.o
  CC      ppc-linux-user/disas.o
  CC      nios2-linux-user/fpu/softfloat.o
  CC      sparc64-softmmu/tcg/tcg-common.o
  CC      sparc-linux-user/fpu/softfloat.o
  CC      mipsel-linux-user/fpu/softfloat.o
  CC      mipsel-softmmu/tcg/tcg-common.o
  CC      x86_64-linux-user/disas.o
  CC      armeb-linux-user/linux-user/syscall.o
  CC      or1k-linux-user/disas.o
  CC      sh4-softmmu/fpu/softfloat.o
  CC      sparc64-linux-user/accel/stubs/hax-stub.o
  CC      arm-linux-user/tcg/tcg-common.o
  CC      mips64-linux-user/disas.o
  CC      cris-linux-user/thunk.o
  CC      mips64el-linux-user/target/mips/dsp_helper.o
  CC      ppcemb-softmmu/tcg/tcg-common.o
  CC      s390x-linux-user/tcg/tcg-common.o
  CC      mips64el-linux-user/target/mips/op_helper.o
  CC      alpha-softmmu/tcg/optimize.o
  CC      microblaze-linux-user/gdbstub.o
  CC      nios2-softmmu/tcg/tcg-common.o
  CC      ppc64-linux-user/tcg/tcg-common.o
  CC      ppc64le-linux-user/disas.o
  CC      or1k-softmmu/tcg/optimize.o
  CC      sh4eb-softmmu/tcg/optimize.o
  CC      sh4-linux-user/disas.o
  CC      lm32-softmmu/disas.o
  GEN     x86_64-linux-user/gdbstub-xml.c
  CC      arm-softmmu/tcg/tcg-common.o
  CC      sh4-softmmu/disas.o
  CC      ppc-softmmu/fpu/softfloat.o
  CC      xtensaeb-softmmu/tcg/tcg-common.o
  CC      microblazeel-linux-user/fpu/softfloat.o
  CC      sparc-linux-user/disas.o
  CC      mips64-linux-user/gdbstub.o
  CC      mips64el-linux-user/target/mips/lmi_helper.o
  CC      xtensaeb-softmmu/fpu/softfloat.o
  CC      sh4-linux-user/gdbstub.o
  CC      lm32-softmmu/arch_init.o
  CC      arm-linux-user/fpu/softfloat.o
  CC      m68k-softmmu/disas.o
  CC      hppa-linux-user/accel/stubs/hax-stub.o
  CC      i386-softmmu/fpu/softfloat.o
  GEN     m68k-linux-user/gdbstub-xml.c
  CC      sparc-linux-user/gdbstub.o
  CC      sparc-softmmu/tcg/optimize.o
  CC      nios2-linux-user/disas.o
  CC      sparc-softmmu/tcg/tcg-common.o
  CC      xtensa-softmmu/tcg/optimize.o
  CC      nios2-softmmu/fpu/softfloat.o
  CC      sparc64-linux-user/accel/stubs/kvm-stub.o
  CC      xtensa-softmmu/tcg/tcg-common.o
  CC      m68k-linux-user/gdbstub.o
  CC      cris-linux-user/accel/stubs/hax-stub.o
  CC      sparc64-softmmu/fpu/softfloat.o
  CC      mipsn32el-linux-user/fpu/softfloat.o
  CC      tricore-softmmu/tcg/tcg-op.o
  CC      lm32-softmmu/cpus.o
  CC      s390x-linux-user/fpu/softfloat.o
  CC      alpha-softmmu/tcg/tcg-common.o
  CC      mipsn32-linux-user/thunk.o
  GEN     ppc-linux-user/gdbstub-xml.c
  CC      ppc-softmmu/disas.o
  CC      nios2-softmmu/disas.o
  CC      sparc64-softmmu/disas.o
  CC      unicore32-softmmu/tcg/optimize.o
  CC      microblazeel-softmmu/tcg/optimize.o
  CC      unicore32-softmmu/tcg/tcg-common.o
  CC      mipsel-softmmu/fpu/softfloat.o
  CC      mipsel-linux-user/disas.o
  CC      sh4-linux-user/thunk.o
  CC      arm-linux-user/disas.o
  CC      mips-softmmu/tcg/tcg-common.o
  CC      mipsel-softmmu/disas.o
  CC      mips-softmmu/fpu/softfloat.o
  CC      alpha-linux-user/gdbstub.o
  CC      mipsn32el-linux-user/disas.o
  CC      mipsn32el-linux-user/gdbstub.o
  CC      or1k-linux-user/gdbstub.o
  CC      ppc64abi32-linux-user/tcg/tcg-common.o
  CC      armeb-linux-user/linux-user/strace.o
  GEN     ppc64le-linux-user/gdbstub-xml.c
  CC      hppa-linux-user/accel/stubs/kvm-stub.o
  GEN     arm-linux-user/gdbstub-xml.c
  GEN     ppc-softmmu/gdbstub-xml.c
  CC      or1k-softmmu/tcg/tcg-common.o
  CC      alpha-softmmu/fpu/softfloat.o
  CC      arm-linux-user/gdbstub.o
  CC      or1k-softmmu/fpu/softfloat.o
  CC      armeb-linux-user/linux-user/mmap.o
  CC      sh4eb-softmmu/tcg/tcg-common.o
  CC      m68k-linux-user/thunk.o
  CC      mipsn32-linux-user/accel/stubs/hax-stub.o
  CC      sh4-softmmu/arch_init.o
  CC      m68k-linux-user/accel/stubs/hax-stub.o
  CC      ppc64abi32-linux-user/fpu/softfloat.o
  CC      s390x-linux-user/disas.o
  CC      hppa-linux-user/accel/tcg/tcg-runtime.o
  CC      mips64-softmmu/tcg/optimize.o
  CC      mips-linux-user/fpu/softfloat.o
  CC      mips-linux-user/disas.o
  CC      nios2-softmmu/arch_init.o
  CC      ppc-softmmu/arch_init.o
  CC      mipsel-linux-user/gdbstub.o
  CC      m68k-linux-user/accel/stubs/kvm-stub.o
  CC      mips64-softmmu/tcg/tcg-common.o
  CC      s390x-softmmu/disas.o
  CC      xtensaeb-softmmu/disas.o
  CC      ppc64-linux-user/fpu/softfloat.o
  CC      aarch64-softmmu/tcg/optimize.o
  CC      mips64el-linux-user/target/mips/helper.o
  CC      m68k-linux-user/accel/tcg/tcg-runtime.o
  CC      sparc32plus-linux-user/disas.o
  CC      or1k-linux-user/thunk.o
  CC      microblaze-softmmu/tcg/tcg-common.o
  CC      ppc64abi32-linux-user/disas.o
  CC      mips-softmmu/disas.o
  CC      alpha-softmmu/disas.o
  CC      mips64el-softmmu/tcg/tcg-common.o
  CC      or1k-linux-user/accel/stubs/hax-stub.o
  CC      mips-linux-user/gdbstub.o
  CC      sh4eb-softmmu/fpu/softfloat.o
  CC      ppc-softmmu/cpus.o
  CC      cris-softmmu/tcg/tcg-op.o
  CC      m68k-linux-user/accel/tcg/cpu-exec.o
  CC      mips64el-linux-user/target/mips/cpu.o
  CC      microblazeel-linux-user/disas.o
  CC      x86_64-linux-user/gdbstub.o
  CC      arm-softmmu/fpu/softfloat.o
  CC      sparc-softmmu/fpu/softfloat.o
  GEN     ppc64abi32-linux-user/gdbstub-xml.c
  CC      alpha-softmmu/arch_init.o
  CC      microblazeel-softmmu/tcg/tcg-common.o
  CC      mips-linux-user/thunk.o
  GEN     s390x-softmmu/gdbstub-xml.c
  CC      sparc32plus-linux-user/gdbstub.o
  CC      ppc64abi32-linux-user/gdbstub.o
  CC      alpha-softmmu/cpus.o
  CC      mips64-linux-user/thunk.o
  CC      hppa-linux-user/accel/tcg/cpu-exec.o
  CC      ppc64-softmmu/tcg/tcg-op.o
  CC      unicore32-softmmu/fpu/softfloat.o
  CC      microblazeel-linux-user/gdbstub.o
  CC      tricore-softmmu/tcg/optimize.o
  CC      microblaze-softmmu/fpu/softfloat.o
  CC      alpha-softmmu/monitor.o
  CC      aarch64-linux-user/disas.o
  CC      m68k-linux-user/accel/tcg/cpu-exec-common.o
  CC      xtensaeb-softmmu/arch_init.o
  CC      alpha-linux-user/thunk.o
  CC      hppa-linux-user/accel/tcg/cpu-exec-common.o
  CC      microblazeel-softmmu/fpu/softfloat.o
  CC      nios2-linux-user/gdbstub.o
  CC      ppc-linux-user/gdbstub.o
  CC      unicore32-softmmu/disas.o
  CC      tricore-softmmu/tcg/tcg-common.o
  CC      sh4eb-linux-user/accel/stubs/kvm-stub.o
  CC      sparc-softmmu/disas.o
  CC      sh4-linux-user/accel/stubs/hax-stub.o
  CC      xtensa-softmmu/fpu/softfloat.o
  CC      ppc64-linux-user/disas.o
  CC      x86_64-linux-user/thunk.o
  CC      ppc64le-linux-user/gdbstub.o
  CC      x86_64-linux-user/accel/stubs/hax-stub.o
  CC      m68k-linux-user/accel/tcg/translate-all.o
  CC      unicore32-softmmu/arch_init.o
  CC      ppcemb-softmmu/fpu/softfloat.o
  GEN     ppc64-linux-user/gdbstub-xml.c
  CC      mips-linux-user/accel/stubs/hax-stub.o
  CC      s390x-softmmu/arch_init.o
  CC      x86_64-softmmu/fpu/softfloat.o
  CC      sparc32plus-linux-user/thunk.o
  CC      microblaze-softmmu/disas.o
  CC      mips-softmmu/arch_init.o
  CC      aarch64-softmmu/tcg/tcg-common.o
  CC      ppc-linux-user/thunk.o
  CC      x86_64-softmmu/disas.o
  CC      ppc-linux-user/accel/stubs/hax-stub.o
  CC      moxie-softmmu/tcg/tcg-common.o
  CC      microblaze-linux-user/thunk.o
  CC      mips-linux-user/accel/stubs/kvm-stub.o
  CC      nios2-linux-user/thunk.o
  CC      sparc64-linux-user/accel/tcg/tcg-runtime.o
  CC      alpha-linux-user/accel/stubs/hax-stub.o
  CC      unicore32-softmmu/cpus.o
  CC      tilegx-linux-user/gdbstub.o
  CC      lm32-softmmu/monitor.o
  CC      mipsel-softmmu/arch_init.o
  CC      mips64-linux-user/accel/stubs/hax-stub.o
  CC      mipsn32-linux-user/accel/stubs/kvm-stub.o
  CC      sh4eb-linux-user/accel/tcg/tcg-runtime.o
  CC      cris-softmmu/tcg/optimize.o
  CC      hppa-linux-user/accel/tcg/translate-all.o
  CC      ppc64abi32-linux-user/thunk.o
  CC      mips-softmmu/cpus.o
  GEN     aarch64-linux-user/gdbstub-xml.c
  CC      ppc64le-linux-user/thunk.o
  CC      ppc64le-linux-user/accel/stubs/hax-stub.o
  CC      cris-linux-user/accel/stubs/kvm-stub.o
  CC      or1k-linux-user/accel/stubs/kvm-stub.o
  CC      sh4eb-linux-user/accel/tcg/cpu-exec.o
  CC      cris-linux-user/accel/tcg/tcg-runtime.o
  GEN     x86_64-softmmu/gdbstub-xml.c
  CC      cris-softmmu/tcg/tcg-common.o
  CC      alpha-softmmu/gdbstub.o
  CC      microblaze-linux-user/accel/stubs/hax-stub.o
  CC      ppcemb-softmmu/disas.o
  CC      moxie-softmmu/fpu/softfloat.o
  CC      microblaze-linux-user/accel/stubs/kvm-stub.o
  CC      alpha-linux-user/accel/stubs/kvm-stub.o
  CC      unicore32-softmmu/monitor.o
  CC      mipsn32el-linux-user/thunk.o
  CC      xtensa-softmmu/disas.o
  CC      arm-softmmu/disas.o
  CC      sparc32plus-linux-user/accel/stubs/hax-stub.o
  CC      sparc64-softmmu/arch_init.o
  CC      x86_64-linux-user/accel/stubs/kvm-stub.o
  CC      aarch64-linux-user/gdbstub.o
  CC      xtensaeb-softmmu/cpus.o
  CC      lm32-softmmu/gdbstub.o
  CC      alpha-softmmu/balloon.o
  CC      armeb-linux-user/linux-user/signal.o
  CC      x86_64-linux-user/accel/tcg/tcg-runtime.o
  CC      mipsel-linux-user/thunk.o
  CC      microblaze-softmmu/arch_init.o
  CC      mipsn32el-linux-user/accel/stubs/hax-stub.o
  CC      sh4-linux-user/accel/stubs/kvm-stub.o
  CC      sh4-softmmu/cpus.o
  CC      nios2-softmmu/cpus.o
  CC      mips64-softmmu/fpu/softfloat.o
  CC      hppa-linux-user/accel/tcg/translator.o
  CC      mips64-linux-user/accel/stubs/kvm-stub.o
  CC      i386-linux-user/disas.o
  CC      mipsn32el-linux-user/accel/stubs/kvm-stub.o
  CC      ppc64abi32-linux-user/accel/stubs/hax-stub.o
  CC      unicore32-softmmu/gdbstub.o
  CC      cris-softmmu/fpu/softfloat.o
  CC      arm-linux-user/thunk.o
  CC      arm-linux-user/accel/stubs/hax-stub.o
  CC      sh4-linux-user/accel/tcg/tcg-runtime.o
  CC      m68k-linux-user/accel/tcg/translator.o
  CC      microblaze-linux-user/accel/tcg/tcg-runtime.o
  CC      alpha-linux-user/accel/tcg/tcg-runtime.o
  CC      alpha-linux-user/accel/tcg/cpu-exec.o
  CC      mipsel-linux-user/accel/stubs/hax-stub.o
  CC      cris-softmmu/disas.o
  CC      cris-linux-user/accel/tcg/cpu-exec.o
  CC      ppc64abi32-linux-user/accel/stubs/kvm-stub.o
  CC      mipsel-softmmu/cpus.o
  CC      sparc32plus-linux-user/accel/stubs/kvm-stub.o
  CC      x86_64-linux-user/accel/tcg/cpu-exec.o
  CC      mipsn32-linux-user/accel/tcg/tcg-runtime.o
  CC      mips64el-softmmu/fpu/softfloat.o
  CC      ppc64-linux-user/gdbstub.o
  CC      lm32-softmmu/balloon.o
  CC      mips-linux-user/accel/tcg/tcg-runtime.o
  CC      sh4eb-linux-user/accel/tcg/cpu-exec-common.o
  CC      alpha-softmmu/ioport.o
  CC      x86_64-linux-user/accel/tcg/cpu-exec-common.o
  CC      ppc-linux-user/accel/stubs/kvm-stub.o
  CC      mips64-linux-user/accel/tcg/tcg-runtime.o
  CC      microblazeel-softmmu/disas.o
  CC      ppc-linux-user/accel/tcg/tcg-runtime.o
  CC      aarch64-softmmu/fpu/softfloat.o
  CC      unicore32-softmmu/balloon.o
  CC      sh4eb-softmmu/disas.o
  CC      mips64-linux-user/accel/tcg/cpu-exec.o
  GEN     arm-softmmu/gdbstub-xml.c
  CC      ppc-linux-user/accel/tcg/cpu-exec.o
  CC      or1k-softmmu/disas.o
  CC      ppc64le-linux-user/accel/stubs/kvm-stub.o
  CC      or1k-softmmu/arch_init.o
  CC      mips-linux-user/accel/tcg/cpu-exec.o
  CC      sh4eb-linux-user/accel/tcg/translate-all.o
  CC      i386-softmmu/disas.o
  CC      arm-linux-user/accel/stubs/kvm-stub.o
  CC      sh4eb-linux-user/accel/tcg/translator.o
  GEN     ppcemb-softmmu/gdbstub-xml.c
  CC      xtensaeb-softmmu/monitor.o
  CC      ppc64-softmmu/tcg/optimize.o
  CC      hppa-linux-user/accel/tcg/user-exec.o
  CC      sparc64-linux-user/accel/tcg/cpu-exec.o
  GEN     i386-linux-user/gdbstub-xml.c
  CC      s390x-softmmu/cpus.o
  CC      microblaze-linux-user/accel/tcg/cpu-exec.o
  GEN     m68k-softmmu/gdbstub-xml.c
  CC      i386-linux-user/gdbstub.o
  CC      arm-linux-user/accel/tcg/tcg-runtime.o
  CC      sparc32plus-linux-user/accel/tcg/tcg-runtime.o
  CC      tilegx-linux-user/thunk.o
  CC      arm-softmmu/arch_init.o
  CC      mipsel-linux-user/accel/stubs/kvm-stub.o
  CC      m68k-linux-user/accel/tcg/user-exec.o
  CC      ppc64-softmmu/tcg/tcg-common.o
  CC      nios2-linux-user/accel/stubs/hax-stub.o
  CC      x86_64-linux-user/accel/tcg/translate-all.o
  CC      sparc32plus-linux-user/accel/tcg/cpu-exec.o
  CC      mips64el-linux-user/target/mips/gdbstub.o
  CC      unicore32-softmmu/ioport.o
  CC      mips-linux-user/accel/tcg/cpu-exec-common.o
  CC      i386-linux-user/thunk.o
  GEN     i386-softmmu/gdbstub-xml.c
  CC      microblazeel-linux-user/thunk.o
  CC      cris-softmmu/arch_init.o
  CC      sh4-linux-user/accel/tcg/cpu-exec.o
  CC      lm32-softmmu/ioport.o
  CC      mipsel-softmmu/monitor.o
  CC      ppc64le-linux-user/accel/tcg/tcg-runtime.o
  CC      mips64-softmmu/disas.o
  CC      ppc64-linux-user/thunk.o
  CC      nios2-linux-user/accel/stubs/kvm-stub.o
  CC      ppc-softmmu/monitor.o
  CC      alpha-linux-user/accel/tcg/cpu-exec-common.o
  CC      sparc64-softmmu/cpus.o
  CC      ppc-softmmu/gdbstub.o
  CC      mips-linux-user/accel/tcg/translate-all.o
  CC      microblaze-softmmu/cpus.o
  CC      i386-softmmu/arch_init.o
  CC      ppc-softmmu/balloon.o
  CC      mipsn32-linux-user/accel/tcg/cpu-exec.o
  CC      sh4eb-softmmu/arch_init.o
  CC      xtensaeb-softmmu/gdbstub.o
  CC      arm-softmmu/cpus.o
  CC      mipsn32-linux-user/accel/tcg/cpu-exec-common.o
  CC      ppc64le-linux-user/accel/tcg/cpu-exec.o
  CC      m68k-linux-user/accel/tcg/user-exec-stub.o
  CC      nios2-softmmu/monitor.o
  CC      aarch64-linux-user/thunk.o
  CC      sh4eb-linux-user/accel/tcg/user-exec.o
  CC      cris-linux-user/accel/tcg/cpu-exec-common.o
  CC      armeb-linux-user/linux-user/elfload.o
  CC      mipsel-softmmu/gdbstub.o
  CC      sparc-linux-user/thunk.o
  CC      mips64-linux-user/accel/tcg/cpu-exec-common.o
  CC      microblaze-linux-user/accel/tcg/cpu-exec-common.o
  CC      m68k-linux-user/linux-user/main.o
  CC      microblaze-linux-user/accel/tcg/translate-all.o
  CC      tilegx-linux-user/accel/stubs/hax-stub.o
  CC      xtensa-softmmu/arch_init.o
  CC      sh4eb-softmmu/cpus.o
  CC      alpha-linux-user/accel/tcg/translate-all.o
  CC      sparc-linux-user/accel/stubs/hax-stub.o
  CC      sparc-linux-user/accel/stubs/kvm-stub.o
  CC      sparc64-softmmu/monitor.o
  CC      microblazeel-linux-user/accel/stubs/hax-stub.o
  CC      moxie-softmmu/disas.o
  CC      ppc64-linux-user/accel/stubs/hax-stub.o
  CC      sparc32plus-linux-user/accel/tcg/cpu-exec-common.o
  CC      sparc64-linux-user/accel/tcg/cpu-exec-common.o
  CC      nios2-softmmu/gdbstub.o
  CC      aarch64-softmmu/disas.o
  CC      arm-linux-user/accel/tcg/cpu-exec.o
  CC      sparc-softmmu/arch_init.o
  CC      sparc64-linux-user/accel/tcg/translate-all.o
  CC      cris-linux-user/accel/tcg/translate-all.o
  CC      ppc64-softmmu/fpu/softfloat.o
  CC      ppcemb-softmmu/arch_init.o
  CC      sparc-softmmu/cpus.o
  CC      tilegx-linux-user/accel/stubs/kvm-stub.o
  CC      or1k-linux-user/accel/tcg/tcg-runtime.o
  CC      sh4-linux-user/accel/tcg/cpu-exec-common.o
  CC      mips64-linux-user/accel/tcg/translate-all.o
  CC      ppc64abi32-linux-user/accel/tcg/tcg-runtime.o
  CC      sh4-linux-user/accel/tcg/translate-all.o
  CC      xtensaeb-softmmu/balloon.o
  CC      tricore-softmmu/fpu/softfloat.o
  CC      arm-linux-user/accel/tcg/cpu-exec-common.o
  CC      s390x-softmmu/monitor.o
  CC      microblaze-softmmu/monitor.o
  CC      sparc64-linux-user/accel/tcg/translator.o
  CC      sh4-softmmu/monitor.o
  CC      nios2-softmmu/balloon.o
  CC      sparc64-softmmu/gdbstub.o
  CC      tilegx-linux-user/accel/tcg/tcg-runtime.o
  CC      mipsn32-linux-user/accel/tcg/translate-all.o
  CC      microblazeel-linux-user/accel/stubs/kvm-stub.o
  CC      mips-linux-user/accel/tcg/translator.o
  CC      ppc-softmmu/ioport.o
  CC      sparc32plus-linux-user/accel/tcg/translate-all.o
  CC      ppc-softmmu/numa.o
  CC      sh4eb-linux-user/accel/tcg/user-exec-stub.o
  CC      alpha-softmmu/numa.o
  CC      mipsn32-linux-user/accel/tcg/translator.o
  CC      aarch64-linux-user/accel/stubs/hax-stub.o
  CC      xtensa-softmmu/cpus.o
  CC      x86_64-linux-user/accel/tcg/translator.o
  CC      m68k-softmmu/arch_init.o
  CC      moxie-softmmu/arch_init.o
  CC      sparc-softmmu/monitor.o
  CC      ppc64le-linux-user/accel/tcg/cpu-exec-common.o
  CC      ppc64-linux-user/accel/stubs/kvm-stub.o
  CC      sparc32plus-linux-user/accel/tcg/translator.o
  CC      sparc-linux-user/accel/tcg/tcg-runtime.o
  CC      hppa-linux-user/accel/tcg/user-exec-stub.o
  CC      alpha-linux-user/accel/tcg/translator.o
  CC      or1k-linux-user/accel/tcg/cpu-exec.o
  CC      m68k-softmmu/cpus.o
  CC      ppcemb-softmmu/cpus.o
  CC      i386-linux-user/accel/stubs/hax-stub.o
  CC      ppc64le-linux-user/accel/tcg/translate-all.o
  GEN     aarch64-softmmu/gdbstub-xml.c
  CC      mipsel-softmmu/balloon.o
  CC      m68k-linux-user/linux-user/syscall.o
  CC      microblazeel-linux-user/accel/tcg/tcg-runtime.o
  CC      unicore32-softmmu/numa.o
  CC      mips-linux-user/accel/tcg/user-exec.o
  CC      alpha-linux-user/accel/tcg/user-exec.o
  CC      unicore32-softmmu/qtest.o
  CC      mips-softmmu/monitor.o
  CC      nios2-linux-user/accel/tcg/tcg-runtime.o
  CC      aarch64-linux-user/accel/stubs/kvm-stub.o
  CC      moxie-softmmu/cpus.o
  CC      sh4eb-linux-user/linux-user/main.o
  CC      ppc64-softmmu/disas.o
  CC      mips64-softmmu/arch_init.o
  CC      tilegx-linux-user/accel/tcg/cpu-exec.o
  CC      mips-softmmu/gdbstub.o
  CC      lm32-softmmu/numa.o
  CC      ppc-linux-user/accel/tcg/cpu-exec-common.o
  CC      or1k-linux-user/accel/tcg/cpu-exec-common.o
  CC      hppa-linux-user/linux-user/main.o
  CC      microblaze-softmmu/gdbstub.o
  CC      i386-softmmu/cpus.o
  CC      sparc-linux-user/accel/tcg/cpu-exec.o
  CC      sparc32plus-linux-user/accel/tcg/user-exec.o
  CC      i386-linux-user/accel/stubs/kvm-stub.o
  CC      sparc64-linux-user/accel/tcg/user-exec.o
  CC      or1k-softmmu/cpus.o
  CC      ppc-linux-user/accel/tcg/translate-all.o
  CC      or1k-softmmu/monitor.o
  CC      lm32-softmmu/qtest.o
  CC      microblaze-linux-user/accel/tcg/translator.o
  CC      hppa-linux-user/linux-user/syscall.o
  CC      ppc64le-linux-user/accel/tcg/translator.o
  CC      alpha-softmmu/qtest.o
  CC      mips64-linux-user/accel/tcg/translator.o
  CC      m68k-softmmu/monitor.o
  CC      ppc-softmmu/qtest.o
  CC      microblazeel-linux-user/accel/tcg/cpu-exec.o
  CC      mips-softmmu/balloon.o
  CC      aarch64-linux-user/accel/tcg/tcg-runtime.o
  CC      mips64-softmmu/cpus.o
  CC      sh4-softmmu/gdbstub.o
  CC      xtensaeb-softmmu/ioport.o
  CC      mipsn32el-linux-user/accel/tcg/tcg-runtime.o
  CC      ppcemb-softmmu/monitor.o
  CC      cris-linux-user/accel/tcg/translator.o
  CC      sparc64-linux-user/accel/tcg/user-exec-stub.o
  CC      nios2-linux-user/accel/tcg/cpu-exec.o
  CC      or1k-linux-user/accel/tcg/translate-all.o
  GEN     ppc64-softmmu/gdbstub-xml.c
  CC      unicore32-softmmu/memory.o
  CC      i386-linux-user/accel/tcg/tcg-runtime.o
  CC      x86_64-softmmu/arch_init.o
  CC      i386-linux-user/accel/tcg/cpu-exec.o
  CC      sh4-linux-user/accel/tcg/translator.o
  CC      x86_64-linux-user/accel/tcg/user-exec.o
  CC      xtensaeb-softmmu/numa.o
  CC      mips64-softmmu/monitor.o
  CC      sh4eb-softmmu/monitor.o
  CC      ppcemb-softmmu/gdbstub.o
  CC      hppa-linux-user/linux-user/strace.o
  CC      sparc32plus-linux-user/accel/tcg/user-exec-stub.o
  CC      ppc-softmmu/memory.o
  CC      armeb-linux-user/linux-user/linuxload.o
  CC      mipsn32-linux-user/accel/tcg/user-exec.o
  CC      alpha-softmmu/memory.o
  CC      mips64el-softmmu/disas.o
  CC      microblaze-linux-user/accel/tcg/user-exec.o
  CC      mipsel-linux-user/accel/tcg/tcg-runtime.o
  GEN     s390x-linux-user/gdbstub-xml.c
  CC      tilegx-linux-user/accel/tcg/cpu-exec-common.o
  CC      alpha-linux-user/accel/tcg/user-exec-stub.o
  CC      sh4eb-linux-user/linux-user/syscall.o
  CC      sparc-linux-user/accel/tcg/cpu-exec-common.o
  CC      mips64-softmmu/gdbstub.o
  CC      sh4eb-linux-user/linux-user/strace.o
  CC      tilegx-linux-user/accel/tcg/translate-all.o
  CC      microblazeel-linux-user/accel/tcg/cpu-exec-common.o
  CC      sh4eb-linux-user/linux-user/mmap.o
  CC      cris-linux-user/accel/tcg/user-exec.o
  CC      alpha-softmmu/memory_mapping.o
  CC      lm32-softmmu/memory.o
  CC      alpha-softmmu/dump.o
  CC      cris-linux-user/accel/tcg/user-exec-stub.o
  CC      microblaze-softmmu/balloon.o
  CC      aarch64-linux-user/accel/tcg/cpu-exec.o
  CC      sparc64-softmmu/balloon.o
  CC      xtensaeb-softmmu/qtest.o
  CC      sparc32plus-linux-user/linux-user/main.o
  CC      xtensa-softmmu/monitor.o
  CC      alpha-linux-user/linux-user/main.o
  CC      xtensa-softmmu/gdbstub.o
  CC      aarch64-softmmu/arch_init.o
  CC      sparc-linux-user/accel/tcg/translate-all.o
  CC      ppcemb-softmmu/balloon.o
  CC      hppa-linux-user/linux-user/mmap.o
  CC      microblazeel-linux-user/accel/tcg/translate-all.o
  CC      mipsel-linux-user/accel/tcg/cpu-exec.o
  CC      sh4-linux-user/accel/tcg/user-exec.o
  CC      sparc-softmmu/gdbstub.o
  CC      nios2-linux-user/accel/tcg/cpu-exec-common.o
  CC      ppcemb-softmmu/ioport.o
  CC      nios2-softmmu/ioport.o
  CC      mips-softmmu/ioport.o
  CC      mips64-linux-user/accel/tcg/user-exec.o
  CC      sparc64-linux-user/linux-user/main.o
  CC      i386-linux-user/accel/tcg/cpu-exec-common.o
  CC      s390x-linux-user/gdbstub.o
  CC      aarch64-softmmu/cpus.o
  CC      xtensaeb-softmmu/memory.o
  CC      microblaze-softmmu/ioport.o
  CC      s390x-softmmu/gdbstub.o
  CC      ppc64le-linux-user/accel/tcg/user-exec.o
  CC      mips-linux-user/accel/tcg/user-exec-stub.o
  CC      aarch64-linux-user/accel/tcg/cpu-exec-common.o
  CC      sparc-linux-user/accel/tcg/translator.o
  CC      arm-softmmu/monitor.o
  CC      unicore32-softmmu/memory_mapping.o
  CC      arm-linux-user/accel/tcg/translate-all.o
  CC      mips64-softmmu/balloon.o
  CC      mipsn32el-linux-user/accel/tcg/cpu-exec.o
  CC      arm-linux-user/accel/tcg/translator.o
  CC      i386-softmmu/monitor.o
  CC      x86_64-softmmu/cpus.o
  CC      alpha-softmmu/migration/ram.o
  CC      ppc-linux-user/accel/tcg/translator.o
  CC      mips64-softmmu/ioport.o
  CC      i386-linux-user/accel/tcg/translate-all.o
  CC      hppa-linux-user/linux-user/signal.o
  CC      xtensa-softmmu/balloon.o
  CC      arm-softmmu/gdbstub.o
  CC      sh4eb-softmmu/gdbstub.o
  CC      or1k-linux-user/accel/tcg/translator.o
  CC      microblaze-linux-user/accel/tcg/user-exec-stub.o
  CC      nios2-linux-user/accel/tcg/translate-all.o
  CC      sparc64-linux-user/linux-user/syscall.o
  CC      mips64el-softmmu/arch_init.o
  CC      hppa-linux-user/linux-user/elfload.o
  CC      nios2-softmmu/numa.o
  CC      cris-linux-user/linux-user/main.o
  CC      alpha-linux-user/linux-user/syscall.o
  CC      alpha-softmmu/accel/accel.o
  CC      nios2-softmmu/qtest.o
  CC      armeb-linux-user/linux-user/uaccess.o
  CC      ppc64-linux-user/accel/tcg/tcg-runtime.o
  CC      ppc64le-linux-user/accel/tcg/user-exec-stub.o
  CC      mipsn32el-linux-user/accel/tcg/cpu-exec-common.o
  CC      nios2-softmmu/memory.o
  CC      ppc-softmmu/memory_mapping.o
  CC      microblaze-linux-user/linux-user/main.o
  CC      mips64el-softmmu/cpus.o
  CC      ppc-softmmu/dump.o
  CC      ppc-softmmu/migration/ram.o
  CC      s390x-linux-user/thunk.o
  CC      x86_64-softmmu/monitor.o
  CC      or1k-linux-user/accel/tcg/user-exec.o
  CC      sparc32plus-linux-user/linux-user/syscall.o
  CC      mipsel-softmmu/ioport.o
  CC      microblaze-softmmu/numa.o
  CC      mipsn32-linux-user/accel/tcg/user-exec-stub.o
  CC      m68k-softmmu/gdbstub.o
  CC      sh4-softmmu/balloon.o
  CC      sparc64-softmmu/ioport.o
  CC      mipsel-linux-user/accel/tcg/cpu-exec-common.o
  CC      microblazeel-softmmu/arch_init.o
  CC      sparc64-softmmu/numa.o
  CC      sh4eb-linux-user/linux-user/signal.o
  CC      x86_64-linux-user/accel/tcg/user-exec-stub.o
  CC      aarch64-linux-user/accel/tcg/translate-all.o
  CC      aarch64-linux-user/accel/tcg/translator.o
  CC      aarch64-linux-user/accel/tcg/user-exec.o
  CC      hppa-linux-user/linux-user/linuxload.o
  CC      tilegx-linux-user/accel/tcg/translator.o
  CC      mipsel-softmmu/numa.o
  CC      cris-softmmu/cpus.o
  CC      mipsn32el-linux-user/accel/tcg/translate-all.o
  CC      sparc32plus-linux-user/linux-user/strace.o
  CC      ppc64abi32-linux-user/accel/tcg/cpu-exec.o
  CC      sparc64-linux-user/linux-user/strace.o
  CC      alpha-linux-user/linux-user/strace.o
  CC      lm32-softmmu/memory_mapping.o
  CC      sh4-linux-user/accel/tcg/user-exec-stub.o
  CC      mips64el-softmmu/monitor.o
  CC      ppc64le-linux-user/linux-user/main.o
  CC      mips64-softmmu/numa.o
  CC      ppcemb-softmmu/numa.o
  CC      sparc-linux-user/accel/tcg/user-exec.o
  CC      mipsel-linux-user/accel/tcg/translate-all.o
  CC      i386-linux-user/accel/tcg/translator.o
  CC      i386-linux-user/accel/tcg/user-exec.o
  CC      mipsn32-linux-user/linux-user/main.o
  CC      sparc-softmmu/balloon.o
  CC      s390x-softmmu/balloon.o
  CC      microblaze-linux-user/linux-user/syscall.o
  CC      microblazeel-linux-user/accel/tcg/translator.o
  CC      mips-linux-user/linux-user/main.o
  CC      armeb-linux-user/linux-user/uname.o
  CC      arm-linux-user/accel/tcg/user-exec.o
  CC      ppc64-linux-user/accel/tcg/cpu-exec.o
  CC      lm32-softmmu/dump.o
  CC      x86_64-linux-user/linux-user/main.o
  CC      xtensa-softmmu/ioport.o
  CC      microblazeel-softmmu/cpus.o
  CC      sparc-linux-user/accel/tcg/user-exec-stub.o
  CC      sparc64-softmmu/qtest.o
  CC      tilegx-linux-user/accel/tcg/user-exec.o
  CC      xtensa-softmmu/numa.o
  CC      ppc64le-linux-user/linux-user/syscall.o
  CC      s390x-linux-user/accel/stubs/hax-stub.o
  CC      alpha-softmmu/accel/stubs/hax-stub.o
  CC      aarch64-linux-user/accel/tcg/user-exec-stub.o
  CC      sparc32plus-linux-user/linux-user/mmap.o
  CC      mips64-linux-user/accel/tcg/user-exec-stub.o
  CC      arm-linux-user/accel/tcg/user-exec-stub.o
  CC      ppc-linux-user/accel/tcg/user-exec.o
  CC      sparc-softmmu/ioport.o
  CC      microblazeel-softmmu/monitor.o
  CC      cris-linux-user/linux-user/syscall.o
  CC      i386-linux-user/accel/tcg/user-exec-stub.o
  CC      microblaze-softmmu/qtest.o
  CC      m68k-linux-user/linux-user/strace.o
  CC      sh4-linux-user/linux-user/main.o
  CC      ppc64abi32-linux-user/accel/tcg/cpu-exec-common.o
  CC      nios2-linux-user/accel/tcg/translator.o
  CC      arm-softmmu/balloon.o
  CC      sparc64-softmmu/memory.o
  CC      xtensa-softmmu/qtest.o
  CC      microblaze-linux-user/linux-user/strace.o
  CC      mipsel-softmmu/qtest.o
  CC      xtensa-softmmu/memory.o
  CC      microblazeel-linux-user/accel/tcg/user-exec.o
  CC      x86_64-softmmu/gdbstub.o
  CC      xtensa-softmmu/memory_mapping.o
  CC      ppc-softmmu/accel/accel.o
  CC      or1k-linux-user/accel/tcg/user-exec-stub.o
  CC      m68k-softmmu/balloon.o
  CC      s390x-linux-user/accel/stubs/kvm-stub.o
  CC      s390x-softmmu/ioport.o
  CC      sh4-softmmu/ioport.o
  CC      nios2-linux-user/accel/tcg/user-exec.o
  CC      or1k-linux-user/linux-user/main.o
  CC      xtensaeb-softmmu/memory_mapping.o
  CC      mipsn32el-linux-user/accel/tcg/translator.o
  CC      mips-linux-user/linux-user/syscall.o
  CC      cris-linux-user/linux-user/strace.o
  CC      mipsel-linux-user/accel/tcg/translator.o
  CC      or1k-linux-user/linux-user/syscall.o
  CC      microblazeel-softmmu/gdbstub.o
  CC      cris-linux-user/linux-user/mmap.o
  CC      ppc64abi32-linux-user/accel/tcg/translate-all.o
  CC      x86_64-linux-user/linux-user/syscall.o
  CC      mipsn32-linux-user/linux-user/syscall.o
  CC      cris-softmmu/monitor.o
  CC      ppcemb-softmmu/qtest.o
  CC      s390x-linux-user/accel/tcg/tcg-runtime.o
  CC      arm-linux-user/linux-user/main.o
  CC      ppc64-linux-user/accel/tcg/cpu-exec-common.o
  CC      arm-softmmu/ioport.o
  CC      moxie-softmmu/monitor.o
  CC      sparc-linux-user/linux-user/main.o
  CC      m68k-linux-user/linux-user/mmap.o
  CC      sh4eb-softmmu/balloon.o
  CC      mips64-linux-user/linux-user/main.o
  CC      mips-softmmu/numa.o
  CC      mips64el-softmmu/gdbstub.o
  CC      or1k-softmmu/gdbstub.o
  CC      cris-linux-user/linux-user/signal.o
  CC      tricore-softmmu/disas.o
  CC      microblaze-softmmu/memory.o
  CC      moxie-softmmu/gdbstub.o
  CC      moxie-softmmu/balloon.o
  CC      nios2-linux-user/accel/tcg/user-exec-stub.o
  CC      mips64el-linux-user/target/mips/msa_helper.o
  CC      mipsn32el-linux-user/accel/tcg/user-exec.o
  CC      microblaze-softmmu/memory_mapping.o
  CC      m68k-softmmu/ioport.o
  CC      microblaze-linux-user/linux-user/mmap.o
  CC      ppcemb-softmmu/memory.o
  CC      ppc64-linux-user/accel/tcg/translate-all.o
  CC      sparc64-linux-user/linux-user/mmap.o
  CC      sh4-linux-user/linux-user/syscall.o
  CC      mips64el-linux-user/target/mips/mips-semi.o
  CC      i386-softmmu/gdbstub.o
  CC      sparc-softmmu/numa.o
  CC      nios2-linux-user/linux-user/main.o
  CC      i386-linux-user/linux-user/main.o
  CC      alpha-softmmu/accel/stubs/kvm-stub.o
  CC      mipsel-softmmu/memory.o
  CC      sh4eb-linux-user/linux-user/elfload.o
  CC      sh4-softmmu/numa.o
  CC      s390x-linux-user/accel/tcg/cpu-exec.o
  CC      tilegx-linux-user/accel/tcg/user-exec-stub.o
  CC      mips64-softmmu/qtest.o
  CC      i386-linux-user/linux-user/syscall.o
  CC      s390x-softmmu/numa.o
  CC      ppc-softmmu/accel/kvm/kvm-all.o
  CC      aarch64-linux-user/linux-user/main.o
  CC      m68k-softmmu/numa.o
  CC      hppa-linux-user/linux-user/uaccess.o
  CC      xtensaeb-softmmu/dump.o
  CC      sparc-linux-user/linux-user/syscall.o
  CC      s390x-linux-user/accel/tcg/cpu-exec-common.o
  CC      sh4eb-softmmu/ioport.o
  CC      or1k-linux-user/linux-user/strace.o
  CC      tricore-softmmu/arch_init.o
  CC      sparc32plus-linux-user/linux-user/signal.o
  CC      ppcemb-softmmu/memory_mapping.o
  CC      unicore32-softmmu/dump.o
  CC      or1k-linux-user/linux-user/mmap.o
  CC      microblaze-linux-user/linux-user/signal.o
  CC      unicore32-softmmu/migration/ram.o
  CC      ppc-linux-user/accel/tcg/user-exec-stub.o
  CC      tilegx-linux-user/linux-user/main.o
  CC      mipsn32-linux-user/linux-user/strace.o
  CC      mipsel-linux-user/accel/tcg/user-exec.o
  CC      mips-softmmu/qtest.o
  CC      sparc64-linux-user/linux-user/signal.o
  CC      sparc-softmmu/qtest.o
  CC      tilegx-linux-user/linux-user/syscall.o
  CC      sparc64-softmmu/memory_mapping.o
  CC      s390x-linux-user/accel/tcg/translate-all.o
  CC      arm-softmmu/numa.o
  CC      ppc-softmmu/accel/stubs/hax-stub.o
  CC      microblazeel-linux-user/accel/tcg/user-exec-stub.o
  CC      alpha-softmmu/accel/tcg/tcg-all.o
  CC      nios2-linux-user/linux-user/syscall.o
  CC      ppc64-softmmu/arch_init.o
  CC      ppc64-linux-user/accel/tcg/translator.o
  CC      lm32-softmmu/migration/ram.o
  CC      mipsn32el-linux-user/accel/tcg/user-exec-stub.o
  CC      mips64-softmmu/memory.o
  CC      xtensaeb-softmmu/migration/ram.o
  CC      ppc-softmmu/accel/tcg/tcg-all.o
  CC      x86_64-softmmu/balloon.o
  CC      arm-linux-user/linux-user/syscall.o
  CC      ppc-linux-user/linux-user/main.o
  CC      sparc-softmmu/memory.o
  CC      sparc-softmmu/memory_mapping.o
  CC      xtensaeb-softmmu/accel/accel.o
  CC      ppc64abi32-linux-user/accel/tcg/translator.o
  CC      ppc64abi32-linux-user/accel/tcg/user-exec.o
  CC      xtensa-softmmu/dump.o
  CC      ppc64-softmmu/cpus.o
  CC      mips-linux-user/linux-user/strace.o
  CC      tricore-softmmu/cpus.o
  CC      mips64el-softmmu/balloon.o
  CC      cris-linux-user/linux-user/elfload.o
  CC      mipsn32-linux-user/linux-user/mmap.o
  CC      tricore-softmmu/monitor.o
  CC      sh4eb-softmmu/numa.o
  CC      ppc64le-linux-user/linux-user/strace.o
  CC      mipsel-linux-user/accel/tcg/user-exec-stub.o
  CC      mips64-linux-user/linux-user/syscall.o
  CC      m68k-softmmu/qtest.o
  CC      m68k-linux-user/linux-user/signal.o
  CC      mipsel-softmmu/memory_mapping.o
  CC      microblazeel-linux-user/linux-user/main.o
  CC      ppc64-linux-user/accel/tcg/user-exec.o
  CC      s390x-softmmu/qtest.o
  CC      sh4-softmmu/qtest.o
  CC      sh4-softmmu/memory.o
  CC      alpha-softmmu/accel/tcg/cputlb.o
  CC      mipsn32-linux-user/linux-user/signal.o
  CC      mipsel-softmmu/dump.o
  CC      aarch64-softmmu/monitor.o
  CC      ppc64-linux-user/accel/tcg/user-exec-stub.o
  CC      mipsel-linux-user/linux-user/main.o
  CC      s390x-linux-user/accel/tcg/translator.o
  CC      mipsel-softmmu/migration/ram.o
  CC      or1k-softmmu/balloon.o
  CC      sh4eb-linux-user/linux-user/linuxload.o
  CC      alpha-linux-user/linux-user/mmap.o
  CC      microblazeel-softmmu/balloon.o
  CC      or1k-softmmu/ioport.o
  CC      sparc64-softmmu/dump.o
  CC      sparc64-softmmu/migration/ram.o
  CC      mipsn32el-linux-user/linux-user/main.o
  CC      aarch64-linux-user/linux-user/syscall.o
  CC      ppcemb-softmmu/dump.o
  CC      x86_64-softmmu/ioport.o
  CC      nios2-softmmu/memory_mapping.o
  CC      xtensa-softmmu/migration/ram.o
  CC      x86_64-softmmu/numa.o
  CC      microblaze-softmmu/dump.o
  CC      ppcemb-softmmu/migration/ram.o
  CC      mips64-linux-user/linux-user/strace.o
  CC      i386-softmmu/balloon.o
  CC      i386-softmmu/ioport.o
  CC      mips-softmmu/memory.o
  CC      i386-softmmu/numa.o
  CC      s390x-linux-user/accel/tcg/user-exec.o
  CC      sparc64-softmmu/accel/accel.o
  CC      x86_64-linux-user/linux-user/strace.o
  CC      arm-softmmu/qtest.o
  CC      xtensaeb-softmmu/accel/stubs/hax-stub.o
  CC      aarch64-linux-user/linux-user/strace.o
  CC      i386-softmmu/qtest.o
  GEN     trace/generated-helpers.c
  CC      sh4eb-softmmu/qtest.o
  CC      mipsel-softmmu/accel/accel.o
  CC      sh4-linux-user/linux-user/strace.o
  CC      i386-linux-user/linux-user/strace.o
  CC      mips64-linux-user/linux-user/mmap.o
  CC      hppa-linux-user/linux-user/uname.o
  CC      mipsn32el-linux-user/linux-user/syscall.o
  CC      microblazeel-linux-user/linux-user/syscall.o
  CC      aarch64-linux-user/linux-user/mmap.o
  CC      sparc-linux-user/linux-user/strace.o
  CC      aarch64-linux-user/linux-user/signal.o
  CC      sparc-linux-user/linux-user/mmap.o
  CCAS    hppa-linux-user/linux-user/safe-syscall.o
  CC      arm-softmmu/memory.o
  CC      mips64-softmmu/memory_mapping.o
  CC      nios2-softmmu/dump.o
  CC      xtensaeb-softmmu/accel/stubs/kvm-stub.o
  CC      microblaze-linux-user/linux-user/elfload.o
  CC      or1k-softmmu/numa.o
  CCAS    armeb-linux-user/linux-user/safe-syscall.o
  CC      mips-softmmu/memory_mapping.o
  CC      ppc-linux-user/linux-user/syscall.o
  CC      xtensa-softmmu/accel/accel.o
  CC      m68k-softmmu/memory.o
  CC      ppc64-linux-user/linux-user/main.o
  CC      ppcemb-softmmu/accel/accel.o
  CC      ppc64abi32-linux-user/accel/tcg/user-exec-stub.o
  CC      mipsel-linux-user/linux-user/syscall.o
  CC      mipsel-softmmu/accel/stubs/hax-stub.o
  CC      ppcemb-softmmu/accel/kvm/kvm-all.o
  CC      nios2-linux-user/linux-user/strace.o
  CC      tilegx-linux-user/linux-user/strace.o
  CC      s390x-softmmu/memory.o
  CC      alpha-linux-user/linux-user/signal.o
  CC      tilegx-linux-user/linux-user/mmap.o
  CC      mips64el-linux-user/trace/control-target.o
  CC      m68k-softmmu/memory_mapping.o
  CC      x86_64-softmmu/qtest.o
  CC      m68k-softmmu/dump.o
  CC      moxie-softmmu/ioport.o
  CC      ppc-softmmu/accel/tcg/cputlb.o
  CC      unicore32-softmmu/accel/accel.o
  CC      ppc-softmmu/accel/tcg/tcg-runtime.o
  CC      lm32-softmmu/accel/accel.o
  CC      ppc64le-linux-user/linux-user/mmap.o
  CC      ppc64abi32-linux-user/linux-user/main.o
  CC      ppc64le-linux-user/linux-user/signal.o
  CC      mips64el-softmmu/ioport.o
  CC      microblaze-softmmu/migration/ram.o
  CC      microblazeel-softmmu/ioport.o
  CC      ppcemb-softmmu/accel/stubs/hax-stub.o
  CC      sparc-softmmu/dump.o
  CC      ppc64-softmmu/monitor.o
  CC      s390x-softmmu/memory_mapping.o
  CC      lm32-softmmu/accel/stubs/hax-stub.o
  CC      mips64el-softmmu/numa.o
  CC      mips64-linux-user/linux-user/signal.o
  CC      cris-linux-user/linux-user/linuxload.o
  CC      xtensaeb-softmmu/accel/tcg/tcg-all.o
  CC      ppc-linux-user/linux-user/strace.o
  CC      sh4eb-softmmu/memory.o
  CC      alpha-linux-user/linux-user/elfload.o
  CC      i386-softmmu/memory.o
  CC      sparc-softmmu/migration/ram.o
  CC      cris-linux-user/linux-user/uaccess.o
  CC      or1k-softmmu/qtest.o
  CC      microblaze-linux-user/linux-user/linuxload.o
  CC      s390x-softmmu/dump.o
  CC      microblaze-softmmu/accel/accel.o
  CC      or1k-softmmu/memory.o
  CC      tricore-softmmu/gdbstub.o
  CC      or1k-softmmu/memory_mapping.o
  CC      m68k-linux-user/linux-user/elfload.o
  CC      mips64-linux-user/linux-user/elfload.o
  CC      mips64-softmmu/dump.o
  CC      lm32-softmmu/accel/stubs/kvm-stub.o
  CC      nios2-softmmu/migration/ram.o
  CC      cris-softmmu/gdbstub.o
  CC      ppc64-softmmu/gdbstub.o
  CC      microblaze-linux-user/linux-user/uaccess.o
  CC      microblaze-softmmu/accel/stubs/hax-stub.o
  CC      armeb-linux-user/linux-user/flatload.o
  CC      ppc64-softmmu/balloon.o
  CC      sparc64-softmmu/accel/stubs/hax-stub.o
  CC      unicore32-softmmu/accel/stubs/hax-stub.o
  CC      hppa-linux-user/target/hppa/translate.o
  CC      m68k-softmmu/migration/ram.o
  CC      aarch64-softmmu/gdbstub.o
  CC      aarch64-softmmu/balloon.o
  CC      s390x-linux-user/accel/tcg/user-exec-stub.o
  CC      mipsel-softmmu/accel/stubs/kvm-stub.o
  CC      xtensaeb-softmmu/accel/tcg/cputlb.o
  CC      microblazeel-linux-user/linux-user/strace.o
  CC      mips-softmmu/dump.o
  CC      nios2-softmmu/accel/accel.o
  CC      ppc64-linux-user/linux-user/syscall.o
  CC      nios2-softmmu/accel/stubs/hax-stub.o
  CC      moxie-softmmu/numa.o
  CC      moxie-softmmu/qtest.o
  CC      or1k-softmmu/dump.o
  CC      xtensa-softmmu/accel/stubs/hax-stub.o
  CC      moxie-softmmu/memory.o
  CC      lm32-softmmu/accel/tcg/tcg-all.o
  CC      mips-linux-user/linux-user/mmap.o
  CC      microblazeel-softmmu/numa.o
  CC      alpha-softmmu/accel/tcg/tcg-runtime.o
  CC      sparc64-softmmu/accel/stubs/kvm-stub.o
  CC      sparc-linux-user/linux-user/signal.o
  CC      unicore32-softmmu/accel/stubs/kvm-stub.o
  CC      sparc64-softmmu/accel/tcg/tcg-all.o
  CC      ppcemb-softmmu/accel/tcg/tcg-all.o
  CC      ppc64-linux-user/linux-user/strace.o
  CC      arm-softmmu/memory_mapping.o
  CC      lm32-softmmu/accel/tcg/cputlb.o
  CC      sparc64-linux-user/linux-user/elfload.o
  CC      mips64el-softmmu/qtest.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11.o
  CC      s390x-linux-user/linux-user/main.o
  CC      xtensa-softmmu/accel/stubs/kvm-stub.o
  CC      mipsn32-linux-user/linux-user/elfload.o
  CC      s390x-linux-user/linux-user/syscall.o
  CC      mipsel-softmmu/accel/tcg/tcg-all.o
  CC      alpha-softmmu/accel/tcg/cpu-exec.o
  CC      x86_64-softmmu/memory.o
  CC      mips64-linux-user/linux-user/linuxload.o
  CC      sh4-softmmu/memory_mapping.o
  CC      sparc64-softmmu/accel/tcg/cputlb.o
  CC      mips64el-linux-user/trace/generated-helpers.o
  CC      ppc64abi32-linux-user/linux-user/syscall.o
  CC      x86_64-softmmu/memory_mapping.o
  CC      xtensaeb-softmmu/accel/tcg/tcg-runtime.o
  CC      i386-softmmu/memory_mapping.o
  CC      sparc-softmmu/accel/accel.o
  CC      mips64-softmmu/migration/ram.o
  CC      tilegx-linux-user/linux-user/signal.o
  CC      mips-linux-user/linux-user/signal.o
  CC      microblazeel-linux-user/linux-user/mmap.o
  CC      sh4eb-softmmu/memory_mapping.o
  CC      microblazeel-linux-user/linux-user/signal.o
  CC      mipsel-softmmu/accel/tcg/cputlb.o
  CC      ppc64-linux-user/linux-user/mmap.o
  CC      unicore32-softmmu/accel/tcg/tcg-all.o
  CC      s390x-linux-user/linux-user/strace.o
  CC      ppc64-linux-user/linux-user/signal.o
  CC      mips64-linux-user/linux-user/uaccess.o
  CC      xtensa-softmmu/accel/tcg/tcg-all.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cpdo.o
  CC      microblaze-softmmu/accel/stubs/kvm-stub.o
  CC      sparc64-softmmu/accel/tcg/tcg-runtime.o
  CC      aarch64-linux-user/linux-user/elfload.o
  CC      sh4eb-linux-user/linux-user/uaccess.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cpdt.o
  CC      sh4-softmmu/dump.o
  CC      mipsn32-linux-user/linux-user/linuxload.o
  CC      nios2-linux-user/linux-user/mmap.o
  CC      mipsel-linux-user/linux-user/strace.o
  CC      sparc-linux-user/linux-user/elfload.o
  CC      alpha-softmmu/accel/tcg/cpu-exec-common.o
  CC      m68k-softmmu/accel/accel.o
  CC      microblazeel-softmmu/qtest.o
  CC      s390x-linux-user/linux-user/mmap.o
  CC      unicore32-softmmu/accel/tcg/cputlb.o
  CC      mips64el-softmmu/memory.o
  CC      mips-linux-user/linux-user/elfload.o
  CC      sparc32plus-linux-user/linux-user/elfload.o
  CC      xtensa-softmmu/accel/tcg/cputlb.o
  CC      mips-softmmu/migration/ram.o
  CC      sparc64-linux-user/linux-user/linuxload.o
  CC      mipsn32-linux-user/linux-user/uaccess.o
  CC      arm-linux-user/linux-user/strace.o
  CC      mips-linux-user/linux-user/linuxload.o
  CC      nios2-softmmu/accel/stubs/kvm-stub.o
  CC      sh4eb-linux-user/linux-user/uname.o
  CC      microblaze-softmmu/accel/tcg/tcg-all.o
  CC      sh4eb-linux-user/linux-user/flatload.o
  CCAS    sh4eb-linux-user/linux-user/safe-syscall.o
  CC      x86_64-linux-user/linux-user/mmap.o
  CC      tricore-softmmu/balloon.o
  CC      cris-softmmu/balloon.o
  CC      aarch64-softmmu/ioport.o
  CC      alpha-linux-user/linux-user/linuxload.o
  CC      alpha-linux-user/linux-user/uaccess.o
  CC      or1k-linux-user/linux-user/signal.o
  CC      mipsn32el-linux-user/linux-user/strace.o
  CC      cris-softmmu/ioport.o
  CC      ppcemb-softmmu/accel/tcg/cputlb.o
  CC      sh4-softmmu/migration/ram.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cprt.o
  CC      alpha-linux-user/linux-user/uname.o
  CC      xtensaeb-softmmu/accel/tcg/cpu-exec.o
  CC      ppcemb-softmmu/accel/tcg/tcg-runtime.o
  CC      ppc64-linux-user/linux-user/elfload.o
  CC      sparc-softmmu/accel/stubs/hax-stub.o
  CC      arm-softmmu/dump.o
  CC      microblaze-linux-user/linux-user/uname.o
  CC      s390x-softmmu/migration/ram.o
  CC      nios2-softmmu/accel/tcg/tcg-all.o
  CC      or1k-linux-user/linux-user/elfload.o
  CC      xtensa-softmmu/accel/tcg/tcg-runtime.o
  CC      nios2-linux-user/linux-user/signal.o
  CC      ppc64-linux-user/linux-user/linuxload.o
  CC      or1k-linux-user/linux-user/linuxload.o
  CC      microblaze-softmmu/accel/tcg/cputlb.o
  CC      arm-softmmu/migration/ram.o
  CC      or1k-linux-user/linux-user/uaccess.o
  CC      alpha-softmmu/accel/tcg/translate-all.o
  CC      lm32-softmmu/accel/tcg/tcg-runtime.o
  CC      nios2-softmmu/accel/tcg/cputlb.o
  CC      microblazeel-softmmu/memory.o
  CC      sparc-linux-user/linux-user/linuxload.o
  CC      ppc64abi32-linux-user/linux-user/strace.o
  CC      tricore-softmmu/ioport.o
  CC      ppcemb-softmmu/accel/tcg/cpu-exec.o
  CC      sh4eb-linux-user/target/sh4/translate.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpopcode.o
  CC      sparc64-softmmu/accel/tcg/cpu-exec.o
  CC      mips-linux-user/linux-user/uaccess.o
  CC      mipsel-linux-user/linux-user/mmap.o
  CC      cris-softmmu/numa.o
  CC      sparc-softmmu/accel/stubs/kvm-stub.o
  CC      nios2-linux-user/linux-user/elfload.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/single_cpdo.o
  CC      sparc64-linux-user/linux-user/uaccess.o
  CC      ppc64-linux-user/linux-user/uaccess.o
  CC      sparc64-linux-user/linux-user/uname.o
  CC      sh4-linux-user/linux-user/mmap.o
  CCAS    alpha-linux-user/linux-user/safe-syscall.o
  CC      ppc64abi32-linux-user/linux-user/mmap.o
  CC      mips64-softmmu/accel/accel.o
  CC      mips64el-softmmu/memory_mapping.o
  CC      aarch64-softmmu/numa.o
  CC      mips64el-softmmu/dump.o
  CCAS    sparc64-linux-user/linux-user/safe-syscall.o
  CC      i386-softmmu/dump.o
  CC      aarch64-linux-user/linux-user/linuxload.o
  CC      mips64el-softmmu/migration/ram.o
  CC      mipsn32el-linux-user/linux-user/mmap.o
  CC      ppc-softmmu/accel/tcg/cpu-exec.o
  CC      microblazeel-softmmu/memory_mapping.o
  CC      arm-linux-user/linux-user/mmap.o
  CC      microblazeel-linux-user/linux-user/elfload.o
  CC      moxie-softmmu/memory_mapping.o
  CC      sh4-linux-user/linux-user/signal.o
  CC      mips-linux-user/linux-user/uname.o
  CC      sh4eb-softmmu/dump.o
  CC      ppc64-softmmu/ioport.o
  CC      mips-softmmu/accel/accel.o
  CC      mipsel-softmmu/accel/tcg/tcg-runtime.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/double_cpdo.o
  CC      alpha-linux-user/target/alpha/translate.o
  CC      sparc-softmmu/accel/tcg/tcg-all.o
  CC      alpha-softmmu/accel/tcg/translator.o
  CC      cris-linux-user/linux-user/uname.o
  CC      mipsel-linux-user/linux-user/signal.o
  CC      ppc-softmmu/accel/tcg/cpu-exec-common.o
  CC      tricore-softmmu/numa.o
  CC      mips64-softmmu/accel/stubs/hax-stub.o
  CC      arm-linux-user/linux-user/signal.o
  CC      or1k-softmmu/migration/ram.o
  CC      alpha-softmmu/hw/9pfs/virtio-9p-device.o
  CC      x86_64-linux-user/linux-user/signal.o
  CC      sh4-linux-user/linux-user/elfload.o
  CC      mips64el-softmmu/accel/accel.o
  CC      m68k-softmmu/accel/stubs/hax-stub.o
  CC      cris-softmmu/qtest.o
  CC      sparc-softmmu/accel/tcg/cputlb.o
  CC      ppcemb-softmmu/accel/tcg/cpu-exec-common.o
  CC      sparc-softmmu/accel/tcg/tcg-runtime.o
  CC      mipsel-softmmu/accel/tcg/cpu-exec.o
  CC      arm-softmmu/accel/accel.o
  CC      s390x-linux-user/linux-user/signal.o
  CC      mipsn32el-linux-user/linux-user/signal.o
  CC      mipsel-linux-user/linux-user/elfload.o
  CC      xtensaeb-softmmu/accel/tcg/cpu-exec-common.o
  CC      mipsel-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppc-linux-user/linux-user/mmap.o
  CC      x86_64-softmmu/dump.o
  CC      microblaze-softmmu/accel/tcg/tcg-runtime.o
  CC      aarch64-softmmu/qtest.o
  CC      x86_64-softmmu/migration/ram.o
  CC      sparc32plus-linux-user/linux-user/linuxload.o
  CC      lm32-softmmu/accel/tcg/cpu-exec.o
  CC      m68k-linux-user/linux-user/linuxload.o
  CC      sh4eb-linux-user/target/sh4/op_helper.o
  CC      tilegx-linux-user/linux-user/elfload.o
  CC      tricore-softmmu/qtest.o
  CC      mips-softmmu/accel/stubs/hax-stub.o
  CC      arm-linux-user/linux-user/elfload.o
  CC      mips64-softmmu/accel/stubs/kvm-stub.o
  CC      alpha-linux-user/target/alpha/helper.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/extended_cpdo.o
  CC      mips64-softmmu/accel/tcg/tcg-all.o
  CC      sparc32plus-linux-user/linux-user/uaccess.o
  CC      m68k-softmmu/accel/stubs/kvm-stub.o
  CC      sparc64-softmmu/accel/tcg/cpu-exec-common.o
  CC      sh4eb-softmmu/migration/ram.o
  CC      ppc64-softmmu/numa.o
  CC      microblazeel-softmmu/dump.o
  CC      xtensa-softmmu/accel/tcg/cpu-exec.o
  CC      xtensaeb-softmmu/accel/tcg/translate-all.o
  CC      ppc-softmmu/accel/tcg/translate-all.o
  CC      mipsel-linux-user/linux-user/linuxload.o
  CC      arm-linux-user/linux-user/linuxload.o
  CC      mipsel-softmmu/accel/tcg/translate-all.o
  CC      tilegx-linux-user/linux-user/linuxload.o
  CC      mips64-linux-user/linux-user/uname.o
  CC      armeb-linux-user/target/arm/arm-semi.o
  CC      or1k-linux-user/linux-user/uname.o
  CC      alpha-softmmu/hw/block/virtio-blk.o
  CC      hppa-linux-user/target/hppa/helper.o
  CC      mips64-softmmu/accel/tcg/cputlb.o
  CC      x86_64-linux-user/linux-user/elfload.o
  CC      sparc64-softmmu/accel/tcg/translate-all.o
  CC      m68k-softmmu/accel/tcg/tcg-all.o
  CC      unicore32-softmmu/accel/tcg/tcg-runtime.o
  CC      m68k-linux-user/linux-user/uaccess.o
  CC      microblazeel-softmmu/migration/ram.o
  CC      moxie-softmmu/dump.o
  CC      x86_64-softmmu/accel/accel.o
  CCAS    cris-linux-user/linux-user/safe-syscall.o
  CC      mipsn32el-linux-user/linux-user/elfload.o
  CC      mipsel-softmmu/accel/tcg/translator.o
  CC      mips-softmmu/accel/stubs/kvm-stub.o
  CC      sparc64-linux-user/target/sparc/translate.o
  CC      lm32-softmmu/accel/tcg/cpu-exec-common.o
  CC      x86_64-linux-user/linux-user/linuxload.o
  CC      cris-softmmu/memory.o
  CC      x86_64-linux-user/linux-user/uaccess.o
  CC      ppc64abi32-linux-user/linux-user/signal.o
  CC      sh4-softmmu/accel/accel.o
  CC      s390x-softmmu/accel/accel.o
  CCAS    or1k-linux-user/linux-user/safe-syscall.o
  CC      sparc64-linux-user/target/sparc/helper.o
  CC      mips64-softmmu/accel/tcg/tcg-runtime.o
  CC      xtensaeb-softmmu/accel/tcg/translator.o
  CC      aarch64-softmmu/memory.o
  CC      ppc64-softmmu/qtest.o
  CC      cris-linux-user/target/cris/translate.o
  CC      tricore-softmmu/memory.o
  CC      x86_64-linux-user/linux-user/uname.o
  CC      m68k-softmmu/accel/tcg/cputlb.o
  CC      mips64el-softmmu/accel/stubs/hax-stub.o
  CC      i386-softmmu/migration/ram.o
  CC      xtensaeb-softmmu/hw/core/generic-loader.o
  CC      unicore32-softmmu/accel/tcg/cpu-exec.o
  CC      arm-linux-user/linux-user/uaccess.o
  CC      mipsn32-linux-user/linux-user/uname.o
  CC      xtensaeb-softmmu/hw/core/null-machine.o
  CC      lm32-softmmu/accel/tcg/translate-all.o
  CC      microblazeel-linux-user/linux-user/linuxload.o
  CC      nios2-linux-user/linux-user/linuxload.o
  CC      unicore32-softmmu/accel/tcg/cpu-exec-common.o
  CC      i386-linux-user/linux-user/mmap.o
  CC      nios2-softmmu/accel/tcg/tcg-runtime.o
  CC      s390x-linux-user/linux-user/elfload.o
  CCAS    mips64-linux-user/linux-user/safe-syscall.o
  CCAS    mipsn32-linux-user/linux-user/safe-syscall.o
  CC      ppc-softmmu/accel/tcg/translator.o
  CC      mips-softmmu/accel/tcg/tcg-all.o
  CC      x86_64-softmmu/accel/stubs/hax-stub.o
  CC      microblaze-softmmu/accel/tcg/cpu-exec.o
  CC      ppc64-linux-user/linux-user/uname.o
  CC      sh4-softmmu/accel/stubs/hax-stub.o
  CC      sh4eb-linux-user/target/sh4/helper.o
  CC      tricore-softmmu/memory_mapping.o
  CC      hppa-linux-user/target/hppa/cpu.o
  CC      microblazeel-softmmu/accel/accel.o
  CC      microblazeel-linux-user/linux-user/uaccess.o
  CC      cris-linux-user/target/cris/op_helper.o
  CC      aarch64-softmmu/memory_mapping.o
  CC      cris-softmmu/memory_mapping.o
  CC      s390x-softmmu/accel/stubs/hax-stub.o
  CC      alpha-linux-user/target/alpha/cpu.o
  CC      microblaze-softmmu/accel/tcg/cpu-exec-common.o
  CC      moxie-softmmu/migration/ram.o
  CC      sparc-softmmu/accel/tcg/cpu-exec.o
  CC      arm-softmmu/accel/stubs/hax-stub.o
  CC      s390x-softmmu/accel/stubs/kvm-stub.o
  CC      mipsel-softmmu/hw/9pfs/virtio-9p-device.o
  CC      or1k-softmmu/accel/accel.o
  CC      mipsel-softmmu/hw/block/virtio-blk.o
  CC      ppc64abi32-linux-user/linux-user/elfload.o
  CC      sparc64-linux-user/target/sparc/cpu.o
  CC      xtensaeb-softmmu/hw/misc/mmio_interface.o
  CC      mipsel-linux-user/linux-user/uaccess.o
  CC      i386-linux-user/linux-user/signal.o
  CC      armeb-linux-user/target/arm/kvm-stub.o
  CC      sh4-softmmu/accel/stubs/kvm-stub.o
  CC      xtensa-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppc-softmmu/hw/9pfs/virtio-9p-device.o
  CC      armeb-linux-user/target/arm/translate.o
  CC      hppa-linux-user/target/hppa/op_helper.o
  CCAS    microblaze-linux-user/linux-user/safe-syscall.o
  CC      alpha-linux-user/target/alpha/int_helper.o
  CC      arm-linux-user/linux-user/uname.o
  CC      microblazeel-softmmu/accel/stubs/hax-stub.o
  CC      microblazeel-softmmu/accel/stubs/kvm-stub.o
  CC      alpha-softmmu/hw/block/dataplane/virtio-blk.o
  CC      arm-softmmu/accel/stubs/kvm-stub.o
  CC      xtensaeb-softmmu/hw/net/vhost_net.o
  CC      s390x-softmmu/accel/tcg/tcg-all.o
  CC      sh4eb-softmmu/accel/accel.o
  CC      sparc32plus-linux-user/linux-user/uname.o
  CC      mips-softmmu/accel/tcg/cputlb.o
  CC      lm32-softmmu/accel/tcg/translator.o
  CC      microblaze-linux-user/linux-user/flatload.o
  CCAS    mips-linux-user/linux-user/safe-syscall.o
  CC      moxie-softmmu/accel/accel.o
  CC      xtensa-softmmu/accel/tcg/translate-all.o
  CC      mipsn32-linux-user/target/mips/translate.o
  CC      or1k-linux-user/target/openrisc/cpu.o
  CC      sh4-softmmu/accel/tcg/tcg-all.o
  CC      xtensa-softmmu/accel/tcg/translator.o
  CC      mips64el-softmmu/accel/stubs/kvm-stub.o
  CC      i386-linux-user/linux-user/elfload.o
  CC      m68k-linux-user/linux-user/uname.o
  CC      nios2-softmmu/accel/tcg/cpu-exec.o
  CC      arm-softmmu/accel/tcg/tcg-all.o
  CC      moxie-softmmu/accel/stubs/hax-stub.o
  CC      ppc64-softmmu/memory.o
  CC      mipsel-softmmu/hw/block/dataplane/virtio-blk.o
  CC      i386-linux-user/linux-user/linuxload.o
  CC      ppc-softmmu/hw/block/virtio-blk.o
  CC      ppcemb-softmmu/accel/tcg/translate-all.o
  CC      alpha-softmmu/hw/char/virtio-serial-bus.o
  CC      sh4-softmmu/accel/tcg/cputlb.o
  CC      s390x-linux-user/linux-user/linuxload.o
  CC      unicore32-softmmu/accel/tcg/translate-all.o
  CC      m68k-softmmu/accel/tcg/tcg-runtime.o
  CC      sh4eb-linux-user/target/sh4/cpu.o
  CCAS    x86_64-linux-user/linux-user/safe-syscall.o
  CC      nios2-softmmu/accel/tcg/cpu-exec-common.o
  CC      s390x-softmmu/accel/tcg/cputlb.o
  CC      mips64-linux-user/target/mips/translate.o
  CC      ppcemb-softmmu/accel/tcg/translator.o
  CC      nios2-softmmu/accel/tcg/translate-all.o
  CC      aarch64-linux-user/linux-user/uaccess.o
  CC      xtensaeb-softmmu/hw/net/rocker/qmp-norocker.o
  CC      x86_64-softmmu/accel/stubs/kvm-stub.o
  CC      sparc64-softmmu/accel/tcg/translator.o
  CC      x86_64-linux-user/target/i386/helper.o
  CC      mips64el-softmmu/accel/tcg/tcg-all.o
  CC      mipsel-linux-user/linux-user/uname.o
  CC      cris-linux-user/target/cris/helper.o
  CC      microblazeel-linux-user/linux-user/uname.o
  CC      microblazeel-softmmu/accel/tcg/tcg-all.o
  CC      mipsel-softmmu/hw/char/virtio-serial-bus.o
  CC      sparc64-linux-user/target/sparc/fop_helper.o
  CCAS    mipsel-linux-user/linux-user/safe-syscall.o
  CC      cris-softmmu/dump.o
  CC      lm32-softmmu/hw/core/generic-loader.o
  CC      aarch64-linux-user/linux-user/uname.o
  CC      mipsn32el-linux-user/linux-user/linuxload.o
  CC      armeb-linux-user/target/arm/op_helper.o
  CCAS    arm-linux-user/linux-user/safe-syscall.o
  CC      microblaze-softmmu/accel/tcg/translate-all.o
  CC      or1k-softmmu/accel/stubs/hax-stub.o
  CC      alpha-softmmu/hw/core/generic-loader.o
  CC      mips-softmmu/accel/tcg/tcg-runtime.o
  CC      arm-softmmu/accel/tcg/cputlb.o
  CC      cris-softmmu/migration/ram.o
  CC      sparc-softmmu/accel/tcg/cpu-exec-common.o
  CCAS    aarch64-linux-user/linux-user/safe-syscall.o
  CC      s390x-linux-user/linux-user/uaccess.o
  CC      m68k-softmmu/accel/tcg/cpu-exec.o
  CC      xtensaeb-softmmu/hw/vfio/common.o
  CC      microblazeel-softmmu/accel/tcg/cputlb.o
  CC      x86_64-softmmu/accel/tcg/tcg-all.o
  CC      or1k-softmmu/accel/stubs/kvm-stub.o
  CC      unicore32-softmmu/accel/tcg/translator.o
  CC      sparc64-linux-user/target/sparc/cc_helper.o
  CC      sparc64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      cris-softmmu/accel/accel.o
  CC      mipsn32-linux-user/target/mips/dsp_helper.o
  CC      armeb-linux-user/target/arm/helper.o
  CC      s390x-linux-user/linux-user/uname.o
  CC      hppa-linux-user/target/hppa/gdbstub.o
  CC      mips64el-softmmu/accel/tcg/cputlb.o
  CC      tricore-softmmu/dump.o
  CC      nios2-softmmu/accel/tcg/translator.o
  CCAS    m68k-linux-user/linux-user/safe-syscall.o
  CCAS    sparc32plus-linux-user/linux-user/safe-syscall.o
  CC      tilegx-linux-user/linux-user/uaccess.o
  CC      sparc32plus-linux-user/target/sparc/translate.o
  CC      microblaze-linux-user/target/microblaze/translate.o
  CCAS    ppc64-linux-user/linux-user/safe-syscall.o
  CC      mips64-softmmu/accel/tcg/cpu-exec.o
  CC      ppc64abi32-linux-user/linux-user/linuxload.o
  CC      m68k-linux-user/linux-user/flatload.o
  CCAS    microblazeel-linux-user/linux-user/safe-syscall.o
  CC      m68k-softmmu/accel/tcg/cpu-exec-common.o
  CC      arm-linux-user/linux-user/flatload.o
  CC      sparc-softmmu/accel/tcg/translate-all.o
  CC      unicore32-softmmu/hw/core/generic-loader.o
  CC      x86_64-softmmu/accel/tcg/cputlb.o
  CC      sh4-linux-user/linux-user/linuxload.o
  CC      aarch64-softmmu/dump.o
  CC      sh4eb-softmmu/accel/stubs/hax-stub.o
  CC      x86_64-softmmu/accel/tcg/tcg-runtime.o
  CC      microblaze-softmmu/accel/tcg/translator.o
  CC      microblaze-softmmu/hw/core/generic-loader.o
  CC      lm32-softmmu/hw/core/null-machine.o
  CC      mips-linux-user/target/mips/translate.o
  CC      nios2-linux-user/linux-user/uaccess.o
  CC      x86_64-linux-user/target/i386/cpu.o
  CC      mipsel-softmmu/hw/core/generic-loader.o
  CC      mipsn32el-linux-user/linux-user/uaccess.o
  CC      sparc-softmmu/accel/tcg/translator.o
  CC      aarch64-linux-user/linux-user/flatload.o
  CC      mips64-softmmu/accel/tcg/cpu-exec-common.o
  GEN     trace/generated-helpers.c
  CC      sh4eb-softmmu/accel/stubs/kvm-stub.o
  CC      sparc64-softmmu/hw/block/virtio-blk.o
  CC      xtensa-softmmu/hw/core/generic-loader.o
  CC      or1k-softmmu/accel/tcg/tcg-all.o
  CC      or1k-linux-user/target/openrisc/exception.o
  CC      hppa-linux-user/trace/control-target.o
  CC      ppc64-softmmu/memory_mapping.o
  CC      aarch64-softmmu/migration/ram.o
  CC      aarch64-linux-user/target/arm/arm-semi.o
  CC      alpha-linux-user/target/alpha/fpu_helper.o
  CC      alpha-linux-user/target/alpha/vax_helper.o
  CC      aarch64-softmmu/accel/accel.o
  CC      nios2-softmmu/hw/core/generic-loader.o
  CC      mips-softmmu/accel/tcg/cpu-exec.o
  CC      arm-softmmu/accel/tcg/tcg-runtime.o
  CC      mips64-softmmu/accel/tcg/translate-all.o
  CC      sh4eb-linux-user/target/sh4/gdbstub.o
  CC      lm32-softmmu/hw/input/milkymist-softusb.o
  GEN     trace/generated-helpers.c
  CC      mips-linux-user/target/mips/dsp_helper.o
  CC      ppc64-softmmu/dump.o
  CC      ppc-softmmu/hw/block/dataplane/virtio-blk.o
  CC      alpha-softmmu/hw/core/null-machine.o
  CC      arm-softmmu/accel/tcg/cpu-exec.o
  CC      microblaze-softmmu/hw/core/null-machine.o
  CC      sh4-linux-user/linux-user/uaccess.o
  CC      sparc32plus-linux-user/target/sparc/helper.o
  CC      tilegx-linux-user/linux-user/uname.o
  CC      ppc-softmmu/hw/char/virtio-serial-bus.o
  CC      hppa-linux-user/trace/generated-helpers.o
  CC      unicore32-softmmu/hw/core/null-machine.o
  CC      mipsel-linux-user/target/mips/translate.o
  CC      or1k-linux-user/target/openrisc/interrupt.o
  CC      or1k-softmmu/accel/tcg/cputlb.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec.o
  CC      m68k-linux-user/linux-user/m68k-sim.o
  CC      ppc64abi32-linux-user/linux-user/uaccess.o
  CC      i386-softmmu/accel/accel.o
  CC      sh4eb-softmmu/accel/tcg/tcg-all.o
  CC      sparc-linux-user/linux-user/uaccess.o
  CC      arm-softmmu/accel/tcg/cpu-exec-common.o
  CC      armeb-linux-user/target/arm/cpu.o
  CC      ppcemb-softmmu/hw/9pfs/virtio-9p-device.o
  CC      microblazeel-softmmu/accel/tcg/tcg-runtime.o
  CC      ppc64-softmmu/migration/ram.o
  CC      aarch64-linux-user/target/arm/kvm-stub.o
  CC      ppc-linux-user/linux-user/signal.o
  CC      mipsel-softmmu/hw/core/null-machine.o
  CC      sparc-linux-user/linux-user/uname.o
  CC      mipsel-linux-user/target/mips/dsp_helper.o
  CC      xtensa-softmmu/hw/core/null-machine.o
  CC      armeb-linux-user/target/arm/neon_helper.o
  CC      alpha-softmmu/hw/display/vga.o
  CC      unicore32-softmmu/hw/misc/mmio_interface.o
  CC      sh4eb-linux-user/trace/control-target.o
  CC      sh4-linux-user/linux-user/uname.o
  CCAS    sh4-linux-user/linux-user/safe-syscall.o
  CC      or1k-linux-user/target/openrisc/mmu.o
  CC      sparc64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      xtensa-softmmu/hw/misc/mmio_interface.o
  CC      sparc-softmmu/hw/core/generic-loader.o
  CC      ppc64le-linux-user/linux-user/elfload.o
  CC      microblaze-softmmu/hw/misc/mmio_interface.o
  CC      microblazeel-softmmu/accel/tcg/cpu-exec.o
  CC      nios2-softmmu/hw/core/null-machine.o
  CC      m68k-linux-user/target/m68k/m68k-semi.o
  CC      mipsel-softmmu/hw/display/vga.o
  CC      sparc-softmmu/hw/core/null-machine.o
  CC      lm32-softmmu/hw/misc/milkymist-hpdmc.o
  CC      sparc32plus-linux-user/target/sparc/cpu.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec-common.o
  CC      sh4eb-softmmu/accel/tcg/cputlb.o
  CC      m68k-softmmu/accel/tcg/translate-all.o
  CC      microblazeel-softmmu/accel/tcg/cpu-exec-common.o
  CC      alpha-linux-user/target/alpha/sys_helper.o
  CC      mips-linux-user/target/mips/op_helper.o
  CC      arm-softmmu/accel/tcg/translate-all.o
  CC      moxie-softmmu/accel/stubs/kvm-stub.o
  CC      sh4-softmmu/accel/tcg/tcg-runtime.o
  CC      moxie-softmmu/accel/tcg/tcg-all.o
  CC      i386-softmmu/accel/stubs/hax-stub.o
  CC      ppc64le-linux-user/linux-user/linuxload.o
  LINK    hppa-linux-user/qemu-hppa
  CC      mipsel-softmmu/hw/display/virtio-gpu.o
  CC      nios2-softmmu/hw/intc/nios2_iic.o
  CC      sparc64-linux-user/target/sparc/win_helper.o
  CC      ppcemb-softmmu/hw/block/virtio-blk.o
  CC      unicore32-softmmu/hw/net/vhost_net.o
  CC      xtensa-softmmu/hw/net/vhost_net.o
  CC      or1k-linux-user/target/openrisc/translate.o
  CC      cris-linux-user/target/cris/cpu.o
  CC      sh4eb-linux-user/trace/generated-helpers.o
  CC      mips64-softmmu/accel/tcg/translator.o
  CC      cris-linux-user/target/cris/gdbstub.o
  CC      microblaze-softmmu/hw/net/xilinx_ethlite.o
  CC      xtensaeb-softmmu/hw/vfio/platform.o
  CC      sparc32plus-linux-user/target/sparc/fop_helper.o
  CC      mipsel-linux-user/target/mips/op_helper.o
  CC      sh4-linux-user/linux-user/flatload.o
  CC      moxie-softmmu/accel/tcg/cputlb.o
  CC      sparc64-linux-user/target/sparc/mmu_helper.o
  CC      or1k-linux-user/target/openrisc/exception_helper.o
  CC      or1k-linux-user/target/openrisc/fpu_helper.o
  CC      sparc-softmmu/hw/display/tcx.o
  CCAS    tilegx-linux-user/linux-user/safe-syscall.o
  CCAS    s390x-linux-user/linux-user/safe-syscall.o
  CC      lm32-softmmu/hw/misc/milkymist-pfpu.o
  CC      x86_64-linux-user/target/i386/gdbstub.o
  CC      unicore32-softmmu/hw/net/rocker/qmp-norocker.o
  CC      alpha-softmmu/hw/display/virtio-gpu.o
  CC      mips-linux-user/target/mips/lmi_helper.o
  CC      sparc64-linux-user/target/sparc/ldst_helper.o
  CC      tilegx-linux-user/target/tilegx/cpu.o
  CC      i386-softmmu/accel/stubs/kvm-stub.o
  CC      microblazeel-linux-user/linux-user/flatload.o
  CC      alpha-linux-user/target/alpha/mem_helper.o
  CC      mips64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      sparc64-softmmu/hw/char/virtio-serial-bus.o
  CC      nios2-softmmu/hw/misc/mmio_interface.o
  CC      ppc-softmmu/hw/core/generic-loader.o
  CC      s390x-softmmu/accel/tcg/tcg-runtime.o
  CC      microblaze-softmmu/hw/net/vhost_net.o
  CC      s390x-softmmu/accel/tcg/cpu-exec.o
  CC      unicore32-softmmu/hw/vfio/common.o
  CC      sh4-softmmu/accel/tcg/cpu-exec.o
  CC      xtensaeb-softmmu/hw/vfio/spapr.o
  CC      tricore-softmmu/migration/ram.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11.o
  CC      ppc-softmmu/hw/core/null-machine.o
  CC      sparc64-linux-user/target/sparc/int64_helper.o
  CC      sh4-softmmu/accel/tcg/cpu-exec-common.o
  CC      microblaze-linux-user/target/microblaze/op_helper.o
  CC      microblazeel-linux-user/target/microblaze/translate.o
  CC      sparc64-linux-user/target/sparc/vis_helper.o
  CC      xtensa-softmmu/hw/net/rocker/qmp-norocker.o
  CC      m68k-linux-user/target/m68k/translate.o
  CC      s390x-linux-user/target/s390x/cpu.o
  CC      tilegx-linux-user/target/tilegx/translate.o
  CC      s390x-linux-user/target/s390x/cpu_models.o
  CC      cris-softmmu/accel/stubs/hax-stub.o
  CC      nios2-softmmu/hw/net/vhost_net.o
  CC      x86_64-linux-user/target/i386/xsave_helper.o
  CC      ppc-linux-user/linux-user/elfload.o
  CC      alpha-linux-user/target/alpha/gdbstub.o
  CC      mips64-linux-user/target/mips/dsp_helper.o
  CC      mips64el-softmmu/accel/tcg/tcg-runtime.o
  LINK    sh4eb-linux-user/qemu-sh4eb
  CC      or1k-linux-user/target/openrisc/interrupt_helper.o
  CC      i386-linux-user/linux-user/uaccess.o
  CC      i386-softmmu/accel/tcg/tcg-all.o
  CC      alpha-softmmu/hw/display/virtio-gpu-3d.o
  CC      microblaze-softmmu/hw/net/rocker/qmp-norocker.o
  CC      armeb-linux-user/target/arm/iwmmxt_helper.o
  CC      sh4-softmmu/accel/tcg/translate-all.o
  CC      microblazeel-linux-user/target/microblaze/op_helper.o
  CC      sparc32plus-linux-user/target/sparc/cc_helper.o
  CC      unicore32-softmmu/hw/vfio/platform.o
  CC      sh4-linux-user/target/sh4/translate.o
  CC      m68k-softmmu/accel/tcg/translator.o
  CC      ppc64-softmmu/accel/accel.o
  CC      mips64-linux-user/target/mips/op_helper.o
  CC      aarch64-softmmu/accel/stubs/hax-stub.o
  CC      ppc-softmmu/hw/display/sm501.o
  CC      m68k-linux-user/target/m68k/op_helper.o
  CC      nios2-softmmu/hw/net/rocker/qmp-norocker.o
  CC      xtensa-softmmu/hw/vfio/common.o
  CC      cris-softmmu/accel/stubs/kvm-stub.o
  CC      aarch64-linux-user/target/arm/translate.o
  CC      nios2-linux-user/linux-user/uname.o
  CC      microblazeel-linux-user/target/microblaze/helper.o
  CC      lm32-softmmu/hw/misc/mmio_interface.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cpdo.o
  CC      xtensaeb-softmmu/hw/xtensa/pic_cpu.o
  CC      m68k-softmmu/hw/char/mcf_uart.o
  CC      mipsel-softmmu/hw/display/virtio-gpu-3d.o
  GEN     trace/generated-helpers.c
  GEN     trace/generated-helpers.c
  CC      sparc64-softmmu/hw/core/generic-loader.o
  CC      microblaze-softmmu/hw/vfio/common.o
  CC      alpha-softmmu/hw/display/virtio-gpu-pci.o
  CC      sparc-softmmu/hw/display/cg3.o
  CC      alpha-linux-user/trace/control-target.o
  CC      lm32-softmmu/hw/net/milkymist-minimac2.o
  CC      tilegx-linux-user/target/tilegx/helper.o
  CC      xtensaeb-softmmu/hw/xtensa/sim.o
  CC      lm32-softmmu/hw/net/vhost_net.o
  CC      ppc64le-linux-user/linux-user/uaccess.o
  CC      i386-linux-user/linux-user/uname.o
  CC      sh4-softmmu/accel/tcg/translator.o
  CC      i386-softmmu/accel/tcg/cputlb.o
  CC      x86_64-linux-user/target/i386/translate.o
  CC      x86_64-softmmu/accel/tcg/translate-all.o
  CC      mips-linux-user/target/mips/helper.o
  CC      nios2-softmmu/hw/timer/altera_timer.o
  CC      mipsel-linux-user/target/mips/lmi_helper.o
  CC      sparc32plus-linux-user/target/sparc/win_helper.o
  CC      mips64el-softmmu/accel/tcg/cpu-exec.o
  CC      microblazeel-softmmu/accel/tcg/translate-all.o
  CC      arm-softmmu/accel/tcg/translator.o
  CC      microblaze-linux-user/target/microblaze/helper.o
  CC      cris-softmmu/accel/tcg/tcg-all.o
  CC      alpha-softmmu/hw/misc/ivshmem.o
  CC      arm-softmmu/hw/9pfs/virtio-9p-device.o
  CC      s390x-softmmu/accel/tcg/cpu-exec-common.o
  CC      mips64-softmmu/hw/block/virtio-blk.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cpdt.o
  CC      xtensaeb-softmmu/hw/xtensa/xtfpga.o
  CC      ppcemb-softmmu/hw/block/dataplane/virtio-blk.o
  CC      i386-softmmu/accel/tcg/tcg-runtime.o
  CCAS    nios2-linux-user/linux-user/safe-syscall.o
  CC      sparc64-softmmu/hw/core/null-machine.o
  CC      x86_64-softmmu/accel/tcg/translator.o
  CC      nios2-softmmu/hw/vfio/common.o
  CC      nios2-linux-user/target/nios2/translate.o
  CC      ppc64abi32-linux-user/linux-user/uname.o
  CC      microblazeel-softmmu/accel/tcg/translator.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cprt.o
  CC      i386-softmmu/accel/tcg/cpu-exec.o
  CC      sparc64-linux-user/target/sparc/gdbstub.o
  CC      or1k-linux-user/target/openrisc/mmu_helper.o
  CC      ppc64-softmmu/accel/kvm/kvm-all.o
  CC      moxie-softmmu/accel/tcg/tcg-runtime.o
  CC      xtensa-softmmu/hw/vfio/platform.o
  CC      mipsel-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppcemb-softmmu/hw/char/virtio-serial-bus.o
  CC      sparc-softmmu/hw/intc/grlib_irqmp.o
  CC      alpha-linux-user/trace/generated-helpers.o
  CC      aarch64-softmmu/accel/stubs/kvm-stub.o
  CC      s390x-softmmu/accel/tcg/translate-all.o
  CC      mipsn32el-linux-user/linux-user/uname.o
  CC      ppc64le-linux-user/linux-user/uname.o
  CCAS    i386-linux-user/linux-user/safe-syscall.o
  CC      sh4eb-softmmu/accel/tcg/tcg-runtime.o
  CC      m68k-softmmu/hw/core/generic-loader.o
  CC      i386-linux-user/linux-user/vm86.o
  CC      xtensaeb-softmmu/target/xtensa/xtensa-semi.o
  CC      mipsel-softmmu/hw/intc/mips_gic.o
  CC      ppc64-linux-user/target/ppc/cpu-models.o
  CC      cris-softmmu/accel/tcg/cputlb.o
  CC      s390x-softmmu/accel/tcg/translator.o
  CC      sparc64-softmmu/hw/display/vga.o
  CC      mips64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mipsel-softmmu/hw/misc/ivshmem.o
  CC      lm32-softmmu/hw/net/rocker/qmp-norocker.o
  CC      mips-softmmu/accel/tcg/translate-all.o
  CC      cris-linux-user/trace/control-target.o
  CC      sparc-softmmu/hw/misc/eccmemctl.o
  CC      sparc-softmmu/hw/misc/slavio_misc.o
  CCAS    sparc-linux-user/linux-user/safe-syscall.o
  CC      sparc32plus-linux-user/target/sparc/mmu_helper.o
  CC      xtensaeb-softmmu/target/xtensa/core-dc232b.o
  CC      or1k-linux-user/target/openrisc/sys_helper.o
  CC      armeb-linux-user/target/arm/gdbstub.o
  CCAS    mipsn32el-linux-user/linux-user/safe-syscall.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpopcode.o
  CC      tilegx-linux-user/target/tilegx/simd_helper.o
  CC      mips64el-softmmu/accel/tcg/cpu-exec-common.o
  CC      unicore32-softmmu/hw/vfio/spapr.o
  CC      x86_64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      microblazeel-softmmu/hw/core/generic-loader.o
  CC      ppc64-linux-user/target/ppc/cpu.o
  LINK    alpha-linux-user/qemu-alpha
  GEN     trace/generated-helpers.c
  GEN     trace/generated-helpers.c
  CC      mips64-softmmu/hw/char/virtio-serial-bus.o
  CC      microblazeel-linux-user/target/microblaze/cpu.o
  CC      x86_64-softmmu/hw/block/virtio-blk.o
  CC      ppc-linux-user/linux-user/linuxload.o
  CC      x86_64-linux-user/target/i386/bpt_helper.o
  CC      sh4-softmmu/hw/9pfs/virtio-9p-device.o
  CC      x86_64-linux-user/target/i386/cc_helper.o
  CCAS    ppc64le-linux-user/linux-user/safe-syscall.o
  CC      alpha-softmmu/hw/misc/mmio_interface.o
  CC      sparc32plus-linux-user/target/sparc/ldst_helper.o
  CC      ppc64-softmmu/accel/stubs/hax-stub.o
  CC      lm32-softmmu/hw/sd/milkymist-memcard.o
  CC      x86_64-linux-user/target/i386/excp_helper.o
  CC      nios2-softmmu/hw/vfio/platform.o
  CC      sparc-linux-user/target/sparc/translate.o
  CC      ppc64le-linux-user/target/ppc/cpu-models.o
  CC      mipsn32-linux-user/target/mips/op_helper.o
  CC      i386-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/accel/tcg/tcg-all.o
  CC      xtensaeb-softmmu/target/xtensa/core-dc233c.o
  CC      m68k-softmmu/hw/core/null-machine.o
  CC      mipsel-softmmu/hw/misc/mips_cmgcr.o
  CC      m68k-linux-user/target/m68k/helper.o
  CC      or1k-linux-user/target/openrisc/gdbstub.o
  CC      mipsn32el-linux-user/target/mips/translate.o
  CC      moxie-softmmu/accel/tcg/cpu-exec.o
  CC      arm-softmmu/hw/adc/stm32f2xx_adc.o
  CC      sparc64-linux-user/trace/control-target.o
  CC      x86_64-linux-user/target/i386/fpu_helper.o
  CC      cris-linux-user/trace/generated-helpers.o
  CC      ppc-softmmu/hw/display/vga.o
  CC      or1k-softmmu/accel/tcg/tcg-runtime.o
  CC      x86_64-linux-user/target/i386/int_helper.o
  CC      tricore-softmmu/accel/accel.o
  CC      ppc-softmmu/hw/display/virtio-gpu.o
  CC      cris-softmmu/accel/tcg/tcg-runtime.o
  CC      armeb-linux-user/target/arm/crypto_helper.o
  CC      mips64el-softmmu/accel/tcg/translate-all.o
  CC      arm-linux-user/linux-user/arm/nwfpe/single_cpdo.o
  CC      microblazeel-linux-user/target/microblaze/gdbstub.o
  CC      xtensa-softmmu/hw/vfio/spapr.o
  CC      mips-linux-user/target/mips/cpu.o
  CC      m68k-linux-user/target/m68k/cpu.o
  CC      m68k-softmmu/hw/misc/mmio_interface.o
  CC      m68k-softmmu/hw/net/mcf_fec.o
  CC      sh4-softmmu/hw/block/tc58128.o
  CC      xtensaeb-softmmu/target/xtensa/core-fsf.o
  CC      aarch64-softmmu/accel/tcg/cputlb.o
  CC      aarch64-softmmu/accel/tcg/tcg-runtime.o
  CC      s390x-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64-softmmu/hw/core/generic-loader.o
  CC      m68k-softmmu/hw/net/vhost_net.o
  CC      microblazeel-softmmu/hw/core/null-machine.o
  CC      mips64-linux-user/target/mips/lmi_helper.o
  CC      xtensa-softmmu/hw/xtensa/pic_cpu.o
  CC      mipsel-linux-user/target/mips/helper.o
  CC      sparc-softmmu/hw/misc/mmio_interface.o
  CC      microblaze-softmmu/hw/vfio/platform.o
  CC      lm32-softmmu/hw/vfio/common.o
  CC      cris-softmmu/accel/tcg/cpu-exec.o
  CC      sh4-softmmu/hw/block/virtio-blk.o
  CC      alpha-softmmu/hw/net/virtio-net.o
  CC      ppc64le-linux-user/target/ppc/cpu.o
  CC      cris-softmmu/accel/tcg/cpu-exec-common.o
  CC      m68k-softmmu/hw/net/rocker/qmp-norocker.o
  CC      unicore32-softmmu/hw/unicore32/puv3.o
  CC      xtensa-softmmu/hw/xtensa/sim.o
  CC      s390x-linux-user/target/s390x/cpu_features.o
  CC      arm-softmmu/hw/block/virtio-blk.o
  CC      ppc-linux-user/linux-user/uaccess.o
  CC      xtensaeb-softmmu/target/xtensa/monitor.o
  CC      m68k-linux-user/target/m68k/fpu_helper.o
  CC      sh4eb-softmmu/accel/tcg/cpu-exec.o
  CC      i386-linux-user/target/i386/helper.o
  CC      sparc64-linux-user/trace/generated-helpers.o
  CC      tilegx-linux-user/trace/control-target.o
  CC      mips-softmmu/accel/tcg/translator.o
  CC      mipsel-softmmu/hw/misc/mips_cpc.o
  GEN     trace/generated-helpers.c
  CC      xtensa-softmmu/hw/xtensa/xtfpga.o
  LINK    cris-linux-user/qemu-cris
  CC      m68k-softmmu/hw/vfio/common.o
  CC      sparc64-softmmu/hw/display/virtio-gpu.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec.o
  CC      mips-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mipsel-linux-user/target/mips/cpu.o
  CC      sh4eb-softmmu/accel/tcg/cpu-exec-common.o
  CC      or1k-softmmu/accel/tcg/cpu-exec.o
  CC      mipsn32el-linux-user/target/mips/dsp_helper.o
  CC      sparc32plus-linux-user/target/sparc/int64_helper.o
  CC      i386-softmmu/accel/tcg/translate-all.o
  CC      or1k-linux-user/trace/control-target.o
  CC      xtensaeb-softmmu/target/xtensa/translate.o
  CC      arm-linux-user/linux-user/arm/nwfpe/double_cpdo.o
  CC      i386-softmmu/accel/tcg/translator.o
  CC      nios2-linux-user/target/nios2/op_helper.o
  CC      sparc-softmmu/hw/net/vhost_net.o
  CC      ppcemb-softmmu/hw/core/generic-loader.o
  CC      microblaze-linux-user/target/microblaze/cpu.o
  CC      i386-softmmu/hw/9pfs/virtio-9p-device.o
  CC      nios2-linux-user/target/nios2/helper.o
  CC      microblazeel-softmmu/hw/misc/mmio_interface.o
  CC      unicore32-softmmu/target/unicore32/translate.o
  CC      sparc-linux-user/target/sparc/helper.o
  CC      nios2-softmmu/hw/vfio/spapr.o
  LINK    mips64el-linux-user/qemu-mips64el
  CC      tricore-softmmu/accel/stubs/hax-stub.o
  CC      nios2-softmmu/hw/nios2/boot.o
  CC      i386-linux-user/target/i386/cpu.o
  CCAS    ppc64abi32-linux-user/linux-user/safe-syscall.o
  CC      sh4-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppc64-softmmu/accel/tcg/tcg-all.o
  CC      s390x-softmmu/hw/block/virtio-blk.o
  CC      mipsel-softmmu/hw/misc/mips_itu.o
  CC      ppc64abi32-linux-user/target/ppc/cpu-models.o
  CC      sparc32plus-linux-user/target/sparc/vis_helper.o
  CC      ppc64le-linux-user/target/ppc/translate.o
  CC      xtensaeb-softmmu/target/xtensa/op_helper.o
  CC      ppc-softmmu/hw/display/virtio-gpu-3d.o
  CC      mipsn32el-linux-user/target/mips/op_helper.o
  CC      mipsel-linux-user/target/mips/gdbstub.o
  CC      xtensaeb-softmmu/target/xtensa/helper.o
  CC      ppcemb-softmmu/hw/core/null-machine.o
  CC      ppc64le-linux-user/target/ppc/kvm-stub.o
  CC      sparc32plus-linux-user/target/sparc/gdbstub.o
  CC      microblaze-linux-user/target/microblaze/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      nios2-linux-user/target/nios2/cpu.o
  CC      xtensaeb-softmmu/target/xtensa/cpu.o
  CC      or1k-linux-user/trace/generated-helpers.o
  CC      xtensaeb-softmmu/target/xtensa/gdbstub.o
  CC      arm-linux-user/linux-user/arm/nwfpe/extended_cpdo.o
  CC      tricore-softmmu/accel/stubs/kvm-stub.o
  CC      microblaze-softmmu/hw/vfio/spapr.o
  GEN     trace/generated-helpers.c
  CC      sparc-softmmu/hw/net/rocker/qmp-norocker.o
  CC      aarch64-linux-user/target/arm/op_helper.o
  CC      mips64el-softmmu/accel/tcg/translator.o
  CC      or1k-softmmu/accel/tcg/cpu-exec-common.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      nios2-softmmu/hw/nios2/cpu_pic.o
  CC      ppc-linux-user/linux-user/uname.o
  LINK    sparc64-linux-user/qemu-sparc64
  CC      sparc32plus-linux-user/trace/control-target.o
  CC      microblazeel-softmmu/hw/net/xilinx_ethlite.o
  CC      xtensa-softmmu/target/xtensa/xtensa-semi.o
  CC      s390x-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sparc-softmmu/hw/vfio/common.o
  CC      m68k-linux-user/target/m68k/gdbstub.o
  CC      nios2-linux-user/target/nios2/mmu.o
  CC      unicore32-softmmu/target/unicore32/op_helper.o
  CC      sparc-softmmu/hw/vfio/platform.o
  CC      moxie-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppc64-softmmu/accel/tcg/cputlb.o
  CC      arm-softmmu/hw/block/dataplane/virtio-blk.o
  CC      unicore32-softmmu/target/unicore32/helper.o
  CCAS    ppc-linux-user/linux-user/safe-syscall.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec-common.o
  CC      x86_64-linux-user/target/i386/mem_helper.o
  CC      mips64-softmmu/hw/core/null-machine.o
  CC      x86_64-softmmu/hw/char/virtio-serial-bus.o
  CC      x86_64-softmmu/hw/core/generic-loader.o
  CC      aarch64-softmmu/accel/tcg/translate-all.o
  CC      or1k-softmmu/accel/tcg/translate-all.o
  CC      lm32-softmmu/hw/vfio/platform.o
  CC      sh4eb-softmmu/accel/tcg/translate-all.o
  CC      xtensa-softmmu/target/xtensa/core-dc232b.o
  CC      ppc64-linux-user/target/ppc/translate.o
  CC      nios2-softmmu/hw/nios2/10m50_devboard.o
  CC      ppc64le-linux-user/target/ppc/dfp_helper.o
  CC      sh4-softmmu/hw/char/sh_serial.o
  CC      mips-linux-user/target/mips/gdbstub.o
  LINK    or1k-linux-user/qemu-or1k
  CC      xtensa-softmmu/target/xtensa/core-dc233c.o
  CC      microblaze-linux-user/trace/control-target.o
  CC      x86_64-softmmu/hw/core/null-machine.o
  CC      x86_64-softmmu/hw/display/vga.o
  CC      microblaze-softmmu/hw/microblaze/petalogix_s3adsp1800_mmu.o
  CC      mips64el-softmmu/hw/9pfs/virtio-9p-device.o
  CC      cris-softmmu/accel/tcg/translate-all.o
  CC      ppcemb-softmmu/hw/display/sm501.o
  CC      s390x-linux-user/target/s390x/gdbstub.o
  CC      mips-softmmu/hw/block/virtio-blk.o
  CC      s390x-linux-user/target/s390x/interrupt.o
  GEN     trace/generated-helpers.c
  CC      mipsel-softmmu/hw/misc/mmio_interface.o
  GEN     trace/generated-helpers.c
  CC      sparc64-softmmu/hw/display/virtio-gpu-3d.o
  CC      arm-linux-user/target/arm/arm-semi.o
  CC      mips64-linux-user/target/mips/helper.o
  CC      mipsn32el-linux-user/target/mips/lmi_helper.o
  CC      or1k-softmmu/accel/tcg/translator.o
  CC      moxie-softmmu/accel/tcg/translate-all.o
  CC      microblazeel-softmmu/hw/net/vhost_net.o
  CC      nios2-linux-user/trace/control-target.o
  CC      ppc64-linux-user/target/ppc/kvm-stub.o
  CC      ppc64-softmmu/accel/tcg/tcg-runtime.o
  CC      tilegx-linux-user/trace/generated-helpers.o
  CC      microblazeel-softmmu/hw/net/rocker/qmp-norocker.o
  CC      sparc-linux-user/target/sparc/cpu.o
  CC      alpha-softmmu/hw/net/vhost_net.o
  CC      alpha-softmmu/hw/scsi/virtio-scsi.o
  CC      tricore-softmmu/accel/tcg/tcg-all.o
  CC      sh4-linux-user/target/sh4/op_helper.o
  CC      i386-softmmu/hw/block/virtio-blk.o
  CC      sparc64-softmmu/hw/display/virtio-gpu-pci.o
  CC      nios2-softmmu/target/nios2/translate.o
  CC      s390x-linux-user/target/s390x/helper.o
  CC      ppc-softmmu/hw/display/virtio-gpu-pci.o
  CC      mipsel-softmmu/hw/net/virtio-net.o
  CC      m68k-softmmu/hw/vfio/platform.o
  CC      mips64-softmmu/hw/display/vga.o
  CC      ppc-softmmu/hw/i2c/ppc4xx_i2c.o
  CC      alpha-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      cris-softmmu/accel/tcg/translator.o
  CC      s390x-softmmu/hw/char/virtio-serial-bus.o
  CC      tricore-softmmu/accel/tcg/cputlb.o
  CC      xtensa-softmmu/target/xtensa/core-fsf.o
  CC      sh4-softmmu/hw/char/virtio-serial-bus.o
  CC      microblaze-linux-user/trace/generated-helpers.o
  CC      sparc64-softmmu/hw/misc/ivshmem.o
  CC      nios2-linux-user/trace/generated-helpers.o
  CC      sh4-linux-user/target/sh4/helper.o
  CC      aarch64-linux-user/target/arm/helper.o
  CC      arm-softmmu/hw/char/exynos4210_uart.o
  CC      microblazeel-softmmu/hw/vfio/common.o
  CC      mips64el-softmmu/hw/block/virtio-blk.o
  CC      mips-linux-user/target/mips/msa_helper.o
  CC      x86_64-softmmu/hw/display/virtio-gpu.o
  CC      sparc-softmmu/hw/vfio/spapr.o
  CC      s390x-softmmu/hw/char/terminal3270.o
  CC      sh4eb-softmmu/accel/tcg/translator.o
  CC      nios2-softmmu/target/nios2/op_helper.o
  CC      microblazeel-softmmu/hw/vfio/platform.o
  GEN     trace/generated-helpers.c
  CC      arm-linux-user/target/arm/kvm-stub.o
  CC      alpha-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mipsel-softmmu/hw/net/vhost_net.o
  CC      alpha-softmmu/hw/scsi/vhost-scsi.o
  CC      m68k-linux-user/trace/control-target.o
  CC      microblaze-softmmu/hw/microblaze/petalogix_ml605_mmu.o
  CC      ppc64-softmmu/accel/tcg/cpu-exec.o
  CC      aarch64-linux-user/target/arm/cpu.o
  CC      ppc64-softmmu/accel/tcg/cpu-exec-common.o
  CC      sh4-softmmu/hw/core/generic-loader.o
  CC      unicore32-softmmu/target/unicore32/cpu.o
  CC      alpha-softmmu/hw/scsi/vhost-user-scsi.o
  LINK    tilegx-linux-user/qemu-tilegx
  CC      microblazeel-linux-user/trace/control-target.o
  CC      nios2-softmmu/target/nios2/helper.o
  CC      mips64el-softmmu/hw/block/dataplane/virtio-blk.o
  CC      microblaze-softmmu/hw/microblaze/boot.o
  CC      aarch64-softmmu/accel/tcg/translator.o
  CC      sh4eb-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mipsel-linux-user/target/mips/msa_helper.o
  CC      ppc64abi32-linux-user/target/ppc/cpu.o
  CC      xtensa-softmmu/target/xtensa/monitor.o
  CC      m68k-softmmu/hw/vfio/spapr.o
  CC      sparc64-softmmu/hw/misc/mmio_interface.o
  CC      m68k-softmmu/hw/m68k/an5206.o
  CC      mips-linux-user/target/mips/mips-semi.o
  CC      mipsel-linux-user/target/mips/mips-semi.o
  CC      arm-softmmu/hw/char/omap_uart.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      m68k-softmmu/hw/m68k/mcf5208.o
  CC      ppc64-linux-user/target/ppc/dfp_helper.o
  CC      arm-softmmu/hw/char/digic-uart.o
  CC      aarch64-softmmu/hw/adc/stm32f2xx_adc.o
  CC      ppc-softmmu/hw/intc/openpic_kvm.o
  CC      alpha-softmmu/hw/timer/mc146818rtc.o
  CC      lm32-softmmu/hw/vfio/spapr.o
  GEN     trace/generated-helpers.c
  LINK    microblaze-linux-user/qemu-microblaze
  CC      aarch64-linux-user/target/arm/neon_helper.o
  CC      sh4-linux-user/target/sh4/cpu.o
  CC      sparc-linux-user/target/sparc/fop_helper.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-3d.o
  CC      nios2-softmmu/target/nios2/cpu.o
  CC      xtensa-softmmu/target/xtensa/translate.o
  CC      sparc32plus-linux-user/trace/generated-helpers.o
  LINK    nios2-linux-user/qemu-nios2
  CC      mips64el-softmmu/hw/char/virtio-serial-bus.o
  CC      arm-linux-user/target/arm/translate.o
  CC      ppcemb-softmmu/hw/display/vga.o
  CC      moxie-softmmu/accel/tcg/translator.o
  CC      ppc64-softmmu/accel/tcg/translate-all.o
  CC      arm-softmmu/hw/char/stm32f2xx_usart.o
  CC      cris-softmmu/hw/core/generic-loader.o
  CC      mips-softmmu/hw/block/dataplane/virtio-blk.o
  CC      s390x-linux-user/target/s390x/cc_helper.o
  CC      s390x-linux-user/target/s390x/translate.o
  CC      nios2-softmmu/target/nios2/mmu.o
  GEN     trace/generated-helpers.c
  CC      mips-softmmu/hw/char/virtio-serial-bus.o
  CC      xtensa-softmmu/target/xtensa/op_helper.o
  CC      s390x-softmmu/hw/core/generic-loader.o
  CC      arm-linux-user/target/arm/op_helper.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-pci.o
  CC      sh4-softmmu/hw/core/null-machine.o
  CC      ppc64-softmmu/accel/tcg/translator.o
  CC      unicore32-softmmu/target/unicore32/ucf64_helper.o
  CC      ppc64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      lm32-softmmu/hw/lm32/lm32_boards.o
  CC      arm-linux-user/target/arm/helper.o
  CC      sparc64-softmmu/hw/net/virtio-net.o
  CC      unicore32-softmmu/target/unicore32/softmmu.o
  CC      or1k-softmmu/hw/core/generic-loader.o
  GEN     trace/generated-helpers.c
  CC      sh4eb-softmmu/hw/block/tc58128.o
  CC      s390x-linux-user/target/s390x/excp_helper.o
  CC      microblaze-softmmu/target/microblaze/translate.o
  CC      i386-softmmu/hw/block/dataplane/virtio-blk.o
  CC      i386-softmmu/hw/char/virtio-serial-bus.o
  CC      xtensaeb-softmmu/trace/control-target.o
  CC      mips64el-softmmu/hw/core/generic-loader.o
  CC      i386-softmmu/hw/core/generic-loader.o
  CC      arm-linux-user/target/arm/cpu.o
  CC      microblazeel-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu.o
  CC      sparc-softmmu/hw/sparc/sun4m.o
  CC      sparc-softmmu/hw/sparc/leon3.o
  CC      microblaze-softmmu/target/microblaze/op_helper.o
  CC      m68k-linux-user/gdbstub-xml.o
  CC      arm-softmmu/hw/char/bcm2835_aux.o
  CC      microblazeel-linux-user/trace/generated-helpers.o
  CC      ppc-softmmu/hw/misc/ivshmem.o
  CC      m68k-softmmu/hw/m68k/mcf5206.o
  CC      ppc64le-linux-user/target/ppc/excp_helper.o
  CC      mips64-softmmu/hw/display/virtio-gpu.o
  CC      aarch64-linux-user/target/arm/iwmmxt_helper.o
  CC      x86_64-linux-user/target/i386/misc_helper.o
  CC      i386-linux-user/target/i386/gdbstub.o
  CC      x86_64-linux-user/target/i386/mpx_helper.o
  CC      arm-softmmu/hw/char/virtio-serial-bus.o
  CC      mipsel-softmmu/hw/scsi/virtio-scsi.o
  CC      unicore32-softmmu/trace/control-target.o
  CC      s390x-softmmu/hw/core/null-machine.o
  CC      s390x-linux-user/target/s390x/fpu_helper.o
  CC      mipsel-linux-user/trace/control-target.o
  CC      sparc64-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/core/generic-loader.o
  CC      cris-softmmu/hw/core/null-machine.o
  CC      nios2-softmmu/target/nios2/monitor.o
  CC      sh4eb-softmmu/hw/block/virtio-blk.o
  CC      ppc-linux-user/target/ppc/cpu-models.o
  CC      moxie-softmmu/hw/core/generic-loader.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu-3d.o
  CC      microblazeel-softmmu/hw/microblaze/petalogix_s3adsp1800_mmu.o
  CC      ppc-softmmu/hw/misc/mmio_interface.o
  CC      aarch64-softmmu/hw/block/virtio-blk.o
  CC      lm32-softmmu/hw/lm32/milkymist.o
  CC      moxie-softmmu/hw/core/null-machine.o
  CC      sparc-linux-user/target/sparc/cc_helper.o
  CC      alpha-softmmu/hw/vfio/common.o
  CC      or1k-softmmu/hw/core/null-machine.o
  CC      tricore-softmmu/accel/tcg/tcg-runtime.o
  CC      ppc-linux-user/target/ppc/cpu.o
  CC      mips64-softmmu/hw/display/virtio-gpu-3d.o
  CC      mips64el-softmmu/hw/core/null-machine.o
  CC      armeb-linux-user/trace/control-target.o
  CC      m68k-softmmu/hw/m68k/mcf_intc.o
  CC      cris-softmmu/hw/misc/mmio_interface.o
  CC      sparc64-softmmu/hw/scsi/virtio-scsi.o
  CC      microblaze-softmmu/target/microblaze/helper.o
  CC      alpha-softmmu/hw/vfio/pci.o
  CC      sh4-softmmu/hw/display/sm501.o
  CC      arm-linux-user/target/arm/neon_helper.o
  CC      i386-linux-user/target/i386/xsave_helper.o
  CC      mipsn32el-linux-user/target/mips/helper.o
  CC      m68k-softmmu/target/m68k/m68k-semi.o
  CC      microblazeel-softmmu/hw/microblaze/petalogix_ml605_mmu.o
  CC      x86_64-softmmu/hw/display/virtio-vga.o
  CC      arm-linux-user/target/arm/iwmmxt_helper.o
  CC      m68k-softmmu/target/m68k/translate.o
  CC      mipsn32-linux-user/target/mips/lmi_helper.o
  CC      mips-softmmu/hw/core/generic-loader.o
  CC      aarch64-linux-user/target/arm/gdbstub.o
  CC      sh4eb-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sparc-softmmu/target/sparc/machine.o
  CC      m68k-linux-user/trace/generated-helpers.o
  CC      microblazeel-softmmu/hw/microblaze/boot.o
  CC      ppc-softmmu/hw/net/xilinx_ethlite.o
  CC      s390x-softmmu/hw/display/virtio-gpu.o
  CC      ppc-softmmu/hw/net/virtio-net.o
  GEN     trace/generated-helpers.c
  CC      sparc-linux-user/target/sparc/win_helper.o
  CC      s390x-softmmu/hw/display/virtio-gpu-3d.o
  CC      mips-linux-user/trace/control-target.o
  CC      xtensa-softmmu/target/xtensa/helper.o
  LINK    microblazeel-linux-user/qemu-microblazeel
  CC      i386-softmmu/hw/core/null-machine.o
  CC      lm32-softmmu/target/lm32/translate.o
  CC      aarch64-linux-user/target/arm/cpu64.o
  CC      moxie-softmmu/hw/display/vga.o
  CC      mipsn32-linux-user/target/mips/helper.o
  CC      nios2-softmmu/trace/control-target.o
  CC      or1k-softmmu/hw/intc/ompic.o
  CC      sparc64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc64-softmmu/hw/block/virtio-blk.o
  CC      mips-softmmu/hw/core/null-machine.o
  CC      x86_64-linux-user/target/i386/seg_helper.o
  CC      cris-softmmu/hw/net/etraxfs_eth.o
  CC      arm-linux-user/target/arm/gdbstub.o
  CC      ppc-linux-user/target/ppc/translate.o
  CC      mips64el-softmmu/hw/display/vga.o
  CC      lm32-softmmu/target/lm32/op_helper.o
  CC      unicore32-softmmu/trace/generated-helpers.o
  CC      mipsel-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      moxie-softmmu/hw/misc/mmio_interface.o
  CC      mipsel-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mipsn32el-linux-user/target/mips/cpu.o
  CC      mips64-linux-user/target/mips/cpu.o
  CC      arm-linux-user/target/arm/crypto_helper.o
  CC      xtensa-softmmu/target/xtensa/cpu.o
  CC      s390x-linux-user/target/s390x/int_helper.o
  CC      ppc64abi32-linux-user/target/ppc/translate.o
  CC      xtensa-softmmu/target/xtensa/gdbstub.o
  CC      i386-softmmu/hw/display/vga.o
  GEN     trace/generated-helpers.c
  CC      sh4eb-softmmu/hw/char/sh_serial.o
  CC      i386-linux-user/target/i386/translate.o
  CC      i386-softmmu/hw/display/virtio-gpu.o
  CC      sparc64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      s390x-softmmu/hw/display/virtio-gpu-pci.o
  CC      x86_64-softmmu/hw/intc/apic.o
  CC      arm-linux-user/trace/control-target.o
  CC      sparc64-softmmu/hw/scsi/vhost-scsi.o
  CC      x86_64-softmmu/hw/intc/apic_common.o
  CC      mips-softmmu/hw/display/vga.o
  CC      sparc-linux-user/target/sparc/mmu_helper.o
  CC      sh4eb-softmmu/hw/char/virtio-serial-bus.o
  CC      aarch64-linux-user/target/arm/translate-a64.o
  CC      microblazeel-softmmu/target/microblaze/translate.o
  CC      ppc64le-linux-user/target/ppc/fpu_helper.o
  CC      arm-softmmu/hw/core/null-machine.o
  CC      s390x-linux-user/target/s390x/mem_helper.o
  CC      aarch64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      moxie-softmmu/hw/net/vhost_net.o
  CC      microblazeel-softmmu/target/microblaze/op_helper.o
  CC      sh4-linux-user/target/sh4/gdbstub.o
  CC      ppc64abi32-linux-user/target/ppc/kvm-stub.o
  CC      or1k-softmmu/hw/misc/mmio_interface.o
  CC      lm32-softmmu/target/lm32/helper.o
  CC      armeb-linux-user/gdbstub-xml.o
  CC      i386-linux-user/target/i386/bpt_helper.o
  CC      moxie-softmmu/hw/net/rocker/qmp-norocker.o
  CC      ppc-softmmu/hw/net/vhost_net.o
  CC      nios2-softmmu/trace/generated-helpers.o
  GEN     trace/generated-helpers.c
  CC      cris-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/cpu/arm11mpcore.o
  CC      cris-softmmu/hw/net/rocker/qmp-norocker.o
  CC      sparc-linux-user/target/sparc/ldst_helper.o
  CC      sparc64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      cris-softmmu/hw/vfio/common.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu-pci.o
  CC      sparc-softmmu/target/sparc/monitor.o
  CC      sh4-softmmu/hw/display/vga.o
  LINK    unicore32-softmmu/qemu-system-unicore32
  CC      microblazeel-softmmu/target/microblaze/helper.o
  CC      ppcemb-softmmu/hw/i2c/ppc4xx_i2c.o
  CC      x86_64-softmmu/hw/intc/ioapic.o
  GEN     trace/generated-helpers.c
  CC      mipsn32-linux-user/target/mips/cpu.o
  CC      xtensaeb-softmmu/trace/generated-helpers.o
  CC      sh4eb-softmmu/hw/core/generic-loader.o
  CC      sparc-linux-user/target/sparc/int32_helper.o
  CC      sh4-softmmu/hw/display/virtio-gpu.o
  CC      cris-softmmu/hw/vfio/platform.o
  CC      or1k-softmmu/hw/net/vhost_net.o
  CC      sparc-linux-user/target/sparc/gdbstub.o
  CC      ppcemb-softmmu/hw/misc/ivshmem.o
  CC      ppc-linux-user/target/ppc/kvm-stub.o
  CC      arm-linux-user/gdbstub-xml.o
  CC      ppc64-linux-user/target/ppc/excp_helper.o
  CC      i386-linux-user/target/i386/cc_helper.o
  CC      arm-softmmu/hw/cpu/realview_mpcore.o
  CC      s390x-softmmu/hw/intc/s390_flic.o
  CC      mips64el-softmmu/hw/display/virtio-gpu.o
  CC      ppc-linux-user/target/ppc/dfp_helper.o
  CC      mipsel-softmmu/hw/scsi/vhost-scsi.o
  CC      mipsn32-linux-user/target/mips/gdbstub.o
  CC      microblazeel-softmmu/target/microblaze/cpu.o
  CC      i386-softmmu/hw/display/virtio-gpu-3d.o
  CC      mipsel-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips64-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/char/exynos4210_uart.o
  CC      sh4-linux-user/trace/control-target.o
  CC      sparc-softmmu/target/sparc/translate.o
  CC      ppc64abi32-linux-user/target/ppc/dfp_helper.o
  CC      mips64el-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc64abi32-linux-user/target/ppc/excp_helper.o
  CC      ppc64-linux-user/target/ppc/fpu_helper.o
  CC      mips-softmmu/hw/display/virtio-gpu.o
  CC      s390x-softmmu/hw/misc/mmio_interface.o
  CC      mips64-linux-user/target/mips/gdbstub.o
  LINK    nios2-softmmu/qemu-system-nios2
  CC      ppcemb-softmmu/hw/misc/mmio_interface.o
  CC      i386-linux-user/target/i386/excp_helper.o
  CC      alpha-softmmu/hw/vfio/pci-quirks.o
  CC      armeb-linux-user/trace/generated-helpers.o
  GEN     trace/generated-helpers.c
  CC      m68k-softmmu/target/m68k/op_helper.o
  CC      moxie-softmmu/hw/timer/mc146818rtc.o
  CC      mips-linux-user/trace/generated-helpers.o
  CC      moxie-softmmu/hw/vfio/common.o
  CC      sparc-softmmu/target/sparc/helper.o
  CC      sparc64-softmmu/hw/timer/mc146818rtc.o
  CC      or1k-softmmu/hw/net/rocker/qmp-norocker.o
  CC      sparc64-softmmu/hw/vfio/common.o
  CC      moxie-softmmu/hw/vfio/platform.o
  CC      ppc-softmmu/hw/net/fsl_etsec/etsec.o
  CC      sparc64-softmmu/hw/vfio/pci.o
  CC      mipsel-linux-user/trace/generated-helpers.o
  CC      ppc64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sh4eb-softmmu/hw/core/null-machine.o
  CC      arm-softmmu/hw/cpu/a9mpcore.o
  CC      mips64el-softmmu/hw/display/virtio-gpu-pci.o
  CC      s390x-softmmu/hw/net/virtio-net.o
  CC      or1k-softmmu/hw/vfio/common.o
  CC      mips64-softmmu/hw/intc/mips_gic.o
  CC      sparc-linux-user/trace/control-target.o
  CC      moxie-softmmu/hw/vfio/spapr.o
  CC      mipsn32el-linux-user/target/mips/gdbstub.o
  CC      microblazeel-softmmu/target/microblaze/gdbstub.o
  CC      s390x-softmmu/hw/net/vhost_net.o
  CC      lm32-softmmu/target/lm32/cpu.o
  CC      sh4-softmmu/hw/display/virtio-gpu-3d.o
  CC      aarch64-softmmu/hw/char/omap_uart.o
  CC      tricore-softmmu/accel/tcg/cpu-exec.o
  CC      mipsel-softmmu/hw/timer/mips_gictimer.o
  CC      mipsel-softmmu/hw/timer/mc146818rtc.o
  CC      cris-softmmu/hw/vfio/spapr.o
  CC      ppc-linux-user/target/ppc/excp_helper.o
  CC      ppcemb-softmmu/hw/net/xilinx_ethlite.o
  CC      moxie-softmmu/hw/moxie/moxiesim.o
  CC      mips-softmmu/hw/display/virtio-gpu-3d.o
  CC      sh4-linux-user/trace/generated-helpers.o
  CC      xtensa-softmmu/trace/control-target.o
  CC      mips64el-softmmu/hw/intc/mips_gic.o
  CC      ppc-softmmu/hw/net/fsl_etsec/registers.o
  CC      microblaze-softmmu/target/microblaze/cpu.o
  CC      sparc64-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64abi32-linux-user/target/ppc/fpu_helper.o
  CC      ppc-linux-user/target/ppc/fpu_helper.o
  CC      lm32-softmmu/target/lm32/gdbstub.o
  CC      x86_64-softmmu/hw/isa/lpc_ich9.o
  CC      x86_64-linux-user/target/i386/smm_helper.o
  CC      s390x-softmmu/hw/net/rocker/qmp-norocker.o
  CC      sh4eb-softmmu/hw/display/sm501.o
  CC      sh4-softmmu/hw/display/virtio-gpu-pci.o
  LINK    m68k-linux-user/qemu-m68k
  CC      alpha-softmmu/hw/vfio/platform.o
  CC      ppc64abi32-linux-user/target/ppc/int_helper.o
  CC      ppc-softmmu/hw/net/fsl_etsec/rings.o
  CC      ppc-linux-user/target/ppc/int_helper.o
  CC      mipsn32-linux-user/target/mips/msa_helper.o
  CC      microblazeel-softmmu/target/microblaze/mmu.o
  CC      cris-softmmu/hw/cris/boot.o
  CC      arm-softmmu/hw/cpu/a15mpcore.o
  CC      ppc-linux-user/target/ppc/timebase_helper.o
  CC      ppc64-softmmu/hw/char/spapr_vty.o
  CC      m68k-softmmu/target/m68k/helper.o
  CC      sparc-softmmu/target/sparc/cpu.o
  CC      arm-softmmu/hw/display/omap_dss.o
  CC      mipsn32-linux-user/target/mips/mips-semi.o
  LINK    sparc32plus-linux-user/qemu-sparc32plus
  CC      arm-softmmu/hw/display/omap_lcdc.o
  CC      mips64el-softmmu/hw/misc/ivshmem.o
  CC      aarch64-softmmu/hw/char/digic-uart.o
  GEN     trace/generated-helpers.c
  CC      lm32-softmmu/target/lm32/lm32-semi.o
  LINK    sh4-linux-user/qemu-sh4
  CC      i386-linux-user/target/i386/fpu_helper.o
  CC      sh4eb-softmmu/hw/display/vga.o
  CC      tricore-softmmu/accel/tcg/cpu-exec-common.o
  CC      sparc-linux-user/trace/generated-helpers.o
  GEN     trace/generated-helpers.c
  CC      m68k-softmmu/target/m68k/cpu.o
  CC      cris-softmmu/hw/cris/axis_dev88.o
  CC      lm32-softmmu/target/lm32/machine.o
  CC      i386-linux-user/target/i386/int_helper.o
  CC      cris-softmmu/target/cris/translate.o
  CC      x86_64-linux-user/target/i386/svm_helper.o
  CC      ppcemb-softmmu/hw/net/virtio-net.o
  CC      mipsn32-linux-user/trace/control-target.o
  CC      s390x-linux-user/target/s390x/misc_helper.o
  CC      aarch64-softmmu/hw/char/stm32f2xx_usart.o
  CC      mips64-softmmu/hw/misc/ivshmem.o
  CC      ppc-softmmu/hw/net/fsl_etsec/miim.o
  CC      microblaze-softmmu/target/microblaze/gdbstub.o
  CC      sparc-softmmu/target/sparc/fop_helper.o
  CC      tricore-softmmu/accel/tcg/translate-all.o
  CC      aarch64-softmmu/hw/char/bcm2835_aux.o
  CC      x86_64-softmmu/hw/misc/vmport.o
  CC      microblazeel-softmmu/trace/control-target.o
  CC      cris-softmmu/target/cris/op_helper.o
  CC      s390x-softmmu/hw/scsi/virtio-scsi.o
  CC      x86_64-linux-user/target/i386/kvm-stub.o
  CC      mipsn32el-linux-user/target/mips/msa_helper.o
  CC      mipsn32el-linux-user/target/mips/mips-semi.o
  GEN     trace/generated-helpers.c
  CC      mipsn32-linux-user/trace/generated-helpers.o
  CC      ppc64abi32-linux-user/target/ppc/timebase_helper.o
  CC      s390x-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu.o
  CC      ppc-softmmu/hw/scsi/virtio-scsi.o
  CC      arm-softmmu/hw/display/pxa2xx_lcd.o
  CC      s390x-linux-user/target/s390x/crypto_helper.o
  CC      sh4-softmmu/hw/intc/sh_intc.o
  CC      arm-linux-user/trace/generated-helpers.o
  CC      sh4-softmmu/hw/misc/ivshmem.o
  CC      ppc64-softmmu/hw/char/virtio-serial-bus.o
  CC      sparc64-softmmu/hw/vfio/platform.o
  CC      sparc64-softmmu/hw/vfio/spapr.o
  LINK    xtensaeb-softmmu/qemu-system-xtensaeb
  CC      ppc-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppcemb-softmmu/hw/net/vhost_net.o
  CC      lm32-softmmu/trace/control-target.o
  CC      moxie-softmmu/target/moxie/translate.o
  CC      mips64-linux-user/target/mips/msa_helper.o
  CC      s390x-softmmu/hw/scsi/vhost-scsi-common.o
  CC      x86_64-softmmu/hw/misc/ivshmem.o
  CC      mipsel-softmmu/hw/vfio/common.o
  CC      mips64-linux-user/target/mips/mips-semi.o
  CC      or1k-softmmu/hw/vfio/platform.o
  CC      sparc-softmmu/target/sparc/cc_helper.o
  CC      m68k-softmmu/target/m68k/fpu_helper.o
  CC      cris-softmmu/target/cris/helper.o
  CC      i386-softmmu/hw/display/virtio-gpu-pci.o
  GEN     trace/generated-helpers.c
  CC      mips-softmmu/hw/display/virtio-gpu-pci.o
  CC      alpha-softmmu/hw/vfio/spapr.o
  CC      microblaze-softmmu/target/microblaze/mmu.o
  CC      ppc64abi32-linux-user/target/ppc/misc_helper.o
  LINK    sparc-linux-user/qemu-sparc
  CC      s390x-linux-user/target/s390x/kvm-stub.o
  CC      mips64el-softmmu/hw/misc/mips_cmgcr.o
  GEN     trace/generated-helpers.c
  CC      ppc-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mipsel-softmmu/hw/vfio/pci.o
  CC      aarch64-softmmu/hw/char/virtio-serial-bus.o
  CC      m68k-softmmu/target/m68k/gdbstub.o
  CC      ppc64-linux-user/target/ppc/int_helper.o
  GEN     trace/generated-helpers.c
  CC      mips-softmmu/hw/intc/mips_gic.o
  CC      moxie-softmmu/target/moxie/helper.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/hw/core/generic-loader.o
  CC      moxie-softmmu/target/moxie/machine.o
  CC      or1k-softmmu/hw/vfio/spapr.o
  CC      tricore-softmmu/accel/tcg/translator.o
  GEN     trace/generated-helpers.c
  CC      sparc64-softmmu/hw/virtio/virtio.o
  CC      cris-softmmu/target/cris/cpu.o
  CC      cris-softmmu/target/cris/gdbstub.o
  CC      lm32-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/cpu/arm11mpcore.o
  CC      mips-softmmu/hw/misc/ivshmem.o
  CC      aarch64-softmmu/hw/cpu/realview_mpcore.o
  CC      s390x-softmmu/hw/scsi/vhost-scsi.o
  CC      cris-softmmu/target/cris/mmu.o
  CC      moxie-softmmu/target/moxie/cpu.o
  CC      tricore-softmmu/hw/core/generic-loader.o
  CC      ppcemb-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc64-linux-user/target/ppc/timebase_helper.o
  CC      arm-softmmu/hw/display/bcm2835_fb.o
  CC      s390x-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips-softmmu/hw/misc/mips_cmgcr.o
  CC      i386-softmmu/hw/display/virtio-vga.o
  CC      microblaze-softmmu/trace/control-target.o
  CC      cris-softmmu/target/cris/machine.o
  CC      ppc-linux-user/target/ppc/misc_helper.o
  CC      sh4-softmmu/hw/misc/mmio_interface.o
  CC      moxie-softmmu/target/moxie/mmu.o
  CC      ppc-linux-user/target/ppc/mem_helper.o
  CC      i386-softmmu/hw/intc/apic.o
  CC      mips64-softmmu/hw/misc/mips_cmgcr.o
  CC      sparc64-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/cpu/a9mpcore.o
  CC      m68k-softmmu/trace/control-target.o
  CC      ppc-linux-user/target/ppc/user_only_helper.o
  CC      sh4-softmmu/hw/net/virtio-net.o
  CC      x86_64-linux-user/trace/control-target.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/hw/misc/pvpanic.o
  CC      mips64el-softmmu/hw/misc/mips_cpc.o
  CC      mips-softmmu/hw/misc/mips_cpc.o
  CC      ppc64le-linux-user/target/ppc/int_helper.o
  CC      aarch64-linux-user/target/arm/helper-a64.o
  CC      mipsel-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64-linux-user/target/ppc/misc_helper.o
  GEN     trace/generated-helpers.c
  CC      mips64-linux-user/trace/control-target.o
  CC      alpha-softmmu/hw/virtio/virtio.o
  CC      alpha-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc64abi32-linux-user/target/ppc/mem_helper.o
  CC      ppcemb-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      s390x-softmmu/hw/vfio/common.o
  CC      mips-softmmu/hw/misc/mips_itu.o
  CC      sparc-softmmu/target/sparc/win_helper.o
  CC      xtensa-softmmu/trace/generated-helpers.o
  CC      ppc-linux-user/target/ppc/gdbstub.o
  CC      or1k-softmmu/hw/openrisc/pic_cpu.o
  CC      mips64-softmmu/hw/misc/mips_cpc.o
  CC      ppc64abi32-linux-user/target/ppc/user_only_helper.o
  CC      s390x-softmmu/hw/vfio/pci.o
  CC      mipsel-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/display/vga.o
  CC      ppc-softmmu/hw/scsi/vhost-scsi.o
  CC      or1k-softmmu/hw/openrisc/cputimer.o
  CC      alpha-softmmu/hw/virtio/vhost.o
  CC      ppc64-softmmu/hw/core/generic-loader.o
  CC      mipsn32el-linux-user/trace/control-target.o
  CC      mips64-softmmu/hw/misc/mips_itu.o
  CC      m68k-softmmu/gdbstub-xml.o
  CC      or1k-softmmu/hw/openrisc/openrisc_sim.o
  CC      mips64el-softmmu/hw/misc/mips_itu.o
  CC      s390x-linux-user/trace/control-target.o
  CC      or1k-softmmu/target/openrisc/machine.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu-3d.o
  CC      tricore-softmmu/hw/core/null-machine.o
  CC      ppc64-softmmu/hw/core/null-machine.o
  CC      x86_64-softmmu/hw/misc/mmio_interface.o
  CC      tricore-softmmu/hw/misc/mmio_interface.o
  GEN     trace/generated-helpers.c
  CC      microblaze-softmmu/trace/generated-helpers.o
  CC      i386-linux-user/target/i386/mem_helper.o
  CC      ppc64-linux-user/target/ppc/mem_helper.o
  LINK    lm32-softmmu/qemu-system-lm32
  CC      arm-softmmu/hw/display/virtio-gpu.o
  CC      microblazeel-softmmu/trace/generated-helpers.o
  CC      mips-softmmu/hw/misc/mmio_interface.o
  CC      aarch64-linux-user/target/arm/gdbstub64.o
  CC      ppc-linux-user/target/ppc/../../libdecnumber/decContext.o
  CC      s390x-softmmu/hw/vfio/pci-quirks.o
  CC      i386-linux-user/target/i386/misc_helper.o
  CC      arm-softmmu/hw/display/virtio-gpu-3d.o
  CC      or1k-softmmu/target/openrisc/cpu.o
  CC      alpha-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/cpu/a15mpcore.o
  CC      ppc-softmmu/hw/scsi/vhost-user-scsi.o
  CC      tricore-softmmu/hw/net/vhost_net.o
  CC      i386-linux-user/target/i386/mpx_helper.o
  CC      mips64el-softmmu/hw/misc/mmio_interface.o
  CC      x86_64-linux-user/gdbstub-xml.o
  CC      i386-softmmu/hw/intc/apic_common.o
  CC      i386-linux-user/target/i386/seg_helper.o
  CC      x86_64-softmmu/hw/net/virtio-net.o
  CC      cris-softmmu/trace/control-target.o
  CC      alpha-softmmu/hw/virtio/vhost-user.o
  CC      x86_64-softmmu/hw/net/vhost_net.o
  CC      ppc64le-linux-user/target/ppc/timebase_helper.o
  CC      ppc64-linux-user/target/ppc/user_only_helper.o
  CC      sh4-softmmu/hw/net/vhost_net.o
  CC      or1k-softmmu/target/openrisc/exception.o
  CC      mips64-softmmu/hw/misc/mmio_interface.o
  CC      moxie-softmmu/trace/control-target.o
  CC      mips-softmmu/hw/net/virtio-net.o
  CC      ppcemb-softmmu/hw/scsi/vhost-scsi-common.o
  CC      ppc64-linux-user/target/ppc/gdbstub.o
  CC      ppc-softmmu/hw/timer/mc146818rtc.o
  CC      sparc-softmmu/target/sparc/mmu_helper.o
  CC      sparc-softmmu/target/sparc/ldst_helper.o
  CC      ppc64-softmmu/hw/display/sm501.o
  CC      s390x-linux-user/gdbstub-xml.o
  CC      ppcemb-softmmu/hw/scsi/vhost-scsi.o
  CC      arm-softmmu/hw/display/virtio-gpu-pci.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu-pci.o
  CC      i386-softmmu/hw/intc/ioapic.o
  CC      ppcemb-softmmu/hw/scsi/vhost-user-scsi.o
  CC      aarch64-softmmu/hw/display/omap_dss.o
  CC      ppc-softmmu/hw/vfio/common.o
  CC      ppc64-linux-user/target/ppc/../../libdecnumber/decContext.o
  CC      sparc-softmmu/target/sparc/int32_helper.o
  CC      mips64-softmmu/hw/net/virtio-net.o
  CC      i386-softmmu/hw/isa/lpc_ich9.o
  CC      tricore-softmmu/hw/net/rocker/qmp-norocker.o
  LINK    microblaze-softmmu/qemu-system-microblaze
  CC      sh4eb-softmmu/hw/intc/sh_intc.o
  CC      mips64el-softmmu/hw/net/virtio-net.o
  CC      i386-softmmu/hw/misc/vmport.o
  LINK    microblazeel-softmmu/qemu-system-microblazeel
  CC      ppc64-softmmu/hw/display/vga.o
  CC      x86_64-linux-user/trace/generated-helpers.o
  CC      tricore-softmmu/hw/vfio/common.o
  CC      mips64-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi.o
  CC      i386-softmmu/hw/misc/ivshmem.o
  CC      mipsel-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/hw/vfio/common.o
  CC      mipsel-softmmu/hw/virtio/virtio.o
  CC      s390x-softmmu/hw/vfio/ccw.o
  CC      mips64-softmmu/hw/scsi/virtio-scsi.o
  CC      sparc64-softmmu/hw/virtio/vhost.o
  CC      sh4-softmmu/hw/scsi/virtio-scsi.o
  LINK    xtensa-softmmu/qemu-system-xtensa
  CC      mipsel-softmmu/hw/virtio/virtio-balloon.o
  CC      or1k-softmmu/target/openrisc/interrupt.o
  CC      m68k-softmmu/trace/generated-helpers.o
  CC      s390x-linux-user/trace/generated-helpers.o
  CC      ppc-softmmu/hw/vfio/pci.o
  CC      ppcemb-softmmu/hw/vfio/pci.o
  CC      ppcemb-softmmu/hw/vfio/pci-quirks.o
  CC      or1k-softmmu/target/openrisc/mmu.o
  CC      s390x-softmmu/hw/vfio/platform.o
  CC      sh4-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc64abi32-linux-user/target/ppc/gdbstub.o
  CC      ppcemb-softmmu/hw/vfio/platform.o
  CC      mips64-linux-user/trace/generated-helpers.o
  CC      aarch64-linux-user/target/arm/crypto_helper.o
  CC      i386-linux-user/target/i386/smm_helper.o
  GEN     trace/generated-helpers.c
  CC      ppc64abi32-linux-user/target/ppc/../../libdecnumber/decContext.o
  CC      sparc64-softmmu/hw/virtio/vhost-backend.o
  CC      mips64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      sparc-softmmu/target/sparc/gdbstub.o
  CC      sh4eb-softmmu/hw/misc/ivshmem.o
  CC      sh4eb-softmmu/hw/misc/mmio_interface.o
  CC      moxie-softmmu/trace/generated-helpers.o
  CC      mipsn32el-linux-user/trace/generated-helpers.o
  CC      s390x-softmmu/hw/vfio/spapr.o
  CC      mipsel-softmmu/hw/virtio/vhost.o
  CC      aarch64-linux-user/trace/control-target.o
  CC      aarch64-softmmu/hw/display/omap_lcdc.o
  CC      s390x-softmmu/hw/virtio/virtio.o
  CC      ppc-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64le-linux-user/target/ppc/misc_helper.o
  CC      ppc64-softmmu/hw/display/virtio-gpu.o
  CC      arm-softmmu/hw/dma/omap_dma.o
  CC      ppc64-linux-user/target/ppc/../../libdecnumber/decNumber.o
  CC      i386-linux-user/target/i386/svm_helper.o
  CC      arm-softmmu/hw/dma/soc_dma.o
  CC      aarch64-softmmu/hw/display/pxa2xx_lcd.o
  GEN     trace/generated-helpers.c
  CC      sh4-softmmu/hw/scsi/vhost-scsi-common.o
  CC      or1k-softmmu/target/openrisc/translate.o
  CC      mips-softmmu/hw/net/vhost_net.o
  CC      tricore-softmmu/hw/vfio/platform.o
  CC      ppc64-linux-user/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      ppc-softmmu/hw/vfio/platform.o
  CC      sparc-softmmu/trace/control-target.o
  CC      aarch64-softmmu/hw/display/bcm2835_fb.o
  CC      mipsel-softmmu/hw/virtio/vhost-backend.o
  CC      ppc64le-linux-user/target/ppc/mem_helper.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips64el-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      i386-linux-user/target/i386/kvm-stub.o
  CC      ppc64-softmmu/hw/display/virtio-gpu-3d.o
  CC      tricore-softmmu/hw/vfio/spapr.o
  CC      ppc-linux-user/target/ppc/../../libdecnumber/decNumber.o
  CC      mips64el-softmmu/hw/scsi/virtio-scsi.o
  CC      mipsel-softmmu/hw/virtio/vhost-user.o
  CC      arm-softmmu/hw/dma/pxa2xx_dma.o
  CC      mips64el-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips-softmmu/hw/scsi/virtio-scsi.o
  CC      i386-softmmu/hw/misc/pvpanic.o
  GEN     trace/generated-helpers.c
  CC      ppcemb-softmmu/hw/vfio/spapr.o
  CC      s390x-softmmu/hw/virtio/virtio-balloon.o
  LINK    moxie-softmmu/qemu-system-moxie
  CC      sh4eb-softmmu/hw/net/virtio-net.o
  CC      s390x-softmmu/hw/virtio/vhost.o
  CC      ppc64abi32-linux-user/target/ppc/../../libdecnumber/decNumber.o
  CC      sh4-softmmu/hw/scsi/vhost-scsi.o
  CC      or1k-softmmu/target/openrisc/exception_helper.o
  CC      sh4eb-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/dma/bcm2835_dma.o
  CC      mipsel-softmmu/hw/virtio/vhost-vsock.o
  CC      mips64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      ppc64-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc64abi32-linux-user/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      ppc64le-linux-user/target/ppc/user_only_helper.o
  CC      mips64-softmmu/hw/scsi/vhost-scsi.o
  CC      alpha-softmmu/hw/virtio/vhost-vsock.o
  CC      i386-linux-user/trace/control-target.o
  CC      ppc64abi32-linux-user/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      sh4eb-softmmu/hw/scsi/virtio-scsi.o
  CC      sparc-softmmu/trace/generated-helpers.o
  CC      i386-softmmu/hw/misc/mmio_interface.o
  CC      mips64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      ppc-softmmu/hw/vfio/spapr.o
  CC      sparc64-softmmu/hw/virtio/vhost-user.o
  CC      ppc-softmmu/hw/virtio/virtio.o
  CC      sh4eb-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      cris-softmmu/trace/generated-helpers.o
  CC      mips-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-linux-user/gdbstub-xml.o
  CC      arm-softmmu/hw/gpio/omap_gpio.o
  CC      mips64-softmmu/hw/timer/mips_gictimer.o
  CC      ppc-linux-user/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      mips-softmmu/hw/scsi/vhost-scsi-common.o
  CC      or1k-softmmu/target/openrisc/fpu_helper.o
  CC      sparc64-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc-linux-user/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      ppc-linux-user/target/ppc/../../libdecnumber/dpd/decimal128.o
  CC      ppc-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc64-softmmu/hw/display/virtio-vga.o
  CC      aarch64-softmmu/hw/display/vga.o
  CC      sh4-softmmu/hw/scsi/vhost-user-scsi.o
  GEN     trace/generated-helpers.c
  CC      ppc64abi32-linux-user/target/ppc/../../libdecnumber/dpd/decimal128.o
  CC      tricore-softmmu/hw/tricore/tricore_testboard.o
  GEN     trace/generated-helpers.c
  CC      mips64el-softmmu/hw/scsi/vhost-scsi-common.o
  CC      i386-softmmu/hw/net/virtio-net.o
  CC      sh4eb-softmmu/hw/scsi/vhost-scsi-common.o
  CC      arm-softmmu/hw/gpio/imx_gpio.o
  CC      ppc64abi32-linux-user/trace/control-target.o
  CC      or1k-softmmu/target/openrisc/interrupt_helper.o
  CC      x86_64-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc64-linux-user/target/ppc/../../libdecnumber/dpd/decimal64.o
  LINK    sparc-softmmu/qemu-system-sparc
  CC      mips64-softmmu/hw/timer/mc146818rtc.o
  CC      tricore-softmmu/target/tricore/translate.o
  CC      i386-softmmu/hw/net/vhost_net.o
  CC      alpha-softmmu/hw/virtio/virtio-crypto.o
  CC      sparc64-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc-linux-user/trace/control-target.o
  CC      mips64-softmmu/hw/vfio/common.o
  CC      alpha-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      alpha-softmmu/hw/alpha/dp264.o
  CC      i386-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc-softmmu/hw/virtio/vhost.o
  CC      ppc64abi32-linux-user/gdbstub-xml.o
  CC      ppc-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/display/virtio-gpu.o
  CC      aarch64-linux-user/trace/generated-helpers.o
  CC      mips64el-softmmu/hw/scsi/vhost-scsi.o
  CC      tricore-softmmu/target/tricore/helper.o
  CC      alpha-softmmu/hw/alpha/pci.o
  CC      ppc64-linux-user/target/ppc/../../libdecnumber/dpd/decimal128.o
  CC      sh4eb-softmmu/hw/scsi/vhost-scsi.o
  CC      mips-softmmu/hw/scsi/vhost-scsi.o
  GEN     trace/generated-helpers.c
  CC      sh4-softmmu/hw/timer/sh_timer.o
  CC      ppc64-softmmu/hw/i2c/ppc4xx_i2c.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc-softmmu/hw/virtio/vhost-user.o
  CC      alpha-softmmu/hw/alpha/typhoon.o
  CC      alpha-softmmu/target/alpha/machine.o
  CC      ppc64-softmmu/hw/intc/openpic_kvm.o
  CC      ppc-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc64-softmmu/hw/intc/xics.o
  CC      alpha-softmmu/target/alpha/translate.o
  CC      mipsel-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc-softmmu/hw/virtio/virtio-crypto.o
  CC      arm-softmmu/hw/gpio/bcm2835_gpio.o
  CC      ppc64-softmmu/hw/intc/xics_spapr.o
  CC      s390x-softmmu/hw/virtio/vhost-backend.o
  CC      ppc64le-linux-user/target/ppc/gdbstub.o
  CC      ppc64abi32-linux-user/trace/generated-helpers.o
  CC      ppc64-softmmu/hw/intc/xics_kvm.o
  CC      ppc64le-linux-user/target/ppc/../../libdecnumber/decContext.o
  CC      mipsel-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc64-linux-user/trace/control-target.o
  CC      ppc-linux-user/gdbstub-xml.o
  CC      x86_64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      i386-linux-user/gdbstub-xml.o
  CC      ppc64le-linux-user/target/ppc/../../libdecnumber/decNumber.o
  CC      arm-softmmu/hw/i2c/omap_i2c.o
  CC      x86_64-softmmu/hw/timer/mc146818rtc.o
  CC      i386-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppcemb-softmmu/hw/virtio/virtio.o
  LINK    cris-softmmu/qemu-system-cris
  CC      mips-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips-softmmu/hw/timer/mips_gictimer.o
  CC      or1k-softmmu/target/openrisc/mmu_helper.o
  CC      ppc64-softmmu/hw/intc/xics_pnv.o
  CC      arm-softmmu/hw/input/pxa2xx_keypad.o
  CC      sparc64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips-softmmu/hw/timer/mc146818rtc.o
  CC      tricore-softmmu/target/tricore/cpu.o
  CC      mips64-softmmu/hw/vfio/pci.o
  CC      mipsel-softmmu/hw/mips/mips_r4k.o
  CC      mipsel-softmmu/hw/mips/mips_malta.o
  CC      mips64el-softmmu/hw/scsi/vhost-user-scsi.o
  CC      or1k-softmmu/target/openrisc/sys_helper.o
  CC      sh4-softmmu/hw/timer/mc146818rtc.o
  CC      ppc64le-linux-user/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      ppc64-softmmu/hw/misc/ivshmem.o
  CC      mipsel-softmmu/hw/mips/mips_mipssim.o
  CC      x86_64-softmmu/hw/vfio/common.o
  CC      sh4-softmmu/hw/vfio/common.o
  CC      i386-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mipsel-softmmu/hw/mips/addr.o
  CC      sparc64-softmmu/hw/sparc64/sparc64.o
  CC      i386-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips64el-softmmu/hw/timer/mips_gictimer.o
  CC      s390x-softmmu/hw/virtio/vhost-user.o
  CC      ppcemb-softmmu/hw/virtio/virtio-balloon.o
  CC      tricore-softmmu/target/tricore/op_helper.o
  CC      or1k-softmmu/target/openrisc/gdbstub.o
  CC      ppc64le-linux-user/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      x86_64-softmmu/hw/vfio/pci.o
  CC      sparc64-softmmu/hw/sparc64/sun4u.o
  CC      ppc-linux-user/trace/generated-helpers.o
  CC      ppc64-linux-user/gdbstub-xml.o
  CC      i386-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips64el-softmmu/hw/timer/mc146818rtc.o
  CC      mipsel-softmmu/hw/mips/mips_int.o
  CC      x86_64-softmmu/hw/vfio/pci-quirks.o
  CC      alpha-softmmu/target/alpha/helper.o
  CC      mips-softmmu/hw/vfio/common.o
  CC      arm-softmmu/hw/input/tsc210x.o
  CC      sh4eb-softmmu/hw/scsi/vhost-user-scsi.o
  CC      x86_64-softmmu/hw/vfio/platform.o
  CC      ppc64-linux-user/trace/generated-helpers.o
  CC      sparc64-softmmu/hw/sparc64/niagara.o
  CC      mipsel-softmmu/hw/mips/gt64xxx_pci.o
  CC      mipsel-softmmu/hw/mips/cps.o
  CC      ppc64-softmmu/hw/misc/mmio_interface.o
  CC      sh4-softmmu/hw/vfio/pci.o
  CC      mipsel-softmmu/target/mips/translate.o
  CC      alpha-softmmu/target/alpha/cpu.o
  CC      mips-softmmu/hw/vfio/pci.o
  CC      sh4-softmmu/hw/vfio/pci-quirks.o
  CC      i386-softmmu/hw/timer/mc146818rtc.o
  CC      alpha-softmmu/target/alpha/int_helper.o
  CC      sh4-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/intc/armv7m_nvic.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips-softmmu/hw/vfio/pci-quirks.o
  CC      sh4eb-softmmu/hw/timer/sh_timer.o
  CC      s390x-softmmu/hw/virtio/vhost-vsock.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/hw/intc/exynos4210_gic.o
  CC      sh4eb-softmmu/hw/timer/mc146818rtc.o
  CC      mips-softmmu/hw/vfio/platform.o
  CC      sh4-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/display/dpcd.o
  CC      or1k-softmmu/trace/control-target.o
  CC      mips64-softmmu/hw/vfio/pci-quirks.o
  CC      sh4eb-softmmu/hw/vfio/common.o
  CC      mips-softmmu/hw/vfio/spapr.o
  CC      alpha-softmmu/target/alpha/fpu_helper.o
  CC      mips-softmmu/hw/virtio/virtio.o
  CC      mips64-softmmu/hw/vfio/platform.o
  CC      mips-softmmu/hw/virtio/virtio-balloon.o
  CC      ppcemb-softmmu/hw/virtio/vhost.o
  CC      alpha-softmmu/target/alpha/vax_helper.o
  CC      sh4-softmmu/hw/virtio/virtio.o
  CC      arm-softmmu/hw/intc/exynos4210_combiner.o
  CC      sparc64-softmmu/target/sparc/machine.o
  CC      mips-softmmu/hw/virtio/vhost.o
  CC      arm-softmmu/hw/intc/omap_intc.o
  CC      ppc-softmmu/hw/ppc/ppc.o
  CC      i386-linux-user/trace/generated-helpers.o
  CC      sh4eb-softmmu/hw/vfio/pci.o
  CC      alpha-softmmu/target/alpha/sys_helper.o
  CC      sparc64-softmmu/target/sparc/monitor.o
  LINK    m68k-softmmu/qemu-system-m68k
  CC      sparc64-softmmu/target/sparc/translate.o
  CC      ppcemb-softmmu/hw/virtio/vhost-backend.o
  CC      sh4-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc-softmmu/hw/ppc/ppc_booke.o
  CC      ppcemb-softmmu/hw/virtio/vhost-user.o
  CC      s390x-softmmu/hw/virtio/virtio-crypto.o
  CC      tricore-softmmu/target/tricore/fpu_helper.o
  CC      sh4-softmmu/hw/virtio/vhost.o
  CC      alpha-softmmu/target/alpha/mem_helper.o
  CC      sh4-softmmu/hw/virtio/vhost-backend.o
  CC      mips64el-softmmu/hw/vfio/common.o
  CC      sh4-softmmu/hw/virtio/vhost-user.o
  CC      ppcemb-softmmu/hw/virtio/vhost-vsock.o
  CC      mips-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/display/xlnx_dp.o
  CC      s390x-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc64le-linux-user/target/ppc/../../libdecnumber/dpd/decimal128.o
  CC      sh4eb-softmmu/hw/vfio/pci-quirks.o
  CC      mips64el-softmmu/hw/vfio/pci.o
  GEN     trace/generated-helpers.c
  CC      ppc64-softmmu/hw/net/spapr_llan.o
  CC      or1k-softmmu/trace/generated-helpers.o
  CC      mips64-softmmu/hw/vfio/spapr.o
  CC      alpha-softmmu/target/alpha/gdbstub.o
  CC      ppc64-softmmu/hw/net/xilinx_ethlite.o
  CC      mips-softmmu/hw/virtio/vhost-user.o
  CC      arm-softmmu/hw/intc/bcm2835_ic.o
  CC      sh4-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc64-softmmu/hw/net/virtio-net.o
  CC      sh4eb-softmmu/hw/vfio/platform.o
  CC      mips64el-softmmu/hw/vfio/pci-quirks.o
  CC      mips64el-softmmu/hw/vfio/platform.o
  CC      s390x-softmmu/hw/s390x/s390-virtio-hcall.o
  CC      ppc-softmmu/hw/ppc/fdt.o
  GEN     trace/generated-helpers.c
  CC      mips64-softmmu/hw/virtio/virtio.o
  GEN     trace/generated-helpers.c
  CC      mips-softmmu/hw/virtio/vhost-vsock.o
  CC      x86_64-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/dma/omap_dma.o
  CC      x86_64-softmmu/hw/virtio/virtio.o
  CC      aarch64-softmmu/hw/dma/soc_dma.o
  CC      aarch64-softmmu/hw/dma/xlnx_dpdma.o
  CC      alpha-softmmu/trace/control-target.o
  CC      ppc64le-linux-user/trace/control-target.o
  CC      ppcemb-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc-softmmu/hw/ppc/ppc405_boards.o
  CC      arm-softmmu/hw/intc/bcm2836_control.o
  LINK    or1k-softmmu/qemu-system-or1k
  CC      tricore-softmmu/trace/control-target.o
  CC      mips64el-softmmu/hw/vfio/spapr.o
  CC      i386-softmmu/hw/vfio/common.o
  CC      x86_64-softmmu/hw/virtio/virtio-balloon.o
  CC      ppcemb-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      sh4eb-softmmu/hw/vfio/spapr.o
  CC      sh4eb-softmmu/hw/virtio/virtio.o
  CC      sh4eb-softmmu/hw/virtio/virtio-balloon.o
  CC      ppcemb-softmmu/hw/ppc/ppc.o
  CC      s390x-softmmu/hw/s390x/sclp.o
  CC      i386-softmmu/hw/vfio/pci.o
  CC      sh4-softmmu/hw/virtio/virtio-crypto.o
  CC      mipsel-softmmu/target/mips/dsp_helper.o
  CC      sparc64-softmmu/target/sparc/helper.o
  CC      ppc64le-linux-user/gdbstub-xml.o
  CC      ppc64le-linux-user/trace/generated-helpers.o
  CC      mips-softmmu/hw/virtio/virtio-crypto.o
  CC      i386-softmmu/hw/vfio/pci-quirks.o
  CC      mips64el-softmmu/hw/virtio/virtio.o
  CC      mips64el-softmmu/hw/virtio/virtio-balloon.o
  CC      sh4eb-softmmu/hw/virtio/vhost.o
  CC      mips64el-softmmu/hw/virtio/vhost.o
  CC      ppcemb-softmmu/hw/ppc/ppc_booke.o
  CC      s390x-softmmu/hw/s390x/event-facility.o
  CC      mipsel-softmmu/target/mips/op_helper.o
  CC      aarch64-softmmu/hw/dma/pxa2xx_dma.o
  CC      mips64-softmmu/hw/virtio/virtio-balloon.o
  CC      mips64-softmmu/hw/virtio/vhost.o
  CC      sh4eb-softmmu/hw/virtio/vhost-backend.o
  CC      arm-softmmu/hw/intc/allwinner-a10-pic.o
  CC      sh4eb-softmmu/hw/virtio/vhost-user.o
  CC      mips-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips-softmmu/hw/mips/mips_r4k.o
  CC      mips-softmmu/hw/mips/mips_malta.o
  CC      i386-softmmu/hw/vfio/platform.o
  CC      mips64el-softmmu/hw/virtio/vhost-backend.o
  CC      mipsel-softmmu/target/mips/lmi_helper.o
  CC      sparc64-softmmu/target/sparc/cpu.o
  CC      i386-softmmu/hw/vfio/spapr.o
  CC      sh4-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc-softmmu/hw/ppc/ppc4xx_devs.o
  CC      sh4-softmmu/hw/sh4/shix.o
  CC      x86_64-softmmu/hw/virtio/vhost.o
  CC      i386-softmmu/hw/virtio/virtio.o
  CC      arm-softmmu/hw/intc/aspeed_vic.o
  CC      sh4-softmmu/hw/sh4/r2d.o
  CC      ppc-softmmu/hw/ppc/ppc405_uc.o
  CC      sparc64-softmmu/target/sparc/fop_helper.o
  CC      mips64el-softmmu/hw/virtio/vhost-user.o
  CC      ppc-softmmu/hw/ppc/ppc440_bamboo.o
  CC      mipsel-softmmu/target/mips/helper.o
  CC      tricore-softmmu/trace/generated-helpers.o
  CC      mips64-softmmu/hw/virtio/vhost-backend.o
  CC      mips-softmmu/hw/mips/mips_mipssim.o
  CC      mips-softmmu/hw/mips/addr.o
  CC      arm-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      mips-softmmu/hw/mips/mips_int.o
  CC      sparc64-softmmu/target/sparc/cc_helper.o
  CC      ppcemb-softmmu/hw/ppc/fdt.o
  CC      ppc64-softmmu/hw/net/vhost_net.o
  CC      ppc-softmmu/hw/ppc/ppc4xx_pci.o
  CC      mips64-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/etsec.o
  CC      i386-softmmu/hw/virtio/virtio-balloon.o
  CC      arm-softmmu/hw/misc/ivshmem.o
  CC      alpha-softmmu/trace/generated-helpers.o
  CC      s390x-softmmu/hw/s390x/sclpquiesce.o
  CC      sh4eb-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/registers.o
  CC      mips-softmmu/hw/mips/gt64xxx_pci.o
  CC      aarch64-softmmu/hw/dma/bcm2835_dma.o
  CC      mips64-softmmu/hw/virtio/vhost-vsock.o
  CC      ppcemb-softmmu/hw/ppc/ppc405_boards.o
  CC      sh4-softmmu/hw/sh4/sh7750.o
  CC      mips-softmmu/hw/mips/cps.o
  CC      s390x-softmmu/hw/s390x/sclpcpu.o
  CC      s390x-softmmu/hw/s390x/ipl.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/rings.o
  CC      aarch64-softmmu/hw/gpio/omap_gpio.o
  CC      ppcemb-softmmu/hw/ppc/ppc4xx_devs.o
  CC      sh4-softmmu/hw/sh4/sh7750_regnames.o
  CC      aarch64-softmmu/hw/gpio/imx_gpio.o
  CC      arm-softmmu/hw/misc/arm_sysctl.o
  CC      ppcemb-softmmu/hw/ppc/ppc405_uc.o
  CC      mips64el-softmmu/hw/virtio/vhost-vsock.o
  CC      aarch64-softmmu/hw/gpio/bcm2835_gpio.o
  CC      x86_64-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/i2c/omap_i2c.o
  CC      arm-softmmu/hw/misc/cbus.o
  CC      mips-softmmu/target/mips/translate.o
  CC      x86_64-softmmu/hw/virtio/vhost-user.o
  CC      sh4-softmmu/hw/sh4/sh_pci.o
  CC      sh4eb-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/miim.o
  CC      ppc-softmmu/hw/ppc/prep.o
  CC      mips-softmmu/target/mips/dsp_helper.o
  CC      mipsel-softmmu/target/mips/cpu.o
  CC      sh4eb-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      i386-softmmu/hw/virtio/vhost.o
  CC      mips64-softmmu/hw/virtio/virtio-crypto.o
  CC      arm-softmmu/hw/misc/exynos4210_pmu.o
  CC      i386-softmmu/hw/virtio/vhost-backend.o
  CC      mipsel-softmmu/target/mips/gdbstub.o
  CC      s390x-softmmu/hw/s390x/css.o
  CC      arm-softmmu/hw/misc/exynos4210_clk.o
  CC      sh4eb-softmmu/hw/sh4/shix.o
  CC      ppc64-softmmu/hw/nvram/spapr_nvram.o
  CC      ppcemb-softmmu/hw/ppc/ppc440_bamboo.o
  CC      ppc64-softmmu/hw/scsi/spapr_vscsi.o
  CC      i386-softmmu/hw/virtio/vhost-user.o
  CC      mips64el-softmmu/hw/virtio/virtio-crypto.o
  CC      sh4-softmmu/target/sh4/translate.o
  CC      x86_64-softmmu/hw/virtio/vhost-vsock.o
  CC      s390x-softmmu/hw/s390x/s390-virtio-ccw.o
  CC      sh4eb-softmmu/hw/sh4/r2d.o
  CC      ppcemb-softmmu/hw/ppc/ppc4xx_pci.o
  CC      arm-softmmu/hw/misc/exynos4210_rng.o
  LINK    s390x-linux-user/qemu-s390x
  CC      x86_64-softmmu/hw/virtio/virtio-crypto.o
  CC      ppcemb-softmmu/hw/ppc/virtex_ml507.o
  CC      mips64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mipsel-softmmu/target/mips/msa_helper.o
  CC      sh4-softmmu/target/sh4/op_helper.o
  CC      ppcemb-softmmu/target/ppc/cpu-models.o
  CC      sh4eb-softmmu/hw/sh4/sh7750.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips64-softmmu/hw/mips/mips_r4k.o
  CC      mips64-softmmu/hw/mips/mips_malta.o
  CC      s390x-softmmu/hw/s390x/3270-ccw.o
  CC      aarch64-softmmu/hw/input/pxa2xx_keypad.o
  CC      mips64-softmmu/hw/mips/mips_mipssim.o
  CC      ppcemb-softmmu/target/ppc/cpu.o
  CC      sh4eb-softmmu/hw/sh4/sh7750_regnames.o
  CC      aarch64-softmmu/hw/input/tsc210x.o
  CC      mips-softmmu/target/mips/op_helper.o
  CC      ppcemb-softmmu/target/ppc/translate.o
  CC      s390x-softmmu/hw/s390x/virtio-ccw.o
  CC      i386-softmmu/hw/virtio/vhost-vsock.o
  CC      mips64-softmmu/hw/mips/addr.o
  CC      sh4-softmmu/target/sh4/helper.o
  CC      ppc-softmmu/hw/ppc/prep_systemio.o
  CC      sparc64-softmmu/target/sparc/win_helper.o
  CC      aarch64-softmmu/hw/intc/armv7m_nvic.o
  CC      mips64el-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/intc/exynos4210_gic.o
  CC      arm-softmmu/hw/misc/imx_ccm.o
  CC      mips-softmmu/target/mips/lmi_helper.o
  CC      sh4eb-softmmu/hw/sh4/sh_pci.o
  CC      mipsel-softmmu/target/mips/mips-semi.o
  CC      sparc64-softmmu/target/sparc/mmu_helper.o
  CC      sh4eb-softmmu/target/sh4/translate.o
  CC      ppc-softmmu/hw/ppc/rs6000_mc.o
  CC      sh4-softmmu/target/sh4/cpu.o
  CC      i386-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc64-softmmu/hw/scsi/virtio-scsi.o
  CC      sh4-softmmu/target/sh4/monitor.o
  CC      arm-softmmu/hw/misc/imx31_ccm.o
  CC      sh4-softmmu/target/sh4/gdbstub.o
  CC      mipsel-softmmu/target/mips/machine.o
  CC      i386-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      sh4eb-softmmu/target/sh4/op_helper.o
  CC      sparc64-softmmu/target/sparc/ldst_helper.o
  CC      arm-softmmu/hw/misc/imx25_ccm.o
  CC      ppc64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/intc/exynos4210_combiner.o
  CC      mips64-softmmu/hw/mips/mips_int.o
  CC      s390x-softmmu/hw/s390x/css-bridge.o
  CC      arm-softmmu/hw/misc/imx6_ccm.o
  CC      arm-softmmu/hw/misc/imx6_src.o
  CC      ppc64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      arm-softmmu/hw/misc/mst_fpga.o
  CC      x86_64-softmmu/hw/i386/multiboot.o
  CC      ppc64-softmmu/hw/scsi/vhost-scsi.o
  CC      s390x-softmmu/hw/s390x/ccw-device.o
  CC      x86_64-softmmu/hw/i386/pc.o
  CC      aarch64-softmmu/hw/intc/omap_intc.o
  CC      i386-softmmu/hw/i386/multiboot.o
  CC      mips-softmmu/target/mips/helper.o
  CC      s390x-softmmu/hw/s390x/s390-pci-bus.o
  CC      mips64el-softmmu/hw/mips/mips_r4k.o
  CC      mipsel-softmmu/target/mips/cp0_timer.o
  CC      i386-softmmu/hw/i386/pc.o
  CC      mips-softmmu/target/mips/cpu.o
  CC      mips-softmmu/target/mips/gdbstub.o
  CC      s390x-softmmu/hw/s390x/s390-pci-inst.o
  GEN     trace/generated-helpers.c
  CC      mips-softmmu/target/mips/msa_helper.o
  CC      s390x-softmmu/hw/s390x/s390-skeys.o
  CC      arm-softmmu/hw/misc/omap_clk.o
  CC      sh4eb-softmmu/target/sh4/helper.o
  CC      ppc64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      s390x-softmmu/hw/s390x/s390-stattrib.o
  CC      mipsel-softmmu/trace/control-target.o
  CC      x86_64-softmmu/hw/i386/pc_piix.o
  CC      ppc-softmmu/hw/ppc/mac_oldworld.o
  CC      s390x-softmmu/hw/s390x/s390-ccw.o
  CC      mips-softmmu/target/mips/mips-semi.o
  CC      x86_64-softmmu/hw/i386/pc_q35.o
  CC      sparc64-softmmu/target/sparc/int64_helper.o
  CC      ppcemb-softmmu/target/ppc/machine.o
  CC      mips64el-softmmu/hw/mips/mips_malta.o
  CC      sh4eb-softmmu/target/sh4/cpu.o
  CC      sparc64-softmmu/target/sparc/vis_helper.o
  CC      mips64-softmmu/hw/mips/mips_jazz.o
  CC      mips64el-softmmu/hw/mips/mips_mipssim.o
  CC      aarch64-softmmu/hw/intc/bcm2835_ic.o
/var/tmp/patchew-tester-tmp-845hv716/src/hw/s390x/s390-stattrib.c: In function ‘s390_stattrib_instance_init’:
/var/tmp/patchew-tester-tmp-845hv716/src/hw/s390x/s390-stattrib.c:379:28: error: assignment from incompatible pointer type [-Werror]
     ops->save_live_pending = cmma_save_pending;
                            ^
  GEN     trace/generated-helpers.c
cc1: all warnings being treated as errors
make[1]: *** [hw/s390x/s390-stattrib.o] Error 1
make[1]: *** Waiting for unfinished jobs....
  CC      x86_64-softmmu/hw/i386/pc_sysfw.o
  CC      arm-softmmu/hw/misc/omap_gpmc.o
  CC      i386-softmmu/hw/i386/pc_piix.o
  CC      aarch64-softmmu/hw/intc/bcm2836_control.o
  CC      sh4eb-softmmu/target/sh4/monitor.o
  CC      sparc64-softmmu/target/sparc/gdbstub.o
  CC      x86_64-softmmu/hw/i386/x86-iommu.o
  CC      mips64el-softmmu/hw/mips/addr.o
  CC      ppcemb-softmmu/target/ppc/mmu_helper.o
  CC      ppc-softmmu/hw/ppc/mac_newworld.o
  CC      i386-softmmu/hw/i386/pc_q35.o
  CC      ppcemb-softmmu/target/ppc/mmu-hash32.o
  CC      ppcemb-softmmu/target/ppc/monitor.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/hw/misc/omap_l4.o
  CC      sh4eb-softmmu/target/sh4/gdbstub.o
  CC      x86_64-softmmu/hw/i386/intel_iommu.o
  CC      sparc64-softmmu/trace/control-target.o
  CC      arm-softmmu/hw/misc/omap_sdrc.o
  CC      aarch64-softmmu/hw/intc/allwinner-a10-pic.o
  CC      arm-softmmu/hw/misc/omap_tap.o
  CC      mips64el-softmmu/hw/mips/mips_int.o
  CC      sh4-softmmu/trace/control-target.o
  CC      aarch64-softmmu/hw/intc/aspeed_vic.o
  CC      x86_64-softmmu/hw/i386/amd_iommu.o
  CC      i386-softmmu/hw/i386/pc_sysfw.o
  GEN     trace/generated-helpers.c
  CC      sh4eb-softmmu/trace/control-target.o
  CC      arm-softmmu/hw/misc/bcm2835_mbox.o
  CC      mips-softmmu/target/mips/machine.o
  CC      ppc64-softmmu/hw/timer/mc146818rtc.o
  LINK    alpha-softmmu/qemu-system-alpha
  CC      x86_64-softmmu/hw/i386/kvmvapic.o
  CC      mipsel-softmmu/trace/generated-helpers.o
  CC      ppc-softmmu/hw/ppc/e500.o
  CC      arm-softmmu/hw/misc/bcm2835_property.o
  CC      ppcemb-softmmu/target/ppc/arch_dump.o
  CC      arm-softmmu/hw/misc/bcm2835_rng.o
  CC      x86_64-softmmu/hw/i386/acpi-build.o
  CC      x86_64-softmmu/hw/i386/pci-assign-load-rom.o
  CC      x86_64-softmmu/target/i386/helper.o
  CC      i386-softmmu/hw/i386/x86-iommu.o
  CC      ppc64-softmmu/hw/vfio/common.o
  CC      i386-softmmu/hw/i386/intel_iommu.o
  CC      arm-softmmu/hw/misc/zynq_slcr.o
  CC      i386-softmmu/hw/i386/amd_iommu.o
  CC      mips64el-softmmu/hw/mips/mips_jazz.o
  CC      mips64el-softmmu/hw/mips/mips_fulong2e.o
  CC      ppcemb-softmmu/target/ppc/kvm.o
  CC      arm-softmmu/hw/misc/zynq-xadc.o
  CC      mips64-softmmu/hw/mips/gt64xxx_pci.o
  LINK    x86_64-linux-user/qemu-x86_64
  CC      aarch64-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      ppc-softmmu/hw/ppc/mpc8544ds.o
  CC      arm-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      ppc-softmmu/hw/ppc/e500plat.o
  CC      i386-softmmu/hw/i386/kvmvapic.o
  CC      sparc64-softmmu/trace/generated-helpers.o
  CC      x86_64-softmmu/target/i386/cpu.o
  CC      mips64-softmmu/hw/mips/cps.o
  CC      ppc-softmmu/hw/ppc/mpc8544_guts.o
  CC      ppc-softmmu/hw/ppc/ppce500_spin.o
  CC      mips64el-softmmu/hw/mips/gt64xxx_pci.o
  CC      ppc-softmmu/hw/ppc/virtex_ml507.o
  CC      ppc64-softmmu/hw/vfio/pci.o
  CC      x86_64-softmmu/target/i386/gdbstub.o
  CC      i386-softmmu/hw/i386/acpi-build.o
  CC      mips-softmmu/target/mips/cp0_timer.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/target/i386/xsave_helper.o
  CC      ppcemb-softmmu/target/ppc/dfp_helper.o
  CC      ppc64-softmmu/hw/vfio/pci-quirks.o
  CC      sh4eb-softmmu/trace/generated-helpers.o
  CC      x86_64-softmmu/target/i386/translate.o
  CC      arm-softmmu/hw/misc/mps2-scc.o
  CC      x86_64-softmmu/target/i386/bpt_helper.o
  CC      arm-softmmu/hw/misc/aspeed_scu.o
  CC      mips64el-softmmu/hw/mips/cps.o
  CC      i386-softmmu/hw/i386/pci-assign-load-rom.o
  CC      aarch64-softmmu/hw/misc/ivshmem.o
  LINK    armeb-linux-user/qemu-armeb
  CC      mips64-softmmu/target/mips/translate.o
  CC      aarch64-softmmu/hw/misc/arm_sysctl.o
  CC      aarch64-softmmu/hw/misc/cbus.o
  CC      arm-softmmu/hw/misc/aspeed_sdmc.o
  CC      mips-softmmu/trace/control-target.o
  CC      mips64el-softmmu/hw/mips/boston.o
  CC      arm-softmmu/hw/misc/mmio_interface.o
  CC      i386-softmmu/target/i386/helper.o
  CC      ppcemb-softmmu/target/ppc/excp_helper.o
  CC      x86_64-softmmu/target/i386/cc_helper.o
  CC      i386-softmmu/target/i386/cpu.o
  CC      i386-softmmu/target/i386/gdbstub.o
  CC      x86_64-softmmu/target/i386/excp_helper.o
  CC      i386-softmmu/target/i386/xsave_helper.o
  CC      ppc-softmmu/target/ppc/cpu-models.o
  CC      arm-softmmu/hw/misc/msf2-sysreg.o
  CC      ppcemb-softmmu/target/ppc/fpu_helper.o
  CC      mips64el-softmmu/target/mips/translate.o
  CC      ppc-softmmu/target/ppc/cpu.o
  CC      i386-softmmu/target/i386/translate.o
  CC      x86_64-softmmu/target/i386/fpu_helper.o
  CC      x86_64-softmmu/target/i386/int_helper.o
  CC      aarch64-softmmu/hw/misc/exynos4210_pmu.o
  CC      ppcemb-softmmu/target/ppc/int_helper.o
  CC      arm-softmmu/hw/net/virtio-net.o
  CC      arm-softmmu/hw/net/vhost_net.o
  LINK    aarch64-linux-user/qemu-aarch64
  CC      ppc64-softmmu/hw/vfio/platform.o
  CC      mips64el-softmmu/target/mips/dsp_helper.o
  CC      sh4-softmmu/trace/generated-helpers.o
  CC      ppc-softmmu/target/ppc/translate.o
  CC      mips-softmmu/trace/generated-helpers.o
  CC      mips64el-softmmu/target/mips/op_helper.o
  CC      i386-softmmu/target/i386/bpt_helper.o
  CC      mips64-softmmu/target/mips/dsp_helper.o
  CC      mips64el-softmmu/target/mips/lmi_helper.o
  CC      aarch64-softmmu/hw/misc/exynos4210_clk.o
  CC      ppc-softmmu/target/ppc/machine.o
  LINK    mipsn32-linux-user/qemu-mipsn32
  CC      ppcemb-softmmu/target/ppc/timebase_helper.o
  CC      x86_64-softmmu/target/i386/mem_helper.o
  CC      aarch64-softmmu/hw/misc/exynos4210_rng.o
  CC      arm-softmmu/hw/pcmcia/pxa2xx.o
  CC      ppc64-softmmu/hw/vfio/spapr.o
  CC      mips64-softmmu/target/mips/op_helper.o
  CC      ppc-softmmu/target/ppc/mmu_helper.o
  CC      ppc-softmmu/target/ppc/mmu-hash32.o
  CC      mips64-softmmu/target/mips/lmi_helper.o
  CC      ppc64-softmmu/hw/virtio/virtio.o
  CC      mips64-softmmu/target/mips/helper.o
  CC      mips64el-softmmu/target/mips/helper.o
make: *** [subdir-s390x-softmmu] Error 2
make: *** Waiting for unfinished jobs....
  CC      aarch64-softmmu/hw/misc/imx_ccm.o
  CC      aarch64-softmmu/hw/misc/imx31_ccm.o
  CC      x86_64-softmmu/target/i386/misc_helper.o
  LINK    mipsel-linux-user/qemu-mipsel
  CC      mips64el-softmmu/target/mips/cpu.o
  CC      aarch64-softmmu/hw/misc/imx25_ccm.o
  CC      i386-softmmu/target/i386/cc_helper.o
  CC      aarch64-softmmu/hw/misc/imx6_ccm.o
  CC      x86_64-softmmu/target/i386/mpx_helper.o
  CC      mips64el-softmmu/target/mips/gdbstub.o
  CC      mips64el-softmmu/target/mips/msa_helper.o
  CC      x86_64-softmmu/target/i386/seg_helper.o
  CC      ppc-softmmu/target/ppc/monitor.o
  CC      mips64-softmmu/target/mips/cpu.o
  CC      x86_64-softmmu/target/i386/smm_helper.o
  CC      mips64el-softmmu/target/mips/mips-semi.o
  CC      arm-softmmu/hw/scsi/virtio-scsi.o
  CC      arm-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips64el-softmmu/target/mips/machine.o
  CC      mips64el-softmmu/target/mips/cp0_timer.o
  CC      x86_64-softmmu/target/i386/svm_helper.o
  CC      x86_64-softmmu/target/i386/machine.o
  CC      x86_64-softmmu/target/i386/arch_memory_mapping.o
  CC      i386-softmmu/target/i386/excp_helper.o
  CC      ppc-softmmu/target/ppc/arch_dump.o
  CC      ppc64-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/misc/imx6_src.o
  CC      arm-softmmu/hw/scsi/vhost-scsi-common.o
  CC      arm-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc-softmmu/target/ppc/kvm.o
  CC      arm-softmmu/hw/scsi/vhost-user-scsi.o
  CC      aarch64-softmmu/hw/misc/mst_fpga.o
  CC      mips64-softmmu/target/mips/gdbstub.o
  CC      i386-softmmu/target/i386/fpu_helper.o
  CC      ppcemb-softmmu/target/ppc/misc_helper.o
  GEN     trace/generated-helpers.c
  CC      ppcemb-softmmu/target/ppc/mem_helper.o
  CC      mips64-softmmu/target/mips/msa_helper.o
  CC      i386-softmmu/target/i386/int_helper.o
  CC      mips64-softmmu/target/mips/mips-semi.o
  CC      ppcemb-softmmu/target/ppc/gdbstub.o
  CC      mips64-softmmu/target/mips/machine.o
  CC      aarch64-softmmu/hw/misc/omap_clk.o
  CC      ppc64-softmmu/hw/virtio/vhost.o
  CC      x86_64-softmmu/target/i386/arch_dump.o
  CC      mips64-softmmu/target/mips/cp0_timer.o
  CC      i386-softmmu/target/i386/mem_helper.o
  CC      arm-softmmu/hw/sd/omap_mmc.o
  CC      ppc64-softmmu/hw/virtio/vhost-backend.o
  CC      ppc64-softmmu/hw/virtio/vhost-user.o
  CC      x86_64-softmmu/target/i386/monitor.o
  CC      x86_64-softmmu/target/i386/kvm-stub.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/decContext.o
  CC      aarch64-softmmu/hw/misc/omap_gpmc.o
  CC      ppc-softmmu/target/ppc/dfp_helper.o
  CC      aarch64-softmmu/hw/misc/omap_l4.o
  CC      mips64el-softmmu/trace/control-target.o
  CC      i386-softmmu/target/i386/misc_helper.o
  CC      ppc-softmmu/target/ppc/excp_helper.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/decNumber.o
  CC      arm-softmmu/hw/sd/pxa2xx_mmci.o
  GEN     trace/generated-helpers.c
  CC      i386-softmmu/target/i386/mpx_helper.o
  CC      mips64-softmmu/trace/control-target.o
  CC      arm-softmmu/hw/sd/bcm2835_sdhost.o
  CC      arm-softmmu/hw/ssi/omap_spi.o
  CC      arm-softmmu/hw/ssi/imx_spi.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/hw/timer/exynos4210_mct.o
  CC      ppc-softmmu/target/ppc/fpu_helper.o
  CC      arm-softmmu/hw/timer/exynos4210_pwm.o
  CC      arm-softmmu/hw/timer/exynos4210_rtc.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      mips64-softmmu/trace/generated-helpers.o
  CC      x86_64-softmmu/trace/control-target.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      x86_64-softmmu/gdbstub-xml.o
  CC      i386-softmmu/target/i386/seg_helper.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/dpd/decimal128.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/hw/timer/omap_gptimer.o
  CC      i386-softmmu/target/i386/smm_helper.o
  CC      ppcemb-softmmu/trace/control-target.o
  CC      ppc-softmmu/target/ppc/int_helper.o
  CC      ppc64-softmmu/hw/virtio/vhost-vsock.o
  CC      i386-softmmu/target/i386/svm_helper.o
  CC      arm-softmmu/hw/timer/omap_synctimer.o
  CC      mips64el-softmmu/trace/generated-helpers.o
  CC      arm-softmmu/hw/timer/pxa2xx_timer.o
  CC      ppc64-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/misc/omap_sdrc.o
  CC      i386-softmmu/target/i386/machine.o
  CC      ppcemb-softmmu/gdbstub-xml.o
  CC      i386-softmmu/target/i386/arch_memory_mapping.o
  CC      arm-softmmu/hw/timer/digic-timer.o
  CC      arm-softmmu/hw/timer/allwinner-a10-pit.o
  CC      ppc64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/misc/omap_tap.o
  CC      ppc64-softmmu/hw/ppc/ppc.o
  CC      i386-softmmu/target/i386/arch_dump.o
  CC      arm-softmmu/hw/usb/tusb6010.o
  CC      ppc64-softmmu/hw/ppc/ppc_booke.o
  CC      i386-softmmu/target/i386/monitor.o
  CC      arm-softmmu/hw/vfio/common.o
  CC      ppcemb-softmmu/trace/generated-helpers.o
  CC      ppc-softmmu/target/ppc/timebase_helper.o
  CC      ppc-softmmu/target/ppc/misc_helper.o
  CC      ppc-softmmu/target/ppc/mem_helper.o
  CC      ppc64-softmmu/hw/ppc/fdt.o
  CC      arm-softmmu/hw/vfio/pci.o
  CC      ppc-softmmu/target/ppc/gdbstub.o
  CC      x86_64-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/misc/bcm2835_mbox.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/decContext.o
  CC      ppc64-softmmu/hw/ppc/spapr.o
  CC      i386-softmmu/target/i386/kvm-stub.o
  CC      arm-softmmu/hw/vfio/pci-quirks.o
  CC      arm-softmmu/hw/vfio/platform.o
  CC      aarch64-softmmu/hw/misc/bcm2835_property.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/decNumber.o
  CC      arm-softmmu/hw/vfio/calxeda-xgmac.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      ppc64-softmmu/hw/ppc/spapr_vio.o
  CC      aarch64-softmmu/hw/misc/bcm2835_rng.o
  CC      aarch64-softmmu/hw/misc/zynq_slcr.o
  CC      arm-softmmu/hw/vfio/amd-xgbe.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/hw/vfio/spapr.o
  CC      arm-softmmu/hw/virtio/virtio.o
  CC      ppc64-softmmu/hw/ppc/spapr_events.o
  CC      i386-softmmu/trace/control-target.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      ppc64-softmmu/hw/ppc/spapr_hcall.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/dpd/decimal128.o
  CC      ppc64-softmmu/hw/ppc/spapr_iommu.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtas.o
  CC      aarch64-softmmu/hw/misc/zynq-xadc.o
  CC      i386-softmmu/gdbstub-xml.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      ppc64-softmmu/hw/ppc/spapr_pci.o
  CC      ppc-softmmu/trace/control-target.o
  CC      arm-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtc.o
  CC      ppc64-softmmu/hw/ppc/spapr_drc.o
  CC      ppc64-softmmu/hw/ppc/spapr_rng.o
  CC      i386-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/misc/mps2-scc.o
  CC      arm-softmmu/hw/virtio/vhost.o
  CC      aarch64-softmmu/hw/misc/auxbus.o
  CC      ppc-softmmu/gdbstub-xml.o
  CC      ppc64-softmmu/hw/ppc/spapr_cpu_core.o
  CC      aarch64-softmmu/hw/misc/aspeed_scu.o
  CC      arm-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/misc/aspeed_sdmc.o
  CC      aarch64-softmmu/hw/misc/mmio_interface.o
  CC      arm-softmmu/hw/virtio/vhost-user.o
  CC      arm-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc64-softmmu/hw/ppc/spapr_ovec.o
  CC      aarch64-softmmu/hw/misc/msf2-sysreg.o
  CC      ppc64-softmmu/hw/ppc/pnv.o
  CC      aarch64-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/ppc/pnv_xscom.o
  CC      arm-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/pcmcia/pxa2xx.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc64-softmmu/hw/ppc/pnv_core.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi.o
  CC      arm-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc64-softmmu/hw/ppc/pnv_lpc.o
  CC      aarch64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      arm-softmmu/hw/arm/boot.o
  CC      ppc64-softmmu/hw/ppc/pnv_psi.o
  CC      ppc64-softmmu/hw/ppc/pnv_occ.o
  CC      aarch64-softmmu/hw/sd/omap_mmc.o
  CC      aarch64-softmmu/hw/sd/pxa2xx_mmci.o
  CC      arm-softmmu/hw/arm/collie.o
  CC      ppc64-softmmu/hw/ppc/pnv_bmc.o
  CC      arm-softmmu/hw/arm/exynos4_boards.o
  CC      ppc64-softmmu/hw/ppc/spapr_pci_vfio.o
  CC      arm-softmmu/hw/arm/gumstix.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtas_ddw.o
  CC      aarch64-softmmu/hw/sd/bcm2835_sdhost.o
  CC      arm-softmmu/hw/arm/highbank.o
  CC      aarch64-softmmu/hw/ssi/omap_spi.o
  CC      ppc64-softmmu/hw/ppc/ppc405_boards.o
  CC      aarch64-softmmu/hw/ssi/imx_spi.o
  CC      aarch64-softmmu/hw/timer/exynos4210_mct.o
  CC      ppc64-softmmu/hw/ppc/ppc4xx_devs.o
  CC      ppc64-softmmu/hw/ppc/ppc405_uc.o
  LINK    arm-linux-user/qemu-arm
  CC      ppc64-softmmu/hw/ppc/ppc440_bamboo.o
  CC      aarch64-softmmu/hw/timer/exynos4210_pwm.o
  CC      ppc64-softmmu/hw/ppc/ppc4xx_pci.o
  CC      ppc64-softmmu/hw/ppc/prep.o
  CC      aarch64-softmmu/hw/timer/exynos4210_rtc.o
  CC      arm-softmmu/hw/arm/digic_boards.o
  CC      ppc64-softmmu/hw/ppc/prep_systemio.o
  CC      ppc64-softmmu/hw/ppc/rs6000_mc.o
  LINK    sh4-softmmu/qemu-system-sh4
  CC      arm-softmmu/hw/arm/integratorcp.o
  CC      aarch64-softmmu/hw/timer/omap_gptimer.o
  CC      ppc64-softmmu/hw/ppc/mac_oldworld.o
  CC      aarch64-softmmu/hw/timer/omap_synctimer.o
  CC      ppc64-softmmu/hw/ppc/mac_newworld.o
  CC      ppc64-softmmu/hw/ppc/e500.o
  CC      arm-softmmu/hw/arm/mainstone.o
  CC      aarch64-softmmu/hw/timer/pxa2xx_timer.o
  CC      ppc64-softmmu/hw/ppc/mpc8544ds.o
  CC      arm-softmmu/hw/arm/musicpal.o
  CC      aarch64-softmmu/hw/timer/digic-timer.o
  CC      arm-softmmu/hw/arm/nseries.o
  CC      ppc64-softmmu/hw/ppc/e500plat.o
  CC      arm-softmmu/hw/arm/omap_sx1.o
  CC      ppc64-softmmu/hw/ppc/mpc8544_guts.o
  CC      aarch64-softmmu/hw/timer/allwinner-a10-pit.o
  LINK    sh4eb-softmmu/qemu-system-sh4eb
  CC      aarch64-softmmu/hw/usb/tusb6010.o
  CC      aarch64-softmmu/hw/vfio/common.o
  CC      arm-softmmu/hw/arm/palm.o
  CC      arm-softmmu/hw/arm/realview.o
  CC      aarch64-softmmu/hw/vfio/pci.o
  CC      arm-softmmu/hw/arm/spitz.o
  CC      aarch64-softmmu/hw/vfio/pci-quirks.o
  CC      arm-softmmu/hw/arm/stellaris.o
  CC      arm-softmmu/hw/arm/tosa.o
  CC      ppc64-softmmu/hw/ppc/ppce500_spin.o
  CC      arm-softmmu/hw/arm/versatilepb.o
  CC      arm-softmmu/hw/arm/vexpress.o
  CC      ppc64-softmmu/hw/ppc/virtex_ml507.o
  CC      aarch64-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/arm/virt.o
  CC      arm-softmmu/hw/arm/xilinx_zynq.o
  CC      arm-softmmu/hw/arm/z2.o
  CC      arm-softmmu/hw/arm/virt-acpi-build.o
  CC      ppc64-softmmu/target/ppc/cpu-models.o
  CC      aarch64-softmmu/hw/vfio/calxeda-xgmac.o
  CC      aarch64-softmmu/hw/vfio/amd-xgbe.o
  CC      ppc64-softmmu/target/ppc/cpu.o
  CC      ppc64-softmmu/target/ppc/translate.o
  CC      arm-softmmu/hw/arm/netduino2.o
  CC      ppc64-softmmu/target/ppc/machine.o
  CC      aarch64-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/virtio/virtio.o
  CC      arm-softmmu/hw/arm/sysbus-fdt.o
  CC      arm-softmmu/hw/arm/armv7m.o
  CC      ppc64-softmmu/target/ppc/mmu_helper.o
  CC      aarch64-softmmu/hw/virtio/virtio-balloon.o
  CC      arm-softmmu/hw/arm/exynos4210.o
  CC      ppc64-softmmu/target/ppc/mmu-hash32.o
  CC      arm-softmmu/hw/arm/pxa2xx.o
  CC      ppc64-softmmu/target/ppc/monitor.o
  CC      aarch64-softmmu/hw/virtio/vhost.o
  CC      arm-softmmu/hw/arm/pxa2xx_gpio.o
  LINK    sparc64-softmmu/qemu-system-sparc64
  CC      aarch64-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/virtio/vhost-user.o
  CC      arm-softmmu/hw/arm/pxa2xx_pic.o
  CC      arm-softmmu/hw/arm/digic.o
  CC      aarch64-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc64-softmmu/target/ppc/arch_dump.o
  CC      ppc64-softmmu/target/ppc/mmu-hash64.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      arm-softmmu/hw/arm/omap1.o
  CC      aarch64-softmmu/hw/arm/boot.o
  CC      ppc64-softmmu/target/ppc/mmu-book3s-v3.o
  CC      arm-softmmu/hw/arm/omap2.o
  CC      ppc64-softmmu/target/ppc/compat.o
  CC      aarch64-softmmu/hw/arm/collie.o
  CC      ppc64-softmmu/target/ppc/mmu-radix64.o
  CC      ppc64-softmmu/target/ppc/kvm.o
  CC      aarch64-softmmu/hw/arm/exynos4_boards.o
  CC      arm-softmmu/hw/arm/strongarm.o
  CC      arm-softmmu/hw/arm/allwinner-a10.o
  CC      ppc64-softmmu/target/ppc/dfp_helper.o
  CC      arm-softmmu/hw/arm/cubieboard.o
  CC      aarch64-softmmu/hw/arm/gumstix.o
  CC      aarch64-softmmu/hw/arm/highbank.o
  CC      ppc64-softmmu/target/ppc/excp_helper.o
  CC      arm-softmmu/hw/arm/bcm2835_peripherals.o
  CC      ppc64-softmmu/target/ppc/fpu_helper.o
  CC      aarch64-softmmu/hw/arm/digic_boards.o
  CC      ppc64-softmmu/target/ppc/int_helper.o
  CC      aarch64-softmmu/hw/arm/integratorcp.o
  LINK    mips-linux-user/qemu-mips
  CC      arm-softmmu/hw/arm/bcm2836.o
  CC      ppc64-softmmu/target/ppc/timebase_helper.o
  CC      aarch64-softmmu/hw/arm/mainstone.o
  CC      ppc64-softmmu/target/ppc/misc_helper.o
  CC      ppc64-softmmu/target/ppc/mem_helper.o
  CC      arm-softmmu/hw/arm/stm32f205_soc.o
  CC      arm-softmmu/hw/arm/raspi.o
  CC      ppc64-softmmu/target/ppc/gdbstub.o
  CC      arm-softmmu/hw/arm/fsl-imx25.o
  CC      arm-softmmu/hw/arm/imx25_pdk.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/decContext.o
  CC      arm-softmmu/hw/arm/fsl-imx31.o
  CC      aarch64-softmmu/hw/arm/musicpal.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/decNumber.o
  CC      aarch64-softmmu/hw/arm/nseries.o
  CC      arm-softmmu/hw/arm/kzm.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      aarch64-softmmu/hw/arm/omap_sx1.o
  CC      aarch64-softmmu/hw/arm/palm.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/dpd/decimal128.o
  CC      aarch64-softmmu/hw/arm/realview.o
  CC      arm-softmmu/hw/arm/fsl-imx6.o
  CC      arm-softmmu/hw/arm/sabrelite.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/hw/arm/spitz.o
  CC      aarch64-softmmu/hw/arm/stellaris.o
  CC      ppc64-softmmu/trace/control-target.o
  CC      aarch64-softmmu/hw/arm/tosa.o
  CC      arm-softmmu/hw/arm/aspeed_soc.o
  CC      ppc64-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/hw/arm/versatilepb.o
  CC      arm-softmmu/hw/arm/aspeed.o
  CC      arm-softmmu/hw/arm/mps2.o
  CC      aarch64-softmmu/hw/arm/vexpress.o
  CC      arm-softmmu/hw/arm/msf2-soc.o
  CC      ppc64-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/arm/xilinx_zynq.o
  CC      aarch64-softmmu/hw/arm/virt.o
  CC      aarch64-softmmu/hw/arm/z2.o
  CC      aarch64-softmmu/hw/arm/virt-acpi-build.o
  CC      aarch64-softmmu/hw/arm/netduino2.o
  CC      arm-softmmu/hw/arm/msf2-som.o
  CC      arm-softmmu/target/arm/arm-semi.o
  CC      aarch64-softmmu/hw/arm/sysbus-fdt.o
  CC      arm-softmmu/target/arm/machine.o
  CC      arm-softmmu/target/arm/psci.o
  CC      aarch64-softmmu/hw/arm/armv7m.o
  CC      arm-softmmu/target/arm/arch_dump.o
  CC      arm-softmmu/target/arm/monitor.o
  CC      aarch64-softmmu/hw/arm/exynos4210.o
  CC      arm-softmmu/target/arm/kvm-stub.o
  CC      arm-softmmu/target/arm/translate.o
  CC      arm-softmmu/target/arm/op_helper.o
  CC      arm-softmmu/target/arm/helper.o
  CC      aarch64-softmmu/hw/arm/pxa2xx.o
  CC      arm-softmmu/target/arm/cpu.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_gpio.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_pic.o
  CC      aarch64-softmmu/hw/arm/digic.o
  CC      aarch64-softmmu/hw/arm/omap1.o
  CC      arm-softmmu/target/arm/neon_helper.o
  CC      aarch64-softmmu/hw/arm/omap2.o
  CC      aarch64-softmmu/hw/arm/strongarm.o
  CC      aarch64-softmmu/hw/arm/allwinner-a10.o
  CC      arm-softmmu/target/arm/iwmmxt_helper.o
  CC      aarch64-softmmu/hw/arm/cubieboard.o
  CC      aarch64-softmmu/hw/arm/bcm2835_peripherals.o
  CC      arm-softmmu/target/arm/gdbstub.o
  CC      arm-softmmu/target/arm/crypto_helper.o
  CC      arm-softmmu/target/arm/arm-powerctl.o
  CC      aarch64-softmmu/hw/arm/bcm2836.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/hw/arm/raspi.o
  CC      aarch64-softmmu/hw/arm/stm32f205_soc.o
  CC      arm-softmmu/trace/control-target.o
  CC      arm-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/hw/arm/xlnx-zynqmp.o
  CC      aarch64-softmmu/hw/arm/xlnx-zcu102.o
  CC      aarch64-softmmu/hw/arm/fsl-imx25.o
  CC      aarch64-softmmu/hw/arm/imx25_pdk.o
  CC      aarch64-softmmu/hw/arm/fsl-imx31.o
  CC      arm-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/arm/kzm.o
  CC      aarch64-softmmu/hw/arm/fsl-imx6.o
  CC      aarch64-softmmu/hw/arm/sabrelite.o
  CC      aarch64-softmmu/hw/arm/aspeed_soc.o
  CC      aarch64-softmmu/hw/arm/aspeed.o
  CC      aarch64-softmmu/hw/arm/mps2.o
  CC      aarch64-softmmu/hw/arm/msf2-soc.o
  CC      aarch64-softmmu/hw/arm/msf2-som.o
  CC      aarch64-softmmu/target/arm/arm-semi.o
  CC      aarch64-softmmu/target/arm/machine.o
  CC      aarch64-softmmu/target/arm/psci.o
  CC      aarch64-softmmu/target/arm/arch_dump.o
  CC      aarch64-softmmu/target/arm/monitor.o
  CC      aarch64-softmmu/target/arm/kvm-stub.o
  CC      aarch64-softmmu/target/arm/translate.o
  CC      aarch64-softmmu/target/arm/op_helper.o
  CC      aarch64-softmmu/target/arm/helper.o
  CC      aarch64-softmmu/target/arm/cpu.o
  CC      aarch64-softmmu/target/arm/neon_helper.o
  CC      aarch64-softmmu/target/arm/iwmmxt_helper.o
  CC      aarch64-softmmu/target/arm/gdbstub.o
  CC      aarch64-softmmu/target/arm/cpu64.o
  CC      aarch64-softmmu/target/arm/translate-a64.o
  CC      aarch64-softmmu/target/arm/helper-a64.o
  CC      aarch64-softmmu/target/arm/gdbstub64.o
  CC      aarch64-softmmu/target/arm/crypto_helper.o
  CC      aarch64-softmmu/target/arm/arm-powerctl.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/trace/control-target.o
  CC      aarch64-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/trace/generated-helpers.o
  LINK    i386-linux-user/qemu-i386
  LINK    mips64-linux-user/qemu-mips64
  LINK    tricore-softmmu/qemu-system-tricore
  LINK    mipsn32el-linux-user/qemu-mipsn32el
  LINK    i386-softmmu/qemu-system-i386
  LINK    x86_64-softmmu/qemu-system-x86_64
  LINK    mipsel-softmmu/qemu-system-mipsel
  LINK    aarch64-softmmu/qemu-system-aarch64
  LINK    mips-softmmu/qemu-system-mips
  LINK    arm-softmmu/qemu-system-arm
  LINK    ppc64le-linux-user/qemu-ppc64le
  LINK    ppc-linux-user/qemu-ppc
  LINK    ppc64abi32-linux-user/qemu-ppc64abi32
  LINK    mips64-softmmu/qemu-system-mips64
  LINK    ppc64-linux-user/qemu-ppc64
  LINK    mips64el-softmmu/qemu-system-mips64el
  LINK    ppcemb-softmmu/qemu-system-ppcemb
  LINK    ppc-softmmu/qemu-system-ppc
  LINK    ppc64-softmmu/qemu-system-ppc64
=== OUTPUT END ===

Test command exited with code: 2


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (14 preceding siblings ...)
  2017-10-30 16:54 ` [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration no-reply
@ 2017-10-30 16:55 ` no-reply
  2017-10-30 18:22 ` Vladimir Sementsov-Ogievskiy
  16 siblings, 0 replies; 44+ messages in thread
From: no-reply @ 2017-10-30 16:55 UTC (permalink / raw)
  To: vsementsov; +Cc: famz, qemu-block, qemu-devel, kwolf, peter.maydell

Hi,

This series failed build test on s390x host. Please find the details below.

Message-id: 20171030163309.75770-1-vsementsov@virtuozzo.com
Subject: [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration
Type: series

=== TEST SCRIPT BEGIN ===
#!/bin/bash
# Testing script will be invoked under the git checkout with
# HEAD pointing to a commit that has the patches applied on top of "base"
# branch
set -e
echo "=== ENV ==="
env
echo "=== PACKAGES ==="
rpm -qa
echo "=== TEST BEGIN ==="
CC=$HOME/bin/cc
INSTALL=$PWD/install
BUILD=$PWD/build
echo -n "Using CC: "
realpath $CC
mkdir -p $BUILD $INSTALL
SRC=$PWD
cd $BUILD
$SRC/configure --cc=$CC --prefix=$INSTALL
make -j4
# XXX: we need reliable clean up
# make check -j4 V=1
make install
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 - [tag update]      patchew/150822818243.26242.12993827911736928961.stgit@bahia.lan -> patchew/150822818243.26242.12993827911736928961.stgit@bahia.lan
 - [tag update]      patchew/20171027104037.8319-1-eblake@redhat.com -> patchew/20171027104037.8319-1-eblake@redhat.com
 - [tag update]      patchew/20171029125338.25988-1-kwolf@redhat.com -> patchew/20171029125338.25988-1-kwolf@redhat.com
 - [tag update]      patchew/20171030102830.4469-1-kraxel@redhat.com -> patchew/20171030102830.4469-1-kraxel@redhat.com
 * [new tag]         patchew/20171030163309.75770-1-vsementsov@virtuozzo.com -> patchew/20171030163309.75770-1-vsementsov@virtuozzo.com
Switched to a new branch 'test'
b200358 iotests: add persistent bitmap migration test
2bc0dad iotests: add dirty bitmap postcopy test
a572a25 iotests: add dirty bitmap migration test
012af82 iotests: add default node-name
d0573d2 migration: add postcopy migration of dirty bitmaps
1c5318d migration: add is_active_iterate handler
7697c9a migration/qemu-file: add qemu_put_counted_string()
b4e20bb migration: include migrate_dirty_bitmaps in migrate_postcopy
272f21c qapi: add dirty-bitmaps migration capability
7f3bb03 migration: introduce postcopy-only pending
c8f365f block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
93cb6f1 block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor
92ce534 block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
abf3538 block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor()

=== OUTPUT BEGIN ===
=== ENV ===
XDG_SESSION_ID=69560
SHELL=/bin/sh
USER=fam
PATCHEW=/home/fam/patchew/patchew-cli -s http://patchew.org --nodebug
PATH=/usr/bin:/bin
PWD=/var/tmp/patchew-tester-tmp-30ljxus4/src
LANG=en_US.UTF-8
HOME=/home/fam
SHLVL=2
LOGNAME=fam
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1012/bus
XDG_RUNTIME_DIR=/run/user/1012
_=/usr/bin/env
=== PACKAGES ===
gpg-pubkey-873529b8-54e386ff
xz-libs-5.2.2-2.fc24.s390x
libxshmfence-1.2-3.fc24.s390x
giflib-4.1.6-15.fc24.s390x
trousers-lib-0.3.13-6.fc24.s390x
ncurses-base-6.0-6.20160709.fc25.noarch
gmp-6.1.1-1.fc25.s390x
libidn-1.33-1.fc25.s390x
slang-2.3.0-7.fc25.s390x
pkgconfig-0.29.1-1.fc25.s390x
alsa-lib-1.1.1-2.fc25.s390x
yum-metadata-parser-1.1.4-17.fc25.s390x
python3-slip-dbus-0.6.4-4.fc25.noarch
python2-cssselect-0.9.2-1.fc25.noarch
createrepo_c-libs-0.10.0-6.fc25.s390x
initscripts-9.69-1.fc25.s390x
parted-3.2-21.fc25.s390x
flex-2.6.0-3.fc25.s390x
colord-libs-1.3.4-1.fc25.s390x
python-osbs-client-0.33-3.fc25.noarch
perl-Pod-Simple-3.35-1.fc25.noarch
python2-simplejson-3.10.0-1.fc25.s390x
brltty-5.4-2.fc25.s390x
librados2-10.2.4-2.fc25.s390x
tcp_wrappers-7.6-83.fc25.s390x
libcephfs_jni1-10.2.4-2.fc25.s390x
nettle-devel-3.3-1.fc25.s390x
bzip2-devel-1.0.6-21.fc25.s390x
libuuid-2.28.2-2.fc25.s390x
python3-dnf-1.1.10-6.fc25.noarch
texlive-kpathsea-doc-svn41139-33.fc25.1.noarch
openssh-7.4p1-4.fc25.s390x
texlive-kpathsea-bin-svn40473-33.20160520.fc25.1.s390x
texlive-graphics-svn41015-33.fc25.1.noarch
texlive-dvipdfmx-def-svn40328-33.fc25.1.noarch
texlive-mfware-svn40768-33.fc25.1.noarch
texlive-texlive-scripts-svn41433-33.fc25.1.noarch
texlive-euro-svn22191.1.1-33.fc25.1.noarch
texlive-etex-svn37057.0-33.fc25.1.noarch
texlive-iftex-svn29654.0.2-33.fc25.1.noarch
texlive-palatino-svn31835.0-33.fc25.1.noarch
texlive-texlive-docindex-svn41430-33.fc25.1.noarch
texlive-xunicode-svn30466.0.981-33.fc25.1.noarch
texlive-koma-script-svn41508-33.fc25.1.noarch
texlive-pst-grad-svn15878.1.06-33.fc25.1.noarch
texlive-pst-blur-svn15878.2.0-33.fc25.1.noarch
texlive-jknapltx-svn19440.0-33.fc25.1.noarch
texinfo-6.1-4.fc25.s390x
openssl-devel-1.0.2k-1.fc25.s390x
jansson-2.10-2.fc25.s390x
fedora-repos-25-4.noarch
perl-Errno-1.25-387.fc25.s390x
acl-2.2.52-13.fc25.s390x
systemd-pam-231-17.fc25.s390x
NetworkManager-libnm-1.4.4-5.fc25.s390x
poppler-0.45.0-5.fc25.s390x
ccache-3.3.4-1.fc25.s390x
valgrind-3.12.0-9.fc25.s390x
perl-open-1.10-387.fc25.noarch
libgcc-6.4.1-1.fc25.s390x
libsoup-2.56.1-1.fc25.s390x
libstdc++-devel-6.4.1-1.fc25.s390x
libobjc-6.4.1-1.fc25.s390x
python2-rpm-4.13.0.1-2.fc25.s390x
python2-gluster-3.10.5-1.fc25.s390x
rpm-build-4.13.0.1-2.fc25.s390x
glibc-static-2.24-10.fc25.s390x
lz4-1.8.0-1.fc25.s390x
xapian-core-libs-1.2.24-1.fc25.s390x
elfutils-libelf-devel-0.169-1.fc25.s390x
nss-softokn-3.32.0-1.2.fc25.s390x
pango-1.40.9-1.fc25.s390x
glibc-debuginfo-common-2.24-10.fc25.s390x
libaio-0.3.110-6.fc24.s390x
libfontenc-1.1.3-3.fc24.s390x
lzo-2.08-8.fc24.s390x
isl-0.14-5.fc24.s390x
libXau-1.0.8-6.fc24.s390x
linux-atm-libs-2.5.1-14.fc24.s390x
libXext-1.3.3-4.fc24.s390x
libXxf86vm-1.1.4-3.fc24.s390x
bison-3.0.4-4.fc24.s390x
perl-srpm-macros-1-20.fc25.noarch
gawk-4.1.3-8.fc25.s390x
libwayland-client-1.12.0-1.fc25.s390x
perl-Exporter-5.72-366.fc25.noarch
perl-version-0.99.17-1.fc25.s390x
fftw-libs-double-3.3.5-3.fc25.s390x
libssh2-1.8.0-1.fc25.s390x
ModemManager-glib-1.6.4-1.fc25.s390x
newt-python3-0.52.19-2.fc25.s390x
python-munch-2.0.4-3.fc25.noarch
python-bugzilla-1.2.2-4.fc25.noarch
libedit-3.1-16.20160618cvs.fc25.s390x
createrepo_c-0.10.0-6.fc25.s390x
device-mapper-multipath-libs-0.4.9-83.fc25.s390x
yum-3.4.3-510.fc25.noarch
mozjs17-17.0.0-16.fc25.s390x
libselinux-2.5-13.fc25.s390x
python2-pyparsing-2.1.10-1.fc25.noarch
cairo-gobject-1.14.8-1.fc25.s390x
xorg-x11-proto-devel-7.7-20.fc25.noarch
brlapi-0.6.5-2.fc25.s390x
librados-devel-10.2.4-2.fc25.s390x
libXinerama-devel-1.1.3-6.fc24.s390x
lua-posix-33.3.1-3.fc25.s390x
usbredir-devel-0.7.1-2.fc24.s390x
python3-dnf-plugins-core-0.1.21-5.fc25.noarch
texlive-pdftex-doc-svn41149-33.fc25.1.noarch
openssh-clients-7.4p1-4.fc25.s390x
iptables-1.6.0-3.fc25.s390x
texlive-texlive.infra-svn41280-33.fc25.1.noarch
texlive-graphics-cfg-svn40269-33.fc25.1.noarch
texlive-bibtex-svn40768-33.fc25.1.noarch
texlive-mfware-bin-svn40473-33.20160520.fc25.1.s390x
texlive-texlive-scripts-bin-svn29741.0-33.20160520.fc25.1.noarch
texlive-sauerj-svn15878.0-33.fc25.1.noarch
texlive-enctex-svn34957.0-33.fc25.1.noarch
texlive-ifetex-svn24853.1.2-33.fc25.1.noarch
texlive-ntgclass-svn15878.2.1a-33.fc25.1.noarch
texlive-tex-gyre-math-svn41264-33.fc25.1.noarch
texlive-bera-svn20031.0-33.fc25.1.noarch
texlive-ms-svn29849.0-33.fc25.1.noarch
texlive-pst-fill-svn15878.1.01-33.fc25.1.noarch
texlive-ctable-svn38672-33.fc25.1.noarch
texlive-extsizes-svn17263.1.4a-33.fc25.1.noarch
texlive-collection-latexrecommended-svn35765.0-33.20160520.fc25.1.noarch
perl-Filter-1.57-1.fc25.s390x
python2-rpm-macros-3-12.fc25.noarch
gdbm-1.13-1.fc25.s390x
libtasn1-4.12-1.fc25.s390x
fedora-release-25-2.noarch
gdb-headless-7.12.1-48.fc25.s390x
perl-macros-5.24.2-387.fc25.s390x
pcre-devel-8.41-1.fc25.s390x
libX11-1.6.5-1.fc25.s390x
coreutils-8.25-17.fc25.s390x
python2-openidc-client-0-3.20170523git77cb3ee.fc25.noarch
systemtap-client-3.1-5.fc25.s390x
firewalld-0.4.4.5-1.fc25.noarch
glibc-2.24-10.fc25.s390x
libglvnd-egl-0.2.999-24.20170818git8d4d03f.fc25.s390x
libkadm5-1.14.4-8.fc25.s390x
glusterfs-fuse-3.10.5-1.fc25.s390x
libgfortran-6.4.1-1.fc25.s390x
python3-rpm-4.13.0.1-2.fc25.s390x
glusterfs-extra-xlators-3.10.5-1.fc25.s390x
dracut-config-rescue-046-2.git20170811.fc25.s390x
python2-sphinx-theme-alabaster-0.7.9-1.fc25.noarch
elfutils-devel-0.169-1.fc25.s390x
nss-3.32.0-1.1.fc25.s390x
pango-devel-1.40.9-1.fc25.s390x
glibc-debuginfo-2.24-10.fc25.s390x
gpg-pubkey-efe550f5-5220ba41
gpg-pubkey-81b46521-55b3ca9a
filesystem-3.2-37.fc24.s390x
libffi-3.1-9.fc24.s390x
keyutils-libs-1.5.9-8.fc24.s390x
libnfnetlink-1.0.1-8.fc24.s390x
libtheora-1.1.1-14.fc24.s390x
xml-common-0.6.3-44.fc24.noarch
autoconf-2.69-22.fc24.noarch
libXt-1.1.5-3.fc24.s390x
kbd-legacy-2.0.3-3.fc24.noarch
ghostscript-fonts-5.50-35.fc24.noarch
libXevie-1.0.3-11.fc24.s390x
libcap-2.25-2.fc25.s390x
mpfr-3.1.5-1.fc25.s390x
perl-Carp-1.40-365.fc25.noarch
libmnl-1.0.4-1.fc25.s390x
perl-Unicode-EastAsianWidth-1.33-8.fc25.noarch
libwayland-cursor-1.12.0-1.fc25.s390x
python-krbV-1.0.90-12.fc25.s390x
python2-urllib3-1.15.1-3.fc25.noarch
fipscheck-1.4.1-11.fc25.s390x
libndp-1.6-1.fc25.s390x
gnupg2-2.1.13-2.fc25.s390x
libXfixes-5.0.3-1.fc25.s390x
adwaita-icon-theme-3.22.0-1.fc25.noarch
dconf-0.26.0-1.fc25.s390x
ncurses-devel-6.0-6.20160709.fc25.s390x
dejagnu-1.6-1.fc25.noarch
device-mapper-1.02.136-3.fc25.s390x
libevent-2.0.22-1.fc25.s390x
atk-devel-2.22.0-1.fc25.s390x
libev-4.24-1.fc25.s390x
xorg-x11-fonts-Type1-7.5-16.fc24.noarch
brlapi-devel-0.6.5-2.fc25.s390x
pulseaudio-libs-10.0-2.fc25.s390x
glib2-2.50.3-1.fc25.s390x
dnf-1.1.10-6.fc25.noarch
texlive-metafont-bin-svn40987-33.20160520.fc25.1.s390x
texlive-xkeyval-svn35741.2.7a-33.fc25.1.noarch
texlive-euler-svn17261.2.5-33.fc25.1.noarch
texlive-mptopdf-svn41282-33.fc25.1.noarch
texlive-wasy-svn35831.0-33.fc25.1.noarch
texlive-avantgar-svn31835.0-33.fc25.1.noarch
texlive-eurosym-svn17265.1.4_subrfix-33.fc25.1.noarch
texlive-knuth-lib-svn35820.0-33.fc25.1.noarch
texlive-parallel-svn15878.0-33.fc25.1.noarch
texlive-texlive-msg-translations-svn41431-33.fc25.1.noarch
texlive-latex-svn40218-33.fc25.1.noarch
texlive-lualatex-math-svn40621-33.fc25.1.noarch
texlive-auto-pst-pdf-svn23723.0.6-33.fc25.1.noarch
texlive-powerdot-svn38984-33.fc25.1.noarch
texlive-wasysym-svn15878.2.0-33.fc25.1.noarch
ImageMagick-libs-6.9.3.0-6.fc25.s390x
geoclue2-2.4.5-1.fc25.s390x
perl-IO-Socket-IP-0.39-1.fc25.noarch
python2-pyasn1-0.2.3-1.fc25.noarch
at-spi2-core-devel-2.22.1-1.fc25.s390x
libacl-2.2.52-13.fc25.s390x
perl-libs-5.24.2-387.fc25.s390x
mesa-libglapi-17.0.5-3.fc25.s390x
python3-rpmconf-1.0.19-1.fc25.noarch
pcre-utf32-8.41-1.fc25.s390x
libX11-common-1.6.5-1.fc25.noarch
coreutils-common-8.25-17.fc25.s390x
mesa-libEGL-17.0.5-3.fc25.s390x
systemtap-runtime-3.1-5.fc25.s390x
NetworkManager-glib-1.4.4-5.fc25.s390x
audit-2.7.7-1.fc25.s390x
glibc-all-langpacks-2.24-10.fc25.s390x
libglvnd-glx-0.2.999-24.20170818git8d4d03f.fc25.s390x
glusterfs-api-3.10.5-1.fc25.s390x
libepoxy-devel-1.4.3-1.fc25.1.s390x
gtk3-3.22.17-2.fc25.s390x
rpm-4.13.0.1-2.fc25.s390x
net-snmp-agent-libs-5.7.3-15.fc25.s390x
pcre2-devel-10.23-9.fc25.s390x
subversion-1.9.7-1.fc25.s390x
libsndfile-1.0.28-6.fc25.s390x
lasi-1.1.2-6.fc24.s390x
python2-snowballstemmer-1.2.1-1.fc25.noarch
nss-util-devel-3.32.0-1.0.fc25.s390x
vim-common-8.0.1030-1.fc25.s390x
gd-2.2.5-1.fc25.s390x
gpg-pubkey-34ec9cba-54e38751
gpg-pubkey-030d5aed-55b577f0
basesystem-11-2.fc24.noarch
libmpc-1.0.2-5.fc24.s390x
libunistring-0.9.4-3.fc24.s390x
libmodman-2.0.1-12.fc24.s390x
lsscsi-0.28-3.fc24.s390x
kbd-misc-2.0.3-3.fc24.noarch
kmod-23-1.fc25.s390x
newt-0.52.19-2.fc25.s390x
perl-Text-Unidecode-1.27-3.fc25.noarch
plymouth-core-libs-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
which-2.21-1.fc25.s390x
python3-slip-0.6.4-4.fc25.noarch
python3-systemd-232-1.fc25.s390x
python-lockfile-0.11.0-4.fc25.noarch
python2-requests-2.10.0-4.fc25.noarch
libnghttp2-1.13.0-2.fc25.s390x
python-urlgrabber-3.10.1-9.fc25.noarch
iputils-20161105-1.fc25.s390x
rest-0.8.0-1.fc25.s390x
adwaita-cursor-theme-3.22.0-1.fc25.noarch
authconfig-6.2.10-14.fc25.s390x
automake-1.15-7.fc25.noarch
shared-mime-info-1.8-1.fc25.s390x
pigz-2.3.4-1.fc25.s390x
device-mapper-libs-1.02.136-3.fc25.s390x
dnsmasq-2.76-2.fc25.s390x
fedora-packager-0.6.0.1-1.fc25.noarch
libwebp-0.5.2-1.fc25.s390x
boost-system-1.60.0-10.fc25.s390x
libasyncns-0.8-10.fc24.s390x
libXau-devel-1.0.8-6.fc24.s390x
libverto-libev-0.2.6-6.fc24.s390x
python3-html5lib-0.999-9.fc25.noarch
ttmkfdir-3.0.9-48.fc24.s390x
pulseaudio-libs-glib2-10.0-2.fc25.s390x
texlive-lib-2016-33.20160520.fc25.s390x
libXi-devel-1.7.9-1.fc25.s390x
python3-distro-1.0.3-1.fc25.noarch
texlive-texlive-common-doc-svn40682-33.fc25.1.noarch
packagedb-cli-2.14.1-1.fc25.noarch
texlive-metafont-svn40793-33.fc25.1.noarch
texlive-tools-svn40934-33.fc25.1.noarch
texlive-enumitem-svn24146.3.5.2-33.fc25.1.noarch
texlive-mptopdf-bin-svn18674.0-33.20160520.fc25.1.noarch
texlive-underscore-svn18261.0-33.fc25.1.noarch
texlive-anysize-svn15878.0-33.fc25.1.noarch
texlive-euenc-svn19795.0.1h-33.fc25.1.noarch
texlive-kastrup-svn15878.0-33.fc25.1.noarch
texlive-paralist-svn39247-33.fc25.1.noarch
texlive-texlive-en-svn41185-33.fc25.1.noarch
texlive-tipa-svn29349.1.3-33.fc25.1.noarch
texlive-currfile-svn40725-33.fc25.1.noarch
texlive-pst-node-svn40743-33.fc25.1.noarch
texlive-pst-slpe-svn24391.1.31-33.fc25.1.noarch
texlive-typehtml-svn17134.0-33.fc25.1.noarch
SDL2-devel-2.0.5-3.fc25.s390x
libcroco-0.6.11-3.fc25.s390x
bluez-libs-devel-5.44-1.fc25.s390x
firewalld-filesystem-0.4.4.5-1.fc25.noarch
pcre-cpp-8.41-1.fc25.s390x
python3-firewall-0.4.4.5-1.fc25.noarch
freetype-devel-2.6.5-9.fc25.s390x
pcre-utf16-8.41-1.fc25.s390x
linux-firmware-20170605-74.git37857004.fc25.noarch
kernel-modules-4.11.10-200.fc25.s390x
systemtap-devel-3.1-5.fc25.s390x
polkit-0.113-8.fc25.s390x
perl-SelfLoader-1.23-387.fc25.noarch
libdb-utils-5.3.28-24.fc25.s390x
glibc-common-2.24-10.fc25.s390x
libglvnd-0.2.999-24.20170818git8d4d03f.fc25.s390x
webkitgtk4-2.16.6-1.fc25.s390x
rpm-build-libs-4.13.0.1-2.fc25.s390x
libglvnd-core-devel-0.2.999-24.20170818git8d4d03f.fc25.s390x
rpm-devel-4.13.0.1-2.fc25.s390x
kernel-4.12.9-200.fc25.s390x
libtool-ltdl-2.4.6-14.fc25.s390x
gts-0.7.6-29.20121130.fc24.s390x
python2-imagesize-0.7.1-2.fc25.noarch
nss-softokn-freebl-3.32.0-1.2.fc25.s390x
selinux-policy-3.13.1-225.22.fc25.noarch
kernel-devel-4.12.11-200.fc25.s390x
fontpackages-filesystem-1.44-17.fc24.noarch
groff-base-1.22.3-8.fc24.s390x
ilmbase-2.2.0-5.fc24.s390x
OpenEXR-libs-2.2.0-5.fc24.s390x
hesiod-3.2.1-6.fc24.s390x
sysfsutils-2.1.0-19.fc24.s390x
ocaml-srpm-macros-2-4.fc24.noarch
mailx-12.5-19.fc24.s390x
ncurses-libs-6.0-6.20160709.fc25.s390x
ipset-libs-6.29-1.fc25.s390x
gmp-devel-6.1.1-1.fc25.s390x
python-pip-8.1.2-2.fc25.noarch
harfbuzz-1.3.2-1.fc25.s390x
python2-iniparse-0.4-20.fc25.noarch
python3-iniparse-0.4-20.fc25.noarch
python3-kickstart-2.32-1.fc25.noarch
perl-Net-SSLeay-1.78-1.fc25.s390x
drpm-0.3.0-3.fc25.s390x
glib-networking-2.50.0-1.fc25.s390x
webkitgtk3-2.4.11-3.fc25.s390x
libXaw-1.0.13-4.fc25.s390x
xorg-x11-font-utils-7.5-32.fc25.s390x
hardlink-1.1-1.fc25.s390x
libcom_err-1.43.3-1.fc25.s390x
python2-dateutil-2.6.0-1.fc25.noarch
libXpm-3.5.12-1.fc25.s390x
poppler-data-0.4.7-6.fc25.noarch
librbd1-10.2.4-2.fc25.s390x
perl-Digest-MD5-2.55-2.fc25.s390x
wayland-protocols-devel-1.7-1.fc25.noarch
texi2html-5.0-4.fc24.noarch
libxkbcommon-0.7.1-1.fc25.s390x
libuuid-devel-2.28.2-2.fc25.s390x
libcacard-2.5.3-1.fc25.s390x
libwmf-lite-0.2.8.4-50.fc25.s390x
texlive-tetex-svn41059-33.fc25.1.noarch
texlive-thumbpdf-svn34621.3.16-33.fc25.1.noarch
texlive-carlisle-svn18258.0-33.fc25.1.noarch
texlive-makeindex-bin-svn40473-33.20160520.fc25.1.s390x
texlive-pdftex-svn41149-33.fc25.1.noarch
texlive-csquotes-svn39538-33.fc25.1.noarch
texlive-courier-svn35058.0-33.fc25.1.noarch
texlive-helvetic-svn31835.0-33.fc25.1.noarch
texlive-mfnfss-svn19410.0-33.fc25.1.noarch
texlive-sepnum-svn20186.2.0-33.fc25.1.noarch
texlive-utopia-svn15878.0-33.fc25.1.noarch
texlive-luatexbase-svn38550-33.fc25.1.noarch
texlive-pst-3d-svn17257.1.10-33.fc25.1.noarch
texlive-latex-bin-bin-svn14050.0-33.20160520.fc25.1.noarch
texlive-l3experimental-svn41163-33.fc25.1.noarch
net-tools-2.0-0.40.20160329git.fc25.s390x
perl-Pod-Perldoc-3.28-1.fc25.noarch
openssl-1.0.2k-1.fc25.s390x
man-pages-4.06-4.fc25.noarch
libxml2-2.9.4-2.fc25.s390x
python3-dateutil-2.6.0-1.fc25.noarch
perl-threads-shared-1.57-1.fc25.s390x
libnotify-0.7.7-1.fc25.s390x
unzip-6.0-32.fc25.s390x
python-beautifulsoup4-4.6.0-1.fc25.noarch
dhcp-client-4.3.5-3.fc25.s390x
python2-fedora-0.9.0-6.fc25.noarch
gdb-7.12.1-48.fc25.s390x
sqlite-libs-3.14.2-3.fc25.s390x
webkitgtk4-jsc-2.16.6-1.fc25.s390x
libgomp-6.4.1-1.fc25.s390x
p11-kit-trust-0.23.8-1.fc25.s390x
gdk-pixbuf2-devel-2.36.9-1.fc25.s390x
rpm-plugin-selinux-4.13.0.1-2.fc25.s390x
mariadb-common-10.1.25-1.fc25.s390x
dbus-devel-1.11.16-1.fc25.s390x
lz4-libs-1.8.0-1.fc25.s390x
python2-jinja2-2.8.1-1.fc25.noarch
system-python-libs-3.5.4-1.fc25.s390x
python2-rpkg-1.50-2.fc25.noarch
libsolv-0.6.29-1.fc25.s390x
gpg-pubkey-95a43f54-5284415a
dejavu-fonts-common-2.35-3.fc24.noarch
libSM-1.2.2-4.fc24.s390x
diffutils-3.3-13.fc24.s390x
libogg-1.3.2-5.fc24.s390x
hunspell-en-US-0.20140811.1-5.fc24.noarch
libdaemon-0.14-10.fc24.s390x
patch-2.7.5-3.fc24.s390x
libsysfs-2.1.0-19.fc24.s390x
procmail-3.22-39.fc24.s390x
libXdamage-1.1.4-8.fc24.s390x
libotf-0.9.13-7.fc24.s390x
urw-fonts-2.4-22.fc24.noarch
crontabs-1.11-12.20150630git.fc24.noarch
ppp-2.4.7-9.fc24.s390x
cyrus-sasl-2.1.26-26.2.fc24.s390x
zlib-devel-1.2.8-10.fc24.s390x
time-1.7-49.fc24.s390x
gpg-pubkey-fdb19c98-56fd6333
libcap-ng-0.7.8-1.fc25.s390x
binutils-2.26.1-1.fc25.s390x
lcms2-2.8-2.fc25.s390x
libcomps-0.1.7-5.fc25.s390x
perl-constant-1.33-367.fc25.noarch
perl-Data-Dumper-2.161-1.fc25.s390x
ipcalc-0.1.8-1.fc25.s390x
gmp-c++-6.1.1-1.fc25.s390x
fontconfig-2.12.1-1.fc25.s390x
enchant-1.6.0-14.fc25.s390x
pyliblzma-0.5.3-16.fc25.s390x
libsepol-devel-2.5-10.fc25.s390x
python3-ordered-set-2.0.0-4.fc25.noarch
python-ipaddress-1.0.16-3.fc25.noarch
python2-kerberos-1.2.5-1.fc25.s390x
python2-pysocks-1.5.6-5.fc25.noarch
fipscheck-lib-1.4.1-11.fc25.s390x
libatomic_ops-7.4.4-1.fc25.s390x
python2-pygpgme-0.3-18.fc25.s390x
orc-0.4.26-1.fc25.s390x
yum-utils-1.1.31-511.fc25.noarch
libXrender-0.9.10-1.fc25.s390x
libXrandr-1.5.1-1.fc25.s390x
go-srpm-macros-2-7.fc25.noarch
gnupg2-smime-2.1.13-2.fc25.s390x
guile-devel-2.0.13-1.fc25.s390x
uboot-tools-2016.09.01-2.fc25.s390x
pykickstart-2.32-1.fc25.noarch
python-bunch-1.0.1-9.fc25.noarch
perl-generators-1.10-1.fc25.noarch
perl-Mozilla-CA-20160104-3.fc25.noarch
bzip2-libs-1.0.6-21.fc25.s390x
libpng-1.6.27-1.fc25.s390x
desktop-file-utils-0.23-2.fc25.s390x
python2-cccolutils-1.4-1.fc25.s390x
python2-lxml-3.7.2-1.fc25.s390x
redhat-rpm-config-45-1.fc25.noarch
device-mapper-event-libs-1.02.136-3.fc25.s390x
lvm2-libs-2.02.167-3.fc25.s390x
libselinux-python-2.5-13.fc25.s390x
boost-thread-1.60.0-10.fc25.s390x
librbd-devel-10.2.4-2.fc25.s390x
libXcursor-devel-1.1.14-6.fc24.s390x
latex2html-2012-7.fc24.noarch
lksctp-tools-1.0.16-5.fc24.s390x
libfdt-1.4.2-1.fc25.s390x
libXft-devel-2.3.2-4.fc24.s390x
libattr-devel-2.4.47-16.fc24.s390x
libiscsi-devel-1.15.0-2.fc24.s390x
gettext-0.19.8.1-3.fc25.s390x
libjpeg-turbo-devel-1.5.1-0.fc25.s390x
pulseaudio-libs-devel-10.0-2.fc25.s390x
libmount-2.28.2-2.fc25.s390x
python3-decorator-4.0.11-1.fc25.noarch
tzdata-java-2017b-1.fc25.noarch
python-srpm-macros-3-12.fc25.noarch
libsmartcols-2.28.2-2.fc25.s390x
texlive-kpathsea-svn41139-33.fc25.1.noarch
texlive-amsmath-svn41561-33.fc25.1.noarch
texlive-thumbpdf-bin-svn6898.0-33.20160520.fc25.1.noarch
texlive-psnfss-svn33946.9.2a-33.fc25.1.noarch
texlive-subfig-svn15878.1.3-33.fc25.1.noarch
texlive-fancybox-svn18304.1.4-33.fc25.1.noarch
texlive-lua-alt-getopt-svn29349.0.7.0-33.fc25.1.noarch
texlive-natbib-svn20668.8.31b-33.fc25.1.noarch
texlive-pdftex-bin-svn40987-33.20160520.fc25.1.s390x
texlive-xdvi-svn40768-33.fc25.1.noarch
texlive-crop-svn15878.1.5-33.fc25.1.noarch
texlive-babel-english-svn30264.3.3p-33.fc25.1.noarch
texlive-cmextra-svn32831.0-33.fc25.1.noarch
texlive-fancyhdr-svn15878.3.1-33.fc25.1.noarch
texlive-luatex-svn40963-33.fc25.1.noarch
texlive-knuth-local-svn38627-33.fc25.1.noarch
texlive-mflogo-font-svn36898.1.002-33.fc25.1.noarch
texlive-parskip-svn19963.2.0-33.fc25.1.noarch
texlive-section-svn20180.0-33.fc25.1.noarch
texlive-textcase-svn15878.0-33.fc25.1.noarch
texlive-updmap-map-svn41159-33.fc25.1.noarch
texlive-attachfile-svn38830-33.fc25.1.noarch
libtiff-4.0.8-1.fc25.s390x
libdb-5.3.28-24.fc25.s390x
bind-license-9.10.5-2.P2.fc25.noarch
mesa-libGLES-17.0.5-3.fc25.s390x
python3-requests-kerberos-0.10.0-2.fc25.noarch
python3-pyOpenSSL-16.2.0-1.fc25.noarch
perl-threads-2.16-1.fc25.s390x
cryptsetup-libs-1.7.5-1.fc25.s390x
netpbm-10.79.00-1.fc25.s390x
qrencode-libs-3.4.4-1.fc25.s390x
gstreamer1-plugins-base-1.10.5-1.fc25.s390x
elfutils-default-yama-scope-0.169-1.fc25.noarch
systemd-udev-231-17.fc25.s390x
python2-koji-1.13.0-2.fc25.noarch
unbound-libs-1.6.3-1.fc25.s390x
openldap-2.4.44-11.fc25.s390x
koji-1.13.0-2.fc25.noarch
bind99-libs-9.9.10-2.P3.fc25.s390x
mesa-libGL-devel-17.0.5-3.fc25.s390x
graphite2-devel-1.3.10-1.fc25.s390x
systemtap-sdt-devel-3.1-5.fc25.s390x
iproute-tc-4.11.0-1.fc25.s390x
libarchive-3.2.2-2.fc25.s390x
publicsuffix-list-dafsa-20170424-1.fc25.noarch
expat-2.2.3-1.fc25.s390x
p11-kit-0.23.8-1.fc25.s390x
kernel-core-4.12.9-200.fc25.s390x
emacs-filesystem-25.2-3.fc25.noarch
ca-certificates-2017.2.16-1.0.fc25.noarch
librsvg2-2.40.18-1.fc25.s390x
gtk-update-icon-cache-3.22.17-2.fc25.s390x
libidn2-2.0.4-1.fc25.s390x
rpm-libs-4.13.0.1-2.fc25.s390x
mariadb-libs-10.1.25-1.fc25.s390x
java-1.8.0-openjdk-headless-1.8.0.144-5.b01.fc25.s390x
gcc-objc-6.4.1-1.fc25.s390x
p11-kit-devel-0.23.8-1.fc25.s390x
ethtool-4.11-1.fc25.s390x
python2-sssdconfig-1.15.3-1.fc25.noarch
xorg-x11-fonts-ISO8859-1-100dpi-7.5-16.fc24.noarch
lato-fonts-2.015-2.fc24.noarch
python-sphinx-locale-1.5.2-2.fc25.noarch
dpkg-1.17.27-1.fc25.s390x
gnutls-3.5.15-1.fc25.s390x
nss-softokn-freebl-devel-3.32.0-1.2.fc25.s390x
vim-filesystem-8.0.1030-1.fc25.s390x
gnutls-devel-3.5.15-1.fc25.s390x
kernel-headers-4.12.11-200.fc25.s390x
texlive-luaotfload-svn40902-33.fc25.1.noarch
texlive-unicode-math-svn38462-33.fc25.1.noarch
texlive-fancyvrb-svn18492.2.8-33.fc25.1.noarch
texlive-pst-pdf-bin-svn7838.0-33.20160520.fc25.1.noarch
texlive-amscls-svn36804.0-33.fc25.1.noarch
texlive-ltxmisc-svn21927.0-33.fc25.1.noarch
texlive-breqn-svn38099.0.98d-33.fc25.1.noarch
texlive-xetex-def-svn40327-33.fc25.1.noarch
openssh-server-7.4p1-4.fc25.s390x
sendmail-8.15.2-8.fc25.s390x
tzdata-2017b-1.fc25.noarch
hunspell-1.4.1-2.fc25.s390x
gpg-pubkey-8e1431d5-53bcbac7
zlib-1.2.8-10.fc24.s390x
sed-4.2.2-15.fc24.s390x
psmisc-22.21-8.fc24.s390x
gpm-libs-1.20.7-9.fc24.s390x
zip-3.0-16.fc24.s390x
libyubikey-1.13-2.fc24.s390x
sg3_utils-libs-1.41-3.fc24.s390x
polkit-pkla-compat-0.1-7.fc24.s390x
passwd-0.79-8.fc24.s390x
trousers-0.3.13-6.fc24.s390x
grubby-8.40-3.fc24.s390x
rootfiles-8.1-19.fc24.noarch
nettle-3.3-1.fc25.s390x
libksba-1.3.5-1.fc25.s390x
perl-Text-ParseWords-3.30-365.fc25.noarch
perl-PathTools-3.63-366.fc25.s390x
perl-File-Temp-0.23.04-365.fc25.noarch
fuse-libs-2.9.7-1.fc25.s390x
perl-Pod-Escapes-1.07-365.fc25.noarch
perl-Term-ANSIColor-4.05-2.fc25.noarch
perl-URI-1.71-5.fc25.noarch
libXfont-1.5.2-1.fc25.s390x
python-six-1.10.0-3.fc25.noarch
dbus-glib-0.108-1.fc25.s390x
gobject-introspection-1.50.0-1.fc25.s390x
libpwquality-1.3.0-6.fc25.s390x
python-gobject-base-3.22.0-1.fc25.s390x
python-html5lib-0.999-9.fc25.noarch
python3-dbus-1.2.4-2.fc25.s390x
python3-chardet-2.3.0-1.fc25.noarch
python3-urllib3-1.15.1-3.fc25.noarch
python-offtrac-0.1.0-7.fc25.noarch
python2-cryptography-1.5.3-3.fc25.s390x
python2-requests-kerberos-0.10.0-2.fc25.noarch
libserf-1.3.9-1.fc25.s390x
libdatrie-0.2.9-3.fc25.s390x
s390utils-base-1.36.0-1.fc25.s390x
kpartx-0.4.9-83.fc25.s390x
s390utils-cpuplugd-1.36.0-1.fc25.s390x
s390utils-osasnmpd-1.36.0-1.fc25.s390x
python-dnf-plugins-extras-common-0.0.12-4.fc25.noarch
fpc-srpm-macros-1.0-1.fc25.noarch
libuser-0.62-4.fc25.s390x
man-db-2.7.5-3.fc25.s390x
python-systemd-doc-232-1.fc25.s390x
bodhi-client-0.9.12.2-6.fc25.noarch
cairo-1.14.8-1.fc25.s390x
cracklib-dicts-2.9.6-4.fc25.s390x
libselinux-python3-2.5-13.fc25.s390x
python2-enchant-1.6.8-1.fc25.noarch
boost-iostreams-1.60.0-10.fc25.s390x
userspace-rcu-0.9.2-2.fc25.s390x
libXext-devel-1.3.3-4.fc24.s390x
libXrandr-devel-1.5.1-1.fc25.s390x
python3-lxml-3.7.2-1.fc25.s390x
libiscsi-1.15.0-2.fc24.s390x
fontconfig-devel-2.12.1-1.fc25.s390x
libfdt-devel-1.4.2-1.fc25.s390x
ceph-devel-compat-10.2.4-2.fc25.s390x
zlib-static-1.2.8-10.fc24.s390x
chrpath-0.16-3.fc24.s390x
info-6.1-4.fc25.s390x
iptables-libs-1.6.0-3.fc25.s390x
libfdisk-2.28.2-2.fc25.s390x
dnf-plugins-core-0.1.21-5.fc25.noarch
perl-Storable-2.56-368.fc25.s390x
python2-decorator-4.0.11-1.fc25.noarch
libnetfilter_conntrack-1.0.6-2.fc25.s390x
texlive-texlive.infra-bin-svn40312-33.20160520.fc25.1.s390x
texlive-ifluatex-svn41346-33.fc25.1.noarch
texlive-fp-svn15878.0-33.fc25.1.noarch
texlive-latex-fonts-svn28888.0-33.fc25.1.noarch
texlive-bibtex-bin-svn40473-33.20160520.fc25.1.s390x
texlive-glyphlist-svn28576.0-33.fc25.1.noarch
texlive-marvosym-svn29349.2.2a-33.fc25.1.noarch
texlive-tex-bin-svn40987-33.20160520.fc25.1.s390x
texlive-texconfig-svn40768-33.fc25.1.noarch
texlive-wasy2-ps-svn35830.0-33.fc25.1.noarch
texlive-psfrag-svn15878.3.04-33.fc25.1.noarch
texlive-charter-svn15878.0-33.fc25.1.noarch
texlive-ec-svn25033.1.0-33.fc25.1.noarch
texlive-lineno-svn21442.4.41-33.fc25.1.noarch
texlive-hyphen-base-svn41138-33.fc25.1.noarch
texlive-manfnt-font-svn35799.0-33.fc25.1.noarch
texlive-ncntrsbk-svn31835.0-33.fc25.1.noarch
texlive-pst-math-svn34786.0.63-33.fc25.1.noarch
texlive-symbol-svn31835.0-33.fc25.1.noarch
texlive-environ-svn33821.0.3-33.fc25.1.noarch
texlive-algorithms-svn38085.0.1-33.fc25.1.noarch
python3-hawkey-0.6.4-3.fc25.s390x
freetype-2.6.5-9.fc25.s390x
mesa-libwayland-egl-17.0.5-3.fc25.s390x
libicu-57.1-5.fc25.s390x
libnl3-cli-3.2.29-3.fc25.s390x
cups-libs-2.2.0-9.fc25.s390x
bind-libs-lite-9.10.5-2.P2.fc25.s390x
python3-kerberos-1.2.5-1.fc25.s390x
python3-cryptography-1.5.3-3.fc25.s390x
perl-IO-1.36-387.fc25.s390x
dhcp-libs-4.3.5-3.fc25.s390x
rsync-3.1.2-4.fc25.s390x
make-4.1-6.fc25.s390x
quota-4.03-8.fc25.s390x
libX11-devel-1.6.5-1.fc25.s390x
ghostscript-9.20-9.fc25.s390x
rpcbind-0.2.4-6.rc2.fc25.s390x
pyOpenSSL-16.2.0-1.fc25.noarch
python3-pycurl-7.43.0-6.fc25.s390x
bind99-license-9.9.10-2.P3.fc25.noarch
python-firewall-0.4.4.5-1.fc25.noarch
netpbm-progs-10.79.00-1.fc25.s390x
wget-1.18-3.fc25.s390x
libsemanage-2.5-9.fc25.s390x
telnet-0.17-68.fc25.s390x
gdk-pixbuf2-2.36.9-1.fc25.s390x
dbus-libs-1.11.16-1.fc25.s390x
glusterfs-client-xlators-3.10.5-1.fc25.s390x
libepoxy-1.4.3-1.fc25.1.s390x
dracut-046-2.git20170811.fc25.s390x
net-snmp-libs-5.7.3-15.fc25.s390x
libgo-devel-6.4.1-1.fc25.s390x
libglvnd-opengl-0.2.999-24.20170818git8d4d03f.fc25.s390x
sqlite-devel-3.14.2-3.fc25.s390x
cpp-6.4.1-1.fc25.s390x
git-2.9.5-1.fc25.s390x
pcre2-10.23-9.fc25.s390x
python2-GitPython-2.1.5-1.fc25.noarch
glusterfs-devel-3.10.5-1.fc25.s390x
net-snmp-5.7.3-15.fc25.s390x
rpm-plugin-systemd-inhibit-4.13.0.1-2.fc25.s390x
emacs-25.2-3.fc25.s390x
libstdc++-static-6.4.1-1.fc25.s390x
expat-devel-2.2.3-1.fc25.s390x
perl-Time-HiRes-1.9744-1.fc25.s390x
fontawesome-fonts-4.7.0-1.fc25.noarch
python-markupsafe-0.23-10.fc25.s390x
pytz-2016.6.1-1.fc25.noarch
python2-sphinx-1.5.2-2.fc25.noarch
nss-util-3.32.0-1.0.fc25.s390x
nss-sysinit-3.32.0-1.1.fc25.s390x
python3-3.5.4-1.fc25.s390x
selinux-policy-targeted-3.13.1-225.22.fc25.noarch
vim-minimal-8.0.1030-1.fc25.s390x
texlive-ifplatform-svn21156.0.4-33.fc25.1.noarch
texlive-eso-pic-svn37925.2.0g-33.fc25.1.noarch
texlive-xcolor-svn41044-33.fc25.1.noarch
texlive-pst-eps-svn15878.1.0-33.fc25.1.noarch
texlive-pst-text-svn15878.1.00-33.fc25.1.noarch
texlive-rotating-svn16832.2.16b-33.fc25.1.noarch
texlive-pdfpages-svn40638-33.fc25.1.noarch
texlive-cm-super-svn15878.0-33.fc25.1.noarch
texlive-xetex-svn41438-33.fc25.1.noarch
dnf-yum-1.1.10-6.fc25.noarch
libseccomp-devel-2.3.2-1.fc25.s390x
gpgme-1.8.0-10.fc25.s390x
apr-util-1.5.4-3.fc24.s390x
jbigkit-libs-2.1-5.fc24.s390x
pixman-0.34.0-2.fc24.s390x
dwz-0.12-2.fc24.s390x
expect-5.45-22.fc24.s390x
libsigsegv-2.10-10.fc24.s390x
fakeroot-libs-1.20.2-4.fc24.s390x
m17n-lib-1.7.0-5.fc24.s390x
libverto-0.2.6-6.fc24.s390x
libXmu-1.1.2-4.fc24.s390x
libXcursor-1.1.14-6.fc24.s390x
python-kitchen-1.2.4-2.fc24.noarch
fakeroot-1.20.2-4.fc24.s390x
blktrace-1.1.0-3.fc24.s390x
usermode-1.111-8.fc24.s390x
kbd-2.0.3-3.fc24.s390x
libaio-devel-0.3.110-6.fc24.s390x
web-assets-filesystem-5-4.fc24.noarch
libgpg-error-1.24-1.fc25.s390x
findutils-4.6.0-8.fc25.s390x
libassuan-2.4.3-1.fc25.s390x
libusbx-1.0.21-1.fc25.s390x
libxslt-1.1.28-13.fc25.s390x
libmetalink-0.1.3-1.fc25.s390x
perl-MIME-Base64-3.15-365.fc25.s390x
ncurses-6.0-6.20160709.fc25.s390x
libwayland-server-1.12.0-1.fc25.s390x
perl-Fedora-VSP-0.001-4.fc25.noarch
perl-libintl-perl-1.26-1.fc25.s390x
shadow-utils-4.2.1-11.fc25.s390x
atk-2.22.0-1.fc25.s390x
pam-1.3.0-1.fc25.s390x
harfbuzz-icu-1.3.2-1.fc25.s390x
libsecret-0.18.5-2.fc25.s390x
s390utils-iucvterm-1.36.0-1.fc25.s390x
python3-requests-2.10.0-4.fc25.noarch
pyusb-1.0.0-2.fc25.noarch
python-enum34-1.0.4-6.fc25.noarch
pyxattr-0.5.3-8.fc25.s390x
libbabeltrace-1.4.0-3.fc25.s390x
libthai-0.1.25-1.fc25.s390x
deltarpm-3.6-17.fc25.s390x
s390utils-mon_statd-1.36.0-1.fc25.s390x
device-mapper-multipath-0.4.9-83.fc25.s390x
python3-pygpgme-0.3-18.fc25.s390x
libreport-filesystem-2.8.0-1.fc25.s390x
ghc-srpm-macros-1.4.2-4.fc25.noarch
rpmdevtools-8.9-1.fc25.noarch
python-dnf-plugins-extras-migrate-0.0.12-4.fc25.noarch
perl-IO-Socket-SSL-2.038-1.fc25.noarch
perl-File-ShareDir-1.102-7.fc25.noarch
tcl-8.6.6-1.fc25.s390x
bzip2-1.0.6-21.fc25.s390x
libss-1.43.3-1.fc25.s390x
libselinux-utils-2.5-13.fc25.s390x
python3-enchant-1.6.8-1.fc25.noarch
python2-dockerfile-parse-0.0.5-7.fc25.noarch
systemd-bootchart-231-2.fc25.s390x
e2fsprogs-1.43.3-1.fc25.s390x
libpng-devel-1.6.27-1.fc25.s390x
perl-XML-Parser-2.44-5.fc25.s390x
lttng-ust-2.8.1-2.fc25.s390x
libXfixes-devel-5.0.3-1.fc25.s390x
libXcomposite-devel-0.4.4-8.fc24.s390x
python3-javapackages-4.7.0-6.1.fc25.noarch
libcephfs_jni-devel-10.2.4-2.fc25.s390x
keyutils-libs-devel-1.5.9-8.fc24.s390x
harfbuzz-devel-1.3.2-1.fc25.s390x
libidn-devel-1.33-1.fc25.s390x
libnfs-1.9.8-2.fc24.s390x
libssh2-devel-1.8.0-1.fc25.s390x
qemu-sanity-check-nodeps-1.1.5-5.fc24.s390x
alsa-lib-devel-1.1.1-2.fc25.s390x
libpsl-0.17.0-1.fc25.s390x
libseccomp-2.3.2-1.fc25.s390x
json-glib-1.2.6-1.fc25.s390x
python2-dnf-1.1.10-6.fc25.noarch
texlive-tetex-bin-svn36770.0-33.20160520.fc25.1.noarch
texlive-amsfonts-svn29208.3.04-33.fc25.1.noarch
texlive-babel-svn40706-33.fc25.1.noarch
texlive-colortbl-svn29803.v1.0a-33.fc25.1.noarch
texlive-babelbib-svn25245.1.31-33.fc25.1.noarch
texlive-footmisc-svn23330.5.5b-33.fc25.1.noarch
texlive-makeindex-svn40768-33.fc25.1.noarch
texlive-plain-svn40274-33.fc25.1.noarch
texlive-texconfig-bin-svn29741.0-33.20160520.fc25.1.noarch
texlive-zapfding-svn31835.0-33.fc25.1.noarch
texlive-microtype-svn41127-33.fc25.1.noarch
texlive-bookman-svn31835.0-33.fc25.1.noarch
texlive-dvisvgm-def-svn41011-33.fc25.1.noarch
texlive-finstrut-svn21719.0.5-33.fc25.1.noarch
texlive-hyph-utf8-svn41189-33.fc25.1.noarch
texlive-lualibs-svn40370-33.fc25.1.noarch
python2-hawkey-0.6.4-3.fc25.s390x
elfutils-libelf-0.169-1.fc25.s390x
libnl3-3.2.29-3.fc25.s390x
gstreamer1-1.10.5-1.fc25.s390x
polkit-libs-0.113-8.fc25.s390x
libtirpc-1.0.2-0.fc25.s390x
libteam-1.27-1.fc25.s390x
python3-pyasn1-0.2.3-1.fc25.noarch
perl-File-Path-2.12-366.fc25.noarch
mesa-libwayland-egl-devel-17.0.5-3.fc25.s390x
libacl-devel-2.2.52-13.fc25.s390x
lua-libs-5.3.4-3.fc25.s390x
quota-nls-4.03-8.fc25.noarch
ghostscript-x11-9.20-9.fc25.s390x
systemd-231-17.fc25.s390x
dhcp-common-4.3.5-3.fc25.noarch
vte291-devel-0.46.2-1.fc25.s390x
python-devel-2.7.13-2.fc25.s390x
elfutils-0.169-1.fc25.s390x
lua-5.3.4-3.fc25.s390x
python3-beautifulsoup4-4.6.0-1.fc25.noarch
libmicrohttpd-0.9.55-1.fc25.s390x
screen-4.6.1-1.fc25.s390x
strace-4.18-1.fc25.s390x
libstdc++-6.4.1-1.fc25.s390x
glusterfs-3.10.5-1.fc25.s390x
file-5.29-9.fc25.s390x
libgo-6.4.1-1.fc25.s390x
tar-1.29-4.fc25.s390x
subversion-libs-1.9.7-1.fc25.s390x
libglvnd-gles-0.2.999-24.20170818git8d4d03f.fc25.s390x
gdk-pixbuf2-modules-2.36.9-1.fc25.s390x
gcc-6.4.1-1.fc25.s390x
curl-7.51.0-9.fc25.s390x
pcre2-utf16-10.23-9.fc25.s390x
mariadb-config-10.1.25-1.fc25.s390x
distribution-gpg-keys-1.14-1.fc25.noarch
libcurl-devel-7.51.0-9.fc25.s390x
gtk3-devel-3.22.17-2.fc25.s390x
krb5-devel-1.14.4-8.fc25.s390x
wpa_supplicant-2.6-3.fc25.s390x
fontawesome-fonts-web-4.7.0-1.fc25.noarch
python2-pygments-2.2.0-7.fc25.noarch
python2-babel-2.3.4-2.fc25.noarch
doxygen-1.8.13-9.fc25.s390x
nspr-devel-4.16.0-1.fc25.s390x
kernel-core-4.12.11-200.fc25.s390x
rpmlint-1.10-3.fc25.noarch
vim-enhanced-8.0.1030-1.fc25.s390x
openjpeg2-2.2.0-3.fc25.s390x
texlive-mparhack-svn15878.1.4-33.fc25.1.noarch
texlive-pspicture-svn15878.0-33.fc25.1.noarch
texlive-soul-svn15878.2.4-33.fc25.1.noarch
texlive-trimspaces-svn15878.1.1-33.fc25.1.noarch
texlive-varwidth-svn24104.0.92-33.fc25.1.noarch
texlive-geometry-svn19716.5.6-33.fc25.1.noarch
texlive-memoir-svn41203-33.fc25.1.noarch
texlive-pgf-svn40966-33.fc25.1.noarch
texlive-pst-coil-svn37377.1.07-33.fc25.1.noarch
texlive-pst-plot-svn41242-33.fc25.1.noarch
texlive-latex-bin-svn41438-33.fc25.1.noarch
texlive-ucs-svn35853.2.2-33.fc25.1.noarch
texlive-ae-svn15878.1.4-33.fc25.1.noarch
texlive-xetex-bin-svn41091-33.20160520.fc25.1.s390x
fedora-upgrade-26.1-1.fc25.noarch
perl-Thread-Queue-3.12-1.fc25.noarch
cdparanoia-libs-10.2-21.fc24.s390x
ustr-1.0.4-21.fc24.s390x
libusb-0.1.5-7.fc24.s390x
readline-devel-6.3-8.fc24.s390x
chkconfig-1.8-1.fc25.s390x
avahi-libs-0.6.32-4.fc25.s390x
perl-Unicode-Normalize-1.25-365.fc25.s390x
perl-libnet-3.10-1.fc25.noarch
perl-podlators-4.09-1.fc25.noarch
dbus-python-1.2.4-2.fc25.s390x
libgnome-keyring-3.12.0-7.fc25.s390x
python-backports-1.0-8.fc25.s390x
python-pycparser-2.14-7.fc25.noarch
plymouth-scripts-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
cronie-1.5.1-2.fc25.s390x
python2-librepo-1.7.18-3.fc25.s390x
libXv-1.0.11-1.fc25.s390x
python2-ndg_httpsclient-0.4.0-4.fc25.noarch
btrfs-progs-4.6.1-1.fc25.s390x
perl-Encode-2.88-5.fc25.s390x
cracklib-2.9.6-4.fc25.s390x
python3-dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
boost-random-1.60.0-10.fc25.s390x
libref_array-0.1.5-29.fc25.s390x
libXrender-devel-0.9.10-1.fc25.s390x
javapackages-tools-4.7.0-6.1.fc25.noarch
keyutils-1.5.9-8.fc24.s390x
libcom_err-devel-1.43.3-1.fc25.s390x
lzo-minilzo-2.08-8.fc24.s390x
libusbx-devel-1.0.21-1.fc25.s390x
virglrenderer-devel-0.5.0-1.20160411git61846f92f.fc25.s390x
acpica-tools-20160831-1.fc25.s390x
grep-2.27-2.fc25.s390x
dnf-conf-1.1.10-6.fc25.noarch
crypto-policies-20160921-4.gitf3018dd.fc25.noarch
libnfsidmap-0.27-1.fc25.s390x
SDL2-2.0.5-3.fc25.s390x
texlive-etex-pkg-svn39355-33.fc25.1.noarch
texlive-multido-svn18302.1.42-33.fc25.1.noarch
texlive-gsftopk-svn40768-33.fc25.1.noarch
texlive-pst-ovl-svn40873-33.fc25.1.noarch
texlive-ltabptch-svn17533.1.74d-33.fc25.1.noarch
texlive-cite-svn36428.5.5-33.fc25.1.noarch
texlive-fpl-svn15878.1.002-33.fc25.1.noarch
texlive-mathpazo-svn15878.1.003-33.fc25.1.noarch
texlive-rcs-svn15878.0-33.fc25.1.noarch
texlive-type1cm-svn21820.0-33.fc25.1.noarch
texlive-l3kernel-svn41246-33.fc25.1.noarch
texlive-hyperref-svn41396-33.fc25.1.noarch
texlive-pst-tree-svn24142.1.12-33.fc25.1.noarch
texlive-sansmathaccent-svn30187.0-33.fc25.1.noarch
texlive-dvipdfmx-bin-svn40273-33.20160520.fc25.1.s390x
texlive-zapfchan-svn31835.0-33.fc25.1.noarch
glib2-static-2.50.3-1.fc25.s390x
bash-completion-2.5-1.fc25.noarch
hyphen-2.8.8-4.fc24.s390x
python3-idna-2.5-1.fc25.noarch
less-481-7.fc25.s390x
rpmconf-base-1.0.19-1.fc25.noarch
gtk2-2.24.31-2.fc25.s390x
mesa-libgbm-17.0.5-3.fc25.s390x
nfs-utils-2.1.1-5.rc4.fc25.s390x
mc-4.8.19-5.fc25.s390x
pcre-static-8.41-1.fc25.s390x
bind-libs-9.10.5-2.P2.fc25.s390x
libproxy-0.4.15-2.fc25.s390x
file-libs-5.29-9.fc25.s390x
glibc-devel-2.24-10.fc25.s390x
glusterfs-server-3.10.5-1.fc25.s390x
git-core-doc-2.9.5-1.fc25.s390x
python2-smmap-2.0.3-1.fc25.noarch
glusterfs-api-devel-3.10.5-1.fc25.s390x
gcc-gdb-plugin-6.4.1-1.fc25.s390x
python3-magic-5.29-9.fc25.noarch
GeoIP-GeoLite-data-2017.07-1.fc25.noarch
python2-funcsigs-1.0.2-2.fc25.noarch
dos2unix-7.3.4-1.fc25.s390x
gnutls-c++-3.5.15-1.fc25.s390x
nss-tools-3.32.0-1.1.fc25.s390x
gpg-pubkey-a29cb19c-53bcbba6
m4-1.4.17-9.fc24.s390x
liblockfile-1.09-4.fc24.s390x
sg3_utils-1.41-3.fc24.s390x
libXinerama-1.1.3-6.fc24.s390x
libXft-2.3.2-4.fc24.s390x
tcp_wrappers-libs-7.6-83.fc25.s390x
perl-Text-Tabs+Wrap-2013.0523-365.fc25.noarch
perl-Error-0.17024-7.fc25.noarch
perl-Term-Cap-1.17-365.fc25.noarch
perl-Pod-Usage-1.69-1.fc25.noarch
device-mapper-persistent-data-0.6.3-1.fc25.s390x
python3-six-1.10.0-3.fc25.noarch
python3-pysocks-1.5.6-5.fc25.noarch
python-chardet-2.3.0-1.fc25.noarch
python2-cffi-1.7.0-2.fc25.s390x
gc-devel-7.4.4-1.fc25.s390x
plymouth-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
ebtables-2.0.10-21.fc25.s390x
python3-librepo-1.7.18-3.fc25.s390x
at-spi2-atk-2.22.0-1.fc25.s390x
avahi-autoipd-0.6.32-4.fc25.s390x
pyparsing-2.1.10-1.fc25.noarch
python3-pyparsing-2.1.10-1.fc25.noarch
libcollection-0.7.0-29.fc25.s390x
libcephfs-devel-10.2.4-2.fc25.s390x
libXdamage-devel-1.1.4-8.fc24.s390x
libverto-devel-0.2.6-6.fc24.s390x
snappy-1.1.3-2.fc24.s390x
cairo-gobject-devel-1.14.8-1.fc25.s390x
cyrus-sasl-devel-2.1.26-26.2.fc24.s390x
libXi-1.7.9-1.fc25.s390x
texlive-base-2016-33.20160520.fc25.noarch
texlive-booktabs-svn40846-33.fc25.1.noarch
texlive-lm-svn28119.2.004-33.fc25.1.noarch
texlive-gsftopk-bin-svn40473-33.20160520.fc25.1.s390x
texlive-tex-svn40793-33.fc25.1.noarch
texlive-fancyref-svn15878.0.9c-33.fc25.1.noarch
texlive-chngcntr-svn17157.1.0a-33.fc25.1.noarch
texlive-fix2col-svn38770-33.fc25.1.noarch
texlive-marginnote-svn41382-33.fc25.1.noarch
texlive-pxfonts-svn15878.0-33.fc25.1.noarch
texlive-txfonts-svn15878.0-33.fc25.1.noarch
texlive-l3packages-svn41246-33.fc25.1.noarch
texlive-oberdiek-svn41346-33.fc25.1.noarch
texlive-pst-tools-svn34067.0.05-33.fc25.1.noarch
texlive-tex-gyre-svn18651.2.004-33.fc25.1.noarch
texlive-dvipdfmx-svn41149-33.fc25.1.noarch
texlive-collection-fontsrecommended-svn35830.0-33.20160520.fc25.1.noarch
libcacard-devel-2.5.3-1.fc25.s390x
ykpers-1.18.0-2.fc25.s390x
python2-idna-2.5-1.fc25.noarch
policycoreutils-2.5-20.fc25.s390x
libgcrypt-1.7.8-1.fc25.s390x
pcre-8.41-1.fc25.s390x
GeoIP-1.6.11-1.fc25.s390x
ghostscript-core-9.20-9.fc25.s390x
python3-cffi-1.7.0-2.fc25.s390x
json-c-0.12.1-2.fc25.s390x
vte291-0.46.2-1.fc25.s390x
gssproxy-0.7.0-9.fc25.s390x
systemtap-3.1-5.fc25.s390x
mesa-libgbm-devel-17.0.5-3.fc25.s390x
libgusb-0.2.10-1.fc25.s390x
kernel-modules-4.12.9-200.fc25.s390x
sqlite-3.14.2-3.fc25.s390x
perl-Git-2.9.5-1.fc25.noarch
python2-gitdb-2.0.2-1.fc25.noarch
libglvnd-devel-0.2.999-24.20170818git8d4d03f.fc25.s390x
gcc-c++-6.4.1-1.fc25.s390x
python-magic-5.29-9.fc25.noarch
kernel-devel-4.12.9-200.fc25.s390x
python2-mock-2.0.0-2.fc25.noarch
nspr-4.16.0-1.fc25.s390x
python3-libs-3.5.4-1.fc25.s390x
system-python-3.5.4-1.fc25.s390x
python-async-0.6.1-9.fc22.s390x
dejavu-sans-mono-fonts-2.35-3.fc24.noarch
popt-1.16-7.fc24.s390x
cyrus-sasl-lib-2.1.26-26.2.fc24.s390x
xz-5.2.2-2.fc24.s390x
libpipeline-1.4.1-2.fc24.s390x
pinentry-0.9.7-2.fc24.s390x
pth-2.0.7-27.fc24.s390x
libsepol-2.5-10.fc25.s390x
libxcb-1.12-1.fc25.s390x
perl-Getopt-Long-2.49.1-1.fc25.noarch
avahi-glib-0.6.32-4.fc25.s390x
python3-pip-8.1.2-2.fc25.noarch
python3-libcomps-0.1.7-5.fc25.s390x
python-slip-0.6.4-4.fc25.noarch
python2-libcomps-0.1.7-5.fc25.s390x
gc-7.4.4-1.fc25.s390x
s390utils-cmsfs-1.36.0-1.fc25.s390x
newt-python-0.52.19-2.fc25.s390x
qt5-srpm-macros-5.7.1-1.fc25.noarch
device-mapper-event-1.02.136-3.fc25.s390x
perl-Class-Inspector-1.31-2.fc25.noarch
libbasicobjects-0.1.1-29.fc25.s390x
libradosstriper1-10.2.4-2.fc25.s390x
libXxf86vm-devel-1.1.4-3.fc24.s390x
zziplib-0.13.62-7.fc24.s390x
libpaper-1.1.24-12.fc24.s390x
libini_config-1.3.0-29.fc25.s390x
snappy-devel-1.1.3-2.fc24.s390x
libcap-ng-devel-0.7.8-1.fc25.s390x
libxkbcommon-devel-0.7.1-1.fc25.s390x
openssl-libs-1.0.2k-1.fc25.s390x
util-linux-2.28.2-2.fc25.s390x
texlive-etoolbox-svn38031.2.2a-33.fc25.1.noarch
texlive-dvips-svn41149-33.fc25.1.noarch
texlive-latexconfig-svn40274-33.fc25.1.noarch
texlive-tex-ini-files-svn40533-33.fc25.1.noarch
texlive-qstest-svn15878.0-33.fc25.1.noarch
texlive-cmap-svn41168-33.fc25.1.noarch
texlive-luatex-bin-svn41091-33.20160520.fc25.1.s390x
texlive-mflogo-svn38628-33.fc25.1.noarch
texlive-sansmath-svn17997.1.1-33.fc25.1.noarch
texlive-unicode-data-svn39808-33.fc25.1.noarch
texlive-luaotfload-bin-svn34647.0-33.20160520.fc25.1.noarch
texlive-listings-svn37534.1.6-33.fc25.1.noarch
texlive-pstricks-svn41321-33.fc25.1.noarch
texlive-metalogo-svn18611.0.12-33.fc25.1.noarch
texlive-collection-latex-svn41011-33.20160520.fc25.1.noarch
python2-dnf-plugins-core-0.1.21-5.fc25.noarch
xkeyboard-config-2.20-2.fc25.noarch
perl-Test-Harness-3.39-1.fc25.noarch
systemd-libs-231-17.fc25.s390x
python3-pycparser-2.14-7.fc25.noarch
kernel-devel-4.11.10-200.fc25.s390x
gsm-1.0.17-1.fc25.s390x
python-2.7.13-2.fc25.s390x
kernel-4.11.10-200.fc25.s390x
rpmconf-1.0.19-1.fc25.noarch
teamd-1.27-1.fc25.s390x
jasper-libs-1.900.13-4.fc25.s390x
glusterfs-libs-3.10.5-1.fc25.s390x
libcrypt-nss-2.24-10.fc25.s390x
emacs-common-25.2-3.fc25.s390x
libcurl-7.51.0-9.fc25.s390x
java-1.8.0-openjdk-1.8.0.144-5.b01.fc25.s390x
gcc-go-6.4.1-1.fc25.s390x
perl-XML-XPath-1.39-2.fc25.noarch
python2-sphinx_rtd_theme-0.1.9-2.fc24.noarch
libxml2-devel-2.9.4-2.fc25.s390x
nss-softokn-devel-3.32.0-1.2.fc25.s390x
nss-devel-3.32.0-1.1.fc25.s390x
libattr-2.4.47-16.fc24.s390x
libvisual-0.4.0-20.fc24.s390x
libpcap-1.7.4-2.fc24.s390x
libutempter-1.1.6-8.fc24.s390x
libgudev-230-3.fc24.s390x
popt-devel-1.16-7.fc24.s390x
hicolor-icon-theme-0.15-3.fc24.noarch
setup-2.10.4-1.fc25.noarch
bash-4.3.43-4.fc25.s390x
libjpeg-turbo-1.5.1-0.fc25.s390x
perl-Socket-2.024-1.fc25.s390x
perl-HTTP-Tiny-0.070-1.fc25.noarch
ipset-6.29-1.fc25.s390x
python2-setuptools-25.1.1-1.fc25.noarch
gsettings-desktop-schemas-3.22.0-1.fc25.s390x
python3-setuptools-25.1.1-1.fc25.noarch
python-slip-dbus-0.6.4-4.fc25.noarch
python2-ply-3.8-2.fc25.noarch
dtc-1.4.2-1.fc25.s390x
guile-2.0.13-1.fc25.s390x
cronie-anacron-1.5.1-2.fc25.s390x
libXtst-1.2.3-1.fc25.s390x
iso-codes-3.70-1.fc25.noarch
s390utils-1.36.0-1.fc25.s390x
python-backports-ssl_match_hostname-3.5.0.1-3.fc25.noarch
fedora-cert-0.6.0.1-1.fc25.noarch
dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
lvm2-2.02.167-3.fc25.s390x
libselinux-devel-2.5-13.fc25.s390x
perl-Time-Local-1.250-1.fc25.noarch
libradosstriper-devel-10.2.4-2.fc25.s390x
flac-libs-1.3.2-1.fc25.s390x
perl-Digest-1.17-366.fc25.noarch
teckit-2.5.1-15.fc24.s390x
libpath_utils-0.2.1-29.fc25.s390x
attr-2.4.47-16.fc24.s390x
usbredir-0.7.1-2.fc24.s390x
cairo-devel-1.14.8-1.fc25.s390x
lzo-devel-2.08-8.fc24.s390x
libcap-devel-2.25-2.fc25.s390x
libbsd-0.8.3-1.fc25.s390x
texlive-url-svn32528.3.4-33.fc25.1.noarch
texlive-dvips-bin-svn40987-33.20160520.fc25.1.s390x
texlive-index-svn24099.4.1beta-33.fc25.1.noarch
texlive-setspace-svn24881.6.7a-33.fc25.1.noarch
texlive-mathtools-svn38833-33.fc25.1.noarch
texlive-cm-svn32865.0-33.fc25.1.noarch
texlive-graphics-def-svn41879-33.fc25.1.noarch
texlive-mdwtools-svn15878.1.05.4-33.fc25.1.noarch
texlive-rsfs-svn15878.0-33.fc25.1.noarch
texlive-ucharcat-svn38907-33.fc25.1.noarch
texlive-fontspec-svn41262-33.fc25.1.noarch
texlive-showexpl-svn32737.v0.3l-33.fc25.1.noarch
texlive-pstricks-add-svn40744-33.fc25.1.noarch
texlive-beamer-svn36461.3.36-33.fc25.1.noarch
texlive-collection-basic-svn41149-33.20160520.fc25.1.noarch
xemacs-filesystem-21.5.34-20.20170124hgf412e9f093d4.fc25.noarch
hawkey-0.6.4-3.fc25.s390x
bluez-libs-5.44-1.fc25.s390x
audit-libs-2.7.7-1.fc25.s390x
iproute-4.11.0-1.fc25.s390x
libICE-1.0.9-9.fc25.s390x
python3-ply-3.8-2.fc25.noarch
perl-5.24.2-387.fc25.s390x
graphite2-1.3.10-1.fc25.s390x
vte-profile-0.46.2-1.fc25.s390x
python-libs-2.7.13-2.fc25.s390x
mesa-libGL-17.0.5-3.fc25.s390x
python2-pycurl-7.43.0-6.fc25.s390x
NetworkManager-1.4.4-5.fc25.s390x
mesa-libEGL-devel-17.0.5-3.fc25.s390x
mesa-libGLES-devel-17.0.5-3.fc25.s390x
hostname-3.15-8.fc25.s390x
glibc-headers-2.24-10.fc25.s390x
glusterfs-cli-3.10.5-1.fc25.s390x
git-core-2.9.5-1.fc25.s390x
mock-1.4.3-1.fc25.noarch
gcc-gfortran-6.4.1-1.fc25.s390x
webkitgtk4-plugin-process-gtk2-2.16.6-1.fc25.s390x
perl-Module-CoreList-5.20170821-1.fc25.noarch
python2-pbr-1.10.0-1.fc25.noarch
libtool-2.4.6-14.fc25.s390x
gnutls-dane-3.5.15-1.fc25.s390x
kernel-4.12.11-200.fc25.s390x
gpg-pubkey-a0a7badb-52844296
readline-6.3-8.fc24.s390x
cpio-2.12-3.fc24.s390x
libXcomposite-0.4.4-8.fc24.s390x
procps-ng-3.3.10-11.fc24.s390x
GConf2-3.2.6-16.fc24.s390x
xz-devel-5.2.2-2.fc24.s390x
fedora-logos-22.0.0-3.fc24.s390x
gpg-pubkey-e372e838-56fd7943
kmod-libs-23-1.fc25.s390x
perl-parent-0.236-1.fc25.noarch
perl-TermReadKey-2.37-1.fc25.s390x
ncurses-c++-libs-6.0-6.20160709.fc25.s390x
gzip-1.8-1.fc25.s390x
python3-gobject-base-3.22.0-1.fc25.s390x
python2-yubico-1.3.2-3.fc25.noarch
s390utils-ziomon-1.36.0-1.fc25.s390x
librepo-1.7.18-3.fc25.s390x
gnat-srpm-macros-4-1.fc25.noarch
python-decoratortools-1.8-12.fc25.noarch
m17n-db-1.7.0-7.fc25.noarch
e2fsprogs-libs-1.43.3-1.fc25.s390x
libvorbis-1.3.5-1.fc25.s390x
npth-1.3-1.fc25.s390x
libcephfs1-10.2.4-2.fc25.s390x
wayland-devel-1.12.0-1.fc25.s390x
libxcb-devel-1.12-1.fc25.s390x
perl-encoding-2.19-5.fc25.s390x
python3-cssselect-0.9.2-1.fc25.noarch
gettext-libs-0.19.8.1-3.fc25.s390x
at-spi2-atk-devel-2.22.0-1.fc25.s390x
virglrenderer-0.5.0-1.20160411git61846f92f.fc25.s390x
pixman-devel-0.34.0-2.fc24.s390x
libnfs-devel-1.9.8-2.fc24.s390x
libblkid-2.28.2-2.fc25.s390x
glib2-devel-2.50.3-1.fc25.s390x
texlive-ifxetex-svn19685.0.5-33.fc25.1.noarch
texlive-caption-svn41409-33.fc25.1.noarch
texlive-float-svn15878.1.3d-33.fc25.1.noarch
texlive-pdftex-def-svn22653.0.06d-33.fc25.1.noarch
texlive-xdvi-bin-svn40750-33.20160520.fc25.1.s390x
texlive-beton-svn15878.0-33.fc25.1.noarch
texlive-filecontents-svn24250.1.3-33.fc25.1.noarch
texlive-lm-math-svn36915.1.959-33.fc25.1.noarch
texlive-pslatex-svn16416.0-33.fc25.1.noarch
texlive-times-svn35058.0-33.fc25.1.noarch
texlive-breakurl-svn29901.1.40-33.fc25.1.noarch
texlive-filehook-svn24280.0.5d-33.fc25.1.noarch
texlive-pst-pdf-svn31660.1.1v-33.fc25.1.noarch
texlive-seminar-svn34011.1.62-33.fc25.1.noarch
texlive-xetexconfig-svn41133-33.fc25.1.noarch
python-rpm-macros-3-12.fc25.noarch
nss-pem-1.0.3-3.fc25.s390x
at-spi2-core-2.22.1-1.fc25.s390x
perl-Scalar-List-Utils-1.48-1.fc25.s390x
libtasn1-devel-4.12-1.fc25.s390x
python3-koji-1.13.0-2.fc25.noarch
opus-1.1.5-1.fc25.s390x
elfutils-libs-0.169-1.fc25.s390x
kernel-core-4.11.10-200.fc25.s390x
systemd-container-231-17.fc25.s390x
sudo-1.8.20p2-1.fc25.s390x
libicu-devel-57.1-5.fc25.s390x
js-jquery-2.2.4-3.fc25.noarch
krb5-libs-1.14.4-8.fc25.s390x
apr-1.6.2-1.fc25.s390x
dbus-1.11.16-1.fc25.s390x
libdrm-2.4.82-1.fc25.s390x
pcre2-utf32-10.23-9.fc25.s390x
copy-jdk-configs-2.3-1.fc25.noarch
libdrm-devel-2.4.82-1.fc25.s390x
krb5-workstation-1.14.4-8.fc25.s390x
python3-sssdconfig-1.15.3-1.fc25.noarch
python2-docutils-0.13.1-3.fc25.noarch
graphviz-2.38.0-39.fc25.s390x
kernel-modules-4.12.11-200.fc25.s390x
fedpkg-1.29-3.fc25.noarch
=== TEST BEGIN ===
Using CC: /home/fam/bin/cc
Install prefix    /var/tmp/patchew-tester-tmp-30ljxus4/src/install
BIOS directory    /var/tmp/patchew-tester-tmp-30ljxus4/src/install/share/qemu
firmware path     /var/tmp/patchew-tester-tmp-30ljxus4/src/install/share/qemu-firmware
binary directory  /var/tmp/patchew-tester-tmp-30ljxus4/src/install/bin
library directory /var/tmp/patchew-tester-tmp-30ljxus4/src/install/lib
module directory  /var/tmp/patchew-tester-tmp-30ljxus4/src/install/lib/qemu
libexec directory /var/tmp/patchew-tester-tmp-30ljxus4/src/install/libexec
include directory /var/tmp/patchew-tester-tmp-30ljxus4/src/install/include
config directory  /var/tmp/patchew-tester-tmp-30ljxus4/src/install/etc
local state directory   /var/tmp/patchew-tester-tmp-30ljxus4/src/install/var
Manual directory  /var/tmp/patchew-tester-tmp-30ljxus4/src/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /var/tmp/patchew-tester-tmp-30ljxus4/src
GIT submodules    ui/keycodemapdb capstone
C compiler        /home/fam/bin/cc
Host C compiler   cc
C++ compiler      c++
Objective-C compiler /home/fam/bin/cc
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/include/pixman-1  -Werror -DHAS_LIBSSH2_SFTP_FSYNC -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -DNCURSES_WIDECHAR -D_GNU_SOURCE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/include/p11-kit-1    -I/usr/include/libpng16 -I/usr/include/libdrm  -I$(SRC_PATH)/capstone/include
LDFLAGS           -Wl,--warn-common -m64 -g 
make              make
install           install
python            python -B
smbd              /usr/sbin/smbd
module support    no
host CPU          s390x
host big endian   yes
target list       aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblazeel-softmmu microblaze-softmmu mips64el-softmmu mips64-softmmu mipsel-softmmu mips-softmmu moxie-softmmu nios2-softmmu or1k-softmmu ppc64-softmmu ppcemb-softmmu ppc-softmmu s390x-softmmu sh4eb-softmmu sh4-softmmu sparc64-softmmu sparc-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensaeb-softmmu xtensa-softmmu aarch64-linux-user alpha-linux-user armeb-linux-user arm-linux-user cris-linux-user hppa-linux-user i386-linux-user m68k-linux-user microblazeel-linux-user microblaze-linux-user mips64el-linux-user mips64-linux-user mipsel-linux-user mips-linux-user mipsn32el-linux-user mipsn32-linux-user nios2-linux-user or1k-linux-user ppc64abi32-linux-user ppc64le-linux-user ppc64-linux-user ppc-linux-user s390x-linux-user sh4eb-linux-user sh4-linux-user sparc32plus-linux-user sparc64-linux-user sparc-linux-user tilegx-linux-user x86_64-linux-user
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
SDL support       yes (2.0.5)
GTK support       yes (3.22.17)
GTK GL support    yes
VTE support       yes (0.46.2)
TLS priority      NORMAL
GNUTLS support    yes
GNUTLS rnd        yes
libgcrypt         no
libgcrypt kdf     no
nettle            yes (3.3)
nettle kdf        yes
libtasn1          yes
curses support    yes
virgl support     yes
curl support      yes
mingw32 support   no
Audio drivers     oss
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    yes
Multipath support no
VNC support       yes
VNC SASL support  yes
VNC JPEG support  yes
VNC PNG support   yes
xen support       no
brlapi support    yes
bluez  support    yes
Documentation     yes
PIE               no
vde support       no
netmap support    no
Linux AIO support yes
ATTR/XATTR support yes
Install blobs     yes
KVM support       yes
HAX support       no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
RDMA support      no
fdt support       yes
preadv support    yes
fdatasync         yes
madvise           yes
posix_madvise     yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
vhost-vsock support yes
vhost-user support yes
Trace backends    log
spice support     no 
rbd support       yes
xfsctl support    no
smartcard support yes
libusb            yes
usb net redir     yes
OpenGL support    yes
OpenGL dmabufs    yes
libiscsi support  yes
libnfs support    yes
build guest agent yes
QGA VSS support   no
QGA w32 disk info no
QGA MSI support   no
seccomp support   yes
coroutine backend ucontext
coroutine pool    yes
debug stack usage no
crypto afalg      no
GlusterFS support yes
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   yes
TPM passthrough   no
TPM emulator      yes
QOM debugging     yes
Live block migration yes
lzo support       yes
snappy support    yes
bzip2 support     yes
NUMA host support no
tcmalloc support  no
jemalloc support  no
avx2 optimization no
replication support yes
VxHS block device no
capstone          git
  GEN     aarch64-softmmu/config-devices.mak.tmp
  GEN     arm-softmmu/config-devices.mak.tmp
  GEN     cris-softmmu/config-devices.mak.tmp
  GEN     alpha-softmmu/config-devices.mak.tmp
  GEN     cris-softmmu/config-devices.mak
  GEN     i386-softmmu/config-devices.mak.tmp
  GEN     arm-softmmu/config-devices.mak
  GEN     alpha-softmmu/config-devices.mak
  GEN     aarch64-softmmu/config-devices.mak
  GEN     lm32-softmmu/config-devices.mak.tmp
  GEN     m68k-softmmu/config-devices.mak.tmp
  GEN     microblazeel-softmmu/config-devices.mak.tmp
  GEN     lm32-softmmu/config-devices.mak
  GEN     m68k-softmmu/config-devices.mak
  GEN     microblaze-softmmu/config-devices.mak.tmp
  GEN     mips64el-softmmu/config-devices.mak.tmp
  GEN     microblaze-softmmu/config-devices.mak
  GEN     mips64-softmmu/config-devices.mak.tmp
  GEN     i386-softmmu/config-devices.mak
  GEN     mipsel-softmmu/config-devices.mak.tmp
  GEN     microblazeel-softmmu/config-devices.mak
  GEN     mips-softmmu/config-devices.mak.tmp
  GEN     mips64el-softmmu/config-devices.mak
  GEN     mipsel-softmmu/config-devices.mak
  GEN     mips-softmmu/config-devices.mak
  GEN     nios2-softmmu/config-devices.mak.tmp
  GEN     moxie-softmmu/config-devices.mak.tmp
  GEN     or1k-softmmu/config-devices.mak.tmp
  GEN     nios2-softmmu/config-devices.mak
  GEN     moxie-softmmu/config-devices.mak
  GEN     mips64-softmmu/config-devices.mak
  GEN     or1k-softmmu/config-devices.mak
  GEN     ppc64-softmmu/config-devices.mak.tmp
  GEN     ppcemb-softmmu/config-devices.mak.tmp
  GEN     ppc-softmmu/config-devices.mak.tmp
  GEN     s390x-softmmu/config-devices.mak.tmp
  GEN     s390x-softmmu/config-devices.mak
  GEN     sh4eb-softmmu/config-devices.mak.tmp
  GEN     ppc64-softmmu/config-devices.mak
  GEN     sh4-softmmu/config-devices.mak.tmp
  GEN     ppc-softmmu/config-devices.mak
  GEN     ppcemb-softmmu/config-devices.mak
  GEN     sparc64-softmmu/config-devices.mak.tmp
  GEN     sparc-softmmu/config-devices.mak.tmp
  GEN     sh4eb-softmmu/config-devices.mak
  GEN     sh4-softmmu/config-devices.mak
  GEN     tricore-softmmu/config-devices.mak.tmp
  GEN     unicore32-softmmu/config-devices.mak.tmp
  GEN     sparc64-softmmu/config-devices.mak
  GEN     sparc-softmmu/config-devices.mak
  GEN     x86_64-softmmu/config-devices.mak.tmp
  GEN     xtensaeb-softmmu/config-devices.mak.tmp
  GEN     tricore-softmmu/config-devices.mak
  GEN     xtensa-softmmu/config-devices.mak.tmp
  GEN     unicore32-softmmu/config-devices.mak
  GEN     xtensa-softmmu/config-devices.mak
  GEN     xtensaeb-softmmu/config-devices.mak
  GEN     aarch64-linux-user/config-devices.mak.tmp
  GEN     alpha-linux-user/config-devices.mak.tmp
  GEN     x86_64-softmmu/config-devices.mak
  GEN     armeb-linux-user/config-devices.mak.tmp
  GEN     aarch64-linux-user/config-devices.mak
  GEN     alpha-linux-user/config-devices.mak
  GEN     arm-linux-user/config-devices.mak.tmp
  GEN     cris-linux-user/config-devices.mak.tmp
  GEN     armeb-linux-user/config-devices.mak
  GEN     hppa-linux-user/config-devices.mak.tmp
  GEN     arm-linux-user/config-devices.mak
  GEN     hppa-linux-user/config-devices.mak
  GEN     i386-linux-user/config-devices.mak.tmp
  GEN     m68k-linux-user/config-devices.mak.tmp
  GEN     cris-linux-user/config-devices.mak
  GEN     microblazeel-linux-user/config-devices.mak.tmp
  GEN     microblaze-linux-user/config-devices.mak.tmp
  GEN     microblazeel-linux-user/config-devices.mak
  GEN     microblaze-linux-user/config-devices.mak
  GEN     m68k-linux-user/config-devices.mak
  GEN     mips64el-linux-user/config-devices.mak.tmp
  GEN     mips64-linux-user/config-devices.mak.tmp
  GEN     mipsel-linux-user/config-devices.mak.tmp
  GEN     mips64el-linux-user/config-devices.mak
  GEN     mips64-linux-user/config-devices.mak
  GEN     mips-linux-user/config-devices.mak.tmp
  GEN     i386-linux-user/config-devices.mak
  GEN     mipsn32el-linux-user/config-devices.mak.tmp
  GEN     mipsel-linux-user/config-devices.mak
  GEN     mipsn32-linux-user/config-devices.mak.tmp
  GEN     nios2-linux-user/config-devices.mak.tmp
  GEN     mipsn32-linux-user/config-devices.mak
  GEN     mips-linux-user/config-devices.mak
  GEN     mipsn32el-linux-user/config-devices.mak
  GEN     or1k-linux-user/config-devices.mak.tmp
  GEN     ppc64abi32-linux-user/config-devices.mak.tmp
  GEN     nios2-linux-user/config-devices.mak
  GEN     ppc64-linux-user/config-devices.mak.tmp
  GEN     ppc64le-linux-user/config-devices.mak.tmp
  GEN     or1k-linux-user/config-devices.mak
  GEN     ppc64abi32-linux-user/config-devices.mak
  GEN     ppc-linux-user/config-devices.mak.tmp
  GEN     s390x-linux-user/config-devices.mak.tmp
  GEN     ppc64-linux-user/config-devices.mak
  GEN     ppc64le-linux-user/config-devices.mak
  GEN     sh4eb-linux-user/config-devices.mak.tmp
  GEN     sh4-linux-user/config-devices.mak.tmp
  GEN     ppc-linux-user/config-devices.mak
  GEN     sh4eb-linux-user/config-devices.mak
  GEN     s390x-linux-user/config-devices.mak
  GEN     sparc32plus-linux-user/config-devices.mak.tmp
  GEN     sparc64-linux-user/config-devices.mak.tmp
  GEN     sparc64-linux-user/config-devices.mak
  GEN     sparc32plus-linux-user/config-devices.mak
  GEN     tilegx-linux-user/config-devices.mak.tmp
  GEN     x86_64-linux-user/config-devices.mak.tmp
  GEN     sparc-linux-user/config-devices.mak.tmp
  GEN     sh4-linux-user/config-devices.mak
  GEN     sparc-linux-user/config-devices.mak
  GEN     config-host.h
  GEN     x86_64-linux-user/config-devices.mak
  GIT     ui/keycodemapdb capstone
  GEN     tilegx-linux-user/config-devices.mak
  GEN     qemu-options.def
  GEN     qmp-commands.h
  GEN     qapi-types.h
  GEN     qapi-visit.h
  GEN     qapi-event.h
Submodule 'capstone' (git://git.qemu.org/capstone.git) registered for path 'capstone'
Submodule 'ui/keycodemapdb' (git://git.qemu.org/keycodemapdb.git) registered for path 'ui/keycodemapdb'
  GEN     qmp-marshal.c
Cloning into '/var/tmp/patchew-tester-tmp-30ljxus4/src/capstone'...
  GEN     qapi-types.c
  GEN     qapi-visit.c
  GEN     qapi-event.c
  GEN     qmp-introspect.h
  GEN     qmp-introspect.c
  GEN     trace/generated-tcg-tracers.h
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-helpers.h
  GEN     trace/generated-helpers.c
  GEN     module_block.h
  GEN     tests/test-qapi-types.h
  GEN     tests/test-qapi-visit.h
  GEN     tests/test-qmp-commands.h
  GEN     tests/test-qapi-event.h
  GEN     tests/test-qmp-introspect.h
  GEN     trace-root.h
  GEN     util/trace.h
  GEN     crypto/trace.h
  GEN     io/trace.h
  GEN     migration/trace.h
  GEN     block/trace.h
  GEN     chardev/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/net/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/display/trace.h
  GEN     hw/input/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/xen/trace.h
  GEN     hw/ide/trace.h
  GEN     ui/trace.h
  GEN     audio/trace.h
  GEN     net/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/mips/trace.h
  GEN     target/sparc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/ppc/trace.h
  GEN     qom/trace.h
  GEN     linux-user/trace.h
  GEN     qapi/trace.h
  GEN     accel/tcg/trace.h
  GEN     accel/kvm/trace.h
  GEN     nbd/trace.h
  GEN     scsi/trace.h
  GEN     trace-root.c
  GEN     util/trace.c
  GEN     crypto/trace.c
  GEN     migration/trace.c
  GEN     io/trace.c
  GEN     block/trace.c
  GEN     chardev/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/net/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/display/trace.c
  GEN     hw/input/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/ide/trace.c
  GEN     hw/xen/trace.c
  GEN     ui/trace.c
  GEN     audio/trace.c
  GEN     net/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/mips/trace.c
  GEN     target/sparc/trace.c
  GEN     target/s390x/trace.c
  GEN     target/ppc/trace.c
  GEN     qom/trace.c
  GEN     linux-user/trace.c
  GEN     qapi/trace.c
  GEN     accel/tcg/trace.c
  GEN     accel/kvm/trace.c
  GEN     nbd/trace.c
  GEN     scsi/trace.c
  GEN     config-all-devices.mak
Cloning into '/var/tmp/patchew-tester-tmp-30ljxus4/src/ui/keycodemapdb'...
  GEN     ui/input-keymap-linux-to-qcode.c
  GEN     ui/input-keymap-qnum-to-qcode.c
  GEN     ui/input-keymap-qcode-to-qnum.c
  CC      cs.o
  CC      utils.o
  CC      MCInstrDesc.o
  CC      SStream.o
  CC      MCRegisterInfo.o
  CC      arch/ARM/ARMDisassembler.o
  CC      arch/ARM/ARMInstPrinter.o
  CC      arch/ARM/ARMMapping.o
  CC      arch/ARM/ARMModule.o
  CC      arch/AArch64/AArch64BaseInfo.o
  CC      arch/AArch64/AArch64Disassembler.o
  CC      arch/AArch64/AArch64InstPrinter.o
  CC      arch/AArch64/AArch64Mapping.o
  CC      arch/AArch64/AArch64Module.o
  CC      arch/Mips/MipsDisassembler.o
  CC      arch/Mips/MipsInstPrinter.o
  CC      arch/Mips/MipsMapping.o
  CC      arch/Mips/MipsModule.o
  CC      arch/PowerPC/PPCDisassembler.o
  CC      arch/PowerPC/PPCInstPrinter.o
  CC      arch/PowerPC/PPCMapping.o
  CC      arch/PowerPC/PPCModule.o
  CC      arch/Sparc/SparcDisassembler.o
  CC      arch/Sparc/SparcInstPrinter.o
  CC      arch/Sparc/SparcMapping.o
  CC      arch/Sparc/SparcModule.o
  CC      arch/SystemZ/SystemZDisassembler.o
  CC      arch/SystemZ/SystemZInstPrinter.o
  CC      arch/SystemZ/SystemZMapping.o
  CC      arch/SystemZ/SystemZModule.o
  CC      arch/X86/X86DisassemblerDecoder.o
  CC      arch/SystemZ/SystemZMCTargetDesc.o
  CC      arch/X86/X86Disassembler.o
  CC      arch/X86/X86IntelInstPrinter.o
  CC      arch/X86/X86ATTInstPrinter.o
  CC      arch/X86/X86Mapping.o
  CC      arch/X86/X86Module.o
  CC      arch/XCore/XCoreDisassembler.o
  CC      arch/XCore/XCoreInstPrinter.o
  CC      arch/XCore/XCoreMapping.o
  CC      arch/XCore/XCoreModule.o
  CC      MCInst.o
  AR      libcapstone.a
ar: creating /var/tmp/patchew-tester-tmp-30ljxus4/src/build/capstone/libcapstone.a
make[1]: '/var/tmp/patchew-tester-tmp-30ljxus4/src/build/capstone/libcapstone.a' is up to date.
  GEN     docs/version.texi
  GEN     qemu-options.texi
  GEN     qemu-monitor.texi
  CC      tests/qemu-iotests/socket_scm_helper.o
  GEN     qemu-img-cmds.texi
  GEN     qemu-monitor-info.texi
  GEN     qemu-img.1
  GEN     qemu-nbd.8
  GEN     qemu-ga.8
  GEN     docs/interop/qemu-qmp-qapi.texi
  GEN     docs/interop/qemu-ga-qapi.texi
  GEN     docs/qemu-block-drivers.7
  GEN     fsdev/virtfs-proxy-helper.1
  GEN     qga/qapi-generated/qga-qapi-types.h
  GEN     qga/qapi-generated/qga-qapi-visit.h
  GEN     qga/qapi-generated/qga-qmp-commands.h
  GEN     qga/qapi-generated/qga-qapi-visit.c
  GEN     qga/qapi-generated/qga-qapi-types.c
  GEN     qga/qapi-generated/qga-qmp-marshal.c
  CC      qapi-types.o
  CC      qmp-introspect.o
  CC      qapi-visit.o
  CC      qapi-event.o
  CC      qapi/qapi-visit-core.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnum.o
  CC      qobject/qnull.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qlist.o
  CC      qobject/qbool.o
  CC      qobject/qjson.o
  CC      qobject/qlit.o
  CC      qobject/qobject.o
  CC      qobject/json-streamer.o
  CC      qobject/json-lexer.o
  CC      qobject/json-parser.o
  CC      trace/control.o
  CC      trace/qmp.o
  CC      util/osdep.o
  CC      util/cutils.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/iohandler.o
  CC      util/aio-posix.o
  CC      util/compatfd.o
  CC      util/event_notifier-posix.o
  CC      util/mmap-alloc.o
  CC      util/oslib-posix.o
  CC      util/qemu-thread-posix.o
  CC      util/qemu-openpty.o
  CC      util/memfd.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/host-utils.o
  CC      util/module.o
  CC      util/bitmap.o
  CC      util/hbitmap.o
  CC      util/bitops.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/cacheinfo.o
  CC      util/error.o
  CC      util/qemu-error.o
  CC      util/id.o
  CC      util/iov.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/qemu-option.o
  CC      util/notify.o
  CC      util/qemu-progress.o
  CC      util/keyval.o
  CC      util/hexdump.o
  CC      util/crc32c.o
  CC      util/uuid.o
  CC      util/throttle.o
  CC      util/getauxval.o
  CC      util/readline.o
  CC      util/rcu.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine-io.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/coroutine-ucontext.o
  CC      util/buffer.o
  CC      util/timed-average.o
  CC      util/base64.o
  CC      util/log.o
  CC      util/pagesize.o
  CC      util/qdist.o
  CC      util/qht.o
  CC      util/range.o
  CC      util/stats64.o
  CC      util/systemd.o
  CC      trace-root.o
  CC      util/trace.o
  CC      crypto/trace.o
  CC      io/trace.o
  CC      migration/trace.o
  CC      block/trace.o
  CC      chardev/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/intc/trace.o
  CC      hw/net/trace.o
  CC      hw/virtio/trace.o
  CC      hw/audio/trace.o
  CC      hw/misc/trace.o
  CC      hw/usb/trace.o
  CC      hw/scsi/trace.o
  CC      hw/nvram/trace.o
  CC      hw/display/trace.o
  CC      hw/input/trace.o
  CC      hw/timer/trace.o
  CC      hw/dma/trace.o
  CC      hw/sparc/trace.o
  CC      hw/sd/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/ppc/trace.o
  CC      hw/pci/trace.o
  CC      hw/s390x/trace.o
  CC      hw/vfio/trace.o
  CC      hw/acpi/trace.o
  CC      hw/arm/trace.o
  CC      hw/alpha/trace.o
  CC      hw/xen/trace.o
  CC      hw/ide/trace.o
  CC      ui/trace.o
  CC      audio/trace.o
  CC      net/trace.o
  CC      target/i386/trace.o
  CC      target/arm/trace.o
  CC      target/mips/trace.o
  CC      target/s390x/trace.o
  CC      target/ppc/trace.o
  CC      target/sparc/trace.o
  CC      qom/trace.o
  CC      linux-user/trace.o
  CC      qapi/trace.o
  CC      accel/tcg/trace.o
  CC      accel/kvm/trace.o
  CC      nbd/trace.o
  CC      scsi/trace.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/blk-commit-all.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/clock-warp.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/error-printf.o
  CC      stubs/dump.o
  CC      stubs/fdset.o
  CC      stubs/gdbstub.o
  CC      stubs/get-vm-name.o
  CC      stubs/iothread.o
  CC      stubs/iothread-lock.o
  CC      stubs/is-daemonized.o
  CC      stubs/linux-aio.o
  CC      stubs/machine-init-done.o
  CC      stubs/migr-blocker.o
  CC      stubs/change-state-handler.o
  CC      stubs/monitor.o
  CC      stubs/qtest.o
  CC      stubs/notify-event.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/slirp.o
  CC      stubs/set-fd-handler.o
  CC      stubs/sysbus.o
  CC      stubs/tpm.o
  CC      stubs/trace-control.o
  CC      stubs/uuid.o
  CC      stubs/vm-stop.o
  CC      stubs/vmstate.o
  CC      stubs/qmp_pc_dimm.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      stubs/vmgenid.o
  CC      stubs/xen-common.o
  CC      stubs/xen-hvm.o
  CC      qemu-keymap.o
  CC      stubs/pci-host-piix.o
  CC      ui/input-keymap.o
  CC      contrib/ivshmem-client/ivshmem-client.o
  CC      contrib/ivshmem-client/main.o
  CC      contrib/ivshmem-server/ivshmem-server.o
  CC      contrib/ivshmem-server/main.o
  CC      qemu-nbd.o
  CC      block.o
  CC      blockjob.o
  CC      qemu-io-cmds.o
  CC      replication.o
  CC      block/raw-format.o
  CC      block/qcow.o
  CC      block/vdi.o
  CC      block/vmdk.o
  CC      block/cloop.o
  CC      block/bochs.o
  CC      block/vpc.o
  CC      block/vvfat.o
  CC      block/dmg.o
  CC      block/qcow2.o
  CC      block/qcow2-refcount.o
  CC      block/qcow2-cluster.o
  CC      block/qcow2-snapshot.o
  CC      block/qcow2-cache.o
  CC      block/qcow2-bitmap.o
  CC      block/qed.o
  CC      block/qed-l2-cache.o
  CC      block/qed-table.o
  CC      block/qed-cluster.o
  CC      block/qed-check.o
  CC      block/vhdx.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/quorum.o
  CC      block/parallels.o
  CC      block/blkdebug.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/qapi.o
  CC      block/file-posix.o
  CC      block/linux-aio.o
  CC      block/null.o
  CC      block/mirror.o
  CC      block/commit.o
  CC      block/io.o
  CC      block/throttle-groups.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/iscsi-opts.o
  CC      block/accounting.o
  CC      block/dirty-bitmap.o
  CC      block/write-threshold.o
  CC      block/replication.o
  CC      block/throttle.o
  CC      block/backup.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      scsi/utils.o
  CC      scsi/pr-manager-helper.o
  CC      scsi/pr-manager.o
  CC      block/iscsi.o
  CC      block/nfs.o
  CC      block/curl.o
  CC      block/rbd.o
  CC      block/gluster.o
  CC      block/ssh.o
  CC      block/dmg-bz2.o
  CC      crypto/init.o
  CC      crypto/hash.o
  CC      crypto/hash-nettle.o
  CC      crypto/hmac.o
  CC      crypto/hmac-nettle.o
  CC      crypto/aes.o
  CC      crypto/desrfb.o
  CC      crypto/cipher.o
  CC      crypto/tlscreds.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/pbkdf.o
  CC      crypto/random-gnutls.o
  CC      crypto/pbkdf-nettle.o
  CC      crypto/ivgen.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/ivgen-plain.o
  CC      crypto/afsplit.o
  CC      crypto/xts.o
  CC      crypto/block.o
  CC      crypto/block-qcow.o
  CC      crypto/block-luks.o
  CC      io/channel.o
  CC      io/channel-command.o
  CC      io/channel-buffer.o
  CC      io/channel-file.o
  CC      io/channel-socket.o
  CC      io/channel-tls.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/dns-resolver.o
  CC      io/task.o
  CC      qom/container.o
  CC      qom/object.o
  CC      qom/qom-qobject.o
  CC      qom/object_interfaces.o
  GEN     qemu-img-cmds.h
  CC      qemu-io.o
  CC      fsdev/9p-marshal.o
  CC      fsdev/virtfs-proxy-helper.o
  CC      fsdev/9p-iov-marshal.o
  CC      scsi/qemu-pr-helper.o
  CC      qemu-bridge-helper.o
  CC      blockdev.o
  CC      blockdev-nbd.o
  CC      bootdevice.o
  CC      iothread.o
  CC      qdev-monitor.o
  CC      device-hotplug.o
  CC      os-posix.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      qemu-seccomp.o
  CC      device_tree.o
  CC      qmp-marshal.o
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/audio.o
  CC      audio/noaudio.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/sdlaudio.o
  CC      audio/ossaudio.o
  CC      backends/rng.o
  CC      audio/wavcapture.o
  CC      backends/rng-egd.o
  CC      backends/rng-random.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-ram.o
  CC      backends/hostmem-file.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      chardev/msmouse.o
  CC      block/stream.o
  CC      chardev/wctablet.o
  CC      chardev/testdev.o
  CC      chardev/baum.o
  CC      disas/alpha.o
  CXX     disas/arm-a64.o
  CC      disas/arm.o
  CC      disas/cris.o
  CC      disas/hppa.o
  CC      disas/i386.o
  CC      disas/m68k.o
  CC      disas/mips.o
  CC      disas/microblaze.o
  CC      disas/nios2.o
  CC      disas/moxie.o
  CC      disas/ppc.o
  CC      disas/s390.o
  CC      disas/sh4.o
  CC      disas/sparc.o
  CC      disas/lm32.o
  CXX     disas/libvixl/vixl/utils.o
  CXX     disas/libvixl/vixl/compiler-intrinsics.o
  CXX     disas/libvixl/vixl/a64/instructions-a64.o
  CXX     disas/libvixl/vixl/a64/decoder-a64.o
  CXX     disas/libvixl/vixl/a64/disasm-a64.o
  CC      fsdev/qemu-fsdev.o
  CC      fsdev/qemu-fsdev-opts.o
  CC      fsdev/qemu-fsdev-throttle.o
  CC      fsdev/qemu-fsdev-dummy.o
  CC      hw/9pfs/9p.o
  CC      hw/9pfs/9p-util.o
  CC      hw/9pfs/9p-local.o
  CC      hw/9pfs/9p-xattr.o
  CC      hw/9pfs/9p-xattr-user.o
  CC      hw/9pfs/9p-posix-acl.o
  CC      hw/9pfs/coth.o
  CC      hw/9pfs/cofs.o
  CC      hw/9pfs/codir.o
  CC      hw/9pfs/cofile.o
  CC      hw/9pfs/coxattr.o
  CC      hw/9pfs/9p-synth.o
  CC      hw/9pfs/9p-handle.o
  CC      hw/9pfs/9p-proxy.o
  CC      hw/acpi/core.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/nvdimm.o
  CC      hw/acpi/vmgenid.o
  CC      hw/acpi/acpi_interface.o
  CC      hw/acpi/bios-linker-loader.o
  CC      hw/acpi/aml-build.o
  CC      hw/acpi/ipmi.o
  CC      hw/acpi/acpi-stub.o
  CC      hw/acpi/ipmi-stub.o
  CC      hw/audio/sb16.o
  CC      hw/audio/es1370.o
  CC      hw/audio/ac97.o
  CC      hw/audio/fmopl.o
  CC      hw/audio/adlib.o
  CC      hw/audio/gus.o
  CC      hw/audio/gusemu_hal.o
  CC      hw/audio/gusemu_mixer.o
  CC      hw/audio/cs4231a.o
  CC      hw/audio/intel-hda.o
  CC      hw/audio/hda-codec.o
  CC      hw/audio/pcspk.o
  CC      hw/audio/wm8750.o
  CC      hw/audio/pl041.o
  CC      hw/audio/lm4549.o
  CC      hw/audio/cs4231.o
  CC      hw/audio/marvell_88w8618.o
  CC      hw/audio/milkymist-ac97.o
  CC      hw/audio/soundhw.o
  CC      hw/block/block.o
  CC      hw/block/cdrom.o
  CC      hw/block/hd-geometry.o
  CC      hw/block/fdc.o
  CC      hw/block/m25p80.o
  CC      hw/block/nand.o
  CC      hw/block/pflash_cfi01.o
  CC      hw/block/pflash_cfi02.o
  CC      hw/block/ecc.o
  CC      hw/block/onenand.o
  CC      hw/block/nvme.o
  CC      hw/bt/core.o
  CC      hw/bt/l2cap.o
  CC      hw/bt/sdp.o
  CC      hw/bt/hci.o
  CC      hw/bt/hid.o
  CC      hw/bt/hci-csr.o
  CC      hw/char/ipoctal232.o
  CC      hw/char/escc.o
  CC      hw/char/parallel.o
  CC      hw/char/pl011.o
  CC      hw/char/serial.o
  CC      hw/char/serial-pci.o
  CC      hw/char/serial-isa.o
  CC      hw/char/virtio-console.o
  CC      hw/char/xilinx_uartlite.o
  CC      hw/char/cadence_uart.o
  CC      hw/char/cmsdk-apb-uart.o
  CC      hw/char/etraxfs_ser.o
  CC      hw/char/debugcon.o
  CC      hw/char/grlib_apbuart.o
  CC      hw/char/imx_serial.o
  CC      hw/char/lm32_juart.o
  CC      hw/char/lm32_uart.o
  CC      hw/char/milkymist-uart.o
  CC      hw/char/sclpconsole.o
  CC      hw/char/sclpconsole-lm.o
  CC      hw/core/qdev.o
  CC      hw/core/qdev-properties.o
  CC      hw/core/bus.o
  CC      hw/core/reset.o
  CC      hw/core/fw-path-provider.o
  CC      hw/core/irq.o
  CC      hw/core/hotplug.o
  CC      hw/core/nmi.o
  CC      hw/core/empty_slot.o
  CC      hw/core/stream.o
  CC      hw/core/ptimer.o
  CC      hw/core/sysbus.o
  CC      hw/core/machine.o
  CC      hw/core/loader.o
  CC      hw/core/loader-fit.o
  CC      hw/core/qdev-properties-system.o
  CC      hw/core/register.o
  CC      hw/core/or-irq.o
  CC      hw/core/platform-bus.o
  CC      hw/cpu/core.o
  CC      hw/display/ads7846.o
  CC      hw/display/cirrus_vga.o
  CC      hw/display/g364fb.o
  CC      hw/display/jazz_led.o
  CC      hw/display/pl110.o
  CC      hw/display/ssd0323.o
  CC      hw/display/ssd0303.o
  CC      hw/display/vga-pci.o
  CC      hw/display/vga-isa.o
  CC      hw/display/vga-isa-mm.o
  CC      hw/display/vmware_vga.o
  CC      hw/display/blizzard.o
  CC      hw/display/exynos4210_fimd.o
  CC      hw/display/framebuffer.o
  CC      hw/display/milkymist-vgafb.o
  CC      hw/display/tc6393xb.o
  CC      hw/dma/puv3_dma.o
  CC      hw/display/milkymist-tmu2.o
  CC      hw/dma/rc4030.o
  CC      hw/dma/pl080.o
  CC      hw/dma/pl330.o
  CC      hw/dma/i82374.o
  CC      hw/dma/i8257.o
  CC      hw/dma/xilinx_axidma.o
  CC      hw/dma/xlnx-zynq-devcfg.o
  CC      hw/dma/etraxfs_dma.o
  CC      hw/dma/sparc32_dma.o
  CC      hw/dma/sun4m_iommu.o
  CC      hw/gpio/max7310.o
  CC      hw/gpio/pl061.o
  CC      hw/gpio/puv3_gpio.o
  CC      hw/gpio/zaurus.o
  CC      hw/gpio/mpc8xxx.o
  CC      hw/gpio/gpio_key.o
  CC      hw/i2c/core.o
  CC      hw/i2c/smbus.o
  CC      hw/i2c/smbus_eeprom.o
  CC      hw/i2c/i2c-ddc.o
  CC      hw/i2c/versatile_i2c.o
  CC      hw/i2c/smbus_ich9.o
  CC      hw/i2c/pm_smbus.o
  CC      hw/i2c/bitbang_i2c.o
  CC      hw/i2c/exynos4210_i2c.o
  CC      hw/i2c/imx_i2c.o
  CC      hw/ide/core.o
  CC      hw/i2c/aspeed_i2c.o
  CC      hw/ide/atapi.o
  CC      hw/ide/qdev.o
  CC      hw/ide/pci.o
  CC      hw/ide/isa.o
  CC      hw/ide/piix.o
  CC      hw/ide/cmd646.o
  CC      hw/ide/macio.o
  CC      hw/ide/mmio.o
  CC      hw/ide/via.o
  CC      hw/ide/microdrive.o
  CC      hw/ide/ahci.o
  CC      hw/ide/ich.o
  CC      hw/input/adb.o
  CC      hw/input/hid.o
  CC      hw/input/lm832x.o
  CC      hw/input/pckbd.o
  CC      hw/input/pl050.o
  CC      hw/input/ps2.o
  CC      hw/input/tsc2005.o
  CC      hw/input/stellaris_input.o
  CC      hw/input/vmmouse.o
  CC      hw/input/virtio-input.o
  CC      hw/input/virtio-input-hid.o
  CC      hw/input/virtio-input-host.o
  CC      hw/intc/heathrow_pic.o
  CC      hw/intc/i8259_common.o
  CC      hw/intc/i8259.o
  CC      hw/intc/pl190.o
  CC      hw/intc/puv3_intc.o
  CC      hw/intc/xilinx_intc.o
  CC      hw/intc/etraxfs_pic.o
  CC      hw/intc/imx_avic.o
  CC      hw/intc/lm32_pic.o
  CC      hw/intc/realview_gic.o
  CC      hw/intc/slavio_intctl.o
  CC      hw/intc/ioapic_common.o
  CC      hw/intc/arm_gic_common.o
  CC      hw/intc/arm_gic.o
  CC      hw/intc/arm_gicv2m.o
  CC      hw/intc/arm_gicv3_common.o
  CC      hw/intc/arm_gicv3.o
  CC      hw/intc/arm_gicv3_dist.o
  CC      hw/intc/arm_gicv3_redist.o
  CC      hw/intc/arm_gicv3_its_common.o
  CC      hw/intc/openpic.o
  CC      hw/intc/intc.o
  CC      hw/ipack/ipack.o
  CC      hw/ipack/tpci200.o
  CC      hw/ipmi/ipmi.o
  CC      hw/ipmi/ipmi_bmc_sim.o
  CC      hw/ipmi/ipmi_bmc_extern.o
  CC      hw/ipmi/isa_ipmi_kcs.o
  CC      hw/ipmi/isa_ipmi_bt.o
  CC      hw/isa/isa-bus.o
  CC      hw/isa/apm.o
  CC      hw/isa/i82378.o
  CC      hw/isa/pc87312.o
  CC      hw/isa/piix4.o
  CC      hw/isa/vt82c686.o
  CC      hw/mem/pc-dimm.o
  CC      hw/mem/nvdimm.o
  CC      hw/misc/applesmc.o
  CC      hw/misc/max111x.o
  CC      hw/misc/tmp105.o
  CC      hw/misc/tmp421.o
  CC      hw/misc/debugexit.o
  CC      hw/misc/sga.o
  CC      hw/misc/pc-testdev.o
  CC      hw/misc/pci-testdev.o
  CC      hw/misc/edu.o
  CC      hw/misc/unimp.o
  CC      hw/misc/vmcoreinfo.o
  CC      hw/misc/arm_l2x0.o
  CC      hw/misc/arm_integrator_debug.o
  CC      hw/misc/a9scu.o
  CC      hw/misc/arm11scu.o
  CC      hw/misc/puv3_pm.o
  CC      hw/misc/macio/macio.o
  CC      hw/misc/macio/cuda.o
  CC      hw/misc/macio/mac_dbdma.o
  CC      hw/net/dp8393x.o
  CC      hw/net/ne2000.o
  CC      hw/net/eepro100.o
  CC      hw/net/pcnet-pci.o
  CC      hw/net/pcnet.o
  CC      hw/net/e1000.o
  CC      hw/net/e1000x_common.o
  CC      hw/net/net_tx_pkt.o
  CC      hw/net/net_rx_pkt.o
  CC      hw/net/e1000e.o
  CC      hw/net/e1000e_core.o
  CC      hw/net/rtl8139.o
  CC      hw/net/vmxnet3.o
  CC      hw/net/smc91c111.o
  CC      hw/net/lan9118.o
  CC      hw/net/ne2000-isa.o
  CC      hw/net/opencores_eth.o
  CC      hw/net/xgmac.o
  CC      hw/net/mipsnet.o
  CC      hw/net/xilinx_axienet.o
  CC      hw/net/allwinner_emac.o
  CC      hw/net/imx_fec.o
  CC      hw/net/cadence_gem.o
  CC      hw/net/stellaris_enet.o
  CC      hw/net/lance.o
  CC      hw/net/sunhme.o
  CC      hw/net/ftgmac100.o
  CC      hw/net/sungem.o
  CC      hw/net/rocker/rocker.o
  CC      hw/net/rocker/rocker_fp.o
  CC      hw/net/rocker/rocker_desc.o
  CC      hw/net/rocker/rocker_world.o
  CC      hw/net/rocker/rocker_of_dpa.o
  CC      hw/nvram/ds1225y.o
  CC      hw/nvram/eeprom93xx.o
  CC      hw/nvram/fw_cfg.o
  CC      hw/nvram/chrp_nvram.o
  CC      hw/nvram/mac_nvram.o
  CC      hw/pci-bridge/pci_bridge_dev.o
  CC      hw/pci-bridge/pcie_pci_bridge.o
  CC      hw/pci-bridge/pcie_root_port.o
  CC      hw/pci-bridge/gen_pcie_root_port.o
  CC      hw/pci-bridge/pci_expander_bridge.o
  CC      hw/pci-bridge/xio3130_downstream.o
  CC      hw/pci-bridge/xio3130_upstream.o
  CC      hw/pci-bridge/ioh3420.o
  CC      hw/pci-bridge/i82801b11.o
  CC      hw/pci-bridge/dec.o
  CC      hw/pci-host/pam.o
  CC      hw/pci-host/prep.o
  CC      hw/pci-host/grackle.o
  CC      hw/pci-host/uninorth.o
  CC      hw/pci-host/ppce500.o
  CC      hw/pci-host/versatile.o
  CC      hw/pci-host/apb.o
  CC      hw/pci-host/bonito.o
  CC      hw/pci-host/piix.o
  CC      hw/pci-host/q35.o
  CC      hw/pci-host/gpex.o
  CC      hw/pci-host/xilinx-pcie.o
  CC      hw/pci/pci.o
  CC      hw/pci/pci_bridge.o
  CC      hw/pci/msix.o
  CC      hw/pci/msi.o
  CC      hw/pci/shpc.o
  CC      hw/pci/slotid_cap.o
  CC      hw/pci/pci_host.o
  CC      hw/pci/pcie_host.o
  CC      hw/pci/pcie.o
  CC      hw/pci/pcie_aer.o
  CC      hw/pci/pcie_port.o
  CC      hw/pci/pci-stub.o
  CC      hw/pcmcia/pcmcia.o
  CC      hw/scsi/scsi-disk.o
  CC      hw/scsi/scsi-generic.o
  CC      hw/scsi/scsi-bus.o
  CC      hw/scsi/lsi53c895a.o
  CC      hw/scsi/mptsas.o
  CC      hw/scsi/mptconfig.o
  CC      hw/scsi/mptendian.o
  CC      hw/scsi/megasas.o
  CC      hw/scsi/vmw_pvscsi.o
  CC      hw/scsi/esp.o
  CC      hw/scsi/esp-pci.o
  CC      hw/sd/pl181.o
  CC      hw/sd/ssi-sd.o
  CC      hw/sd/sd.o
  CC      hw/sd/core.o
  CC      hw/sd/sdhci.o
  CC      hw/smbios/smbios.o
  CC      hw/smbios/smbios_type_38.o
  CC      hw/smbios/smbios-stub.o
  CC      hw/smbios/smbios_type_38-stub.o
  CC      hw/ssi/pl022.o
  CC      hw/ssi/ssi.o
  CC      hw/ssi/xilinx_spi.o
  CC      hw/ssi/xilinx_spips.o
  CC      hw/ssi/aspeed_smc.o
  CC      hw/ssi/stm32f2xx_spi.o
  CC      hw/ssi/mss-spi.o
  CC      hw/timer/arm_timer.o
  CC      hw/timer/arm_mptimer.o
  CC      hw/timer/armv7m_systick.o
  CC      hw/timer/a9gtimer.o
  CC      hw/timer/cadence_ttc.o
  CC      hw/timer/ds1338.o
  CC      hw/timer/hpet.o
  CC      hw/timer/i8254_common.o
  CC      hw/timer/i8254.o
  CC      hw/timer/m48t59.o
  CC      hw/timer/m48t59-isa.o
  CC      hw/timer/pl031.o
  CC      hw/timer/puv3_ost.o
  CC      hw/timer/twl92230.o
  CC      hw/timer/xilinx_timer.o
  CC      hw/timer/slavio_timer.o
  CC      hw/timer/etraxfs_timer.o
  CC      hw/timer/grlib_gptimer.o
  CC      hw/timer/imx_epit.o
  CC      hw/timer/imx_gpt.o
  CC      hw/timer/lm32_timer.o
  CC      hw/timer/milkymist-sysctl.o
  CC      hw/timer/stm32f2xx_timer.o
  CC      hw/timer/sun4v-rtc.o
  CC      hw/timer/aspeed_timer.o
  CC      hw/timer/cmsdk-apb-timer.o
  CC      hw/timer/mss-timer.o
  CC      hw/tpm/tpm_tis.o
  CC      hw/tpm/tpm_emulator.o
  CC      hw/tpm/tpm_util.o
  CC      hw/usb/core.o
  CC      hw/usb/combined-packet.o
  CC      hw/usb/bus.o
  CC      hw/usb/libhw.o
  CC      hw/usb/desc.o
  CC      hw/usb/desc-msos.o
  CC      hw/usb/hcd-uhci.o
  CC      hw/usb/hcd-ohci.o
  CC      hw/usb/hcd-ehci.o
  CC      hw/usb/hcd-ehci-pci.o
  CC      hw/usb/hcd-ehci-sysbus.o
  CC      hw/usb/hcd-xhci.o
  CC      hw/usb/hcd-xhci-nec.o
  CC      hw/usb/hcd-musb.o
  CC      hw/usb/dev-hub.o
  CC      hw/usb/dev-hid.o
  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
  CC      hw/usb/dev-uas.o
  CC      hw/usb/dev-audio.o
  CC      hw/usb/dev-serial.o
  CC      hw/usb/dev-network.o
  CC      hw/usb/dev-bluetooth.o
  CC      hw/usb/dev-smartcard-reader.o
  CC      hw/usb/ccid-card-passthru.o
  CC      hw/usb/ccid-card-emulated.o
  CC      hw/usb/dev-mtp.o
  CC      hw/usb/redirect.o
  CC      hw/usb/quirks.o
  CC      hw/usb/host-libusb.o
  CC      hw/usb/host-legacy.o
  CC      hw/usb/host-stub.o
  CC      hw/virtio/virtio-rng.o
  CC      hw/virtio/virtio-pci.o
  CC      hw/virtio/virtio-bus.o
  CC      hw/virtio/virtio-mmio.o
  CC      hw/virtio/vhost-stub.o
  CC      hw/watchdog/watchdog.o
  CC      hw/watchdog/wdt_i6300esb.o
  CC      hw/watchdog/wdt_ib700.o
  CC      hw/watchdog/wdt_diag288.o
  CC      hw/watchdog/wdt_aspeed.o
  CC      migration/migration.o
  CC      migration/socket.o
  CC      migration/fd.o
  CC      migration/exec.o
  CC      migration/tls.o
  CC      migration/savevm.o
  CC      migration/channel.o
  CC      migration/colo-comm.o
  CC      migration/colo.o
  CC      migration/colo-failover.o
  CC      migration/vmstate.o
  CC      migration/vmstate-types.o
  CC      migration/page_cache.o
  CC      migration/qemu-file.o
  CC      migration/global_state.o
  CC      migration/xbzrle.o
  CC      migration/qemu-file-channel.o
  CC      migration/postcopy-ram.o
  CC      migration/qjson.o
  CC      migration/block-dirty-bitmap.o
  CC      migration/block.o
  CC      net/net.o
  CC      net/queue.o
  CC      net/checksum.o
  CC      net/util.o
  CC      net/hub.o
  CC      net/socket.o
  CC      net/dump.o
  CC      net/eth.o
  CC      net/l2tpv3.o
  CC      net/vhost-user.o
  CC      net/slirp.o
  CC      net/filter.o
  CC      net/filter-mirror.o
  CC      net/filter-buffer.o
  CC      net/colo-compare.o
  CC      net/colo.o
  CC      net/filter-rewriter.o
  CC      net/filter-replay.o
  CC      net/tap.o
  CC      net/tap-linux.o
  CC      qom/cpu.o
  CC      replay/replay.o
  CC      replay/replay-internal.o
  CC      replay/replay-events.o
  CC      replay/replay-time.o
  CC      replay/replay-input.o
  CC      replay/replay-char.o
  CC      replay/replay-snapshot.o
  CC      replay/replay-net.o
  CC      replay/replay-audio.o
  CC      slirp/cksum.o
  CC      slirp/if.o
  CC      slirp/ip_icmp.o
  CC      slirp/ip6_icmp.o
  CC      slirp/ip6_input.o
  CC      slirp/ip6_output.o
  CC      slirp/ip_input.o
  CC      slirp/ip_output.o
  CC      slirp/dnssearch.o
  CC      slirp/dhcpv6.o
  CC      slirp/slirp.o
  CC      slirp/mbuf.o
  CC      slirp/misc.o
  CC      slirp/sbuf.o
  CC      slirp/socket.o
  CC      slirp/tcp_input.o
  CC      slirp/tcp_output.o
  CC      slirp/tcp_subr.o
  CC      slirp/tcp_timer.o
  CC      slirp/udp.o
  CC      slirp/udp6.o
  CC      slirp/bootp.o
  CC      slirp/tftp.o
  CC      slirp/arp_table.o
  CC      slirp/ndp_table.o
  CC      slirp/ncsi.o
  CC      ui/keymaps.o
  CC      ui/console.o
  CC      ui/cursor.o
  CC      ui/qemu-pixman.o
  CC      ui/input.o
  CC      ui/input-legacy.o
  CC      ui/input-linux.o
  CC      ui/sdl2.o
  CC      ui/sdl2-input.o
  CC      ui/sdl2-2d.o
  CC      ui/sdl2-gl.o
  CC      ui/x_keymap.o
  CC      ui/curses.o
  CC      ui/vnc.o
  CC      ui/vnc-enc-zlib.o
  CC      ui/vnc-enc-hextile.o
  CC      ui/vnc-enc-tight.o
  CC      ui/vnc-palette.o
  CC      ui/vnc-enc-zrle.o
  CC      ui/vnc-auth-vencrypt.o
  CC      ui/vnc-auth-sasl.o
  CC      ui/vnc-jobs.o
  CC      ui/vnc-ws.o
  CC      ui/gtk.o
  VERT    ui/shader/texture-blit-vert.h
  VERT    ui/shader/texture-blit-flip-vert.h
  FRAG    ui/shader/texture-blit-frag.h
  CC      ui/console-gl.o
  CC      ui/egl-helpers.o
  CC      ui/egl-context.o
  CC      ui/egl-headless.o
  CC      ui/gtk-gl-area.o
  CC      chardev/char.o
  CC      chardev/char-fd.o
  CC      chardev/char-fe.o
  CC      chardev/char-file.o
  CC      chardev/char-io.o
  CC      chardev/char-mux.o
  CC      chardev/char-null.o
  CC      chardev/char-parallel.o
  CC      chardev/char-pipe.o
  CC      chardev/char-ringbuf.o
  CC      chardev/char-pty.o
  CC      chardev/char-serial.o
  CC      chardev/char-socket.o
  CC      chardev/char-stdio.o
  CC      chardev/char-udp.o
  LINK    tests/qemu-iotests/socket_scm_helper
  GEN     qemu-doc.html
  CCAS    s390-ccw/start.o
  GEN     qemu-doc.txt
  GEN     qemu.1
  CC      s390-ccw/main.o
  CC      s390-ccw/bootmap.o
  GEN     docs/interop/qemu-qmp-ref.html
  CC      s390-ccw/sclp.o
  CC      s390-ccw/virtio.o
  GEN     docs/interop/qemu-qmp-ref.txt
  CC      s390-ccw/virtio-scsi.o
  GEN     docs/interop/qemu-qmp-ref.7
  CC      s390-ccw/virtio-blkdev.o
  GEN     docs/interop/qemu-ga-ref.html
s390-netboot.img not built since roms/SLOF/ is not available.
  BUILD   s390-ccw/s390-ccw.elf
  STRIP   s390-ccw/s390-ccw.img
  GEN     docs/interop/qemu-ga-ref.txt
  GEN     docs/interop/qemu-ga-ref.7
  CC      qga/commands.o
  CC      qga/guest-agent-command-state.o
  CC      qga/main.o
  CC      qga/commands-posix.o
  CC      qga/channel-posix.o
  CC      qga/qapi-generated/qga-qapi-types.o
  CC      qga/qapi-generated/qga-qapi-visit.o
  CC      qga/qapi-generated/qga-qmp-marshal.o
  AR      libqemuutil.a
  CC      ui/shader.o
  CC      qemu-img.o
  LINK    qemu-keymap
  LINK    ivshmem-client
  LINK    ivshmem-server
  LINK    qemu-nbd
  LINK    qemu-io
  LINK    fsdev/virtfs-proxy-helper
  LINK    scsi/qemu-pr-helper
  LINK    qemu-bridge-helper
  GEN     cris-softmmu/hmp-commands.h
  GEN     alpha-softmmu/hmp-commands.h
  GEN     cris-softmmu/hmp-commands-info.h
  GEN     arm-softmmu/hmp-commands.h
  GEN     cris-softmmu/config-target.h
  GEN     arm-softmmu/hmp-commands-info.h
  GEN     alpha-softmmu/hmp-commands-info.h
  CC      cris-softmmu/exec.o
  GEN     arm-softmmu/config-target.h
  CC      arm-softmmu/exec.o
  GEN     alpha-softmmu/config-target.h
  CC      alpha-softmmu/exec.o
  GEN     aarch64-softmmu/hmp-commands.h
  GEN     aarch64-softmmu/hmp-commands-info.h
  GEN     aarch64-softmmu/config-target.h
  CC      aarch64-softmmu/exec.o
  CC      arm-softmmu/tcg/tcg.o
  CC      cris-softmmu/tcg/tcg.o
  CC      alpha-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/tcg/tcg.o
  CC      arm-softmmu/tcg/tcg-op.o
  CC      alpha-softmmu/tcg/tcg-op.o
  CC      cris-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/tcg/tcg-op.o
  CC      arm-softmmu/tcg/optimize.o
  CC      alpha-softmmu/tcg/optimize.o
  CC      cris-softmmu/tcg/optimize.o
  CC      arm-softmmu/tcg/tcg-common.o
  CC      arm-softmmu/fpu/softfloat.o
  CC      alpha-softmmu/tcg/tcg-common.o
  CC      cris-softmmu/tcg/tcg-common.o
  CC      alpha-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/tcg/optimize.o
  CC      cris-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/tcg/tcg-common.o
  CC      arm-softmmu/disas.o
  CC      alpha-softmmu/disas.o
  CC      aarch64-softmmu/fpu/softfloat.o
  GEN     arm-softmmu/gdbstub-xml.c
  CC      alpha-softmmu/arch_init.o
  CC      alpha-softmmu/cpus.o
  CC      arm-softmmu/arch_init.o
  CC      alpha-softmmu/monitor.o
  CC      cris-softmmu/disas.o
  CC      arm-softmmu/cpus.o
  CC      cris-softmmu/arch_init.o
  CC      arm-softmmu/monitor.o
  CC      cris-softmmu/cpus.o
  CC      alpha-softmmu/gdbstub.o
  CC      aarch64-softmmu/disas.o
  CC      cris-softmmu/monitor.o
  CC      alpha-softmmu/balloon.o
  GEN     aarch64-softmmu/gdbstub-xml.c
  CC      alpha-softmmu/ioport.o
  CC      arm-softmmu/gdbstub.o
  CC      alpha-softmmu/numa.o
  CC      cris-softmmu/gdbstub.o
  CC      arm-softmmu/balloon.o
  CC      aarch64-softmmu/arch_init.o
  CC      alpha-softmmu/qtest.o
  CC      aarch64-softmmu/cpus.o
  CC      cris-softmmu/balloon.o
  CC      arm-softmmu/ioport.o
  CC      alpha-softmmu/memory.o
  CC      cris-softmmu/ioport.o
  CC      arm-softmmu/numa.o
  CC      aarch64-softmmu/monitor.o
  CC      cris-softmmu/numa.o
  CC      arm-softmmu/qtest.o
  CC      cris-softmmu/qtest.o
  CC      alpha-softmmu/memory_mapping.o
  CC      arm-softmmu/memory.o
  CC      alpha-softmmu/dump.o
  CC      cris-softmmu/memory.o
  CC      aarch64-softmmu/gdbstub.o
  CC      alpha-softmmu/migration/ram.o
  CC      arm-softmmu/memory_mapping.o
  CC      aarch64-softmmu/balloon.o
  CC      aarch64-softmmu/ioport.o
  CC      arm-softmmu/dump.o
  CC      cris-softmmu/memory_mapping.o
  CC      alpha-softmmu/accel/accel.o
  CC      aarch64-softmmu/numa.o
  CC      alpha-softmmu/accel/stubs/hax-stub.o
  CC      cris-softmmu/dump.o
  CC      arm-softmmu/migration/ram.o
  CC      alpha-softmmu/accel/stubs/kvm-stub.o
  CC      aarch64-softmmu/qtest.o
  CC      alpha-softmmu/accel/tcg/tcg-all.o
  CC      alpha-softmmu/accel/tcg/cputlb.o
  CC      cris-softmmu/migration/ram.o
  CC      aarch64-softmmu/memory.o
  CC      arm-softmmu/accel/accel.o
  CC      arm-softmmu/accel/stubs/hax-stub.o
  CC      cris-softmmu/accel/accel.o
  CC      arm-softmmu/accel/stubs/kvm-stub.o
  CC      cris-softmmu/accel/stubs/hax-stub.o
  CC      aarch64-softmmu/memory_mapping.o
  CC      alpha-softmmu/accel/tcg/tcg-runtime.o
  CC      cris-softmmu/accel/stubs/kvm-stub.o
  CC      arm-softmmu/accel/tcg/tcg-all.o
  CC      aarch64-softmmu/dump.o
  CC      cris-softmmu/accel/tcg/tcg-all.o
  CC      arm-softmmu/accel/tcg/cputlb.o
  CC      alpha-softmmu/accel/tcg/cpu-exec.o
  CC      cris-softmmu/accel/tcg/cputlb.o
  CC      alpha-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/migration/ram.o
  CC      alpha-softmmu/accel/tcg/translate-all.o
  CC      cris-softmmu/accel/tcg/tcg-runtime.o
  CC      arm-softmmu/accel/tcg/tcg-runtime.o
  CC      alpha-softmmu/accel/tcg/translator.o
  CC      cris-softmmu/accel/tcg/cpu-exec.o
  CC      aarch64-softmmu/accel/accel.o
  CC      alpha-softmmu/hw/9pfs/virtio-9p-device.o
  CC      arm-softmmu/accel/tcg/cpu-exec.o
  CC      aarch64-softmmu/accel/stubs/hax-stub.o
  CC      cris-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/accel/stubs/kvm-stub.o
  CC      alpha-softmmu/hw/block/virtio-blk.o
  CC      cris-softmmu/accel/tcg/translate-all.o
  CC      aarch64-softmmu/accel/tcg/tcg-all.o
  CC      arm-softmmu/accel/tcg/cpu-exec-common.o
  CC      alpha-softmmu/hw/block/dataplane/virtio-blk.o
  CC      aarch64-softmmu/accel/tcg/cputlb.o
  CC      arm-softmmu/accel/tcg/translate-all.o
  CC      alpha-softmmu/hw/char/virtio-serial-bus.o
  CC      cris-softmmu/accel/tcg/translator.o
  CC      cris-softmmu/hw/core/generic-loader.o
  CC      alpha-softmmu/hw/core/generic-loader.o
  CC      arm-softmmu/accel/tcg/translator.o
  CC      alpha-softmmu/hw/core/null-machine.o
  CC      cris-softmmu/hw/core/null-machine.o
  CC      alpha-softmmu/hw/display/vga.o
  CC      cris-softmmu/hw/misc/mmio_interface.o
  CC      aarch64-softmmu/accel/tcg/tcg-runtime.o
  CC      arm-softmmu/hw/9pfs/virtio-9p-device.o
  CC      cris-softmmu/hw/net/etraxfs_eth.o
  CC      cris-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/adc/stm32f2xx_adc.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec.o
  CC      cris-softmmu/hw/net/rocker/qmp-norocker.o
  CC      arm-softmmu/hw/block/virtio-blk.o
  CC      cris-softmmu/hw/vfio/common.o
  CC      alpha-softmmu/hw/display/virtio-gpu.o
  CC      arm-softmmu/hw/block/dataplane/virtio-blk.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/accel/tcg/translate-all.o
  CC      arm-softmmu/hw/char/exynos4210_uart.o
  CC      cris-softmmu/hw/vfio/platform.o
  CC      alpha-softmmu/hw/display/virtio-gpu-3d.o
  CC      arm-softmmu/hw/char/omap_uart.o
  CC      aarch64-softmmu/accel/tcg/translator.o
  CC      cris-softmmu/hw/vfio/spapr.o
  CC      alpha-softmmu/hw/display/virtio-gpu-pci.o
  CC      arm-softmmu/hw/char/digic-uart.o
  CC      arm-softmmu/hw/char/stm32f2xx_usart.o
  CC      cris-softmmu/hw/cris/boot.o
  CC      aarch64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      alpha-softmmu/hw/misc/ivshmem.o
  CC      cris-softmmu/hw/cris/axis_dev88.o
  CC      arm-softmmu/hw/char/bcm2835_aux.o
  CC      aarch64-softmmu/hw/adc/stm32f2xx_adc.o
  CC      cris-softmmu/target/cris/translate.o
  CC      aarch64-softmmu/hw/block/virtio-blk.o
  CC      arm-softmmu/hw/char/virtio-serial-bus.o
  CC      alpha-softmmu/hw/misc/mmio_interface.o
  CC      arm-softmmu/hw/core/generic-loader.o
  CC      aarch64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      alpha-softmmu/hw/net/virtio-net.o
  CC      arm-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/char/exynos4210_uart.o
  CC      aarch64-softmmu/hw/char/omap_uart.o
  CC      arm-softmmu/hw/cpu/arm11mpcore.o
  CC      aarch64-softmmu/hw/char/digic-uart.o
  CC      alpha-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/cpu/realview_mpcore.o
  CC      cris-softmmu/target/cris/op_helper.o
  CC      aarch64-softmmu/hw/char/stm32f2xx_usart.o
  CC      alpha-softmmu/hw/scsi/virtio-scsi.o
  CC      arm-softmmu/hw/cpu/a9mpcore.o
  CC      cris-softmmu/target/cris/helper.o
  CC      arm-softmmu/hw/cpu/a15mpcore.o
  CC      aarch64-softmmu/hw/char/bcm2835_aux.o
  CC      cris-softmmu/target/cris/cpu.o
  CC      alpha-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      arm-softmmu/hw/display/omap_dss.o
  CC      cris-softmmu/target/cris/gdbstub.o
  CC      alpha-softmmu/hw/scsi/vhost-scsi-common.o
  CC      aarch64-softmmu/hw/char/virtio-serial-bus.o
  CC      cris-softmmu/target/cris/mmu.o
  CC      alpha-softmmu/hw/scsi/vhost-scsi.o
  CC      arm-softmmu/hw/display/omap_lcdc.o
  CC      cris-softmmu/target/cris/machine.o
  CC      alpha-softmmu/hw/scsi/vhost-user-scsi.o
  CC      aarch64-softmmu/hw/core/generic-loader.o
  CC      alpha-softmmu/hw/timer/mc146818rtc.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/hw/core/null-machine.o
  CC      cris-softmmu/trace/control-target.o
  CC      arm-softmmu/hw/display/pxa2xx_lcd.o
  CC      aarch64-softmmu/hw/cpu/arm11mpcore.o
  CC      alpha-softmmu/hw/vfio/common.o
  CC      aarch64-softmmu/hw/cpu/realview_mpcore.o
  CC      cris-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/cpu/a9mpcore.o
  LINK    cris-softmmu/qemu-system-cris
  CC      aarch64-softmmu/hw/cpu/a15mpcore.o
  CC      alpha-softmmu/hw/vfio/pci.o
  CC      arm-softmmu/hw/display/bcm2835_fb.o
  CC      aarch64-softmmu/hw/display/omap_dss.o
  CC      arm-softmmu/hw/display/vga.o
  CC      aarch64-softmmu/hw/display/omap_lcdc.o
  CC      alpha-softmmu/hw/vfio/pci-quirks.o
  CC      arm-softmmu/hw/display/virtio-gpu.o
  CC      aarch64-softmmu/hw/display/pxa2xx_lcd.o
  CC      alpha-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/display/virtio-gpu-3d.o
  CC      alpha-softmmu/hw/vfio/spapr.o
  GEN     i386-softmmu/hmp-commands.h
  GEN     i386-softmmu/hmp-commands-info.h
  CC      alpha-softmmu/hw/virtio/virtio.o
  GEN     i386-softmmu/config-target.h
  CC      aarch64-softmmu/hw/display/bcm2835_fb.o
  CC      i386-softmmu/exec.o
  CC      arm-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/display/vga.o
  CC      alpha-softmmu/hw/virtio/virtio-balloon.o
  CC      arm-softmmu/hw/dma/omap_dma.o
  CC      alpha-softmmu/hw/virtio/vhost.o
  CC      aarch64-softmmu/hw/display/virtio-gpu.o
  CC      arm-softmmu/hw/dma/soc_dma.o
  CC      i386-softmmu/tcg/tcg.o
  CC      arm-softmmu/hw/dma/pxa2xx_dma.o
  CC      alpha-softmmu/hw/virtio/vhost-backend.o
  CC      arm-softmmu/hw/dma/bcm2835_dma.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-3d.o
  CC      alpha-softmmu/hw/virtio/vhost-user.o
  CC      arm-softmmu/hw/gpio/omap_gpio.o
  CC      alpha-softmmu/hw/virtio/vhost-vsock.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-pci.o
  CC      arm-softmmu/hw/gpio/imx_gpio.o
  CC      alpha-softmmu/hw/virtio/virtio-crypto.o
  CC      arm-softmmu/hw/gpio/bcm2835_gpio.o
  CC      aarch64-softmmu/hw/display/dpcd.o
  CC      alpha-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      i386-softmmu/tcg/tcg-op.o
  CC      arm-softmmu/hw/i2c/omap_i2c.o
  CC      aarch64-softmmu/hw/display/xlnx_dp.o
  CC      arm-softmmu/hw/input/pxa2xx_keypad.o
  CC      alpha-softmmu/hw/alpha/dp264.o
  CC      aarch64-softmmu/hw/dma/xlnx_dpdma.o
  CC      arm-softmmu/hw/input/tsc210x.o
  CC      alpha-softmmu/hw/alpha/pci.o
  CC      arm-softmmu/hw/intc/armv7m_nvic.o
  CC      aarch64-softmmu/hw/dma/omap_dma.o
  CC      alpha-softmmu/hw/alpha/typhoon.o
  CC      i386-softmmu/tcg/optimize.o
  CC      alpha-softmmu/target/alpha/machine.o
  CC      alpha-softmmu/target/alpha/translate.o
  CC      aarch64-softmmu/hw/dma/soc_dma.o
  CC      arm-softmmu/hw/intc/exynos4210_gic.o
  CC      aarch64-softmmu/hw/dma/pxa2xx_dma.o
  CC      i386-softmmu/tcg/tcg-common.o
  CC      arm-softmmu/hw/intc/exynos4210_combiner.o
  CC      i386-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/hw/dma/bcm2835_dma.o
  CC      arm-softmmu/hw/intc/omap_intc.o
  CC      alpha-softmmu/target/alpha/helper.o
  CC      aarch64-softmmu/hw/gpio/omap_gpio.o
  CC      arm-softmmu/hw/intc/bcm2835_ic.o
  CC      aarch64-softmmu/hw/gpio/imx_gpio.o
  CC      alpha-softmmu/target/alpha/cpu.o
  CC      arm-softmmu/hw/intc/bcm2836_control.o
  CC      alpha-softmmu/target/alpha/int_helper.o
  CC      aarch64-softmmu/hw/gpio/bcm2835_gpio.o
  CC      arm-softmmu/hw/intc/allwinner-a10-pic.o
  CC      aarch64-softmmu/hw/i2c/omap_i2c.o
  CC      arm-softmmu/hw/intc/aspeed_vic.o
  CC      aarch64-softmmu/hw/input/pxa2xx_keypad.o
  CC      alpha-softmmu/target/alpha/fpu_helper.o
  CC      arm-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      aarch64-softmmu/hw/input/tsc210x.o
  CC      alpha-softmmu/target/alpha/vax_helper.o
  CC      i386-softmmu/disas.o
  CC      aarch64-softmmu/hw/intc/armv7m_nvic.o
  CC      alpha-softmmu/target/alpha/sys_helper.o
  GEN     i386-softmmu/gdbstub-xml.c
  CC      arm-softmmu/hw/misc/ivshmem.o
  CC      alpha-softmmu/target/alpha/mem_helper.o
  CC      i386-softmmu/arch_init.o
  CC      alpha-softmmu/target/alpha/gdbstub.o
  CC      aarch64-softmmu/hw/intc/exynos4210_gic.o
  CC      i386-softmmu/cpus.o
  CC      arm-softmmu/hw/misc/arm_sysctl.o
  GEN     trace/generated-helpers.c
  CC      alpha-softmmu/trace/control-target.o
  CC      aarch64-softmmu/hw/intc/exynos4210_combiner.o
  CC      arm-softmmu/hw/misc/cbus.o
  CC      aarch64-softmmu/hw/intc/omap_intc.o
  CC      alpha-softmmu/trace/generated-helpers.o
  CC      i386-softmmu/monitor.o
  CC      arm-softmmu/hw/misc/exynos4210_pmu.o
  CC      aarch64-softmmu/hw/intc/bcm2835_ic.o
  LINK    alpha-softmmu/qemu-system-alpha
  CC      arm-softmmu/hw/misc/exynos4210_clk.o
  CC      aarch64-softmmu/hw/intc/bcm2836_control.o
  CC      arm-softmmu/hw/misc/exynos4210_rng.o
  CC      aarch64-softmmu/hw/intc/allwinner-a10-pic.o
  CC      arm-softmmu/hw/misc/imx_ccm.o
  CC      i386-softmmu/gdbstub.o
  CC      arm-softmmu/hw/misc/imx31_ccm.o
  CC      aarch64-softmmu/hw/intc/aspeed_vic.o
  CC      arm-softmmu/hw/misc/imx25_ccm.o
  CC      arm-softmmu/hw/misc/imx6_ccm.o
  CC      aarch64-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      i386-softmmu/balloon.o
  CC      arm-softmmu/hw/misc/imx6_src.o
  CC      i386-softmmu/ioport.o
  CC      arm-softmmu/hw/misc/mst_fpga.o
  CC      i386-softmmu/numa.o
  CC      arm-softmmu/hw/misc/omap_clk.o
  GEN     lm32-softmmu/hmp-commands.h
  GEN     lm32-softmmu/hmp-commands-info.h
  GEN     lm32-softmmu/config-target.h
  CC      aarch64-softmmu/hw/misc/ivshmem.o
  CC      lm32-softmmu/exec.o
  CC      i386-softmmu/qtest.o
  CC      arm-softmmu/hw/misc/omap_gpmc.o
  CC      aarch64-softmmu/hw/misc/arm_sysctl.o
  CC      i386-softmmu/memory.o
  CC      aarch64-softmmu/hw/misc/cbus.o
  CC      arm-softmmu/hw/misc/omap_l4.o
  CC      arm-softmmu/hw/misc/omap_sdrc.o
  CC      aarch64-softmmu/hw/misc/exynos4210_pmu.o
  CC      aarch64-softmmu/hw/misc/exynos4210_clk.o
  CC      arm-softmmu/hw/misc/omap_tap.o
  CC      arm-softmmu/hw/misc/bcm2835_mbox.o
  CC      i386-softmmu/memory_mapping.o
  CC      lm32-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/hw/misc/exynos4210_rng.o
  CC      arm-softmmu/hw/misc/bcm2835_property.o
  CC      i386-softmmu/dump.o
  CC      aarch64-softmmu/hw/misc/imx_ccm.o
  CC      aarch64-softmmu/hw/misc/imx31_ccm.o
  CC      arm-softmmu/hw/misc/bcm2835_rng.o
  CC      i386-softmmu/migration/ram.o
  CC      aarch64-softmmu/hw/misc/imx25_ccm.o
  CC      arm-softmmu/hw/misc/zynq_slcr.o
  CC      aarch64-softmmu/hw/misc/imx6_ccm.o
  CC      lm32-softmmu/tcg/tcg-op.o
  CC      arm-softmmu/hw/misc/zynq-xadc.o
  CC      aarch64-softmmu/hw/misc/imx6_src.o
  CC      i386-softmmu/accel/accel.o
  CC      arm-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      arm-softmmu/hw/misc/mps2-scc.o
  CC      aarch64-softmmu/hw/misc/mst_fpga.o
  CC      i386-softmmu/accel/stubs/hax-stub.o
  CC      arm-softmmu/hw/misc/aspeed_scu.o
  CC      aarch64-softmmu/hw/misc/omap_clk.o
  CC      i386-softmmu/accel/stubs/kvm-stub.o
  CC      arm-softmmu/hw/misc/aspeed_sdmc.o
  CC      aarch64-softmmu/hw/misc/omap_gpmc.o
  CC      i386-softmmu/accel/tcg/tcg-all.o
  CC      arm-softmmu/hw/misc/mmio_interface.o
  CC      lm32-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/hw/misc/omap_l4.o
  CC      i386-softmmu/accel/tcg/cputlb.o
  CC      arm-softmmu/hw/misc/msf2-sysreg.o
  CC      aarch64-softmmu/hw/misc/omap_sdrc.o
  CC      arm-softmmu/hw/net/virtio-net.o
  CC      lm32-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/hw/misc/omap_tap.o
  CC      lm32-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/hw/misc/bcm2835_mbox.o
  CC      arm-softmmu/hw/net/vhost_net.o
  CC      i386-softmmu/accel/tcg/tcg-runtime.o
  CC      arm-softmmu/hw/pcmcia/pxa2xx.o
  CC      aarch64-softmmu/hw/misc/bcm2835_property.o
  CC      arm-softmmu/hw/scsi/virtio-scsi.o
  CC      i386-softmmu/accel/tcg/cpu-exec.o
  CC      arm-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/misc/bcm2835_rng.o
  CC      i386-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/hw/misc/zynq_slcr.o
  CC      arm-softmmu/hw/scsi/vhost-scsi-common.o
  CC      i386-softmmu/accel/tcg/translate-all.o
  CC      aarch64-softmmu/hw/misc/zynq-xadc.o
  CC      arm-softmmu/hw/scsi/vhost-scsi.o
  CC      i386-softmmu/accel/tcg/translator.o
  CC      aarch64-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      arm-softmmu/hw/scsi/vhost-user-scsi.o
  CC      lm32-softmmu/disas.o
  CC      i386-softmmu/hw/9pfs/virtio-9p-device.o
  CC      aarch64-softmmu/hw/misc/mps2-scc.o
  CC      lm32-softmmu/arch_init.o
  CC      arm-softmmu/hw/sd/omap_mmc.o
  CC      aarch64-softmmu/hw/misc/auxbus.o
  CC      i386-softmmu/hw/block/virtio-blk.o
  CC      lm32-softmmu/cpus.o
  CC      aarch64-softmmu/hw/misc/aspeed_scu.o
  CC      arm-softmmu/hw/sd/pxa2xx_mmci.o
  CC      aarch64-softmmu/hw/misc/aspeed_sdmc.o
  CC      i386-softmmu/hw/block/dataplane/virtio-blk.o
  CC      arm-softmmu/hw/sd/bcm2835_sdhost.o
  CC      aarch64-softmmu/hw/misc/mmio_interface.o
  CC      i386-softmmu/hw/char/virtio-serial-bus.o
  CC      lm32-softmmu/monitor.o
  CC      arm-softmmu/hw/ssi/omap_spi.o
  CC      aarch64-softmmu/hw/misc/msf2-sysreg.o
  CC      i386-softmmu/hw/core/generic-loader.o
  CC      arm-softmmu/hw/ssi/imx_spi.o
  CC      i386-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/net/virtio-net.o
  CC      arm-softmmu/hw/timer/exynos4210_mct.o
  CC      i386-softmmu/hw/display/vga.o
  CC      arm-softmmu/hw/timer/exynos4210_pwm.o
  CC      lm32-softmmu/gdbstub.o
  CC      arm-softmmu/hw/timer/exynos4210_rtc.o
  CC      aarch64-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/pcmcia/pxa2xx.o
  CC      arm-softmmu/hw/timer/omap_gptimer.o
  CC      lm32-softmmu/balloon.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi.o
  CC      arm-softmmu/hw/timer/omap_synctimer.o
  CC      i386-softmmu/hw/display/virtio-gpu.o
  CC      lm32-softmmu/ioport.o
  CC      arm-softmmu/hw/timer/pxa2xx_timer.o
  CC      lm32-softmmu/numa.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      arm-softmmu/hw/timer/digic-timer.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      i386-softmmu/hw/display/virtio-gpu-3d.o
  CC      lm32-softmmu/qtest.o
  CC      arm-softmmu/hw/timer/allwinner-a10-pit.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi.o
  CC      arm-softmmu/hw/usb/tusb6010.o
  CC      lm32-softmmu/memory.o
  CC      i386-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      arm-softmmu/hw/vfio/common.o
  CC      aarch64-softmmu/hw/sd/omap_mmc.o
  CC      i386-softmmu/hw/display/virtio-vga.o
  CC      arm-softmmu/hw/vfio/pci.o
  CC      aarch64-softmmu/hw/sd/pxa2xx_mmci.o
  CC      i386-softmmu/hw/intc/apic.o
  CC      lm32-softmmu/memory_mapping.o
  CC      aarch64-softmmu/hw/sd/bcm2835_sdhost.o
  CC      lm32-softmmu/dump.o
  CC      i386-softmmu/hw/intc/apic_common.o
  CC      aarch64-softmmu/hw/ssi/omap_spi.o
  CC      arm-softmmu/hw/vfio/pci-quirks.o
  CC      aarch64-softmmu/hw/ssi/imx_spi.o
  CC      i386-softmmu/hw/intc/ioapic.o
  CC      lm32-softmmu/migration/ram.o
  CC      aarch64-softmmu/hw/timer/exynos4210_mct.o
  CC      arm-softmmu/hw/vfio/platform.o
  CC      i386-softmmu/hw/isa/lpc_ich9.o
  CC      aarch64-softmmu/hw/timer/exynos4210_pwm.o
  CC      arm-softmmu/hw/vfio/calxeda-xgmac.o
  CC      lm32-softmmu/accel/accel.o
  CC      aarch64-softmmu/hw/timer/exynos4210_rtc.o
  CC      i386-softmmu/hw/misc/vmport.o
  CC      arm-softmmu/hw/vfio/amd-xgbe.o
  CC      aarch64-softmmu/hw/timer/omap_gptimer.o
  CC      arm-softmmu/hw/vfio/spapr.o
  CC      lm32-softmmu/accel/stubs/hax-stub.o
  CC      i386-softmmu/hw/misc/ivshmem.o
  CC      lm32-softmmu/accel/stubs/kvm-stub.o
  CC      aarch64-softmmu/hw/timer/omap_synctimer.o
  CC      arm-softmmu/hw/virtio/virtio.o
  CC      lm32-softmmu/accel/tcg/tcg-all.o
  CC      aarch64-softmmu/hw/timer/pxa2xx_timer.o
  CC      lm32-softmmu/accel/tcg/cputlb.o
  CC      i386-softmmu/hw/misc/pvpanic.o
  CC      aarch64-softmmu/hw/timer/digic-timer.o
  CC      i386-softmmu/hw/misc/mmio_interface.o
  CC      arm-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/timer/allwinner-a10-pit.o
  CC      i386-softmmu/hw/net/virtio-net.o
  CC      arm-softmmu/hw/virtio/vhost.o
  CC      aarch64-softmmu/hw/usb/tusb6010.o
  CC      i386-softmmu/hw/net/vhost_net.o
  CC      lm32-softmmu/accel/tcg/tcg-runtime.o
  CC      aarch64-softmmu/hw/vfio/common.o
  CC      i386-softmmu/hw/scsi/virtio-scsi.o
  CC      arm-softmmu/hw/virtio/vhost-backend.o
  CC      lm32-softmmu/accel/tcg/cpu-exec.o
  CC      arm-softmmu/hw/virtio/vhost-user.o
  CC      i386-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/vfio/pci.o
  CC      lm32-softmmu/accel/tcg/cpu-exec-common.o
  CC      i386-softmmu/hw/scsi/vhost-scsi-common.o
  CC      arm-softmmu/hw/virtio/vhost-vsock.o
  CC      i386-softmmu/hw/scsi/vhost-scsi.o
  CC      lm32-softmmu/accel/tcg/translate-all.o
  CC      arm-softmmu/hw/virtio/virtio-crypto.o
  CC      i386-softmmu/hw/scsi/vhost-user-scsi.o
  CC      aarch64-softmmu/hw/vfio/pci-quirks.o
  CC      i386-softmmu/hw/timer/mc146818rtc.o
  CC      lm32-softmmu/accel/tcg/translator.o
  CC      arm-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      i386-softmmu/hw/vfio/common.o
  CC      lm32-softmmu/hw/core/generic-loader.o
  CC      aarch64-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/arm/boot.o
  CC      lm32-softmmu/hw/core/null-machine.o
  CC      i386-softmmu/hw/vfio/pci.o
  CC      aarch64-softmmu/hw/vfio/calxeda-xgmac.o
  CC      lm32-softmmu/hw/input/milkymist-softusb.o
  CC      arm-softmmu/hw/arm/collie.o
  CC      aarch64-softmmu/hw/vfio/amd-xgbe.o
  CC      arm-softmmu/hw/arm/exynos4_boards.o
  CC      aarch64-softmmu/hw/vfio/spapr.o
  CC      lm32-softmmu/hw/misc/milkymist-hpdmc.o
  CC      arm-softmmu/hw/arm/gumstix.o
  CC      aarch64-softmmu/hw/virtio/virtio.o
  CC      i386-softmmu/hw/vfio/pci-quirks.o
  CC      lm32-softmmu/hw/misc/milkymist-pfpu.o
  CC      arm-softmmu/hw/arm/highbank.o
  CC      lm32-softmmu/hw/misc/mmio_interface.o
  CC      arm-softmmu/hw/arm/digic_boards.o
  CC      i386-softmmu/hw/vfio/platform.o
  CC      aarch64-softmmu/hw/virtio/virtio-balloon.o
  CC      lm32-softmmu/hw/net/milkymist-minimac2.o
  CC      arm-softmmu/hw/arm/integratorcp.o
  CC      i386-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/virtio/vhost.o
  CC      lm32-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/arm/mainstone.o
  CC      i386-softmmu/hw/virtio/virtio.o
  CC      lm32-softmmu/hw/net/rocker/qmp-norocker.o
  CC      arm-softmmu/hw/arm/musicpal.o
  CC      aarch64-softmmu/hw/virtio/vhost-backend.o
  CC      lm32-softmmu/hw/sd/milkymist-memcard.o
  CC      aarch64-softmmu/hw/virtio/vhost-user.o
  CC      arm-softmmu/hw/arm/nseries.o
  CC      lm32-softmmu/hw/vfio/common.o
  CC      i386-softmmu/hw/virtio/virtio-balloon.o
  CC      i386-softmmu/hw/virtio/vhost.o
  CC      aarch64-softmmu/hw/virtio/vhost-vsock.o
  CC      lm32-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/arm/omap_sx1.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto.o
  CC      lm32-softmmu/hw/vfio/spapr.o
  CC      i386-softmmu/hw/virtio/vhost-backend.o
  CC      arm-softmmu/hw/arm/palm.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      lm32-softmmu/hw/lm32/lm32_boards.o
  CC      i386-softmmu/hw/virtio/vhost-user.o
  CC      arm-softmmu/hw/arm/realview.o
  CC      lm32-softmmu/hw/lm32/milkymist.o
  CC      aarch64-softmmu/hw/arm/boot.o
  CC      i386-softmmu/hw/virtio/vhost-vsock.o
  CC      arm-softmmu/hw/arm/spitz.o
  CC      lm32-softmmu/target/lm32/translate.o
  CC      i386-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/arm/collie.o
  CC      arm-softmmu/hw/arm/stellaris.o
  CC      i386-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/arm/exynos4_boards.o
  CC      lm32-softmmu/target/lm32/op_helper.o
  CC      aarch64-softmmu/hw/arm/gumstix.o
  CC      arm-softmmu/hw/arm/tosa.o
  CC      lm32-softmmu/target/lm32/helper.o
  CC      i386-softmmu/hw/i386/multiboot.o
  CC      aarch64-softmmu/hw/arm/highbank.o
  CC      lm32-softmmu/target/lm32/cpu.o
  CC      arm-softmmu/hw/arm/versatilepb.o
  CC      i386-softmmu/hw/i386/pc.o
  CC      aarch64-softmmu/hw/arm/digic_boards.o
  CC      lm32-softmmu/target/lm32/gdbstub.o
  CC      arm-softmmu/hw/arm/vexpress.o
  CC      lm32-softmmu/target/lm32/lm32-semi.o
  CC      aarch64-softmmu/hw/arm/integratorcp.o
  CC      arm-softmmu/hw/arm/virt.o
  CC      i386-softmmu/hw/i386/pc_piix.o
  CC      lm32-softmmu/target/lm32/machine.o
  CC      aarch64-softmmu/hw/arm/mainstone.o
  CC      arm-softmmu/hw/arm/xilinx_zynq.o
  GEN     trace/generated-helpers.c
  CC      lm32-softmmu/trace/control-target.o
  CC      i386-softmmu/hw/i386/pc_q35.o
  CC      aarch64-softmmu/hw/arm/musicpal.o
  CC      arm-softmmu/hw/arm/z2.o
  CC      lm32-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/arm/nseries.o
  CC      i386-softmmu/hw/i386/pc_sysfw.o
  CC      arm-softmmu/hw/arm/virt-acpi-build.o
  LINK    lm32-softmmu/qemu-system-lm32
  CC      i386-softmmu/hw/i386/x86-iommu.o
  CC      aarch64-softmmu/hw/arm/omap_sx1.o
  CC      arm-softmmu/hw/arm/netduino2.o
  CC      i386-softmmu/hw/i386/intel_iommu.o
  CC      arm-softmmu/hw/arm/sysbus-fdt.o
  CC      aarch64-softmmu/hw/arm/palm.o
  CC      arm-softmmu/hw/arm/armv7m.o
  CC      i386-softmmu/hw/i386/amd_iommu.o
  CC      aarch64-softmmu/hw/arm/realview.o
  CC      arm-softmmu/hw/arm/exynos4210.o
  CC      aarch64-softmmu/hw/arm/spitz.o
  CC      i386-softmmu/hw/i386/kvmvapic.o
  GEN     m68k-softmmu/hmp-commands.h
  CC      arm-softmmu/hw/arm/pxa2xx.o
  GEN     m68k-softmmu/hmp-commands-info.h
  GEN     m68k-softmmu/config-target.h
  CC      m68k-softmmu/exec.o
  CC      i386-softmmu/hw/i386/acpi-build.o
  CC      aarch64-softmmu/hw/arm/stellaris.o
  CC      aarch64-softmmu/hw/arm/tosa.o
  CC      arm-softmmu/hw/arm/pxa2xx_gpio.o
  CC      i386-softmmu/hw/i386/pci-assign-load-rom.o
  CC      aarch64-softmmu/hw/arm/versatilepb.o
  CC      aarch64-softmmu/hw/arm/vexpress.o
  CC      arm-softmmu/hw/arm/pxa2xx_pic.o
  CC      i386-softmmu/target/i386/helper.o
  CC      aarch64-softmmu/hw/arm/virt.o
  CC      i386-softmmu/target/i386/cpu.o
  CC      arm-softmmu/hw/arm/digic.o
  CC      m68k-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/hw/arm/xilinx_zynq.o
  CC      arm-softmmu/hw/arm/omap1.o
  CC      aarch64-softmmu/hw/arm/z2.o
  CC      i386-softmmu/target/i386/gdbstub.o
  CC      i386-softmmu/target/i386/xsave_helper.o
  CC      aarch64-softmmu/hw/arm/virt-acpi-build.o
  CC      arm-softmmu/hw/arm/omap2.o
  CC      i386-softmmu/target/i386/translate.o
  CC      m68k-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/hw/arm/netduino2.o
  CC      arm-softmmu/hw/arm/strongarm.o
  CC      aarch64-softmmu/hw/arm/sysbus-fdt.o
  CC      aarch64-softmmu/hw/arm/armv7m.o
  CC      arm-softmmu/hw/arm/allwinner-a10.o
  CC      aarch64-softmmu/hw/arm/exynos4210.o
  CC      m68k-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/hw/arm/pxa2xx.o
  CC      arm-softmmu/hw/arm/cubieboard.o
  CC      arm-softmmu/hw/arm/bcm2835_peripherals.o
  CC      m68k-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_gpio.o
  CC      m68k-softmmu/fpu/softfloat.o
  CC      arm-softmmu/hw/arm/bcm2836.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_pic.o
  CC      arm-softmmu/hw/arm/raspi.o
  CC      aarch64-softmmu/hw/arm/digic.o
  CC      aarch64-softmmu/hw/arm/omap1.o
  CC      arm-softmmu/hw/arm/stm32f205_soc.o
  CC      arm-softmmu/hw/arm/fsl-imx25.o
  CC      i386-softmmu/target/i386/bpt_helper.o
  CC      m68k-softmmu/disas.o
  CC      aarch64-softmmu/hw/arm/omap2.o
  CC      i386-softmmu/target/i386/cc_helper.o
  CC      arm-softmmu/hw/arm/imx25_pdk.o
  CC      i386-softmmu/target/i386/excp_helper.o
  GEN     m68k-softmmu/gdbstub-xml.c
  CC      arm-softmmu/hw/arm/fsl-imx31.o
  CC      i386-softmmu/target/i386/fpu_helper.o
  CC      m68k-softmmu/arch_init.o
  CC      aarch64-softmmu/hw/arm/strongarm.o
  CC      arm-softmmu/hw/arm/kzm.o
  CC      m68k-softmmu/cpus.o
  CC      aarch64-softmmu/hw/arm/allwinner-a10.o
  CC      arm-softmmu/hw/arm/fsl-imx6.o
  CC      aarch64-softmmu/hw/arm/cubieboard.o
  CC      m68k-softmmu/monitor.o
  CC      aarch64-softmmu/hw/arm/bcm2835_peripherals.o
  CC      arm-softmmu/hw/arm/sabrelite.o
  CC      aarch64-softmmu/hw/arm/bcm2836.o
  CC      arm-softmmu/hw/arm/aspeed_soc.o
  CC      i386-softmmu/target/i386/int_helper.o
  CC      aarch64-softmmu/hw/arm/raspi.o
  CC      m68k-softmmu/gdbstub.o
  CC      arm-softmmu/hw/arm/aspeed.o
  CC      i386-softmmu/target/i386/mem_helper.o
  CC      arm-softmmu/hw/arm/mps2.o
  CC      aarch64-softmmu/hw/arm/stm32f205_soc.o
  CC      m68k-softmmu/balloon.o
  CC      arm-softmmu/hw/arm/msf2-soc.o
  CC      i386-softmmu/target/i386/misc_helper.o
  CC      aarch64-softmmu/hw/arm/xlnx-zynqmp.o
  CC      m68k-softmmu/ioport.o
  CC      aarch64-softmmu/hw/arm/xlnx-zcu102.o
  CC      arm-softmmu/hw/arm/msf2-som.o
  CC      i386-softmmu/target/i386/mpx_helper.o
  CC      m68k-softmmu/numa.o
  CC      aarch64-softmmu/hw/arm/fsl-imx25.o
  CC      arm-softmmu/target/arm/arm-semi.o
  CC      i386-softmmu/target/i386/seg_helper.o
  CC      m68k-softmmu/qtest.o
  CC      aarch64-softmmu/hw/arm/imx25_pdk.o
  CC      arm-softmmu/target/arm/machine.o
  CC      aarch64-softmmu/hw/arm/fsl-imx31.o
  CC      arm-softmmu/target/arm/psci.o
  CC      m68k-softmmu/memory.o
  CC      aarch64-softmmu/hw/arm/kzm.o
  CC      arm-softmmu/target/arm/arch_dump.o
  CC      aarch64-softmmu/hw/arm/fsl-imx6.o
  CC      aarch64-softmmu/hw/arm/sabrelite.o
  CC      arm-softmmu/target/arm/monitor.o
  CC      i386-softmmu/target/i386/smm_helper.o
  CC      aarch64-softmmu/hw/arm/aspeed_soc.o
  CC      arm-softmmu/target/arm/kvm-stub.o
  CC      m68k-softmmu/memory_mapping.o
  CC      m68k-softmmu/dump.o
  CC      i386-softmmu/target/i386/svm_helper.o
  CC      aarch64-softmmu/hw/arm/aspeed.o
  CC      arm-softmmu/target/arm/translate.o
  CC      aarch64-softmmu/hw/arm/mps2.o
  CC      m68k-softmmu/migration/ram.o
  CC      i386-softmmu/target/i386/machine.o
  CC      aarch64-softmmu/hw/arm/msf2-soc.o
  CC      i386-softmmu/target/i386/arch_memory_mapping.o
  CC      aarch64-softmmu/hw/arm/msf2-som.o
  CC      m68k-softmmu/accel/accel.o
  CC      i386-softmmu/target/i386/arch_dump.o
  CC      aarch64-softmmu/target/arm/arm-semi.o
  CC      m68k-softmmu/accel/stubs/hax-stub.o
  CC      i386-softmmu/target/i386/monitor.o
  CC      m68k-softmmu/accel/stubs/kvm-stub.o
  CC      aarch64-softmmu/target/arm/machine.o
  CC      i386-softmmu/target/i386/kvm-stub.o
  CC      m68k-softmmu/accel/tcg/tcg-all.o
  CC      aarch64-softmmu/target/arm/psci.o
  GEN     trace/generated-helpers.c
  CC      m68k-softmmu/accel/tcg/cputlb.o
  CC      i386-softmmu/trace/control-target.o
  CC      aarch64-softmmu/target/arm/arch_dump.o
  CC      i386-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/target/arm/monitor.o
  CC      i386-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/target/arm/kvm-stub.o
  LINK    i386-softmmu/qemu-system-i386
  CC      aarch64-softmmu/target/arm/translate.o
  CC      m68k-softmmu/accel/tcg/tcg-runtime.o
  CC      arm-softmmu/target/arm/op_helper.o
  CC      m68k-softmmu/accel/tcg/cpu-exec.o
  CC      m68k-softmmu/accel/tcg/cpu-exec-common.o
  CC      arm-softmmu/target/arm/helper.o
  CC      m68k-softmmu/accel/tcg/translate-all.o
  CC      arm-softmmu/target/arm/cpu.o
  CC      m68k-softmmu/accel/tcg/translator.o
  CC      m68k-softmmu/hw/char/mcf_uart.o
  CC      m68k-softmmu/hw/core/generic-loader.o
  GEN     microblazeel-softmmu/hmp-commands.h
  GEN     microblazeel-softmmu/hmp-commands-info.h
  GEN     microblazeel-softmmu/config-target.h
  CC      m68k-softmmu/hw/core/null-machine.o
  CC      microblazeel-softmmu/exec.o
  CC      m68k-softmmu/hw/misc/mmio_interface.o
  CC      arm-softmmu/target/arm/neon_helper.o
  CC      m68k-softmmu/hw/net/mcf_fec.o
  CC      m68k-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/target/arm/op_helper.o
  CC      m68k-softmmu/hw/net/rocker/qmp-norocker.o
  CC      arm-softmmu/target/arm/iwmmxt_helper.o
  CC      m68k-softmmu/hw/vfio/common.o
  CC      microblazeel-softmmu/tcg/tcg.o
  CC      arm-softmmu/target/arm/gdbstub.o
  CC      m68k-softmmu/hw/vfio/platform.o
  CC      aarch64-softmmu/target/arm/helper.o
  CC      m68k-softmmu/hw/vfio/spapr.o
  CC      arm-softmmu/target/arm/crypto_helper.o
  CC      microblazeel-softmmu/tcg/tcg-op.o
  CC      m68k-softmmu/hw/m68k/an5206.o
  CC      arm-softmmu/target/arm/arm-powerctl.o
  CC      m68k-softmmu/hw/m68k/mcf5208.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/trace/control-target.o
  CC      m68k-softmmu/hw/m68k/mcf5206.o
  CC      arm-softmmu/gdbstub-xml.o
  CC      microblazeel-softmmu/tcg/optimize.o
  CC      m68k-softmmu/hw/m68k/mcf_intc.o
  CC      arm-softmmu/trace/generated-helpers.o
  CC      m68k-softmmu/target/m68k/m68k-semi.o
  CC      microblazeel-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/target/arm/cpu.o
  LINK    arm-softmmu/qemu-system-arm
  CC      m68k-softmmu/target/m68k/translate.o
  CC      microblazeel-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/target/arm/neon_helper.o
  CC      aarch64-softmmu/target/arm/iwmmxt_helper.o
  CC      m68k-softmmu/target/m68k/op_helper.o
  CC      aarch64-softmmu/target/arm/gdbstub.o
  CC      aarch64-softmmu/target/arm/cpu64.o
  CC      m68k-softmmu/target/m68k/helper.o
  CC      aarch64-softmmu/target/arm/translate-a64.o
  CC      microblazeel-softmmu/disas.o
  CC      m68k-softmmu/target/m68k/cpu.o
  CC      microblazeel-softmmu/arch_init.o
  CC      m68k-softmmu/target/m68k/fpu_helper.o
  CC      microblazeel-softmmu/cpus.o
  CC      m68k-softmmu/target/m68k/gdbstub.o
  GEN     microblaze-softmmu/hmp-commands.h
  GEN     microblaze-softmmu/hmp-commands-info.h
  CC      microblazeel-softmmu/monitor.o
  GEN     microblaze-softmmu/config-target.h
  GEN     trace/generated-helpers.c
  CC      m68k-softmmu/trace/control-target.o
  CC      microblaze-softmmu/exec.o
  CC      m68k-softmmu/gdbstub-xml.o
  CC      m68k-softmmu/trace/generated-helpers.o
  CC      microblazeel-softmmu/gdbstub.o
  LINK    m68k-softmmu/qemu-system-m68k
  CC      microblaze-softmmu/tcg/tcg.o
  CC      microblazeel-softmmu/balloon.o
  CC      microblazeel-softmmu/ioport.o
  CC      aarch64-softmmu/target/arm/helper-a64.o
  CC      microblazeel-softmmu/numa.o
  CC      aarch64-softmmu/target/arm/gdbstub64.o
  CC      microblaze-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/target/arm/crypto_helper.o
  CC      microblazeel-softmmu/qtest.o
  CC      aarch64-softmmu/target/arm/arm-powerctl.o
  GEN     mips64el-softmmu/hmp-commands.h
  GEN     mips64el-softmmu/hmp-commands-info.h
  CC      microblazeel-softmmu/memory.o
  GEN     mips64el-softmmu/config-target.h
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/trace/control-target.o
  CC      mips64el-softmmu/exec.o
  CC      aarch64-softmmu/gdbstub-xml.o
  CC      microblaze-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/trace/generated-helpers.o
  CC      microblazeel-softmmu/memory_mapping.o
  LINK    aarch64-softmmu/qemu-system-aarch64
  CC      microblazeel-softmmu/dump.o
  CC      microblaze-softmmu/tcg/tcg-common.o
  CC      mips64el-softmmu/tcg/tcg.o
  CC      microblaze-softmmu/fpu/softfloat.o
  CC      microblazeel-softmmu/migration/ram.o
  CC      microblazeel-softmmu/accel/accel.o
  CC      microblazeel-softmmu/accel/stubs/hax-stub.o
  CC      mips64el-softmmu/tcg/tcg-op.o
  CC      microblazeel-softmmu/accel/stubs/kvm-stub.o
  CC      microblazeel-softmmu/accel/tcg/tcg-all.o
  CC      microblaze-softmmu/disas.o
  CC      microblazeel-softmmu/accel/tcg/cputlb.o
  CC      microblaze-softmmu/arch_init.o
  GEN     mips64-softmmu/hmp-commands.h
  GEN     mips64-softmmu/hmp-commands-info.h
  GEN     mips64-softmmu/config-target.h
  CC      mips64-softmmu/exec.o
  CC      microblaze-softmmu/cpus.o
  CC      mips64el-softmmu/tcg/optimize.o
  CC      microblazeel-softmmu/accel/tcg/tcg-runtime.o
  CC      microblaze-softmmu/monitor.o
  CC      microblazeel-softmmu/accel/tcg/cpu-exec.o
  CC      mips64-softmmu/tcg/tcg.o
  CC      mips64el-softmmu/tcg/tcg-common.o
  CC      mips64el-softmmu/fpu/softfloat.o
  CC      microblazeel-softmmu/accel/tcg/cpu-exec-common.o
  CC      microblaze-softmmu/gdbstub.o
  CC      microblazeel-softmmu/accel/tcg/translate-all.o
  CC      microblazeel-softmmu/accel/tcg/translator.o
  CC      microblaze-softmmu/balloon.o
  CC      mips64-softmmu/tcg/tcg-op.o
  CC      microblazeel-softmmu/hw/core/generic-loader.o
  CC      microblaze-softmmu/ioport.o
  CC      microblazeel-softmmu/hw/core/null-machine.o
  CC      microblaze-softmmu/numa.o
  CC      mips64el-softmmu/disas.o
  CC      microblazeel-softmmu/hw/misc/mmio_interface.o
  CC      mips64el-softmmu/arch_init.o
  CC      microblaze-softmmu/qtest.o
  CC      microblazeel-softmmu/hw/net/xilinx_ethlite.o
  CC      mips64el-softmmu/cpus.o
  CC      microblazeel-softmmu/hw/net/vhost_net.o
  CC      mips64-softmmu/tcg/optimize.o
  CC      microblaze-softmmu/memory.o
  CC      microblazeel-softmmu/hw/net/rocker/qmp-norocker.o
  CC      mips64el-softmmu/monitor.o
  CC      microblazeel-softmmu/hw/vfio/common.o
  CC      microblaze-softmmu/memory_mapping.o
  CC      mips64-softmmu/tcg/tcg-common.o
  CC      mips64el-softmmu/gdbstub.o
  CC      microblazeel-softmmu/hw/vfio/platform.o
  CC      microblaze-softmmu/dump.o
  CC      mips64-softmmu/fpu/softfloat.o
  CC      microblazeel-softmmu/hw/vfio/spapr.o
  CC      mips64el-softmmu/balloon.o
  CC      mips64el-softmmu/ioport.o
  CC      microblaze-softmmu/migration/ram.o
  CC      microblazeel-softmmu/hw/microblaze/petalogix_s3adsp1800_mmu.o
  CC      mips64el-softmmu/numa.o
  CC      microblazeel-softmmu/hw/microblaze/petalogix_ml605_mmu.o
  CC      microblazeel-softmmu/hw/microblaze/boot.o
  CC      mips64el-softmmu/qtest.o
  CC      microblaze-softmmu/accel/accel.o
  CC      microblaze-softmmu/accel/stubs/hax-stub.o
  CC      microblazeel-softmmu/target/microblaze/translate.o
  CC      microblaze-softmmu/accel/stubs/kvm-stub.o
  CC      mips64el-softmmu/memory.o
  CC      mips64-softmmu/disas.o
  CC      microblaze-softmmu/accel/tcg/tcg-all.o
  CC      microblaze-softmmu/accel/tcg/cputlb.o
  CC      mips64-softmmu/arch_init.o
  CC      microblazeel-softmmu/target/microblaze/op_helper.o
  CC      mips64-softmmu/cpus.o
  CC      mips64el-softmmu/memory_mapping.o
  CC      mips64el-softmmu/dump.o
  CC      microblazeel-softmmu/target/microblaze/helper.o
  CC      mips64-softmmu/monitor.o
  CC      microblazeel-softmmu/target/microblaze/cpu.o
  CC      microblaze-softmmu/accel/tcg/tcg-runtime.o
  CC      mips64el-softmmu/migration/ram.o
  CC      microblazeel-softmmu/target/microblaze/gdbstub.o
  CC      microblaze-softmmu/accel/tcg/cpu-exec.o
  CC      microblazeel-softmmu/target/microblaze/mmu.o
  CC      mips64-softmmu/gdbstub.o
  CC      microblaze-softmmu/accel/tcg/cpu-exec-common.o
  CC      mips64el-softmmu/accel/accel.o
  GEN     trace/generated-helpers.c
  CC      microblazeel-softmmu/trace/control-target.o
  CC      microblaze-softmmu/accel/tcg/translate-all.o
  CC      mips64-softmmu/balloon.o
  CC      mips64el-softmmu/accel/stubs/hax-stub.o
  CC      microblazeel-softmmu/trace/generated-helpers.o
  CC      mips64el-softmmu/accel/stubs/kvm-stub.o
  CC      mips64-softmmu/ioport.o
  CC      microblaze-softmmu/accel/tcg/translator.o
  LINK    microblazeel-softmmu/qemu-system-microblazeel
  CC      mips64el-softmmu/accel/tcg/tcg-all.o
  CC      microblaze-softmmu/hw/core/generic-loader.o
  CC      mips64-softmmu/numa.o
  CC      mips64el-softmmu/accel/tcg/cputlb.o
  CC      microblaze-softmmu/hw/core/null-machine.o
  CC      mips64-softmmu/qtest.o
  CC      microblaze-softmmu/hw/misc/mmio_interface.o
  CC      mips64-softmmu/memory.o
  CC      microblaze-softmmu/hw/net/xilinx_ethlite.o
  CC      mips64el-softmmu/accel/tcg/tcg-runtime.o
  CC      microblaze-softmmu/hw/net/vhost_net.o
  CC      mips64-softmmu/memory_mapping.o
  CC      mips64el-softmmu/accel/tcg/cpu-exec.o
  CC      mips64el-softmmu/accel/tcg/cpu-exec-common.o
  CC      microblaze-softmmu/hw/net/rocker/qmp-norocker.o
  CC      mips64el-softmmu/accel/tcg/translate-all.o
  CC      mips64-softmmu/dump.o
  CC      microblaze-softmmu/hw/vfio/common.o
  GEN     mipsel-softmmu/hmp-commands.h
  GEN     mipsel-softmmu/hmp-commands-info.h
  GEN     mipsel-softmmu/config-target.h
  CC      mipsel-softmmu/exec.o
  CC      mips64-softmmu/migration/ram.o
  CC      mips64el-softmmu/accel/tcg/translator.o
  CC      microblaze-softmmu/hw/vfio/platform.o
  CC      mips64-softmmu/accel/accel.o
  CC      mips64el-softmmu/hw/9pfs/virtio-9p-device.o
  CC      microblaze-softmmu/hw/vfio/spapr.o
  CC      mips64-softmmu/accel/stubs/hax-stub.o
  CC      mips64el-softmmu/hw/block/virtio-blk.o
  CC      mipsel-softmmu/tcg/tcg.o
  CC      microblaze-softmmu/hw/microblaze/petalogix_s3adsp1800_mmu.o
  CC      mips64-softmmu/accel/stubs/kvm-stub.o
  CC      microblaze-softmmu/hw/microblaze/petalogix_ml605_mmu.o
  CC      mips64-softmmu/accel/tcg/tcg-all.o
  CC      mips64el-softmmu/hw/block/dataplane/virtio-blk.o
  CC      microblaze-softmmu/hw/microblaze/boot.o
  CC      mips64-softmmu/accel/tcg/cputlb.o
  CC      mips64el-softmmu/hw/char/virtio-serial-bus.o
  CC      microblaze-softmmu/target/microblaze/translate.o
  CC      mips64el-softmmu/hw/core/generic-loader.o
  CC      mipsel-softmmu/tcg/tcg-op.o
  CC      mips64-softmmu/accel/tcg/tcg-runtime.o
  CC      mips64el-softmmu/hw/core/null-machine.o
  CC      mips64el-softmmu/hw/display/vga.o
  CC      mips64-softmmu/accel/tcg/cpu-exec.o
  CC      microblaze-softmmu/target/microblaze/op_helper.o
  CC      microblaze-softmmu/target/microblaze/helper.o
  CC      mips64-softmmu/accel/tcg/cpu-exec-common.o
  CC      mips64el-softmmu/hw/display/virtio-gpu.o
  CC      microblaze-softmmu/target/microblaze/cpu.o
  CC      mips64-softmmu/accel/tcg/translate-all.o
  CC      mipsel-softmmu/tcg/optimize.o
  CC      microblaze-softmmu/target/microblaze/gdbstub.o
  CC      mips64el-softmmu/hw/display/virtio-gpu-3d.o
  CC      mips64-softmmu/accel/tcg/translator.o
  CC      microblaze-softmmu/target/microblaze/mmu.o
  CC      mips64el-softmmu/hw/display/virtio-gpu-pci.o
  GEN     trace/generated-helpers.c
  CC      microblaze-softmmu/trace/control-target.o
  CC      mipsel-softmmu/tcg/tcg-common.o
  CC      mips64el-softmmu/hw/intc/mips_gic.o
  CC      microblaze-softmmu/trace/generated-helpers.o
  CC      mipsel-softmmu/fpu/softfloat.o
  CC      mips64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64el-softmmu/hw/misc/ivshmem.o
  LINK    microblaze-softmmu/qemu-system-microblaze
  CC      mips64-softmmu/hw/block/virtio-blk.o
  CC      mips64el-softmmu/hw/misc/mips_cmgcr.o
  CC      mips64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips64el-softmmu/hw/misc/mips_cpc.o
  CC      mips64-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64el-softmmu/hw/misc/mips_itu.o
  CC      mips64-softmmu/hw/core/generic-loader.o
  CC      mips64el-softmmu/hw/misc/mmio_interface.o
  CC      mips64-softmmu/hw/core/null-machine.o
  GEN     mips-softmmu/hmp-commands.h
  CC      mips64el-softmmu/hw/net/virtio-net.o
  CC      mipsel-softmmu/disas.o
  GEN     mips-softmmu/hmp-commands-info.h
  GEN     mips-softmmu/config-target.h
  CC      mips-softmmu/exec.o
  CC      mips64-softmmu/hw/display/vga.o
  CC      mipsel-softmmu/arch_init.o
  CC      mips64el-softmmu/hw/net/vhost_net.o
  CC      mipsel-softmmu/cpus.o
  CC      mips64el-softmmu/hw/scsi/virtio-scsi.o
  CC      mips64-softmmu/hw/display/virtio-gpu.o
  CC      mipsel-softmmu/monitor.o
  CC      mips64el-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips64el-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mips-softmmu/tcg/tcg.o
  CC      mips64el-softmmu/hw/scsi/vhost-scsi.o
  CC      mips64-softmmu/hw/display/virtio-gpu-3d.o
  CC      mips64el-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mipsel-softmmu/gdbstub.o
  CC      mips64-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips64el-softmmu/hw/timer/mips_gictimer.o
  CC      mips64-softmmu/hw/intc/mips_gic.o
  CC      mips64el-softmmu/hw/timer/mc146818rtc.o
  CC      mipsel-softmmu/balloon.o
  CC      mips64-softmmu/hw/misc/ivshmem.o
  CC      mips64el-softmmu/hw/vfio/common.o
  CC      mipsel-softmmu/ioport.o
  CC      mips-softmmu/tcg/tcg-op.o
  CC      mips64-softmmu/hw/misc/mips_cmgcr.o
  CC      mipsel-softmmu/numa.o
  CC      mips64el-softmmu/hw/vfio/pci.o
  CC      mipsel-softmmu/qtest.o
  CC      mips64-softmmu/hw/misc/mips_cpc.o
  CC      mips64-softmmu/hw/misc/mips_itu.o
  CC      mips64el-softmmu/hw/vfio/pci-quirks.o
  CC      mipsel-softmmu/memory.o
  CC      mips64-softmmu/hw/misc/mmio_interface.o
  CC      mips-softmmu/tcg/optimize.o
  CC      mips64el-softmmu/hw/vfio/platform.o
  CC      mips64-softmmu/hw/net/virtio-net.o
  CC      mipsel-softmmu/memory_mapping.o
  CC      mips64el-softmmu/hw/vfio/spapr.o
  CC      mips64-softmmu/hw/net/vhost_net.o
  CC      mipsel-softmmu/dump.o
  CC      mips-softmmu/tcg/tcg-common.o
  CC      mips64-softmmu/hw/scsi/virtio-scsi.o
  CC      mips64el-softmmu/hw/virtio/virtio.o
  CC      mipsel-softmmu/migration/ram.o
  CC      mips-softmmu/fpu/softfloat.o
  CC      mips64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips64el-softmmu/hw/virtio/virtio-balloon.o
  CC      mips64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mipsel-softmmu/accel/accel.o
  CC      mips64el-softmmu/hw/virtio/vhost.o
  CC      mipsel-softmmu/accel/stubs/hax-stub.o
  CC      mips64-softmmu/hw/scsi/vhost-scsi.o
  CC      mipsel-softmmu/accel/stubs/kvm-stub.o
  CC      mips64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips64el-softmmu/hw/virtio/vhost-backend.o
  CC      mipsel-softmmu/accel/tcg/tcg-all.o
  CC      mips64el-softmmu/hw/virtio/vhost-user.o
  CC      mips64-softmmu/hw/timer/mips_gictimer.o
  CC      mipsel-softmmu/accel/tcg/cputlb.o
  CC      mips64el-softmmu/hw/virtio/vhost-vsock.o
  CC      mips64-softmmu/hw/timer/mc146818rtc.o
  CC      mips-softmmu/disas.o
  CC      mips64el-softmmu/hw/virtio/virtio-crypto.o
  CC      mips64-softmmu/hw/vfio/common.o
  CC      mips64el-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips-softmmu/arch_init.o
  CC      mips64-softmmu/hw/vfio/pci.o
  CC      mips64el-softmmu/hw/mips/mips_r4k.o
  CC      mipsel-softmmu/accel/tcg/tcg-runtime.o
  CC      mips-softmmu/cpus.o
  CC      mips64el-softmmu/hw/mips/mips_malta.o
  CC      mipsel-softmmu/accel/tcg/cpu-exec.o
  CC      mips64-softmmu/hw/vfio/pci-quirks.o
  CC      mips-softmmu/monitor.o
  CC      mips64el-softmmu/hw/mips/mips_mipssim.o
  CC      mipsel-softmmu/accel/tcg/cpu-exec-common.o
  CC      mipsel-softmmu/accel/tcg/translate-all.o
  CC      mips64-softmmu/hw/vfio/platform.o
  CC      mips64el-softmmu/hw/mips/addr.o
  CC      mipsel-softmmu/accel/tcg/translator.o
  CC      mips64-softmmu/hw/vfio/spapr.o
  CC      mips64el-softmmu/hw/mips/mips_int.o
  CC      mips-softmmu/gdbstub.o
  CC      mips64-softmmu/hw/virtio/virtio.o
  CC      mips64el-softmmu/hw/mips/mips_jazz.o
  CC      mips-softmmu/balloon.o
  CC      mipsel-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64el-softmmu/hw/mips/mips_fulong2e.o
  CC      mips-softmmu/ioport.o
  CC      mipsel-softmmu/hw/block/virtio-blk.o
  CC      mips64el-softmmu/hw/mips/gt64xxx_pci.o
  CC      mips64-softmmu/hw/virtio/virtio-balloon.o
  CC      mips-softmmu/numa.o
  CC      mips64el-softmmu/hw/mips/cps.o
  CC      mipsel-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips64-softmmu/hw/virtio/vhost.o
  CC      mipsel-softmmu/hw/char/virtio-serial-bus.o
  CC      mips-softmmu/qtest.o
  CC      mips64el-softmmu/hw/mips/boston.o
  CC      mips-softmmu/memory.o
  CC      mips64el-softmmu/target/mips/translate.o
  CC      mipsel-softmmu/hw/core/generic-loader.o
  CC      mips64-softmmu/hw/virtio/vhost-backend.o
  CC      mipsel-softmmu/hw/core/null-machine.o
  CC      mips64-softmmu/hw/virtio/vhost-user.o
  CC      mipsel-softmmu/hw/display/vga.o
  CC      mips-softmmu/memory_mapping.o
  CC      mips64-softmmu/hw/virtio/vhost-vsock.o
  CC      mips-softmmu/dump.o
  CC      mips64-softmmu/hw/virtio/virtio-crypto.o
  CC      mipsel-softmmu/hw/display/virtio-gpu.o
  CC      mips64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips-softmmu/migration/ram.o
  CC      mips64-softmmu/hw/mips/mips_r4k.o
  CC      mipsel-softmmu/hw/display/virtio-gpu-3d.o
  CC      mips64-softmmu/hw/mips/mips_malta.o
  CC      mips-softmmu/accel/accel.o
  CC      mipsel-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips-softmmu/accel/stubs/hax-stub.o
  CC      mips64-softmmu/hw/mips/mips_mipssim.o
  CC      mips-softmmu/accel/stubs/kvm-stub.o
  CC      mips-softmmu/accel/tcg/tcg-all.o
  CC      mipsel-softmmu/hw/intc/mips_gic.o
  CC      mips64-softmmu/hw/mips/addr.o
  CC      mips-softmmu/accel/tcg/cputlb.o
  CC      mipsel-softmmu/hw/misc/ivshmem.o
  CC      mips64-softmmu/hw/mips/mips_int.o
  CC      mips64-softmmu/hw/mips/mips_jazz.o
  CC      mipsel-softmmu/hw/misc/mips_cmgcr.o
  CC      mips64-softmmu/hw/mips/gt64xxx_pci.o
  CC      mips-softmmu/accel/tcg/tcg-runtime.o
  CC      mipsel-softmmu/hw/misc/mips_cpc.o
  CC      mips64-softmmu/hw/mips/cps.o
  CC      mips-softmmu/accel/tcg/cpu-exec.o
  CC      mipsel-softmmu/hw/misc/mips_itu.o
  CC      mips64-softmmu/target/mips/translate.o
  CC      mips-softmmu/accel/tcg/cpu-exec-common.o
  CC      mipsel-softmmu/hw/misc/mmio_interface.o
  CC      mips-softmmu/accel/tcg/translate-all.o
  CC      mipsel-softmmu/hw/net/virtio-net.o
  CC      mips-softmmu/accel/tcg/translator.o
  CC      mipsel-softmmu/hw/net/vhost_net.o
  CC      mipsel-softmmu/hw/scsi/virtio-scsi.o
  CC      mips-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64el-softmmu/target/mips/dsp_helper.o
  CC      mipsel-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips-softmmu/hw/block/virtio-blk.o
  CC      mipsel-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mips-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mipsel-softmmu/hw/scsi/vhost-scsi.o
  CC      mips-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64el-softmmu/target/mips/op_helper.o
  CC      mipsel-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips-softmmu/hw/core/generic-loader.o
  CC      mipsel-softmmu/hw/timer/mips_gictimer.o
  CC      mips-softmmu/hw/core/null-machine.o
  CC      mips-softmmu/hw/display/vga.o
  CC      mipsel-softmmu/hw/timer/mc146818rtc.o
  CC      mipsel-softmmu/hw/vfio/common.o
  CC      mips64el-softmmu/target/mips/lmi_helper.o
  CC      mips-softmmu/hw/display/virtio-gpu.o
  CC      mipsel-softmmu/hw/vfio/pci.o
  CC      mips64el-softmmu/target/mips/helper.o
  CC      mips-softmmu/hw/display/virtio-gpu-3d.o
  CC      mipsel-softmmu/hw/vfio/pci-quirks.o
  CC      mips64el-softmmu/target/mips/cpu.o
  CC      mips-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips64el-softmmu/target/mips/gdbstub.o
  CC      mipsel-softmmu/hw/vfio/platform.o
  CC      mips64el-softmmu/target/mips/msa_helper.o
  CC      mips-softmmu/hw/intc/mips_gic.o
  CC      mipsel-softmmu/hw/vfio/spapr.o
  CC      mips-softmmu/hw/misc/ivshmem.o
  CC      mips64-softmmu/target/mips/dsp_helper.o
  CC      mipsel-softmmu/hw/virtio/virtio.o
  CC      mips-softmmu/hw/misc/mips_cmgcr.o
  CC      mips-softmmu/hw/misc/mips_cpc.o
  CC      mips64-softmmu/target/mips/op_helper.o
  CC      mipsel-softmmu/hw/virtio/virtio-balloon.o
  CC      mips-softmmu/hw/misc/mips_itu.o
  CC      mipsel-softmmu/hw/virtio/vhost.o
  CC      mips-softmmu/hw/misc/mmio_interface.o
  CC      mips64el-softmmu/target/mips/mips-semi.o
  CC      mipsel-softmmu/hw/virtio/vhost-backend.o
  CC      mips-softmmu/hw/net/virtio-net.o
  CC      mips64el-softmmu/target/mips/machine.o
  CC      mipsel-softmmu/hw/virtio/vhost-user.o
  CC      mips64el-softmmu/target/mips/cp0_timer.o
  CC      mips-softmmu/hw/net/vhost_net.o
  CC      mipsel-softmmu/hw/virtio/vhost-vsock.o
  GEN     trace/generated-helpers.c
  CC      mips64el-softmmu/trace/control-target.o
  CC      mips-softmmu/hw/scsi/virtio-scsi.o
  CC      mips64-softmmu/target/mips/lmi_helper.o
  CC      mipsel-softmmu/hw/virtio/virtio-crypto.o
  CC      mips64el-softmmu/trace/generated-helpers.o
  CC      mips64-softmmu/target/mips/helper.o
  CC      mips-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mipsel-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips-softmmu/hw/scsi/vhost-scsi-common.o
  LINK    mips64el-softmmu/qemu-system-mips64el
  CC      mips64-softmmu/target/mips/cpu.o
  CC      mipsel-softmmu/hw/mips/mips_r4k.o
  CC      mips-softmmu/hw/scsi/vhost-scsi.o
  CC      mipsel-softmmu/hw/mips/mips_malta.o
  CC      mips-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips64-softmmu/target/mips/gdbstub.o
  CC      mips-softmmu/hw/timer/mips_gictimer.o
  CC      mipsel-softmmu/hw/mips/mips_mipssim.o
  CC      mips64-softmmu/target/mips/msa_helper.o
  CC      mips-softmmu/hw/timer/mc146818rtc.o
  CC      mipsel-softmmu/hw/mips/addr.o
  CC      mips-softmmu/hw/vfio/common.o
  CC      mipsel-softmmu/hw/mips/mips_int.o
  CC      mipsel-softmmu/hw/mips/gt64xxx_pci.o
  GEN     moxie-softmmu/hmp-commands.h
  GEN     moxie-softmmu/hmp-commands-info.h
  GEN     moxie-softmmu/config-target.h
  CC      moxie-softmmu/exec.o
  CC      mips-softmmu/hw/vfio/pci.o
  CC      mipsel-softmmu/hw/mips/cps.o
  CC      mipsel-softmmu/target/mips/translate.o
  CC      mips-softmmu/hw/vfio/pci-quirks.o
  CC      moxie-softmmu/tcg/tcg.o
  CC      mips-softmmu/hw/vfio/platform.o
  CC      mips64-softmmu/target/mips/mips-semi.o
  CC      mips64-softmmu/target/mips/machine.o
  CC      mips-softmmu/hw/vfio/spapr.o
  CC      mips64-softmmu/target/mips/cp0_timer.o
  CC      mips-softmmu/hw/virtio/virtio.o
  GEN     trace/generated-helpers.c
  CC      mips64-softmmu/trace/control-target.o
  CC      moxie-softmmu/tcg/tcg-op.o
  CC      mips64-softmmu/trace/generated-helpers.o
  CC      mips-softmmu/hw/virtio/virtio-balloon.o
  LINK    mips64-softmmu/qemu-system-mips64
  CC      mips-softmmu/hw/virtio/vhost.o
  CC      moxie-softmmu/tcg/optimize.o
  CC      mips-softmmu/hw/virtio/vhost-backend.o
  CC      moxie-softmmu/tcg/tcg-common.o
  CC      mips-softmmu/hw/virtio/vhost-user.o
  CC      moxie-softmmu/fpu/softfloat.o
  CC      mipsel-softmmu/target/mips/dsp_helper.o
  CC      mips-softmmu/hw/virtio/vhost-vsock.o
  CC      mips-softmmu/hw/virtio/virtio-crypto.o
  CC      mips-softmmu/hw/virtio/virtio-crypto-pci.o
  GEN     nios2-softmmu/hmp-commands.h
  GEN     nios2-softmmu/hmp-commands-info.h
  GEN     nios2-softmmu/config-target.h
  CC      nios2-softmmu/exec.o
  CC      mipsel-softmmu/target/mips/op_helper.o
  CC      mips-softmmu/hw/mips/mips_r4k.o
  CC      mips-softmmu/hw/mips/mips_malta.o
  CC      moxie-softmmu/disas.o
  CC      mips-softmmu/hw/mips/mips_mipssim.o
  CC      moxie-softmmu/arch_init.o
  CC      nios2-softmmu/tcg/tcg.o
  CC      mips-softmmu/hw/mips/addr.o
  CC      moxie-softmmu/cpus.o
  CC      mips-softmmu/hw/mips/mips_int.o
  CC      mipsel-softmmu/target/mips/lmi_helper.o
  CC      mips-softmmu/hw/mips/gt64xxx_pci.o
  CC      moxie-softmmu/monitor.o
  CC      mips-softmmu/hw/mips/cps.o
  CC      mipsel-softmmu/target/mips/helper.o
  CC      mips-softmmu/target/mips/translate.o
  CC      nios2-softmmu/tcg/tcg-op.o
  CC      mipsel-softmmu/target/mips/cpu.o
  CC      mipsel-softmmu/target/mips/gdbstub.o
  CC      moxie-softmmu/gdbstub.o
  CC      mipsel-softmmu/target/mips/msa_helper.o
  CC      moxie-softmmu/balloon.o
  CC      nios2-softmmu/tcg/optimize.o
  CC      moxie-softmmu/ioport.o
  CC      moxie-softmmu/numa.o
  CC      nios2-softmmu/tcg/tcg-common.o
  CC      nios2-softmmu/fpu/softfloat.o
  CC      moxie-softmmu/qtest.o
  CC      moxie-softmmu/memory.o
  CC      mipsel-softmmu/target/mips/mips-semi.o
  CC      mipsel-softmmu/target/mips/machine.o
  CC      mipsel-softmmu/target/mips/cp0_timer.o
  CC      moxie-softmmu/memory_mapping.o
  CC      nios2-softmmu/disas.o
  GEN     trace/generated-helpers.c
  CC      mipsel-softmmu/trace/control-target.o
  CC      moxie-softmmu/dump.o
  CC      nios2-softmmu/arch_init.o
  CC      nios2-softmmu/cpus.o
  CC      mipsel-softmmu/trace/generated-helpers.o
  CC      moxie-softmmu/migration/ram.o
  LINK    mipsel-softmmu/qemu-system-mipsel
  CC      nios2-softmmu/monitor.o
  CC      mips-softmmu/target/mips/dsp_helper.o
  CC      moxie-softmmu/accel/accel.o
  CC      mips-softmmu/target/mips/op_helper.o
  CC      moxie-softmmu/accel/stubs/hax-stub.o
  CC      moxie-softmmu/accel/stubs/kvm-stub.o
  CC      nios2-softmmu/gdbstub.o
  CC      moxie-softmmu/accel/tcg/tcg-all.o
  CC      moxie-softmmu/accel/tcg/cputlb.o
  GEN     or1k-softmmu/hmp-commands.h
  CC      nios2-softmmu/balloon.o
  GEN     or1k-softmmu/hmp-commands-info.h
  GEN     or1k-softmmu/config-target.h
  CC      or1k-softmmu/exec.o
  CC      nios2-softmmu/ioport.o
  CC      nios2-softmmu/numa.o
  CC      moxie-softmmu/accel/tcg/tcg-runtime.o
  CC      mips-softmmu/target/mips/lmi_helper.o
  CC      nios2-softmmu/qtest.o
  CC      moxie-softmmu/accel/tcg/cpu-exec.o
  CC      moxie-softmmu/accel/tcg/cpu-exec-common.o
  CC      mips-softmmu/target/mips/helper.o
  CC      nios2-softmmu/memory.o
  CC      moxie-softmmu/accel/tcg/translate-all.o
  CC      or1k-softmmu/tcg/tcg.o
  CC      mips-softmmu/target/mips/cpu.o
  CC      moxie-softmmu/accel/tcg/translator.o
  CC      mips-softmmu/target/mips/gdbstub.o
  CC      moxie-softmmu/hw/core/generic-loader.o
  CC      nios2-softmmu/memory_mapping.o
  CC      mips-softmmu/target/mips/msa_helper.o
  CC      nios2-softmmu/dump.o
  CC      moxie-softmmu/hw/core/null-machine.o
  CC      nios2-softmmu/migration/ram.o
  CC      moxie-softmmu/hw/display/vga.o
  CC      or1k-softmmu/tcg/tcg-op.o
  CC      nios2-softmmu/accel/accel.o
  CC      moxie-softmmu/hw/misc/mmio_interface.o
  CC      nios2-softmmu/accel/stubs/hax-stub.o
  CC      moxie-softmmu/hw/net/vhost_net.o
  CC      or1k-softmmu/tcg/optimize.o
  CC      nios2-softmmu/accel/stubs/kvm-stub.o
  CC      moxie-softmmu/hw/net/rocker/qmp-norocker.o
  CC      moxie-softmmu/hw/timer/mc146818rtc.o
  CC      nios2-softmmu/accel/tcg/tcg-all.o
  CC      mips-softmmu/target/mips/mips-semi.o
  CC      nios2-softmmu/accel/tcg/cputlb.o
  CC      moxie-softmmu/hw/vfio/common.o
  CC      or1k-softmmu/tcg/tcg-common.o
  CC      mips-softmmu/target/mips/machine.o
  CC      or1k-softmmu/fpu/softfloat.o
  CC      moxie-softmmu/hw/vfio/platform.o
  CC      mips-softmmu/target/mips/cp0_timer.o
  CC      moxie-softmmu/hw/vfio/spapr.o
  CC      nios2-softmmu/accel/tcg/tcg-runtime.o
  GEN     trace/generated-helpers.c
  CC      mips-softmmu/trace/control-target.o
  CC      moxie-softmmu/hw/moxie/moxiesim.o
  CC      nios2-softmmu/accel/tcg/cpu-exec.o
  CC      mips-softmmu/trace/generated-helpers.o
  CC      moxie-softmmu/target/moxie/translate.o
  LINK    mips-softmmu/qemu-system-mips
  CC      nios2-softmmu/accel/tcg/cpu-exec-common.o
  CC      moxie-softmmu/target/moxie/helper.o
  CC      nios2-softmmu/accel/tcg/translate-all.o
  CC      or1k-softmmu/disas.o
  CC      moxie-softmmu/target/moxie/machine.o
  CC      nios2-softmmu/accel/tcg/translator.o
  CC      moxie-softmmu/target/moxie/cpu.o
  CC      or1k-softmmu/arch_init.o
  CC      moxie-softmmu/target/moxie/mmu.o
  CC      or1k-softmmu/cpus.o
  CC      nios2-softmmu/hw/core/generic-loader.o
  CC      nios2-softmmu/hw/core/null-machine.o
  GEN     trace/generated-helpers.c
  CC      moxie-softmmu/trace/control-target.o
  CC      or1k-softmmu/monitor.o
  CC      nios2-softmmu/hw/intc/nios2_iic.o
  CC      moxie-softmmu/trace/generated-helpers.o
  CC      nios2-softmmu/hw/misc/mmio_interface.o
  CC      nios2-softmmu/hw/net/vhost_net.o
  LINK    moxie-softmmu/qemu-system-moxie
  CC      nios2-softmmu/hw/net/rocker/qmp-norocker.o
  GEN     ppc64-softmmu/hmp-commands.h
  GEN     ppc64-softmmu/hmp-commands-info.h
  GEN     ppc64-softmmu/config-target.h
  CC      nios2-softmmu/hw/timer/altera_timer.o
  CC      ppc64-softmmu/exec.o
  CC      or1k-softmmu/gdbstub.o
  CC      or1k-softmmu/balloon.o
  CC      nios2-softmmu/hw/vfio/common.o
  CC      nios2-softmmu/hw/vfio/platform.o
  CC      or1k-softmmu/ioport.o
  CC      nios2-softmmu/hw/vfio/spapr.o
  CC      or1k-softmmu/numa.o
  CC      nios2-softmmu/hw/nios2/boot.o
  CC      nios2-softmmu/hw/nios2/cpu_pic.o
  CC      or1k-softmmu/qtest.o
  CC      ppc64-softmmu/tcg/tcg.o
  CC      nios2-softmmu/hw/nios2/10m50_devboard.o
  GEN     ppcemb-softmmu/hmp-commands.h
  GEN     ppcemb-softmmu/hmp-commands-info.h
  GEN     ppcemb-softmmu/config-target.h
  CC      or1k-softmmu/memory.o
  CC      nios2-softmmu/target/nios2/translate.o
  CC      ppcemb-softmmu/exec.o
  CC      nios2-softmmu/target/nios2/op_helper.o
  CC      nios2-softmmu/target/nios2/helper.o
  CC      or1k-softmmu/memory_mapping.o
  CC      nios2-softmmu/target/nios2/cpu.o
  CC      ppcemb-softmmu/tcg/tcg.o
  CC      ppc64-softmmu/tcg/tcg-op.o
  CC      nios2-softmmu/target/nios2/mmu.o
  CC      or1k-softmmu/dump.o
  CC      nios2-softmmu/target/nios2/monitor.o
  CC      or1k-softmmu/migration/ram.o
  GEN     trace/generated-helpers.c
  CC      nios2-softmmu/trace/control-target.o
  CC      ppc64-softmmu/tcg/optimize.o
  CC      nios2-softmmu/trace/generated-helpers.o
  CC      or1k-softmmu/accel/accel.o
  CC      ppcemb-softmmu/tcg/tcg-op.o
  CC      or1k-softmmu/accel/stubs/hax-stub.o
  LINK    nios2-softmmu/qemu-system-nios2
  CC      or1k-softmmu/accel/stubs/kvm-stub.o
  CC      ppc64-softmmu/tcg/tcg-common.o
  CC      or1k-softmmu/accel/tcg/tcg-all.o
  CC      ppc64-softmmu/fpu/softfloat.o
  CC      or1k-softmmu/accel/tcg/cputlb.o
  CC      ppc64-softmmu/disas.o
  CC      or1k-softmmu/accel/tcg/tcg-runtime.o
  CC      ppcemb-softmmu/tcg/optimize.o
  CC      or1k-softmmu/accel/tcg/cpu-exec.o
  CC      or1k-softmmu/accel/tcg/cpu-exec-common.o
  GEN     ppc-softmmu/hmp-commands.h
  GEN     ppc-softmmu/hmp-commands-info.h
  GEN     ppc-softmmu/config-target.h
  CC      ppc-softmmu/exec.o
  CC      ppcemb-softmmu/tcg/tcg-common.o
  CC      or1k-softmmu/accel/tcg/translate-all.o
  CC      ppcemb-softmmu/fpu/softfloat.o
  GEN     ppc64-softmmu/gdbstub-xml.c
  CC      or1k-softmmu/accel/tcg/translator.o
  CC      or1k-softmmu/hw/core/generic-loader.o
  CC      or1k-softmmu/hw/core/null-machine.o
  CC      or1k-softmmu/hw/intc/ompic.o
  CC      ppc64-softmmu/arch_init.o
  CC      ppc-softmmu/tcg/tcg.o
  CC      or1k-softmmu/hw/misc/mmio_interface.o
  CC      ppc64-softmmu/cpus.o
  CC      or1k-softmmu/hw/net/vhost_net.o
  CC      ppcemb-softmmu/disas.o
  CC      or1k-softmmu/hw/net/rocker/qmp-norocker.o
  CC      ppc64-softmmu/monitor.o
  GEN     ppcemb-softmmu/gdbstub-xml.c
  CC      or1k-softmmu/hw/vfio/common.o
  CC      or1k-softmmu/hw/vfio/platform.o
  CC      ppc-softmmu/tcg/tcg-op.o
  CC      ppcemb-softmmu/arch_init.o
  CC      ppcemb-softmmu/cpus.o
  CC      ppc64-softmmu/gdbstub.o
  CC      or1k-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/monitor.o
  CC      or1k-softmmu/hw/openrisc/pic_cpu.o
  CC      ppc64-softmmu/balloon.o
  CC      or1k-softmmu/hw/openrisc/cputimer.o
  CC      ppc-softmmu/tcg/optimize.o
  CC      ppc64-softmmu/ioport.o
  CC      or1k-softmmu/hw/openrisc/openrisc_sim.o
  CC      ppc64-softmmu/numa.o
  CC      ppcemb-softmmu/gdbstub.o
  CC      or1k-softmmu/target/openrisc/machine.o
  CC      or1k-softmmu/target/openrisc/cpu.o
  CC      ppc64-softmmu/qtest.o
  CC      ppc-softmmu/tcg/tcg-common.o
  CC      ppc-softmmu/fpu/softfloat.o
  CC      or1k-softmmu/target/openrisc/exception.o
  CC      ppcemb-softmmu/balloon.o
  CC      or1k-softmmu/target/openrisc/interrupt.o
  CC      ppc64-softmmu/memory.o
  CC      ppcemb-softmmu/ioport.o
  CC      or1k-softmmu/target/openrisc/mmu.o
  CC      ppcemb-softmmu/numa.o
  CC      or1k-softmmu/target/openrisc/translate.o
  CC      ppcemb-softmmu/qtest.o
  CC      ppcemb-softmmu/memory.o
  CC      ppc64-softmmu/memory_mapping.o
  CC      or1k-softmmu/target/openrisc/exception_helper.o
  CC      ppc-softmmu/disas.o
  CC      ppc64-softmmu/dump.o
  CC      or1k-softmmu/target/openrisc/fpu_helper.o
  GEN     ppc-softmmu/gdbstub-xml.c
  CC      ppcemb-softmmu/memory_mapping.o
  CC      ppc64-softmmu/migration/ram.o
  CC      ppc-softmmu/arch_init.o
  CC      or1k-softmmu/target/openrisc/interrupt_helper.o
  CC      ppcemb-softmmu/dump.o
  CC      ppc-softmmu/cpus.o
  CC      or1k-softmmu/target/openrisc/mmu_helper.o
  CC      ppc64-softmmu/accel/accel.o
  CC      or1k-softmmu/target/openrisc/sys_helper.o
  CC      ppc-softmmu/monitor.o
  CC      ppcemb-softmmu/migration/ram.o
  CC      ppc64-softmmu/accel/stubs/hax-stub.o
  CC      or1k-softmmu/target/openrisc/gdbstub.o
  CC      ppc64-softmmu/accel/stubs/kvm-stub.o
  CC      ppc64-softmmu/accel/tcg/tcg-all.o
  GEN     trace/generated-helpers.c
  CC      or1k-softmmu/trace/control-target.o
  CC      ppc64-softmmu/accel/tcg/cputlb.o
  CC      ppcemb-softmmu/accel/accel.o
  CC      or1k-softmmu/trace/generated-helpers.o
  CC      ppcemb-softmmu/accel/stubs/hax-stub.o
  CC      ppc-softmmu/gdbstub.o
  LINK    or1k-softmmu/qemu-system-or1k
  CC      ppcemb-softmmu/accel/stubs/kvm-stub.o
  CC      ppc-softmmu/balloon.o
  CC      ppcemb-softmmu/accel/tcg/tcg-all.o
  CC      ppc64-softmmu/accel/tcg/tcg-runtime.o
  CC      ppc-softmmu/ioport.o
  CC      ppcemb-softmmu/accel/tcg/cputlb.o
  CC      ppc64-softmmu/accel/tcg/cpu-exec.o
  CC      ppcemb-softmmu/accel/tcg/tcg-runtime.o
  CC      ppc-softmmu/numa.o
  CC      ppc64-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppc64-softmmu/accel/tcg/translate-all.o
  GEN     s390x-softmmu/hmp-commands.h
  CC      ppc-softmmu/qtest.o
  GEN     s390x-softmmu/hmp-commands-info.h
  CC      s390x-softmmu/gen-features
  GEN     s390x-softmmu/config-target.h
  CC      ppcemb-softmmu/accel/tcg/cpu-exec.o
  GEN     s390x-softmmu/gen-features.h
  CC      ppc64-softmmu/accel/tcg/translator.o
  CC      s390x-softmmu/exec.o
  CC      ppc-softmmu/memory.o
  CC      ppcemb-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppc64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppcemb-softmmu/accel/tcg/translate-all.o
  CC      ppc-softmmu/memory_mapping.o
  CC      ppcemb-softmmu/accel/tcg/translator.o
  CC      ppc64-softmmu/hw/block/virtio-blk.o
  CC      ppc-softmmu/dump.o
  CC      ppc64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppcemb-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppc-softmmu/migration/ram.o
  CC      s390x-softmmu/tcg/tcg.o
  CC      ppc64-softmmu/hw/char/spapr_vty.o
  CC      ppcemb-softmmu/hw/block/virtio-blk.o
  CC      ppcemb-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppc64-softmmu/hw/char/virtio-serial-bus.o
  CC      ppc-softmmu/accel/accel.o
  CC      ppcemb-softmmu/hw/char/virtio-serial-bus.o
  CC      ppc-softmmu/accel/stubs/hax-stub.o
  CC      ppc64-softmmu/hw/core/generic-loader.o
  CC      ppcemb-softmmu/hw/core/generic-loader.o
  CC      ppc-softmmu/accel/stubs/kvm-stub.o
  CC      ppc64-softmmu/hw/core/null-machine.o
  CC      s390x-softmmu/tcg/tcg-op.o
  CC      ppc64-softmmu/hw/display/sm501.o
  CC      ppc-softmmu/accel/tcg/tcg-all.o
  CC      ppcemb-softmmu/hw/core/null-machine.o
  CC      ppc-softmmu/accel/tcg/cputlb.o
  CC      ppcemb-softmmu/hw/display/sm501.o
  CC      ppc64-softmmu/hw/display/vga.o
  CC      s390x-softmmu/tcg/optimize.o
  CC      ppcemb-softmmu/hw/display/vga.o
  CC      ppc-softmmu/accel/tcg/tcg-runtime.o
  CC      ppc64-softmmu/hw/display/virtio-gpu.o
  CC      ppc-softmmu/accel/tcg/cpu-exec.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu.o
  CC      s390x-softmmu/tcg/tcg-common.o
  CC      s390x-softmmu/fpu/softfloat.o
  CC      ppc-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc64-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc-softmmu/accel/tcg/translate-all.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc64-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppcemb-softmmu/hw/i2c/ppc4xx_i2c.o
  CC      ppc-softmmu/accel/tcg/translator.o
  CC      ppcemb-softmmu/hw/misc/ivshmem.o
  CC      ppc64-softmmu/hw/display/virtio-vga.o
  CC      ppcemb-softmmu/hw/misc/mmio_interface.o
  CC      ppc-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppcemb-softmmu/hw/net/xilinx_ethlite.o
  CC      ppc64-softmmu/hw/i2c/ppc4xx_i2c.o
  CC      ppc-softmmu/hw/block/virtio-blk.o
  CC      s390x-softmmu/disas.o
  CC      ppcemb-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/intc/xics.o
  CC      ppc-softmmu/hw/block/dataplane/virtio-blk.o
  GEN     s390x-softmmu/gdbstub-xml.c
  CC      ppc64-softmmu/hw/intc/xics_spapr.o
  CC      ppcemb-softmmu/hw/net/vhost_net.o
  CC      ppc-softmmu/hw/char/virtio-serial-bus.o
  CC      ppcemb-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc64-softmmu/hw/intc/xics_pnv.o
  CC      ppc64-softmmu/hw/misc/ivshmem.o
  CC      s390x-softmmu/arch_init.o
  CC      ppc-softmmu/hw/core/generic-loader.o
  CC      ppcemb-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      s390x-softmmu/cpus.o
  CC      ppc64-softmmu/hw/misc/mmio_interface.o
  CC      ppc-softmmu/hw/core/null-machine.o
  CC      ppcemb-softmmu/hw/scsi/vhost-scsi-common.o
  CC      ppc64-softmmu/hw/net/spapr_llan.o
  CC      ppc-softmmu/hw/display/sm501.o
  CC      ppcemb-softmmu/hw/scsi/vhost-scsi.o
  CC      s390x-softmmu/monitor.o
  CC      ppc64-softmmu/hw/net/xilinx_ethlite.o
  CC      ppcemb-softmmu/hw/scsi/vhost-user-scsi.o
  CC      ppcemb-softmmu/hw/vfio/common.o
  CC      ppc64-softmmu/hw/net/virtio-net.o
  CC      ppc-softmmu/hw/display/vga.o
  CC      s390x-softmmu/gdbstub.o
  CC      ppcemb-softmmu/hw/vfio/pci.o
  CC      ppc64-softmmu/hw/net/vhost_net.o
  CC      ppc-softmmu/hw/display/virtio-gpu.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/etsec.o
  CC      s390x-softmmu/balloon.o
  CC      ppc-softmmu/hw/display/virtio-gpu-3d.o
  CC      s390x-softmmu/ioport.o
  CC      ppcemb-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/registers.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/rings.o
  CC      s390x-softmmu/numa.o
  CC      ppc-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/miim.o
  CC      ppcemb-softmmu/hw/vfio/platform.o
  CC      s390x-softmmu/qtest.o
  CC      ppc64-softmmu/hw/nvram/spapr_nvram.o
  CC      ppc-softmmu/hw/i2c/ppc4xx_i2c.o
  CC      ppcemb-softmmu/hw/vfio/spapr.o
  CC      s390x-softmmu/memory.o
  CC      ppc64-softmmu/hw/scsi/spapr_vscsi.o
  CC      ppc-softmmu/hw/misc/ivshmem.o
  CC      ppcemb-softmmu/hw/virtio/virtio.o
  CC      ppc-softmmu/hw/misc/mmio_interface.o
  CC      ppc64-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc-softmmu/hw/net/xilinx_ethlite.o
  CC      ppc-softmmu/hw/net/virtio-net.o
  CC      s390x-softmmu/memory_mapping.o
  CC      ppcemb-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      s390x-softmmu/dump.o
  CC      ppcemb-softmmu/hw/virtio/vhost.o
  CC      ppc64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      ppc-softmmu/hw/net/vhost_net.o
  CC      ppc64-softmmu/hw/scsi/vhost-scsi.o
  CC      ppcemb-softmmu/hw/virtio/vhost-backend.o
  CC      ppc-softmmu/hw/net/fsl_etsec/etsec.o
  CC      s390x-softmmu/migration/ram.o
  CC      ppc64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      ppcemb-softmmu/hw/virtio/vhost-user.o
  CC      ppc-softmmu/hw/net/fsl_etsec/registers.o
  CC      ppc64-softmmu/hw/timer/mc146818rtc.o
  CC      ppc-softmmu/hw/net/fsl_etsec/rings.o
  CC      ppcemb-softmmu/hw/virtio/vhost-vsock.o
  CC      s390x-softmmu/accel/accel.o
  CC      ppc64-softmmu/hw/vfio/common.o
  CC      s390x-softmmu/accel/kvm/kvm-all.o
  CC      ppc-softmmu/hw/net/fsl_etsec/miim.o
  CC      ppcemb-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc64-softmmu/hw/vfio/pci.o
  CC      ppcemb-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      s390x-softmmu/accel/stubs/hax-stub.o
  CC      ppc-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppcemb-softmmu/hw/ppc/ppc.o
  CC      s390x-softmmu/accel/tcg/tcg-all.o
  CC      ppc-softmmu/hw/scsi/vhost-scsi-common.o
  CC      s390x-softmmu/accel/tcg/cputlb.o
  CC      ppc64-softmmu/hw/vfio/pci-quirks.o
  CC      ppcemb-softmmu/hw/ppc/ppc_booke.o
  CC      ppc-softmmu/hw/scsi/vhost-scsi.o
  CC      ppcemb-softmmu/hw/ppc/fdt.o
  CC      ppc-softmmu/hw/scsi/vhost-user-scsi.o
  CC      ppc64-softmmu/hw/vfio/platform.o
  CC      ppcemb-softmmu/hw/ppc/ppc405_boards.o
  CC      ppc-softmmu/hw/timer/mc146818rtc.o
  CC      ppc64-softmmu/hw/vfio/spapr.o
  CC      s390x-softmmu/accel/tcg/tcg-runtime.o
  CC      ppcemb-softmmu/hw/ppc/ppc4xx_devs.o
  CC      ppc-softmmu/hw/vfio/common.o
  CC      ppc64-softmmu/hw/virtio/virtio.o
  CC      s390x-softmmu/accel/tcg/cpu-exec.o
  CC      ppcemb-softmmu/hw/ppc/ppc405_uc.o
  CC      ppc-softmmu/hw/vfio/pci.o
  CC      s390x-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppcemb-softmmu/hw/ppc/ppc440_bamboo.o
  CC      ppc64-softmmu/hw/virtio/virtio-balloon.o
  CC      s390x-softmmu/accel/tcg/translate-all.o
  CC      ppcemb-softmmu/hw/ppc/ppc4xx_pci.o
  CC      ppc-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64-softmmu/hw/virtio/vhost.o
  CC      ppcemb-softmmu/hw/ppc/virtex_ml507.o
  CC      s390x-softmmu/accel/tcg/translator.o
  CC      ppc-softmmu/hw/vfio/platform.o
  CC      ppc64-softmmu/hw/virtio/vhost-backend.o
  CC      ppcemb-softmmu/target/ppc/cpu-models.o
  CC      s390x-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppc64-softmmu/hw/virtio/vhost-user.o
  CC      ppc-softmmu/hw/vfio/spapr.o
  CC      s390x-softmmu/hw/block/virtio-blk.o
  CC      ppc64-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc-softmmu/hw/virtio/virtio.o
  CC      s390x-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppc64-softmmu/hw/virtio/virtio-crypto.o
  CC      ppcemb-softmmu/target/ppc/cpu.o
  CC      ppc64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      s390x-softmmu/hw/char/virtio-serial-bus.o
  CC      ppcemb-softmmu/target/ppc/translate.o
  CC      ppc-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc64-softmmu/hw/ppc/ppc.o
  CC      ppc-softmmu/hw/virtio/vhost.o
  CC      s390x-softmmu/hw/char/terminal3270.o
  CC      ppc64-softmmu/hw/ppc/ppc_booke.o
  CC      s390x-softmmu/hw/core/generic-loader.o
  CC      ppc-softmmu/hw/virtio/vhost-backend.o
  CC      ppc64-softmmu/hw/ppc/fdt.o
  CC      s390x-softmmu/hw/core/null-machine.o
  CC      ppc-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/ppc/spapr.o
  CC      s390x-softmmu/hw/display/virtio-gpu.o
  CC      ppc-softmmu/hw/virtio/vhost-vsock.o
  CC      s390x-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc64-softmmu/hw/ppc/spapr_vio.o
  CC      s390x-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc64-softmmu/hw/ppc/spapr_events.o
  CC      s390x-softmmu/hw/intc/s390_flic.o
  CC      ppc-softmmu/hw/ppc/ppc.o
  CC      ppc64-softmmu/hw/ppc/spapr_hcall.o
  CC      s390x-softmmu/hw/intc/s390_flic_kvm.o
  CC      ppc-softmmu/hw/ppc/ppc_booke.o
  CC      ppc64-softmmu/hw/ppc/spapr_iommu.o
  CC      s390x-softmmu/hw/misc/mmio_interface.o
  CC      ppc-softmmu/hw/ppc/fdt.o
  CC      s390x-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtas.o
  CC      ppc-softmmu/hw/ppc/ppc405_boards.o
  CC      s390x-softmmu/hw/net/vhost_net.o
  CC      ppc-softmmu/hw/ppc/ppc4xx_devs.o
  CC      ppc64-softmmu/hw/ppc/spapr_pci.o
  CC      s390x-softmmu/hw/net/rocker/qmp-norocker.o
  CC      ppc-softmmu/hw/ppc/ppc405_uc.o
  CC      s390x-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtc.o
  CC      ppc-softmmu/hw/ppc/ppc440_bamboo.o
  CC      s390x-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc64-softmmu/hw/ppc/spapr_drc.o
  CC      ppc-softmmu/hw/ppc/ppc4xx_pci.o
  CC      s390x-softmmu/hw/scsi/vhost-scsi-common.o
  CC      ppc-softmmu/hw/ppc/prep.o
  CC      ppc64-softmmu/hw/ppc/spapr_rng.o
  CC      s390x-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc64-softmmu/hw/ppc/spapr_cpu_core.o
  CC      s390x-softmmu/hw/scsi/vhost-user-scsi.o
  CC      ppc-softmmu/hw/ppc/prep_systemio.o
  CC      ppc64-softmmu/hw/ppc/spapr_ovec.o
  CC      s390x-softmmu/hw/vfio/common.o
  CC      ppc-softmmu/hw/ppc/rs6000_mc.o
  CC      ppc64-softmmu/hw/ppc/pnv.o
  CC      s390x-softmmu/hw/vfio/pci.o
  CC      ppc-softmmu/hw/ppc/mac_oldworld.o
  CC      ppc-softmmu/hw/ppc/mac_newworld.o
  CC      ppc64-softmmu/hw/ppc/pnv_xscom.o
  CC      ppc-softmmu/hw/ppc/e500.o
  CC      s390x-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64-softmmu/hw/ppc/pnv_core.o
  CC      ppc-softmmu/hw/ppc/mpc8544ds.o
  CC      ppc64-softmmu/hw/ppc/pnv_lpc.o
  CC      s390x-softmmu/hw/vfio/ccw.o
  CC      ppc-softmmu/hw/ppc/e500plat.o
  CC      ppc64-softmmu/hw/ppc/pnv_psi.o
  CC      s390x-softmmu/hw/vfio/platform.o
  CC      ppc-softmmu/hw/ppc/mpc8544_guts.o
  CC      ppc64-softmmu/hw/ppc/pnv_occ.o
  CC      ppc-softmmu/hw/ppc/ppce500_spin.o
  CC      s390x-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/target/ppc/machine.o
  CC      ppc64-softmmu/hw/ppc/pnv_bmc.o
  CC      ppc-softmmu/hw/ppc/virtex_ml507.o
  CC      s390x-softmmu/hw/virtio/virtio.o
  CC      ppcemb-softmmu/target/ppc/mmu_helper.o
  CC      ppc64-softmmu/hw/ppc/spapr_pci_vfio.o
  CC      ppc-softmmu/target/ppc/cpu-models.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtas_ddw.o
  CC      ppc64-softmmu/hw/ppc/ppc405_boards.o
  CC      s390x-softmmu/hw/virtio/virtio-balloon.o
  CC      ppcemb-softmmu/target/ppc/mmu-hash32.o
  CC      ppc64-softmmu/hw/ppc/ppc4xx_devs.o
  CC      ppc-softmmu/target/ppc/cpu.o
  CC      s390x-softmmu/hw/virtio/vhost.o
  CC      ppcemb-softmmu/target/ppc/monitor.o
  CC      ppc64-softmmu/hw/ppc/ppc405_uc.o
  CC      ppcemb-softmmu/target/ppc/arch_dump.o
  CC      ppc-softmmu/target/ppc/translate.o
  CC      ppcemb-softmmu/target/ppc/kvm-stub.o
  CC      s390x-softmmu/hw/virtio/vhost-backend.o
  CC      ppc64-softmmu/hw/ppc/ppc440_bamboo.o
  CC      ppcemb-softmmu/target/ppc/dfp_helper.o
  CC      ppc64-softmmu/hw/ppc/ppc4xx_pci.o
  CC      s390x-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/ppc/prep.o
  CC      s390x-softmmu/hw/virtio/vhost-vsock.o
  CC      ppcemb-softmmu/target/ppc/excp_helper.o
  CC      ppc64-softmmu/hw/ppc/prep_systemio.o
  CC      s390x-softmmu/hw/virtio/virtio-crypto.o
  CC      ppcemb-softmmu/target/ppc/fpu_helper.o
  CC      ppc64-softmmu/hw/ppc/rs6000_mc.o
  CC      s390x-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc64-softmmu/hw/ppc/mac_oldworld.o
  CC      s390x-softmmu/hw/s390x/s390-virtio-hcall.o
  CC      ppc64-softmmu/hw/ppc/mac_newworld.o
  CC      s390x-softmmu/hw/s390x/sclp.o
  CC      s390x-softmmu/hw/s390x/event-facility.o
  CC      ppc64-softmmu/hw/ppc/e500.o
  CC      s390x-softmmu/hw/s390x/sclpquiesce.o
  CC      s390x-softmmu/hw/s390x/sclpcpu.o
  CC      ppc64-softmmu/hw/ppc/mpc8544ds.o
  CC      s390x-softmmu/hw/s390x/ipl.o
  CC      ppc64-softmmu/hw/ppc/e500plat.o
  CC      s390x-softmmu/hw/s390x/css.o
  CC      ppcemb-softmmu/target/ppc/int_helper.o
  CC      ppc64-softmmu/hw/ppc/mpc8544_guts.o
  CC      ppc64-softmmu/hw/ppc/ppce500_spin.o
  CC      s390x-softmmu/hw/s390x/s390-virtio-ccw.o
  CC      ppc64-softmmu/hw/ppc/virtex_ml507.o
  CC      ppc64-softmmu/target/ppc/cpu-models.o
  CC      s390x-softmmu/hw/s390x/3270-ccw.o
  CC      ppcemb-softmmu/target/ppc/timebase_helper.o
  CC      s390x-softmmu/hw/s390x/virtio-ccw.o
  CC      ppcemb-softmmu/target/ppc/misc_helper.o
  CC      ppcemb-softmmu/target/ppc/mem_helper.o
  CC      ppc64-softmmu/target/ppc/cpu.o
  CC      s390x-softmmu/hw/s390x/css-bridge.o
  CC      ppc64-softmmu/target/ppc/translate.o
  CC      ppcemb-softmmu/target/ppc/gdbstub.o
  CC      s390x-softmmu/hw/s390x/ccw-device.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/decContext.o
  CC      s390x-softmmu/hw/s390x/s390-pci-bus.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/decNumber.o
  CC      s390x-softmmu/hw/s390x/s390-pci-inst.o
  CC      s390x-softmmu/hw/s390x/s390-skeys.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      s390x-softmmu/hw/s390x/s390-stattrib.o
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      ppc-softmmu/target/ppc/machine.o
/var/tmp/patchew-tester-tmp-30ljxus4/src/hw/s390x/s390-stattrib.c: In function ‘s390_stattrib_instance_init’:
/var/tmp/patchew-tester-tmp-30ljxus4/src/hw/s390x/s390-stattrib.c:379:28: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
     ops->save_live_pending = cmma_save_pending;
                            ^
cc1: all warnings being treated as errors
/var/tmp/patchew-tester-tmp-30ljxus4/src/rules.mak:66: recipe for target 'hw/s390x/s390-stattrib.o' failed
make[1]: *** [hw/s390x/s390-stattrib.o] Error 1
Makefile:374: recipe for target 'subdir-s390x-softmmu' failed
make: *** [subdir-s390x-softmmu] Error 2
make: *** Waiting for unfinished jobs....
  CC      ppcemb-softmmu/target/ppc/../../libdecnumber/dpd/decimal128.o
  CC      ppc-softmmu/target/ppc/mmu_helper.o
  CC      ppc64-softmmu/target/ppc/machine.o
  GEN     trace/generated-helpers.c
  CC      ppcemb-softmmu/trace/control-target.o
  CC      ppc-softmmu/target/ppc/mmu-hash32.o
  CC      ppcemb-softmmu/gdbstub-xml.o
  CC      ppc-softmmu/target/ppc/monitor.o
  CC      ppcemb-softmmu/trace/generated-helpers.o
  CC      ppc-softmmu/target/ppc/arch_dump.o
  CC      ppc-softmmu/target/ppc/kvm-stub.o
  CC      ppc64-softmmu/target/ppc/mmu_helper.o
  LINK    ppcemb-softmmu/qemu-system-ppcemb
  CC      ppc-softmmu/target/ppc/dfp_helper.o
  CC      ppc-softmmu/target/ppc/excp_helper.o
  CC      ppc64-softmmu/target/ppc/mmu-hash32.o
  CC      ppc64-softmmu/target/ppc/monitor.o
  CC      ppc64-softmmu/target/ppc/arch_dump.o
  CC      ppc-softmmu/target/ppc/fpu_helper.o
  CC      ppc64-softmmu/target/ppc/mmu-hash64.o
  CC      ppc-softmmu/target/ppc/int_helper.o
  CC      ppc64-softmmu/target/ppc/mmu-book3s-v3.o
  CC      ppc-softmmu/target/ppc/timebase_helper.o
  CC      ppc-softmmu/target/ppc/misc_helper.o
  CC      ppc-softmmu/target/ppc/mem_helper.o
  CC      ppc-softmmu/target/ppc/gdbstub.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/decContext.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/decNumber.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      ppc-softmmu/target/ppc/../../libdecnumber/dpd/decimal128.o
  GEN     trace/generated-helpers.c
  CC      ppc-softmmu/trace/control-target.o
  CC      ppc-softmmu/gdbstub-xml.o
  CC      ppc-softmmu/trace/generated-helpers.o
  CC      ppc64-softmmu/target/ppc/compat.o
  CC      ppc64-softmmu/target/ppc/mmu-radix64.o
  CC      ppc64-softmmu/target/ppc/kvm-stub.o
  LINK    ppc-softmmu/qemu-system-ppc
  CC      ppc64-softmmu/target/ppc/dfp_helper.o
  CC      ppc64-softmmu/target/ppc/excp_helper.o
  CC      ppc64-softmmu/target/ppc/fpu_helper.o
  CC      ppc64-softmmu/target/ppc/int_helper.o
  CC      ppc64-softmmu/target/ppc/timebase_helper.o
  CC      ppc64-softmmu/target/ppc/misc_helper.o
  CC      ppc64-softmmu/target/ppc/mem_helper.o
  CC      ppc64-softmmu/target/ppc/gdbstub.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/decContext.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/decNumber.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/dpd/decimal32.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/dpd/decimal64.o
  CC      ppc64-softmmu/target/ppc/../../libdecnumber/dpd/decimal128.o
  GEN     trace/generated-helpers.c
  CC      ppc64-softmmu/trace/control-target.o
  CC      ppc64-softmmu/gdbstub-xml.o
  CC      ppc64-softmmu/trace/generated-helpers.o
  LINK    ppc64-softmmu/qemu-system-ppc64
=== OUTPUT END ===

Test command exited with code: 2


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending Vladimir Sementsov-Ogievskiy
@ 2017-10-30 17:31   ` Dr. David Alan Gilbert
  2017-10-30 18:17     ` Vladimir Sementsov-Ogievskiy
  2017-10-30 18:19   ` [Qemu-devel] [PATCH v8.1 " Vladimir Sementsov-Ogievskiy
  1 sibling, 1 reply; 44+ messages in thread
From: Dr. David Alan Gilbert @ 2017-10-30 17:31 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: qemu-block, qemu-devel, pbonzini, armbru, eblake, famz, stefanha,
	amit.shah, quintela, mreitz, kwolf, peter.maydell, den, jsnow,
	lirans

* Vladimir Sementsov-Ogievskiy (vsementsov@virtuozzo.com) wrote:
> There would be savevm states (dirty-bitmap) which can migrate only in
> postcopy stage. The corresponding pending is introduced here.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> Reviewed-by: Juan Quintela <quintela@redhat.com>

Note the error patchew picked up on this for s390 which has
cmma_save_pending.

Dave

> ---
>  include/migration/register.h | 17 +++++++++++++++--
>  migration/savevm.h           |  5 +++--
>  migration/block.c            |  7 ++++---
>  migration/migration.c        | 15 ++++++++-------
>  migration/ram.c              |  9 +++++----
>  migration/savevm.c           | 13 ++++++++-----
>  migration/trace-events       |  2 +-
>  7 files changed, 44 insertions(+), 24 deletions(-)
> 
> diff --git a/include/migration/register.h b/include/migration/register.h
> index f4f7bdc177..9436a87678 100644
> --- a/include/migration/register.h
> +++ b/include/migration/register.h
> @@ -37,8 +37,21 @@ typedef struct SaveVMHandlers {
>      int (*save_setup)(QEMUFile *f, void *opaque);
>      void (*save_live_pending)(QEMUFile *f, void *opaque,
>                                uint64_t threshold_size,
> -                              uint64_t *non_postcopiable_pending,
> -                              uint64_t *postcopiable_pending);
> +                              uint64_t *res_precopy_only,
> +                              uint64_t *res_compatible,
> +                              uint64_t *res_postcopy_only);
> +    /* Note for save_live_pending:
> +     * - res_precopy_only is for data which must be migrated in precopy phase
> +     *     or in stopped state, in other words - before target vm start
> +     * - res_compatible is for data which may be migrated in any phase
> +     * - res_postcopy_only is for data which must be migrated in postcopy phase
> +     *     or in stopped state, in other words - after source vm stop
> +     *
> +     * Sum of res_postcopy_only, res_compatible and res_postcopy_only is the
> +     * whole amount of pending data.
> +     */
> +
> +
>      LoadStateHandler *load_state;
>      int (*load_setup)(QEMUFile *f, void *opaque);
>      int (*load_cleanup)(void *opaque);
> diff --git a/migration/savevm.h b/migration/savevm.h
> index 295c4a1f2c..cf4f0d37ca 100644
> --- a/migration/savevm.h
> +++ b/migration/savevm.h
> @@ -38,8 +38,9 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f);
>  int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only,
>                                         bool inactivate_disks);
>  void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size,
> -                               uint64_t *res_non_postcopiable,
> -                               uint64_t *res_postcopiable);
> +                               uint64_t *res_precopy_only,
> +                               uint64_t *res_compatible,
> +                               uint64_t *res_postcopy_only);
>  void qemu_savevm_send_ping(QEMUFile *f, uint32_t value);
>  void qemu_savevm_send_open_return_path(QEMUFile *f);
>  int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len);
> diff --git a/migration/block.c b/migration/block.c
> index 3282809583..39dfa567e8 100644
> --- a/migration/block.c
> +++ b/migration/block.c
> @@ -865,8 +865,9 @@ static int block_save_complete(QEMUFile *f, void *opaque)
>  }
>  
>  static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
> -                               uint64_t *non_postcopiable_pending,
> -                               uint64_t *postcopiable_pending)
> +                               uint64_t *res_precopy_only,
> +                               uint64_t *res_compatible,
> +                               uint64_t *res_postcopy_only)
>  {
>      /* Estimate pending number of bytes to send */
>      uint64_t pending;
> @@ -887,7 +888,7 @@ static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
>  
>      DPRINTF("Enter save live pending  %" PRIu64 "\n", pending);
>      /* We don't do postcopy */
> -    *non_postcopiable_pending += pending;
> +    *res_precopy_only += pending;
>  }
>  
>  static int block_load(QEMUFile *f, void *opaque, int version_id)
> diff --git a/migration/migration.c b/migration/migration.c
> index 4de3b551fe..e6c9be3cca 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -2216,20 +2216,21 @@ static void *migration_thread(void *opaque)
>          uint64_t pending_size;
>  
>          if (!qemu_file_rate_limit(s->to_dst_file)) {
> -            uint64_t pend_post, pend_nonpost;
> +            uint64_t pend_pre, pend_compat, pend_post;
>  
> -            qemu_savevm_state_pending(s->to_dst_file, threshold_size,
> -                                      &pend_nonpost, &pend_post);
> -            pending_size = pend_nonpost + pend_post;
> +            qemu_savevm_state_pending(s->to_dst_file, threshold_size, &pend_pre,
> +                                      &pend_compat, &pend_post);
> +            pending_size = pend_pre + pend_compat + pend_post;
>              trace_migrate_pending(pending_size, threshold_size,
> -                                  pend_post, pend_nonpost);
> +                                  pend_pre, pend_compat, pend_post);
>              if (pending_size && pending_size >= threshold_size) {
>                  /* Still a significant amount to transfer */
>  
>                  if (migrate_postcopy() &&
>                      s->state != MIGRATION_STATUS_POSTCOPY_ACTIVE &&
> -                    pend_nonpost <= threshold_size &&
> -                    atomic_read(&s->start_postcopy)) {
> +                    pend_pre <= threshold_size &&
> +                    (atomic_read(&s->start_postcopy) ||
> +                     (pend_pre + pend_compat <= threshold_size))) {
>  
>                      if (!postcopy_start(s, &old_vm_running)) {
>                          current_active_state = MIGRATION_STATUS_POSTCOPY_ACTIVE;
> diff --git a/migration/ram.c b/migration/ram.c
> index 8620aa400a..1b664a2d9a 100644
> --- a/migration/ram.c
> +++ b/migration/ram.c
> @@ -2358,8 +2358,9 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
>  }
>  
>  static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
> -                             uint64_t *non_postcopiable_pending,
> -                             uint64_t *postcopiable_pending)
> +                             uint64_t *res_precopy_only,
> +                             uint64_t *res_compatible,
> +                             uint64_t *res_postcopy_only)
>  {
>      RAMState **temp = opaque;
>      RAMState *rs = *temp;
> @@ -2379,9 +2380,9 @@ static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
>  
>      if (migrate_postcopy_ram()) {
>          /* We can do postcopy, and all the data is postcopiable */
> -        *postcopiable_pending += remaining_size;
> +        *res_compatible += remaining_size;
>      } else {
> -        *non_postcopiable_pending += remaining_size;
> +        *res_precopy_only += remaining_size;
>      }
>  }
>  
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 4a88228614..f6b62cb202 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -1218,13 +1218,15 @@ int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only,
>   * for units that can't do postcopy.
>   */
>  void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size,
> -                               uint64_t *res_non_postcopiable,
> -                               uint64_t *res_postcopiable)
> +                               uint64_t *res_precopy_only,
> +                               uint64_t *res_compatible,
> +                               uint64_t *res_postcopy_only)
>  {
>      SaveStateEntry *se;
>  
> -    *res_non_postcopiable = 0;
> -    *res_postcopiable = 0;
> +    *res_precopy_only = 0;
> +    *res_compatible = 0;
> +    *res_postcopy_only = 0;
>  
>  
>      QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> @@ -1237,7 +1239,8 @@ void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size,
>              }
>          }
>          se->ops->save_live_pending(f, se->opaque, threshold_size,
> -                                   res_non_postcopiable, res_postcopiable);
> +                                   res_precopy_only, res_compatible,
> +                                   res_postcopy_only);
>      }
>  }
>  
> diff --git a/migration/trace-events b/migration/trace-events
> index 6f29fcc686..a04fffb877 100644
> --- a/migration/trace-events
> +++ b/migration/trace-events
> @@ -86,7 +86,7 @@ migrate_fd_cleanup(void) ""
>  migrate_fd_error(const char *error_desc) "error=%s"
>  migrate_fd_cancel(void) ""
>  migrate_handle_rp_req_pages(const char *rbname, size_t start, size_t len) "in %s at 0x%zx len 0x%zx"
> -migrate_pending(uint64_t size, uint64_t max, uint64_t post, uint64_t nonpost) "pending size %" PRIu64 " max %" PRIu64 " (post=%" PRIu64 " nonpost=%" PRIu64 ")"
> +migrate_pending(uint64_t size, uint64_t max, uint64_t pre, uint64_t compat, uint64_t post) "pending size %" PRIu64 " max %" PRIu64 " (pre = %" PRIu64 " compat=%" PRIu64 " post=%" PRIu64 ")"
>  migrate_send_rp_message(int msg_type, uint16_t len) "%d: len %d"
>  migration_completion_file_err(void) ""
>  migration_completion_postcopy_end(void) ""
> -- 
> 2.11.1
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending
  2017-10-30 17:31   ` Dr. David Alan Gilbert
@ 2017-10-30 18:17     ` Vladimir Sementsov-Ogievskiy
  0 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 18:17 UTC (permalink / raw)
  To: Dr. David Alan Gilbert
  Cc: qemu-block, qemu-devel, pbonzini, armbru, eblake, famz, stefanha,
	amit.shah, quintela, mreitz, kwolf, peter.maydell, den, jsnow,
	lirans

30.10.2017 20:31, Dr. David Alan Gilbert wrote:
> * Vladimir Sementsov-Ogievskiy (vsementsov@virtuozzo.com) wrote:
>> There would be savevm states (dirty-bitmap) which can migrate only in
>> postcopy stage. The corresponding pending is introduced here.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> Reviewed-by: Juan Quintela <quintela@redhat.com>
> Note the error patchew picked up on this for s390 which has
> cmma_save_pending.
>
> Dave

Thanks for pointing here, I'll update the patch.



-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

* [Qemu-devel] [PATCH v8.1 05/14] migration: introduce postcopy-only pending
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending Vladimir Sementsov-Ogievskiy
  2017-10-30 17:31   ` Dr. David Alan Gilbert
@ 2017-10-30 18:19   ` Vladimir Sementsov-Ogievskiy
  2017-11-14  0:09     ` John Snow
  1 sibling, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 18:19 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, vsementsov,
	lirans

There would be savevm states (dirty-bitmap) which can migrate only in
postcopy stage. The corresponding pending is introduced here.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---

8.1: add new version for cmma_save_pending too.


 include/migration/register.h | 17 +++++++++++++++--
 migration/savevm.h           |  5 +++--
 hw/s390x/s390-stattrib.c     |  7 ++++---
 migration/block.c            |  7 ++++---
 migration/migration.c        | 15 ++++++++-------
 migration/ram.c              |  9 +++++----
 migration/savevm.c           | 13 ++++++++-----
 migration/trace-events       |  2 +-
 8 files changed, 48 insertions(+), 27 deletions(-)

diff --git a/include/migration/register.h b/include/migration/register.h
index f4f7bdc177..9436a87678 100644
--- a/include/migration/register.h
+++ b/include/migration/register.h
@@ -37,8 +37,21 @@ typedef struct SaveVMHandlers {
     int (*save_setup)(QEMUFile *f, void *opaque);
     void (*save_live_pending)(QEMUFile *f, void *opaque,
                               uint64_t threshold_size,
-                              uint64_t *non_postcopiable_pending,
-                              uint64_t *postcopiable_pending);
+                              uint64_t *res_precopy_only,
+                              uint64_t *res_compatible,
+                              uint64_t *res_postcopy_only);
+    /* Note for save_live_pending:
+     * - res_precopy_only is for data which must be migrated in precopy phase
+     *     or in stopped state, in other words - before target vm start
+     * - res_compatible is for data which may be migrated in any phase
+     * - res_postcopy_only is for data which must be migrated in postcopy phase
+     *     or in stopped state, in other words - after source vm stop
+     *
+     * Sum of res_postcopy_only, res_compatible and res_postcopy_only is the
+     * whole amount of pending data.
+     */
+
+
     LoadStateHandler *load_state;
     int (*load_setup)(QEMUFile *f, void *opaque);
     int (*load_cleanup)(void *opaque);
diff --git a/migration/savevm.h b/migration/savevm.h
index 295c4a1f2c..cf4f0d37ca 100644
--- a/migration/savevm.h
+++ b/migration/savevm.h
@@ -38,8 +38,9 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f);
 int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only,
                                        bool inactivate_disks);
 void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size,
-                               uint64_t *res_non_postcopiable,
-                               uint64_t *res_postcopiable);
+                               uint64_t *res_precopy_only,
+                               uint64_t *res_compatible,
+                               uint64_t *res_postcopy_only);
 void qemu_savevm_send_ping(QEMUFile *f, uint32_t value);
 void qemu_savevm_send_open_return_path(QEMUFile *f);
 int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len);
diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
index 2902f54f11..dd3fbfd1eb 100644
--- a/hw/s390x/s390-stattrib.c
+++ b/hw/s390x/s390-stattrib.c
@@ -183,15 +183,16 @@ static int cmma_save_setup(QEMUFile *f, void *opaque)
 }
 
 static void cmma_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
-                             uint64_t *non_postcopiable_pending,
-                             uint64_t *postcopiable_pending)
+                              uint64_t *res_precopy_only,
+                              uint64_t *res_compatible,
+                              uint64_t *res_postcopy_only)
 {
     S390StAttribState *sas = S390_STATTRIB(opaque);
     S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
     long long res = sac->get_dirtycount(sas);
 
     if (res >= 0) {
-        *non_postcopiable_pending += res;
+        *res_precopy_only += res;
     }
 }
 
diff --git a/migration/block.c b/migration/block.c
index 3282809583..39dfa567e8 100644
--- a/migration/block.c
+++ b/migration/block.c
@@ -865,8 +865,9 @@ static int block_save_complete(QEMUFile *f, void *opaque)
 }
 
 static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
-                               uint64_t *non_postcopiable_pending,
-                               uint64_t *postcopiable_pending)
+                               uint64_t *res_precopy_only,
+                               uint64_t *res_compatible,
+                               uint64_t *res_postcopy_only)
 {
     /* Estimate pending number of bytes to send */
     uint64_t pending;
@@ -887,7 +888,7 @@ static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
 
     DPRINTF("Enter save live pending  %" PRIu64 "\n", pending);
     /* We don't do postcopy */
-    *non_postcopiable_pending += pending;
+    *res_precopy_only += pending;
 }
 
 static int block_load(QEMUFile *f, void *opaque, int version_id)
diff --git a/migration/migration.c b/migration/migration.c
index 4de3b551fe..e6c9be3cca 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2216,20 +2216,21 @@ static void *migration_thread(void *opaque)
         uint64_t pending_size;
 
         if (!qemu_file_rate_limit(s->to_dst_file)) {
-            uint64_t pend_post, pend_nonpost;
+            uint64_t pend_pre, pend_compat, pend_post;
 
-            qemu_savevm_state_pending(s->to_dst_file, threshold_size,
-                                      &pend_nonpost, &pend_post);
-            pending_size = pend_nonpost + pend_post;
+            qemu_savevm_state_pending(s->to_dst_file, threshold_size, &pend_pre,
+                                      &pend_compat, &pend_post);
+            pending_size = pend_pre + pend_compat + pend_post;
             trace_migrate_pending(pending_size, threshold_size,
-                                  pend_post, pend_nonpost);
+                                  pend_pre, pend_compat, pend_post);
             if (pending_size && pending_size >= threshold_size) {
                 /* Still a significant amount to transfer */
 
                 if (migrate_postcopy() &&
                     s->state != MIGRATION_STATUS_POSTCOPY_ACTIVE &&
-                    pend_nonpost <= threshold_size &&
-                    atomic_read(&s->start_postcopy)) {
+                    pend_pre <= threshold_size &&
+                    (atomic_read(&s->start_postcopy) ||
+                     (pend_pre + pend_compat <= threshold_size))) {
 
                     if (!postcopy_start(s, &old_vm_running)) {
                         current_active_state = MIGRATION_STATUS_POSTCOPY_ACTIVE;
diff --git a/migration/ram.c b/migration/ram.c
index 8620aa400a..1b664a2d9a 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -2358,8 +2358,9 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
 }
 
 static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
-                             uint64_t *non_postcopiable_pending,
-                             uint64_t *postcopiable_pending)
+                             uint64_t *res_precopy_only,
+                             uint64_t *res_compatible,
+                             uint64_t *res_postcopy_only)
 {
     RAMState **temp = opaque;
     RAMState *rs = *temp;
@@ -2379,9 +2380,9 @@ static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
 
     if (migrate_postcopy_ram()) {
         /* We can do postcopy, and all the data is postcopiable */
-        *postcopiable_pending += remaining_size;
+        *res_compatible += remaining_size;
     } else {
-        *non_postcopiable_pending += remaining_size;
+        *res_precopy_only += remaining_size;
     }
 }
 
diff --git a/migration/savevm.c b/migration/savevm.c
index 4a88228614..f6b62cb202 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1218,13 +1218,15 @@ int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only,
  * for units that can't do postcopy.
  */
 void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size,
-                               uint64_t *res_non_postcopiable,
-                               uint64_t *res_postcopiable)
+                               uint64_t *res_precopy_only,
+                               uint64_t *res_compatible,
+                               uint64_t *res_postcopy_only)
 {
     SaveStateEntry *se;
 
-    *res_non_postcopiable = 0;
-    *res_postcopiable = 0;
+    *res_precopy_only = 0;
+    *res_compatible = 0;
+    *res_postcopy_only = 0;
 
 
     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
@@ -1237,7 +1239,8 @@ void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size,
             }
         }
         se->ops->save_live_pending(f, se->opaque, threshold_size,
-                                   res_non_postcopiable, res_postcopiable);
+                                   res_precopy_only, res_compatible,
+                                   res_postcopy_only);
     }
 }
 
diff --git a/migration/trace-events b/migration/trace-events
index 6f29fcc686..a04fffb877 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -86,7 +86,7 @@ migrate_fd_cleanup(void) ""
 migrate_fd_error(const char *error_desc) "error=%s"
 migrate_fd_cancel(void) ""
 migrate_handle_rp_req_pages(const char *rbname, size_t start, size_t len) "in %s at 0x%zx len 0x%zx"
-migrate_pending(uint64_t size, uint64_t max, uint64_t post, uint64_t nonpost) "pending size %" PRIu64 " max %" PRIu64 " (post=%" PRIu64 " nonpost=%" PRIu64 ")"
+migrate_pending(uint64_t size, uint64_t max, uint64_t pre, uint64_t compat, uint64_t post) "pending size %" PRIu64 " max %" PRIu64 " (pre = %" PRIu64 " compat=%" PRIu64 " post=%" PRIu64 ")"
 migrate_send_rp_message(int msg_type, uint16_t len) "%d: len %d"
 migration_completion_file_err(void) ""
 migration_completion_postcopy_end(void) ""
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration
  2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
                   ` (15 preceding siblings ...)
  2017-10-30 16:55 ` no-reply
@ 2017-10-30 18:22 ` Vladimir Sementsov-Ogievskiy
  16 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-10-30 18:22 UTC (permalink / raw)
  To: qemu-block, qemu-devel
  Cc: pbonzini, armbru, eblake, famz, stefanha, amit.shah, quintela,
	mreitz, kwolf, peter.maydell, dgilbert, den, jsnow, lirans

30.10.2017 19:32, Vladimir Sementsov-Ogievskiy wrote:
> Hi all!
>
> There is a new version of dirty bitmap postcopy migration series.
>
> v8
>
> clone: tag postcopy-v8 from https://src.openvz.org/scm/~vsementsov/qemu.git
> online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=postcopy-v8

compilation is broken for s390, so updated version is:

clone: tag postcopy-v8.1 from https://src.openvz.org/scm/~vsementsov/qemu.git
online: https://src.openvz.org/users/vsementsov/repos/qemu/browse?at=postcopy-v8.1



-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 01/14] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor()
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 01/14] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor() Vladimir Sementsov-Ogievskiy
@ 2017-11-10  0:47   ` John Snow
  0 siblings, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-10  0:47 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
> Enabling bitmap successor is necessary to enable successors of bitmaps
> being migrated before target vm start.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  include/block/dirty-bitmap.h | 1 +
>  block/dirty-bitmap.c         | 8 ++++++++
>  2 files changed, 9 insertions(+)
> 
> diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
> index 3579a7597c..93d4336505 100644
> --- a/include/block/dirty-bitmap.h
> +++ b/include/block/dirty-bitmap.h
> @@ -20,6 +20,7 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
>  BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
>                                             BdrvDirtyBitmap *bitmap,
>                                             Error **errp);
> +void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap);
>  BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs,
>                                          const char *name);
>  void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap);
> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
> index bd04e991b1..81adbeb6d4 100644
> --- a/block/dirty-bitmap.c
> +++ b/block/dirty-bitmap.c
> @@ -237,6 +237,14 @@ int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
>      return 0;
>  }
>  
> +/* Called with BQL taken. */
> +void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap)
> +{
> +    qemu_mutex_lock(bitmap->mutex);
> +    bdrv_enable_dirty_bitmap(bitmap->successor);
> +    qemu_mutex_unlock(bitmap->mutex);
> +}
> +
>  /**
>   * For a bitmap with a successor, yield our name to the successor,
>   * delete the old bitmap, and return a handle to the new bitmap.
> 

Mechanically correct; though I haven't looked forward to how it's used yet.

Reviewed-by: John Snow <jsnow@redhat.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap Vladimir Sementsov-Ogievskiy
@ 2017-11-10 22:52   ` John Snow
  2017-11-16  8:56     ` Vladimir Sementsov-Ogievskiy
  2017-11-17  8:07     ` Vladimir Sementsov-Ogievskiy
  0 siblings, 2 replies; 44+ messages in thread
From: John Snow @ 2017-11-10 22:52 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
> It is needed to realize bdrv_dirty_bitmap_release_successor in
> the following patch.
> 

OK, but...

> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  block/dirty-bitmap.c | 25 ++++++++++++++++++++-----
>  1 file changed, 20 insertions(+), 5 deletions(-)
> 
> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
> index 81adbeb6d4..981f99d362 100644
> --- a/block/dirty-bitmap.c
> +++ b/block/dirty-bitmap.c
> @@ -326,13 +326,13 @@ static bool bdrv_dirty_bitmap_has_name(BdrvDirtyBitmap *bitmap)
>      return !!bdrv_dirty_bitmap_name(bitmap);
>  }
>  
> -/* Called with BQL taken.  */
> -static void bdrv_do_release_matching_dirty_bitmap(
> +/* Called within bdrv_dirty_bitmap_lock..unlock */

...Add this so it will compile:

__attribute__((__unused__))
> +static void bdrv_do_release_matching_dirty_bitmap_locked(
>      BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
>      bool (*cond)(BdrvDirtyBitmap *bitmap))
>  {
>      BdrvDirtyBitmap *bm, *next;
> -    bdrv_dirty_bitmaps_lock(bs);
> +
>      QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
>          if ((!bitmap || bm == bitmap) && (!cond || cond(bm))) {
>              assert(!bm->active_iterators);
> @@ -344,18 +344,33 @@ static void bdrv_do_release_matching_dirty_bitmap(
>              g_free(bm);
>  
>              if (bitmap) {
> -                goto out;
> +                return;
>              }
>          }
>      }
> +
>      if (bitmap) {
>          abort();
>      }

Do we have any style guide rules on using abort() instead of assert()?
The rest of this function uses assert, and it'd be less lines to simply
write:

assert(!bitmap);

which I think might also carry better semantic information for coverity
beyond an actual runtime conditional branch.

(I think. Please correct me if I am wrong, I'm a little hazy on this.)

> +}
>  
> -out:
> +/* Called with BQL taken.  */
> +static void bdrv_do_release_matching_dirty_bitmap(
> +    BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
> +    bool (*cond)(BdrvDirtyBitmap *bitmap))
> +{
> +    bdrv_dirty_bitmaps_lock(bs);
> +    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, cond);
>      bdrv_dirty_bitmaps_unlock(bs);
>  }
>  
> +/* Called within bdrv_dirty_bitmap_lock..unlock */
> +static void bdrv_release_dirty_bitmap_locked(BlockDriverState *bs,
> +                                             BdrvDirtyBitmap *bitmap)
> +{
> +    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, NULL);
> +}
> +
>  /* Called with BQL taken.  */
>  void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
>  {
> 

If you agree with those two changes, you may add:

Reviewed-by: John Snow <jsnow@redhat.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 03/14] block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 03/14] block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor Vladimir Sementsov-Ogievskiy
@ 2017-11-13 22:17   ` John Snow
  0 siblings, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-13 22:17 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
> To just release successor and unfreeze bitmap without any additional
> work.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> ---
>  include/block/dirty-bitmap.h |  2 ++
>  block/dirty-bitmap.c         | 14 ++++++++++++++
>  2 files changed, 16 insertions(+)
> 
> diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
> index 93d4336505..a9e2a92e4f 100644
> --- a/include/block/dirty-bitmap.h
> +++ b/include/block/dirty-bitmap.h
> @@ -20,6 +20,8 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
>  BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
>                                             BdrvDirtyBitmap *bitmap,
>                                             Error **errp);
> +void bdrv_dirty_bitmap_release_successor(BlockDriverState *bs,
> +                                         BdrvDirtyBitmap *bitmap);
>  void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap);
>  BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs,
>                                          const char *name);
> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
> index 981f99d362..7578863aa1 100644
> --- a/block/dirty-bitmap.c
> +++ b/block/dirty-bitmap.c
> @@ -431,6 +431,20 @@ void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
>      bitmap->disabled = false;
>  }
>  
> +/* Called with BQL taken. */
> +void bdrv_dirty_bitmap_release_successor(BlockDriverState *bs,
> +                                         BdrvDirtyBitmap *parent)
> +{
> +    qemu_mutex_lock(parent->mutex);
> +
> +    if (parent->successor) {
> +        bdrv_release_dirty_bitmap_locked(bs, parent->successor);
> +        parent->successor = NULL;
> +    }
> +
> +    qemu_mutex_unlock(parent->mutex);
> +}
> +
>  BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
>  {
>      BdrvDirtyBitmap *bm;
> 

Not sure what this is useful for just yet, but it looks okay, tentatively..

Reviewed-by: John Snow <jsnow@redhat.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
  2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen Vladimir Sementsov-Ogievskiy
@ 2017-11-13 23:32   ` John Snow
  2017-11-17 14:46     ` Vladimir Sementsov-Ogievskiy
  0 siblings, 1 reply; 44+ messages in thread
From: John Snow @ 2017-11-13 23:32 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel, famz
  Cc: kwolf, peter.maydell, lirans, quintela, armbru, mreitz, stefanha,
	den, amit.shah, pbonzini, dgilbert



On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
> Make it possible to set bitmap 'frozen' without a successor.
> This is needed to protect the bitmap during outgoing bitmap postcopy
> migration.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  include/block/dirty-bitmap.h |  1 +
>  block/dirty-bitmap.c         | 22 ++++++++++++++++++++--
>  2 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
> index a9e2a92e4f..ae6d697850 100644
> --- a/include/block/dirty-bitmap.h
> +++ b/include/block/dirty-bitmap.h
> @@ -39,6 +39,7 @@ uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
>  uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap);
>  bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
>  bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool frozen);
>  const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
>  int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
>  DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap);
> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
> index 7578863aa1..67fc6bd6e0 100644
> --- a/block/dirty-bitmap.c
> +++ b/block/dirty-bitmap.c
> @@ -40,6 +40,8 @@ struct BdrvDirtyBitmap {
>      QemuMutex *mutex;
>      HBitmap *bitmap;            /* Dirty bitmap implementation */
>      HBitmap *meta;              /* Meta dirty bitmap */
> +    bool frozen;                /* Bitmap is frozen, it can't be modified
> +                                   through QMP */

I hesitate, because this now means that we have two independent bits of
state we need to update and maintain consistency with.

Before:

Frozen: "Bitmap has a successor and is no longer itself recording
writes, though we are guaranteed to have a successor doing so on our
behalf."

After:

Frozen: "Bitmap may or may not have a successor, but it is disabled with
an even more limited subset of tasks than a traditionally disabled bitmap."

This changes the meaning of "frozen" a little, and I am not sure that is
a problem as such, but it does make the interface seem a little
"fuzzier" than it did prior.

>      BdrvDirtyBitmap *successor; /* Anonymous child; implies frozen status */
>      char *name;                 /* Optional non-empty unique ID */
>      int64_t size;               /* Size of the bitmap, in bytes */
> @@ -183,13 +185,22 @@ const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap)
>  /* Called with BQL taken.  */
>  bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
>  {
> -    return bitmap->successor;
> +    return bitmap->frozen;
> +}

Are there any cases where we will be unfrozen, but actually have a
successor now? If so, under what circumstances does that happen?

> +
> +/* Called with BQL taken.  */
> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool frozen)
> +{
> +    qemu_mutex_lock(bitmap->mutex);
> +    assert(bitmap->successor == NULL);
> +    bitmap->frozen = frozen;
> +    qemu_mutex_unlock(bitmap->mutex);
>  }
>  

OK, so we can only "set frozen" (or unset) if we don't have a successor.

>  /* Called with BQL taken.  */
>  bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
>  {
> -    return !(bitmap->disabled || bitmap->successor);
> +    return !(bitmap->disabled || (bitmap->successor != NULL));
>  }
>  

I guess this just makes 'successor' more obviously non-boolean, which is
fine.

>  /* Called with BQL taken.  */
> @@ -234,6 +245,7 @@ int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
>  
>      /* Install the successor and freeze the parent */
>      bitmap->successor = child;
> +    bitmap->frozen = true;
>      return 0;
>  }
>  
> @@ -266,6 +278,8 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
>      name = bitmap->name;
>      bitmap->name = NULL;
>      successor->name = name;
> +    assert(bitmap->frozen);
> +    bitmap->frozen = false;
>      bitmap->successor = NULL;
>      successor->persistent = bitmap->persistent;
>      bitmap->persistent = false;
> @@ -298,6 +312,8 @@ BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
>          return NULL;
>      }
>      bdrv_release_dirty_bitmap(bs, successor);
> +    assert(parent->frozen);
> +    parent->frozen = false;
>      parent->successor = NULL;
>  
>      return parent;
> @@ -439,6 +455,8 @@ void bdrv_dirty_bitmap_release_successor(BlockDriverState *bs,
>  
>      if (parent->successor) {
>          bdrv_release_dirty_bitmap_locked(bs, parent->successor);
> +        assert(parent->frozen);
> +        parent->frozen = false;
>          parent->successor = NULL;
>      }
>  
> 

Tentatively:

Reviewed-by: John Snow <jsnow@redhat.com>

Fam, any thoughts?

--John

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8.1 05/14] migration: introduce postcopy-only pending
  2017-10-30 18:19   ` [Qemu-devel] [PATCH v8.1 " Vladimir Sementsov-Ogievskiy
@ 2017-11-14  0:09     ` John Snow
  0 siblings, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-14  0:09 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 10/30/2017 02:19 PM, Vladimir Sementsov-Ogievskiy wrote:
> There would be savevm states (dirty-bitmap) which can migrate only in
> postcopy stage. The corresponding pending is introduced here.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> Reviewed-by: Juan Quintela <quintela@redhat.com>
> ---
> 
> 8.1: add new version for cmma_save_pending too.

I love "8.1" :)

With this fixup applied to fix the s390x build issue,

Reviewed-by: John Snow <jsnow@redhat.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 07/14] migration: include migrate_dirty_bitmaps in migrate_postcopy
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 07/14] migration: include migrate_dirty_bitmaps in migrate_postcopy Vladimir Sementsov-Ogievskiy
@ 2017-11-14  0:19   ` John Snow
  0 siblings, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-14  0:19 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 10/30/2017 12:33 PM, Vladimir Sementsov-Ogievskiy wrote:
> Enable postcopy if dirty bitmap migration is endabled.
> 

"enabled"

> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> Reviewed-by: Juan Quintela <quintela@redhat.com>

Reviewed-by: John Snow <jsnow@redhat.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 09/14] migration: add is_active_iterate handler
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 09/14] migration: add is_active_iterate handler Vladimir Sementsov-Ogievskiy
@ 2017-11-14  0:29   ` John Snow
  0 siblings, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-14  0:29 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 10/30/2017 12:33 PM, Vladimir Sementsov-Ogievskiy wrote:
> Only-postcopy savevm states (dirty-bitmap) don't need live iteration, so
> to disable them and stop transporting empty sections there is a new
> savevm handler.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> Reviewed-by: Juan Quintela <quintela@redhat.com>


Reviewed-by: John Snow <jsnow@redhat.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps
  2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps Vladimir Sementsov-Ogievskiy
@ 2017-11-15  1:58   ` John Snow
  2017-11-16 10:24     ` Vladimir Sementsov-Ogievskiy
  2017-11-16 16:50     ` Dr. David Alan Gilbert
  0 siblings, 2 replies; 44+ messages in thread
From: John Snow @ 2017-11-15  1:58 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 10/30/2017 12:33 PM, Vladimir Sementsov-Ogievskiy wrote:
> Postcopy migration of dirty bitmaps. Only named dirty bitmaps,
> associated with root nodes and non-root named nodes are migrated.
> 
> If destination qemu is already containing a dirty bitmap with the same name
> as a migrated bitmap (for the same node), then, if their granularities are
> the same the migration will be done, otherwise the error will be generated.
> 
> If destination qemu doesn't contain such bitmap it will be created.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  include/migration/misc.h       |   3 +
>  migration/migration.h          |   3 +
>  migration/block-dirty-bitmap.c | 734 +++++++++++++++++++++++++++++++++++++++++

Ouch :\

>  migration/migration.c          |   3 +
>  migration/savevm.c             |   2 +
>  vl.c                           |   1 +
>  migration/Makefile.objs        |   1 +
>  migration/trace-events         |  14 +
>  8 files changed, 761 insertions(+)
>  create mode 100644 migration/block-dirty-bitmap.c
> 

Organizationally, you introduce three new 'public' prototypes:

dirty_bitmap_mig_init
dirty_bitmap_mig_before_vm_start
init_dirty_bitmap_incoming_migration

mig_init is advertised in migration/misc.h, the other two are in
migration/migration.h.
The definitions for all three are in migration/block-dirty-bitmap.c

In pure naivety, I find it weird to have something that you use in
migration.c and advertised in migration.h actually exist separately in
block-dirty-bitmap.c; but maybe this is the sanest thing to do.

> diff --git a/include/migration/misc.h b/include/migration/misc.h
> index c079b7771b..9cc539e232 100644
> --- a/include/migration/misc.h
> +++ b/include/migration/misc.h
> @@ -55,4 +55,7 @@ bool migration_has_failed(MigrationState *);
>  bool migration_in_postcopy_after_devices(MigrationState *);
>  void migration_global_dump(Monitor *mon);
>  
> +/* migration/block-dirty-bitmap.c */
> +void dirty_bitmap_mig_init(void);
> +
>  #endif
> diff --git a/migration/migration.h b/migration/migration.h
> index 50d1f01346..4e3ad04664 100644
> --- a/migration/migration.h
> +++ b/migration/migration.h
> @@ -211,4 +211,7 @@ void migrate_send_rp_pong(MigrationIncomingState *mis,
>  void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
>                                ram_addr_t start, size_t len);
>  
> +void dirty_bitmap_mig_before_vm_start(void);
> +void init_dirty_bitmap_incoming_migration(void);
> +
>  #endif
> diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
> new file mode 100644
> index 0000000000..53cb20045d
> --- /dev/null
> +++ b/migration/block-dirty-bitmap.c
> @@ -0,0 +1,734 @@
> +/*
> + * Block dirty bitmap postcopy migration
> + *
> + * Copyright IBM, Corp. 2009
> + * Copyright (c) 2016-2017 Parallels International GmbH
> + *
> + * Authors:
> + *  Liran Schour   <lirans@il.ibm.com>
> + *  Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + * This file is derived from migration/block.c, so it's author and IBM copyright
> + * are here, although content is quite different.
> + *
> + * Contributions after 2012-01-13 are licensed under the terms of the
> + * GNU GPL, version 2 or (at your option) any later version.
> + *
> + *                                ***
> + *
> + * Here postcopy migration of dirty bitmaps is realized. Only named dirty
> + * bitmaps, associated with root nodes and non-root named nodes are migrated.

Put another way, only QMP-addressable bitmaps. Nodes without a name that
are not the root have no way to be addressed.

> + *
> + * If destination qemu is already containing a dirty bitmap with the same name

"If the destination QEMU already contains a dirty bitmap with the same name"

> + * as a migrated bitmap (for the same node), then, if their granularities are
> + * the same the migration will be done, otherwise the error will be generated.

"an error"

> + *
> + * If destination qemu doesn't contain such bitmap it will be created.

"If the destination QEMU doesn't contain such a bitmap, it will be created."

> + *
> + * format of migration:
> + *
> + * # Header (shared for different chunk types)
> + * 1, 2 or 4 bytes: flags (see qemu_{put,put}_flags)
> + * [ 1 byte: node name size ] \  flags & DEVICE_NAME
> + * [ n bytes: node name     ] /
> + * [ 1 byte: bitmap name size ] \  flags & BITMAP_NAME
> + * [ n bytes: bitmap name     ] /
> + *
> + * # Start of bitmap migration (flags & START)
> + * header
> + * be64: granularity
> + * 1 byte: bitmap flags (corresponds to BdrvDirtyBitmap)
> + *   bit 0    -  bitmap is enabled
> + *   bit 1    -  bitmap is persistent
> + *   bit 2    -  bitmap is autoloading
> + *   bits 3-7 - reserved, must be zero
> + *
> + * # Complete of bitmap migration (flags & COMPLETE)
> + * header
> + *
> + * # Data chunk of bitmap migration
> + * header
> + * be64: start sector
> + * be32: number of sectors
> + * [ be64: buffer size  ] \ ! (flags & ZEROES)
> + * [ n bytes: buffer    ] /
> + *
> + * The last chunk in stream should contain flags & EOS. The chunk may skip
> + * device and/or bitmap names, assuming them to be the same with the previous
> + * chunk.
> + */
> +

Been a while since I reviewed the format, but it seems sane.

> +#include "qemu/osdep.h"
> +#include "block/block.h"
> +#include "block/block_int.h"
> +#include "sysemu/block-backend.h"
> +#include "qemu/main-loop.h"
> +#include "qemu/error-report.h"
> +#include "migration/misc.h"
> +#include "migration/migration.h"
> +#include "migration/qemu-file.h"
> +#include "migration/vmstate.h"
> +#include "migration/register.h"
> +#include "qemu/hbitmap.h"
> +#include "sysemu/sysemu.h"
> +#include "qemu/cutils.h"
> +#include "qapi/error.h"
> +#include "trace.h"
> +
> +#define CHUNK_SIZE     (1 << 10)
> +
> +/* Flags occupy one, two or four bytes (Big Endian). The size is determined as
> + * follows:
> + * in first (most significant) byte bit 8 is clear  -->  one byte
> + * in first byte bit 8 is set    -->  two or four bytes, depending on second
> + *                                    byte:
> + *    | in second byte bit 8 is clear  -->  two bytes
> + *    | in second byte bit 8 is set    -->  four bytes
> + */
> +#define DIRTY_BITMAP_MIG_FLAG_EOS           0x01
> +#define DIRTY_BITMAP_MIG_FLAG_ZEROES        0x02
> +#define DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME   0x04
> +#define DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME   0x08
> +#define DIRTY_BITMAP_MIG_FLAG_START         0x10
> +#define DIRTY_BITMAP_MIG_FLAG_COMPLETE      0x20
> +#define DIRTY_BITMAP_MIG_FLAG_BITS          0x40
> +
> +#define DIRTY_BITMAP_MIG_EXTRA_FLAGS        0x80
> +
> +#define DIRTY_BITMAP_MIG_START_FLAG_ENABLED          0x01
> +#define DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT       0x02
> +#define DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD         0x04
> +#define DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK    0xf8
> +
> +typedef struct DirtyBitmapMigBitmapState {
> +    /* Written during setup phase. */
> +    BlockDriverState *bs;
> +    const char *node_name;
> +    BdrvDirtyBitmap *bitmap;
> +    uint64_t total_sectors;
> +    uint64_t sectors_per_chunk;
> +    QSIMPLEQ_ENTRY(DirtyBitmapMigBitmapState) entry;
> +    uint8_t flags;
> +
> +    /* For bulk phase. */
> +    bool bulk_completed;
> +    uint64_t cur_sector;
> +} DirtyBitmapMigBitmapState;
> +
> +typedef struct DirtyBitmapMigState {
> +    QSIMPLEQ_HEAD(dbms_list, DirtyBitmapMigBitmapState) dbms_list;
> +
> +    bool bulk_completed;
> +
> +    /* for send_bitmap_bits() */
> +    BlockDriverState *prev_bs;
> +    BdrvDirtyBitmap *prev_bitmap;
> +} DirtyBitmapMigState;
> +
> +typedef struct DirtyBitmapLoadState {
> +    uint32_t flags;
> +    char node_name[256];
> +    char bitmap_name[256];
> +    BlockDriverState *bs;
> +    BdrvDirtyBitmap *bitmap;
> +} DirtyBitmapLoadState;
> +
> +static DirtyBitmapMigState dirty_bitmap_mig_state;
> +
> +typedef struct DirtyBitmapLoadBitmapState {
> +    BlockDriverState *bs;
> +    BdrvDirtyBitmap *bitmap;
> +    bool migrated;
> +} DirtyBitmapLoadBitmapState;
> +static GSList *enabled_bitmaps;
> +QemuMutex finish_lock;
> +
> +void init_dirty_bitmap_incoming_migration(void)
> +{
> +    qemu_mutex_init(&finish_lock);
> +}
> +

This is a little odd as public interface. David, is there a nicer way to
integrate in-migrate hooks? I guess it hasn't come up yet. Anyway, it
might be nice to leave a comment here for now that says that the only
caller is migration.c, and it will only ever call it once.

> +static uint32_t qemu_get_bitmap_flags(QEMUFile *f)
> +{
> +    uint8_t flags = qemu_get_byte(f);
> +    if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
> +        flags = flags << 8 | qemu_get_byte(f);
> +        if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
> +            flags = flags << 16 | qemu_get_be16(f);
> +        }
> +    }
> +
> +    return flags;
> +}
> +

ok

(Sorry for the per-function ACKs, it's just helpful for me to know which
functions I followed execution of on paper to make sure I got everything
in this big patch.)

> +static void qemu_put_bitmap_flags(QEMUFile *f, uint32_t flags)
> +{
> +    /* The code currently do not send flags more than one byte */
> +    assert(!(flags & (0xffffff00 | DIRTY_BITMAP_MIG_EXTRA_FLAGS)));
> +
> +    qemu_put_byte(f, flags);
> +}
> +

ok

> +static void send_bitmap_header(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
> +                               uint32_t additional_flags)
> +{
> +    BlockDriverState *bs = dbms->bs;
> +    BdrvDirtyBitmap *bitmap = dbms->bitmap;
> +    uint32_t flags = additional_flags;
> +    trace_send_bitmap_header_enter();
> +
> +    if (bs != dirty_bitmap_mig_state.prev_bs) {
> +        dirty_bitmap_mig_state.prev_bs = bs;
> +        flags |= DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME;
> +    }
> +
> +    if (bitmap != dirty_bitmap_mig_state.prev_bitmap) {
> +        dirty_bitmap_mig_state.prev_bitmap = bitmap;
> +        flags |= DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME;
> +    }
> +

I guess the idea here is that we might be able to skip the node name
broadcast, leaving the possibilities as:

- new node and bitmap: send both
- new bitmap, but not node: send bitmap name only
- same for both: send neither

and that otherwise it's not possible to have a new node but "same
bitmap" by nature of how the structures are organized.

> +    qemu_put_bitmap_flags(f, flags);
> +
> +    if (flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
> +        qemu_put_counted_string(f, dbms->node_name);
> +    }
> +
> +    if (flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
> +        qemu_put_counted_string(f, bdrv_dirty_bitmap_name(bitmap));
> +    }
> +}
> +

ok

> +static void send_bitmap_start(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
> +{
> +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_START);
> +    qemu_put_be32(f, bdrv_dirty_bitmap_granularity(dbms->bitmap));
> +    qemu_put_byte(f, dbms->flags);
> +}
> +

ok

> +static void send_bitmap_complete(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
> +{
> +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_COMPLETE);
> +}
> +

ok

> +static void send_bitmap_bits(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
> +                             uint64_t start_sector, uint32_t nr_sectors)
> +{
> +    /* align for buffer_is_zero() */
> +    uint64_t align = 4 * sizeof(long);
> +    uint64_t unaligned_size =
> +        bdrv_dirty_bitmap_serialization_size(
> +            dbms->bitmap, start_sector << BDRV_SECTOR_BITS,
> +            (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
> +    uint64_t buf_size = (unaligned_size + align - 1) & ~(align - 1);
> +    uint8_t *buf = g_malloc0(buf_size);
> +    uint32_t flags = DIRTY_BITMAP_MIG_FLAG_BITS;
> +
> +    bdrv_dirty_bitmap_serialize_part(
> +        dbms->bitmap, buf, start_sector << BDRV_SECTOR_BITS,
> +        (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
> +
> +    if (buffer_is_zero(buf, buf_size)) {
> +        g_free(buf);
> +        buf = NULL;
> +        flags |= DIRTY_BITMAP_MIG_FLAG_ZEROES;
> +    }
> +
> +    trace_send_bitmap_bits(flags, start_sector, nr_sectors, buf_size);
> +
> +    send_bitmap_header(f, dbms, flags);
> +
> +    qemu_put_be64(f, start_sector);
> +    qemu_put_be32(f, nr_sectors);
> +
> +    /* if a block is zero we need to flush here since the network
> +     * bandwidth is now a lot higher than the storage device bandwidth.
> +     * thus if we queue zero blocks we slow down the migration. */

Can you elaborate on this for me?

> +    if (flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
> +        qemu_fflush(f);
> +    } else {
> +        qemu_put_be64(f, buf_size);
> +        qemu_put_buffer(f, buf, buf_size);
> +    }
> +
> +    g_free(buf);
> +}
> +
> +
> +/* Called with iothread lock taken.  */
> +
> +static int init_dirty_bitmap_migration(void)
> +{
> +    BlockDriverState *bs;
> +    BdrvDirtyBitmap *bitmap;
> +    DirtyBitmapMigBitmapState *dbms;
> +    BdrvNextIterator it;
> +
> +    dirty_bitmap_mig_state.bulk_completed = false;
> +    dirty_bitmap_mig_state.prev_bs = NULL;
> +    dirty_bitmap_mig_state.prev_bitmap = NULL;
> +
> +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
> +        if (!bdrv_get_device_or_node_name(bs)) {
> +            /* not named non-root node */

I can't imagine the situation it would arise in, but is it possible to
have a named bitmap attached to a now-anonymous node?

Let's say we attach a bitmap to a root node, but then later we insert a
filter or something above it and it's no longer at the root.

We should probably prohibit such things, or at the very least toss out
an error here instead of silently continuing.

I think the only things valid to just *skip* are nameless bitmaps.
Anything named we really ought to either migrate or error out over, I
think, even if the circumstances leading to such a configuration are
very unlikely.

> +            continue;
> +        }
> +
> +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
> +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
> +            if (!bdrv_dirty_bitmap_name(bitmap)) {
> +                continue;
> +            }
> +
> +            if (bdrv_dirty_bitmap_frozen(bitmap)) {
> +                error_report("Can't migrate frozen dirty bitmap: '%s",
> +                             bdrv_dirty_bitmap_name(bitmap));
> +                return -1;
> +            }
> +        }
> +    }
> +
> +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
> +        if (!bdrv_get_device_or_node_name(bs)) {
> +            /* not named non-root node */
> +            continue;
> +        }

Why two-pass? I guess because we don't have to tear anything down if we
check for errors in advance?

I worry that if we need to amend the logic here that it's error-prone to
update it in two places, so maybe we ought to just have one loop.

> +
> +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
> +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
> +            if (!bdrv_dirty_bitmap_name(bitmap)) {
> +                continue;
> +            }
> +
> +            bdrv_ref(bs);
> +            bdrv_dirty_bitmap_set_frozen(bitmap, true);
> +

We could say that for any bitmap in the list of pending bitmaps to
migrate, we know that we have to un-freeze it, since we never add any
bitmaps that are frozen to our list.

> +            dbms = g_new0(DirtyBitmapMigBitmapState, 1);
> +            dbms->bs = bs;
> +            dbms->node_name = bdrv_get_node_name(bs);
> +            if (!dbms->node_name || dbms->node_name[0] == '\0') {
> +                dbms->node_name = bdrv_get_device_name(bs);
> +            }
> +            dbms->bitmap = bitmap;
> +            dbms->total_sectors = bdrv_nb_sectors(bs);
> +            dbms->sectors_per_chunk = CHUNK_SIZE * 8 *
> +                bdrv_dirty_bitmap_granularity(bitmap) >> BDRV_SECTOR_BITS;

Eric may want to avoid checking in new code that thinks in sectors, but
for the sake of review I don't mind right now.

(Sorry, Eric!)

> +            if (bdrv_dirty_bitmap_enabled(bitmap)) {
> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_ENABLED;
> +            }
> +            if (bdrv_dirty_bitmap_get_persistance(bitmap)) {
> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
> +            }
> +            if (bdrv_dirty_bitmap_get_autoload(bitmap)) {
> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD;
> +            }
> +
> +            bdrv_dirty_bitmap_set_persistance(bitmap, false);

Oh, this might be stranger to undo. Perhaps what we CAN do is limit the
second pass to just this action and allow ourselves to unroll everything
else.

> +
> +            QSIMPLEQ_INSERT_TAIL(&dirty_bitmap_mig_state.dbms_list,
> +                                 dbms, entry);
> +        }
> +    }
> +
> +    return 0;
> +}
> +
> +/* Called with no lock taken.  */
> +static void bulk_phase_send_chunk(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
> +{
> +    uint32_t nr_sectors = MIN(dbms->total_sectors - dbms->cur_sector,
> +                             dbms->sectors_per_chunk);
> +
> +    send_bitmap_bits(f, dbms, dbms->cur_sector, nr_sectors);
> +
> +    dbms->cur_sector += nr_sectors;
> +    if (dbms->cur_sector >= dbms->total_sectors) {
> +        dbms->bulk_completed = true;
> +    }
> +}
> +
> +/* Called with no lock taken.  */
> +static void bulk_phase(QEMUFile *f, bool limit)
> +{
> +    DirtyBitmapMigBitmapState *dbms;
> +
> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> +        while (!dbms->bulk_completed) {
> +            bulk_phase_send_chunk(f, dbms);
> +            if (limit && qemu_file_rate_limit(f)) {
> +                return;
> +            }
> +        }
> +    }
> +
> +    dirty_bitmap_mig_state.bulk_completed = true;
> +}
> +
> +/* Called with iothread lock taken.  */
> +static void dirty_bitmap_mig_cleanup(void)
> +{
> +    DirtyBitmapMigBitmapState *dbms;
> +
> +    while ((dbms = QSIMPLEQ_FIRST(&dirty_bitmap_mig_state.dbms_list)) != NULL) {
> +        QSIMPLEQ_REMOVE_HEAD(&dirty_bitmap_mig_state.dbms_list, entry);
> +        bdrv_dirty_bitmap_set_frozen(dbms->bitmap, false);
> +        bdrv_unref(dbms->bs);
> +        g_free(dbms);
> +    }
> +}
> +

ok

> +/* for SaveVMHandlers */
> +static void dirty_bitmap_save_cleanup(void *opaque)
> +{
> +    dirty_bitmap_mig_cleanup();
> +}
> +

ok

> +static int dirty_bitmap_save_iterate(QEMUFile *f, void *opaque)
> +{
> +    trace_dirty_bitmap_save_iterate(migration_in_postcopy());
> +
> +    if (migration_in_postcopy() && !dirty_bitmap_mig_state.bulk_completed) {
> +        bulk_phase(f, true);
> +    }
> +
> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
> +
> +    return dirty_bitmap_mig_state.bulk_completed;
> +}
> +

What's the purpose behind doing bulk save both here and in
dirty_bitmap_save_complete? Is there a path that isn't guaranteed to
call one of the completion functions?

(The way it's coded seems like it'll work fine, but I'm curious about
what looks like a redundancy at a glance.)

> +/* Called with iothread lock taken.  */
> +
> +static int dirty_bitmap_save_complete(QEMUFile *f, void *opaque)
> +{
> +    DirtyBitmapMigBitmapState *dbms;
> +    trace_dirty_bitmap_save_complete_enter();
> +
> +    if (!dirty_bitmap_mig_state.bulk_completed) {
> +        bulk_phase(f, false);
> +    }
> +

funny now that we don't actually really iterate over the data, and the
bulk phase is now really the _only_ phase :)

> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> +        send_bitmap_complete(f, dbms);
> +    }
> +
> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
> +
> +    trace_dirty_bitmap_save_complete_finish();
> +
> +    dirty_bitmap_mig_cleanup();
> +    return 0;
> +}
> +

ok

> +static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque,
> +                                      uint64_t max_size,
> +                                      uint64_t *res_precopy_only,
> +                                      uint64_t *res_compatible,
> +                                      uint64_t *res_postcopy_only)
> +{
> +    DirtyBitmapMigBitmapState *dbms;
> +    uint64_t pending = 0;
> +
> +    qemu_mutex_lock_iothread();
> +
> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> +        uint64_t gran = bdrv_dirty_bitmap_granularity(dbms->bitmap);
> +        uint64_t sectors = dbms->bulk_completed ? 0 :
> +                           dbms->total_sectors - dbms->cur_sector;
> +
> +        pending += (sectors * BDRV_SECTOR_SIZE + gran - 1) / gran;
> +    }
> +
> +    qemu_mutex_unlock_iothread();
> +
> +    trace_dirty_bitmap_save_pending(pending, max_size);
> +
> +    *res_postcopy_only += pending;
> +}
> +

ok

> +/* First occurrence of this bitmap. It should be created if doesn't exist */
> +static int dirty_bitmap_load_start(QEMUFile *f, DirtyBitmapLoadState *s)
> +{
> +    Error *local_err = NULL;
> +    uint32_t granularity = qemu_get_be32(f);
> +    uint8_t flags = qemu_get_byte(f);
> +
> +    if (!s->bitmap) {
> +        s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
> +                                             s->bitmap_name, &local_err);
> +        if (!s->bitmap) {
> +            error_report_err(local_err);
> +            return -EINVAL;
> +        }
> +    } else {
> +        uint32_t dest_granularity =
> +            bdrv_dirty_bitmap_granularity(s->bitmap);
> +        if (dest_granularity != granularity) {
> +            error_report("Error: "
> +                         "Migrated bitmap granularity (%" PRIu32 ") "
> +                         "doesn't match the destination bitmap '%s' "
> +                         "granularity (%" PRIu32 ")",
> +                         granularity,
> +                         bdrv_dirty_bitmap_name(s->bitmap),
> +                         dest_granularity);
> +            return -EINVAL;
> +        }
> +    }
> +

I'm a fan of auto-creating the bitmaps. Do you have a use-case for why
creating them ahead of time is better, or are you just attempting to be
flexible?

> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK) {
> +        error_report("Unknown flags in migrated dirty bitmap header: %x",
> +                     flags);
> +        return -EINVAL;
> +    }
> +
> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) {
> +        bdrv_dirty_bitmap_set_persistance(s->bitmap, true);
> +    }
> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD) {
> +        bdrv_dirty_bitmap_set_autoload(s->bitmap, true);
> +    }
> +
> +    bdrv_disable_dirty_bitmap(s->bitmap);

OK, so we start them off as disabled, and

> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
> +        DirtyBitmapLoadBitmapState *b;
> +
> +        bdrv_dirty_bitmap_create_successor(s->bs, s->bitmap, &local_err);
> +        if (local_err) {
> +            error_report_err(local_err);
> +            return -EINVAL;
> +        }
> +

If they weren't disabled on the host, we create a successor to record
writes while we wait for the rest of the data to arrive.

> +        b = g_new(DirtyBitmapLoadBitmapState, 1);
> +        b->bs = s->bs;
> +        b->bitmap = s->bitmap;
> +        b->migrated = false;
> +        enabled_bitmaps = g_slist_prepend(enabled_bitmaps, b);

And we make a note of which ones we were supposed to re-enable.

> +    }
> +
> +    return 0;
> +}

OK

> +
> +void dirty_bitmap_mig_before_vm_start(void)

Similarly, I guess I find it weird that this is a callable interface.

David, no nice hook for just-prior-to-vm-start calls? a
.postcopy_pivot() hook or something might be nice..

> +{
> +    GSList *item;
> +
> +    qemu_mutex_lock(&finish_lock);
> +
> +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
> +        DirtyBitmapLoadBitmapState *b = item->data;
> +

Anyway, if I am reading this right; we call this in the postcopy phase
prior to receiving the entirety of the bitmaps (so before receiving
COMPLETE) ... right?

> +        if (b->migrated) {
> +            bdrv_enable_dirty_bitmap(b->bitmap);

...or, am I confused, and we might receive a COMPLETE event prior to the
postcopy pivot?

Anyway, I suppose this code says "If we received the entire bitmap, go
ahead and enable it."

> +        } else {
> +            bdrv_dirty_bitmap_enable_successor(b->bitmap);

And this says "If we haven't received it yet, enable the successor to
record writes until we get the rest of the data."

> +        }
> +
> +        g_free(b);
> +    }
> +
> +    g_slist_free(enabled_bitmaps);
> +    enabled_bitmaps = NULL;
> +
> +    qemu_mutex_unlock(&finish_lock);
> +}
> +
> +static void dirty_bitmap_load_complete(QEMUFile *f, DirtyBitmapLoadState *s)
> +{
> +    GSList *item;
> +    trace_dirty_bitmap_load_complete();
> +    bdrv_dirty_bitmap_deserialize_finish(s->bitmap);
> +
> +    qemu_mutex_lock(&finish_lock);
> +
> +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
> +        DirtyBitmapLoadBitmapState *b = item->data;
> +
> +        if (b->bitmap == s->bitmap) {
> +            b->migrated = true;

we can probably break; here now, right?

(This whole stanza is a little strange, can't we cache the active
DirtyBitmapLoadBitmapState in DirtyBitmapLoadState? I guess not, because
we're looking up the BdrvDirtyBitmap itself and caching that instead, so
either way we have some kind of lookup on every context switch.)

> +        }
> +    }
> +
> +    if (bdrv_dirty_bitmap_frozen(s->bitmap)) {
> +        if (enabled_bitmaps == NULL) {
> +            /* in postcopy */
> +            AioContext *aio_context = bdrv_get_aio_context(s->bs);
> +            aio_context_acquire(aio_context);
> +
> +            bdrv_reclaim_dirty_bitmap(s->bs, s->bitmap, &error_abort);
> +            bdrv_enable_dirty_bitmap(s->bitmap);
> +

OK, so if enabled_bitmaps is gone, that means we already pivoted and
we're live on the receiving end here. We merge the successor into the
fully deserialized bitmap and enable it.

> +            aio_context_release(aio_context);
> +        } else {
> +            /* target not started, successor is empty */
> +            bdrv_dirty_bitmap_release_successor(s->bs, s->bitmap);

Otherwise we just trash the successor. Did we really need a new call for
this? I suppose it's faster than merging a 0-bit bitmap, but the
additional API complexity for the speed win here seems like premature
optimization.

...well, you already wrote it, so I won't argue.

> +        }
> +    }
> +
> +    qemu_mutex_unlock(&finish_lock);
> +}
> +
> +static int dirty_bitmap_load_bits(QEMUFile *f, DirtyBitmapLoadState *s)
> +{
> +    uint64_t first_byte = qemu_get_be64(f) << BDRV_SECTOR_BITS;
> +    uint64_t nr_bytes = (uint64_t)qemu_get_be32(f) << BDRV_SECTOR_BITS;
> +    trace_dirty_bitmap_load_bits_enter(first_byte >> BDRV_SECTOR_BITS,
> +                                       nr_bytes >> BDRV_SECTOR_BITS);
> +
> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
> +        trace_dirty_bitmap_load_bits_zeroes();
> +        bdrv_dirty_bitmap_deserialize_zeroes(s->bitmap, first_byte, nr_bytes,
> +                                             false);
> +    } else {
> +        uint8_t *buf;
> +        uint64_t buf_size = qemu_get_be64(f);
> +        uint64_t needed_size =
> +            bdrv_dirty_bitmap_serialization_size(s->bitmap,
> +                                                 first_byte, nr_bytes);
> +
> +        if (needed_size > buf_size) {
> +            error_report("Error: Migrated bitmap granularity doesn't "
> +                         "match the destination bitmap '%s' granularity",
> +                         bdrv_dirty_bitmap_name(s->bitmap));
> +            return -EINVAL;
> +        }
> +
> +        buf = g_malloc(buf_size);
> +        qemu_get_buffer(f, buf, buf_size);
> +        bdrv_dirty_bitmap_deserialize_part(s->bitmap, buf, first_byte, nr_bytes,
> +                                           false);
> +        g_free(buf);
> +    }
> +
> +    return 0;
> +}
> +

ok

> +static int dirty_bitmap_load_header(QEMUFile *f, DirtyBitmapLoadState *s)
> +{
> +    Error *local_err = NULL;
> +    s->flags = qemu_get_bitmap_flags(f);
> +    trace_dirty_bitmap_load_header(s->flags);
> +
> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
> +        if (!qemu_get_counted_string(f, s->node_name)) {
> +            error_report("Unable to read node name string");
> +            return -EINVAL;
> +        }
> +        s->bs = bdrv_lookup_bs(s->node_name, s->node_name, &local_err);
> +        if (!s->bs) {
> +            error_report_err(local_err);
> +            return -EINVAL;
> +        }
> +    } else if (!s->bs) {
> +        error_report("Error: block device name is not set");
> +        return -EINVAL;
> +    }
> +
> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
> +        if (!qemu_get_counted_string(f, s->bitmap_name)) {
> +            error_report("Unable to read node name string");
> +            return -EINVAL;
> +        }
> +        s->bitmap = bdrv_find_dirty_bitmap(s->bs, s->bitmap_name);
> +
> +        /* bitmap may be NULL here, it wouldn't be an error if it is the
> +         * first occurrence of the bitmap */
> +        if (!s->bitmap && !(s->flags & DIRTY_BITMAP_MIG_FLAG_START)) {
> +            error_report("Error: unknown dirty bitmap "
> +                         "'%s' for block device '%s'",
> +                         s->bitmap_name, s->node_name);
> +            return -EINVAL;
> +        }
> +    } else if (!s->bitmap) {
> +        error_report("Error: block device name is not set");
> +        return -EINVAL;
> +    }
> +
> +    return 0;
> +}
> +

ok

> +static int dirty_bitmap_load(QEMUFile *f, void *opaque, int version_id)
> +{
> +    static DirtyBitmapLoadState s;
> +    int ret = 0;
> +
> +    trace_dirty_bitmap_load_enter();
> +
> +    if (version_id != 1) {
> +        return -EINVAL;
> +    }
> +
> +    do {
> +        dirty_bitmap_load_header(f, &s);
> +
> +        if (s.flags & DIRTY_BITMAP_MIG_FLAG_START) {
> +            ret = dirty_bitmap_load_start(f, &s);
> +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_COMPLETE) {
> +            dirty_bitmap_load_complete(f, &s);
> +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_BITS) {
> +            ret = dirty_bitmap_load_bits(f, &s);
> +        }
> +
> +        if (!ret) {
> +            ret = qemu_file_get_error(f);
> +        }
> +
> +        if (ret) {
> +            return ret;
> +        }
> +    } while (!(s.flags & DIRTY_BITMAP_MIG_FLAG_EOS));
> +
> +    trace_dirty_bitmap_load_success();
> +    return 0;
> +}

OK

> +
> +static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
> +{
> +    DirtyBitmapMigBitmapState *dbms = NULL;
> +    if (init_dirty_bitmap_migration() < 0) {
> +        return -1;
> +    }
> +
> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> +        send_bitmap_start(f, dbms);
> +    }
> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
> +
> +    return 0;
> +}
> +

ok

> +static bool dirty_bitmap_is_active(void *opaque)
> +{
> +    return migrate_dirty_bitmaps();
> +}
> +

ok

> +static bool dirty_bitmap_is_active_iterate(void *opaque)
> +{
> +    return dirty_bitmap_is_active(opaque) && !runstate_is_running();
> +}
> +

On second thought, in patch 9, can you add a little tiny bit of
documentation text explaining the exact nature of this callback?

Is the second portion of the conditional here so that once we reach the
postcopy state that .is_active_iterate starts returning true?

"ok" if I'm reading this right, but it might be helped along by a little
comment.

> +static bool dirty_bitmap_has_postcopy(void *opaque)
> +{
> +    return true;
> +}
> +

ok! :)

> +static SaveVMHandlers savevm_dirty_bitmap_handlers = {
> +    .save_setup = dirty_bitmap_save_setup,
> +    .save_live_complete_postcopy = dirty_bitmap_save_complete,
> +    .save_live_complete_precopy = dirty_bitmap_save_complete,
> +    .has_postcopy = dirty_bitmap_has_postcopy,
> +    .save_live_pending = dirty_bitmap_save_pending,
> +    .save_live_iterate = dirty_bitmap_save_iterate,
> +    .is_active_iterate = dirty_bitmap_is_active_iterate,
> +    .load_state = dirty_bitmap_load,
> +    .save_cleanup = dirty_bitmap_save_cleanup,
> +    .is_active = dirty_bitmap_is_active,
> +};
> +
> +void dirty_bitmap_mig_init(void)
> +{
> +    QSIMPLEQ_INIT(&dirty_bitmap_mig_state.dbms_list);
> +
> +    register_savevm_live(NULL, "dirty-bitmap", 0, 1,
> +                         &savevm_dirty_bitmap_handlers,
> +                         &dirty_bitmap_mig_state);
> +}

ok

dgilbert, would it be worth registering a block-driver-like registration
trick that automatically invokes these functions instead of having to
hook them up in vl.c? the more we add, the more hacky it looks to not
have some subsystem-wide registration hook.

> diff --git a/migration/migration.c b/migration/migration.c
> index e973837bfd..66e9cf03cd 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -150,6 +150,9 @@ MigrationIncomingState *migration_incoming_get_current(void)
>          memset(&mis_current, 0, sizeof(MigrationIncomingState));
>          qemu_mutex_init(&mis_current.rp_mutex);
>          qemu_event_init(&mis_current.main_thread_load_event, false);
> +
> +        init_dirty_bitmap_incoming_migration();
> +
>          once = true;
>      }
>      return &mis_current;
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 9bbfb3fa1b..b0c37ef9f1 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -1673,6 +1673,8 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
>  
>      trace_loadvm_postcopy_handle_run_vmstart();
>  
> +    dirty_bitmap_mig_before_vm_start();
> +
>      if (autostart) {
>          /* Hold onto your hats, starting the CPU */
>          vm_start();
> diff --git a/vl.c b/vl.c
> index ec299099ff..3d393aaf2c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4642,6 +4642,7 @@ int main(int argc, char **argv, char **envp)
>  
>      blk_mig_init();
>      ram_mig_init();
> +    dirty_bitmap_mig_init();
>  
>      /* If the currently selected machine wishes to override the units-per-bus
>       * property of its default HBA interface type, do so now. */
> diff --git a/migration/Makefile.objs b/migration/Makefile.objs
> index 99e038024d..c83ec47ba8 100644
> --- a/migration/Makefile.objs
> +++ b/migration/Makefile.objs
> @@ -6,6 +6,7 @@ common-obj-y += qemu-file.o global_state.o
>  common-obj-y += qemu-file-channel.o
>  common-obj-y += xbzrle.o postcopy-ram.o
>  common-obj-y += qjson.o
> +common-obj-y += block-dirty-bitmap.o
>  
>  common-obj-$(CONFIG_RDMA) += rdma.o
>  
> diff --git a/migration/trace-events b/migration/trace-events
> index a04fffb877..e9eb8078d4 100644
> --- a/migration/trace-events
> +++ b/migration/trace-events
> @@ -227,3 +227,17 @@ colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'"
>  colo_send_message(const char *msg) "Send '%s' message"
>  colo_receive_message(const char *msg) "Receive '%s' message"
>  colo_failover_set_state(const char *new_state) "new state %s"
> +
> +# migration/block-dirty-bitmap.c
> +send_bitmap_header_enter(void) ""
> +send_bitmap_bits(uint32_t flags, uint64_t start_sector, uint32_t nr_sectors, uint64_t data_size) "\n   flags:        0x%x\n   start_sector: %" PRIu64 "\n   nr_sectors:   %" PRIu32 "\n   data_size:    %" PRIu64 "\n"
> +dirty_bitmap_save_iterate(int in_postcopy) "in postcopy: %d"
> +dirty_bitmap_save_complete_enter(void) ""
> +dirty_bitmap_save_complete_finish(void) ""
> +dirty_bitmap_save_pending(uint64_t pending, uint64_t max_size) "pending %" PRIu64 " max: %" PRIu64
> +dirty_bitmap_load_complete(void) ""
> +dirty_bitmap_load_bits_enter(uint64_t first_sector, uint32_t nr_sectors) "chunk: %" PRIu64 " %" PRIu32
> +dirty_bitmap_load_bits_zeroes(void) ""
> +dirty_bitmap_load_header(uint32_t flags) "flags 0x%x"
> +dirty_bitmap_load_enter(void) ""
> +dirty_bitmap_load_success(void) ""
> 

OK, I think everything here is probably in order, and it's only my
understanding that is a barrier at this point. Help me understand the
rest of this patch and I'll re-pester migration to get this staged for
qemu-next.

--js

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
  2017-11-10 22:52   ` John Snow
@ 2017-11-16  8:56     ` Vladimir Sementsov-Ogievskiy
  2017-11-16 18:18       ` John Snow
  2017-11-17  8:07     ` Vladimir Sementsov-Ogievskiy
  1 sibling, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-11-16  8:56 UTC (permalink / raw)
  To: John Snow, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert

11.11.2017 01:52, John Snow wrote:
>
> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>> It is needed to realize bdrv_dirty_bitmap_release_successor in
>> the following patch.
>>
> OK, but...
>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   block/dirty-bitmap.c | 25 ++++++++++++++++++++-----
>>   1 file changed, 20 insertions(+), 5 deletions(-)
>>
>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>> index 81adbeb6d4..981f99d362 100644
>> --- a/block/dirty-bitmap.c
>> +++ b/block/dirty-bitmap.c
>> @@ -326,13 +326,13 @@ static bool bdrv_dirty_bitmap_has_name(BdrvDirtyBitmap *bitmap)
>>       return !!bdrv_dirty_bitmap_name(bitmap);
>>   }
>>   
>> -/* Called with BQL taken.  */
>> -static void bdrv_do_release_matching_dirty_bitmap(
>> +/* Called within bdrv_dirty_bitmap_lock..unlock */
> ...Add this so it will compile:
>
> __attribute__((__unused__))

ok

>> +static void bdrv_do_release_matching_dirty_bitmap_locked(
>>       BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
>>       bool (*cond)(BdrvDirtyBitmap *bitmap))
>>   {
>>       BdrvDirtyBitmap *bm, *next;
>> -    bdrv_dirty_bitmaps_lock(bs);
>> +
>>       QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
>>           if ((!bitmap || bm == bitmap) && (!cond || cond(bm))) {
>>               assert(!bm->active_iterators);
>> @@ -344,18 +344,33 @@ static void bdrv_do_release_matching_dirty_bitmap(
>>               g_free(bm);
>>   
>>               if (bitmap) {
>> -                goto out;
>> +                return;
>>               }
>>           }
>>       }
>> +
>>       if (bitmap) {
>>           abort();
>>       }
> Do we have any style guide rules on using abort() instead of assert()?
> The rest of this function uses assert, and it'd be less lines to simply
> write:
>
> assert(!bitmap);
>
> which I think might also carry better semantic information for coverity
> beyond an actual runtime conditional branch.
>
> (I think. Please correct me if I am wrong, I'm a little hazy on this.)

agree, but it is a preexisting code, so I'll fix it with an additional 
patch.

>
>> +}
>>   
>> -out:
>> +/* Called with BQL taken.  */
>> +static void bdrv_do_release_matching_dirty_bitmap(
>> +    BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
>> +    bool (*cond)(BdrvDirtyBitmap *bitmap))
>> +{
>> +    bdrv_dirty_bitmaps_lock(bs);
>> +    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, cond);
>>       bdrv_dirty_bitmaps_unlock(bs);
>>   }
>>   
>> +/* Called within bdrv_dirty_bitmap_lock..unlock */
>> +static void bdrv_release_dirty_bitmap_locked(BlockDriverState *bs,
>> +                                             BdrvDirtyBitmap *bitmap)
>> +{
>> +    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, NULL);
>> +}
>> +
>>   /* Called with BQL taken.  */
>>   void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
>>   {
>>
> If you agree with those two changes, you may add:

ok

>
> Reviewed-by: John Snow <jsnow@redhat.com>


-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps
  2017-11-15  1:58   ` John Snow
@ 2017-11-16 10:24     ` Vladimir Sementsov-Ogievskiy
  2017-11-17  0:36       ` John Snow
  2017-11-17  0:47       ` John Snow
  2017-11-16 16:50     ` Dr. David Alan Gilbert
  1 sibling, 2 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-11-16 10:24 UTC (permalink / raw)
  To: John Snow, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert

15.11.2017 04:58, John Snow wrote:
>
> On 10/30/2017 12:33 PM, Vladimir Sementsov-Ogievskiy wrote:
>> Postcopy migration of dirty bitmaps. Only named dirty bitmaps,
>> associated with root nodes and non-root named nodes are migrated.
>>
>> If destination qemu is already containing a dirty bitmap with the same name
>> as a migrated bitmap (for the same node), then, if their granularities are
>> the same the migration will be done, otherwise the error will be generated.
>>
>> If destination qemu doesn't contain such bitmap it will be created.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   include/migration/misc.h       |   3 +
>>   migration/migration.h          |   3 +
>>   migration/block-dirty-bitmap.c | 734 +++++++++++++++++++++++++++++++++++++++++
> Ouch :\
>
>>   migration/migration.c          |   3 +
>>   migration/savevm.c             |   2 +
>>   vl.c                           |   1 +
>>   migration/Makefile.objs        |   1 +
>>   migration/trace-events         |  14 +
>>   8 files changed, 761 insertions(+)
>>   create mode 100644 migration/block-dirty-bitmap.c
>>
> Organizationally, you introduce three new 'public' prototypes:
>
> dirty_bitmap_mig_init
> dirty_bitmap_mig_before_vm_start
> init_dirty_bitmap_incoming_migration
>
> mig_init is advertised in migration/misc.h, the other two are in
> migration/migration.h.
> The definitions for all three are in migration/block-dirty-bitmap.c
>
> In pure naivety, I find it weird to have something that you use in
> migration.c and advertised in migration.h actually exist separately in
> block-dirty-bitmap.c; but maybe this is the sanest thing to do.
>
>> diff --git a/include/migration/misc.h b/include/migration/misc.h
>> index c079b7771b..9cc539e232 100644
>> --- a/include/migration/misc.h
>> +++ b/include/migration/misc.h
>> @@ -55,4 +55,7 @@ bool migration_has_failed(MigrationState *);
>>   bool migration_in_postcopy_after_devices(MigrationState *);
>>   void migration_global_dump(Monitor *mon);
>>   
>> +/* migration/block-dirty-bitmap.c */
>> +void dirty_bitmap_mig_init(void);
>> +
>>   #endif
>> diff --git a/migration/migration.h b/migration/migration.h
>> index 50d1f01346..4e3ad04664 100644
>> --- a/migration/migration.h
>> +++ b/migration/migration.h
>> @@ -211,4 +211,7 @@ void migrate_send_rp_pong(MigrationIncomingState *mis,
>>   void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
>>                                 ram_addr_t start, size_t len);
>>   
>> +void dirty_bitmap_mig_before_vm_start(void);
>> +void init_dirty_bitmap_incoming_migration(void);
>> +
>>   #endif
>> diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
>> new file mode 100644
>> index 0000000000..53cb20045d
>> --- /dev/null
>> +++ b/migration/block-dirty-bitmap.c
>> @@ -0,0 +1,734 @@
>> +/*
>> + * Block dirty bitmap postcopy migration
>> + *
>> + * Copyright IBM, Corp. 2009
>> + * Copyright (c) 2016-2017 Parallels International GmbH
>> + *
>> + * Authors:
>> + *  Liran Schour   <lirans@il.ibm.com>
>> + *  Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2.  See
>> + * the COPYING file in the top-level directory.
>> + * This file is derived from migration/block.c, so it's author and IBM copyright
>> + * are here, although content is quite different.
>> + *
>> + * Contributions after 2012-01-13 are licensed under the terms of the
>> + * GNU GPL, version 2 or (at your option) any later version.
>> + *
>> + *                                ***
>> + *
>> + * Here postcopy migration of dirty bitmaps is realized. Only named dirty
>> + * bitmaps, associated with root nodes and non-root named nodes are migrated.
> Put another way, only QMP-addressable bitmaps. Nodes without a name that
> are not the root have no way to be addressed.
>
>> + *
>> + * If destination qemu is already containing a dirty bitmap with the same name
> "If the destination QEMU already contains a dirty bitmap with the same name"
>
>> + * as a migrated bitmap (for the same node), then, if their granularities are
>> + * the same the migration will be done, otherwise the error will be generated.
> "an error"
>
>> + *
>> + * If destination qemu doesn't contain such bitmap it will be created.
> "If the destination QEMU doesn't contain such a bitmap, it will be created."
>
>> + *
>> + * format of migration:
>> + *
>> + * # Header (shared for different chunk types)
>> + * 1, 2 or 4 bytes: flags (see qemu_{put,put}_flags)
>> + * [ 1 byte: node name size ] \  flags & DEVICE_NAME
>> + * [ n bytes: node name     ] /
>> + * [ 1 byte: bitmap name size ] \  flags & BITMAP_NAME
>> + * [ n bytes: bitmap name     ] /
>> + *
>> + * # Start of bitmap migration (flags & START)
>> + * header
>> + * be64: granularity
>> + * 1 byte: bitmap flags (corresponds to BdrvDirtyBitmap)
>> + *   bit 0    -  bitmap is enabled
>> + *   bit 1    -  bitmap is persistent
>> + *   bit 2    -  bitmap is autoloading
>> + *   bits 3-7 - reserved, must be zero
>> + *
>> + * # Complete of bitmap migration (flags & COMPLETE)
>> + * header
>> + *
>> + * # Data chunk of bitmap migration
>> + * header
>> + * be64: start sector
>> + * be32: number of sectors
>> + * [ be64: buffer size  ] \ ! (flags & ZEROES)
>> + * [ n bytes: buffer    ] /
>> + *
>> + * The last chunk in stream should contain flags & EOS. The chunk may skip
>> + * device and/or bitmap names, assuming them to be the same with the previous
>> + * chunk.
>> + */
>> +
> Been a while since I reviewed the format, but it seems sane.
>
>> +#include "qemu/osdep.h"
>> +#include "block/block.h"
>> +#include "block/block_int.h"
>> +#include "sysemu/block-backend.h"
>> +#include "qemu/main-loop.h"
>> +#include "qemu/error-report.h"
>> +#include "migration/misc.h"
>> +#include "migration/migration.h"
>> +#include "migration/qemu-file.h"
>> +#include "migration/vmstate.h"
>> +#include "migration/register.h"
>> +#include "qemu/hbitmap.h"
>> +#include "sysemu/sysemu.h"
>> +#include "qemu/cutils.h"
>> +#include "qapi/error.h"
>> +#include "trace.h"
>> +
>> +#define CHUNK_SIZE     (1 << 10)
>> +
>> +/* Flags occupy one, two or four bytes (Big Endian). The size is determined as
>> + * follows:
>> + * in first (most significant) byte bit 8 is clear  -->  one byte
>> + * in first byte bit 8 is set    -->  two or four bytes, depending on second
>> + *                                    byte:
>> + *    | in second byte bit 8 is clear  -->  two bytes
>> + *    | in second byte bit 8 is set    -->  four bytes
>> + */
>> +#define DIRTY_BITMAP_MIG_FLAG_EOS           0x01
>> +#define DIRTY_BITMAP_MIG_FLAG_ZEROES        0x02
>> +#define DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME   0x04
>> +#define DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME   0x08
>> +#define DIRTY_BITMAP_MIG_FLAG_START         0x10
>> +#define DIRTY_BITMAP_MIG_FLAG_COMPLETE      0x20
>> +#define DIRTY_BITMAP_MIG_FLAG_BITS          0x40
>> +
>> +#define DIRTY_BITMAP_MIG_EXTRA_FLAGS        0x80
>> +
>> +#define DIRTY_BITMAP_MIG_START_FLAG_ENABLED          0x01
>> +#define DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT       0x02
>> +#define DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD         0x04
>> +#define DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK    0xf8
>> +
>> +typedef struct DirtyBitmapMigBitmapState {
>> +    /* Written during setup phase. */
>> +    BlockDriverState *bs;
>> +    const char *node_name;
>> +    BdrvDirtyBitmap *bitmap;
>> +    uint64_t total_sectors;
>> +    uint64_t sectors_per_chunk;
>> +    QSIMPLEQ_ENTRY(DirtyBitmapMigBitmapState) entry;
>> +    uint8_t flags;
>> +
>> +    /* For bulk phase. */
>> +    bool bulk_completed;
>> +    uint64_t cur_sector;
>> +} DirtyBitmapMigBitmapState;
>> +
>> +typedef struct DirtyBitmapMigState {
>> +    QSIMPLEQ_HEAD(dbms_list, DirtyBitmapMigBitmapState) dbms_list;
>> +
>> +    bool bulk_completed;
>> +
>> +    /* for send_bitmap_bits() */
>> +    BlockDriverState *prev_bs;
>> +    BdrvDirtyBitmap *prev_bitmap;
>> +} DirtyBitmapMigState;
>> +
>> +typedef struct DirtyBitmapLoadState {
>> +    uint32_t flags;
>> +    char node_name[256];
>> +    char bitmap_name[256];
>> +    BlockDriverState *bs;
>> +    BdrvDirtyBitmap *bitmap;
>> +} DirtyBitmapLoadState;
>> +
>> +static DirtyBitmapMigState dirty_bitmap_mig_state;
>> +
>> +typedef struct DirtyBitmapLoadBitmapState {
>> +    BlockDriverState *bs;
>> +    BdrvDirtyBitmap *bitmap;
>> +    bool migrated;
>> +} DirtyBitmapLoadBitmapState;
>> +static GSList *enabled_bitmaps;
>> +QemuMutex finish_lock;
>> +
>> +void init_dirty_bitmap_incoming_migration(void)
>> +{
>> +    qemu_mutex_init(&finish_lock);
>> +}
>> +
> This is a little odd as public interface. David, is there a nicer way to
> integrate in-migrate hooks? I guess it hasn't come up yet. Anyway, it
> might be nice to leave a comment here for now that says that the only
> caller is migration.c, and it will only ever call it once.
>
>> +static uint32_t qemu_get_bitmap_flags(QEMUFile *f)
>> +{
>> +    uint8_t flags = qemu_get_byte(f);
>> +    if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
>> +        flags = flags << 8 | qemu_get_byte(f);
>> +        if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
>> +            flags = flags << 16 | qemu_get_be16(f);
>> +        }
>> +    }
>> +
>> +    return flags;
>> +}
>> +
> ok
>
> (Sorry for the per-function ACKs, it's just helpful for me to know which
> functions I followed execution of on paper to make sure I got everything
> in this big patch.)
>
>> +static void qemu_put_bitmap_flags(QEMUFile *f, uint32_t flags)
>> +{
>> +    /* The code currently do not send flags more than one byte */
>> +    assert(!(flags & (0xffffff00 | DIRTY_BITMAP_MIG_EXTRA_FLAGS)));
>> +
>> +    qemu_put_byte(f, flags);
>> +}
>> +
> ok
>
>> +static void send_bitmap_header(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
>> +                               uint32_t additional_flags)
>> +{
>> +    BlockDriverState *bs = dbms->bs;
>> +    BdrvDirtyBitmap *bitmap = dbms->bitmap;
>> +    uint32_t flags = additional_flags;
>> +    trace_send_bitmap_header_enter();
>> +
>> +    if (bs != dirty_bitmap_mig_state.prev_bs) {
>> +        dirty_bitmap_mig_state.prev_bs = bs;
>> +        flags |= DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME;
>> +    }
>> +
>> +    if (bitmap != dirty_bitmap_mig_state.prev_bitmap) {
>> +        dirty_bitmap_mig_state.prev_bitmap = bitmap;
>> +        flags |= DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME;
>> +    }
>> +
> I guess the idea here is that we might be able to skip the node name
> broadcast, leaving the possibilities as:
>
> - new node and bitmap: send both
> - new bitmap, but not node: send bitmap name only
> - same for both: send neither

yes

>
> and that otherwise it's not possible to have a new node but "same
> bitmap" by nature of how the structures are organized.

I hope we don't have bitmaps, shared between nodes)

>
>> +    qemu_put_bitmap_flags(f, flags);
>> +
>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
>> +        qemu_put_counted_string(f, dbms->node_name);
>> +    }
>> +
>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
>> +        qemu_put_counted_string(f, bdrv_dirty_bitmap_name(bitmap));
>> +    }
>> +}
>> +
> ok
>
>> +static void send_bitmap_start(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
>> +{
>> +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_START);
>> +    qemu_put_be32(f, bdrv_dirty_bitmap_granularity(dbms->bitmap));
>> +    qemu_put_byte(f, dbms->flags);
>> +}
>> +
> ok
>
>> +static void send_bitmap_complete(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
>> +{
>> +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_COMPLETE);
>> +}
>> +
> ok
>
>> +static void send_bitmap_bits(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
>> +                             uint64_t start_sector, uint32_t nr_sectors)
>> +{
>> +    /* align for buffer_is_zero() */
>> +    uint64_t align = 4 * sizeof(long);
>> +    uint64_t unaligned_size =
>> +        bdrv_dirty_bitmap_serialization_size(
>> +            dbms->bitmap, start_sector << BDRV_SECTOR_BITS,
>> +            (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
>> +    uint64_t buf_size = (unaligned_size + align - 1) & ~(align - 1);
>> +    uint8_t *buf = g_malloc0(buf_size);
>> +    uint32_t flags = DIRTY_BITMAP_MIG_FLAG_BITS;
>> +
>> +    bdrv_dirty_bitmap_serialize_part(
>> +        dbms->bitmap, buf, start_sector << BDRV_SECTOR_BITS,
>> +        (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
>> +
>> +    if (buffer_is_zero(buf, buf_size)) {
>> +        g_free(buf);
>> +        buf = NULL;
>> +        flags |= DIRTY_BITMAP_MIG_FLAG_ZEROES;
>> +    }
>> +
>> +    trace_send_bitmap_bits(flags, start_sector, nr_sectors, buf_size);
>> +
>> +    send_bitmap_header(f, dbms, flags);
>> +
>> +    qemu_put_be64(f, start_sector);
>> +    qemu_put_be32(f, nr_sectors);
>> +
>> +    /* if a block is zero we need to flush here since the network
>> +     * bandwidth is now a lot higher than the storage device bandwidth.
>> +     * thus if we queue zero blocks we slow down the migration. */
> Can you elaborate on this for me?

it comes from migration/block.c, as it was a prototype for dirty bitmaps 
migration.
May be the original thought was to give destination storage more time to 
handle
write-zeros? It may make sense if it can't do it fast but really writes 
zeros.

>
>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
>> +        qemu_fflush(f);
>> +    } else {
>> +        qemu_put_be64(f, buf_size);
>> +        qemu_put_buffer(f, buf, buf_size);
>> +    }
>> +
>> +    g_free(buf);
>> +}
>> +
>> +
>> +/* Called with iothread lock taken.  */
>> +
>> +static int init_dirty_bitmap_migration(void)
>> +{
>> +    BlockDriverState *bs;
>> +    BdrvDirtyBitmap *bitmap;
>> +    DirtyBitmapMigBitmapState *dbms;
>> +    BdrvNextIterator it;
>> +
>> +    dirty_bitmap_mig_state.bulk_completed = false;
>> +    dirty_bitmap_mig_state.prev_bs = NULL;
>> +    dirty_bitmap_mig_state.prev_bitmap = NULL;
>> +
>> +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
>> +        if (!bdrv_get_device_or_node_name(bs)) {
>> +            /* not named non-root node */
> I can't imagine the situation it would arise in, but is it possible to
> have a named bitmap attached to a now-anonymous node?
>
> Let's say we attach a bitmap to a root node, but then later we insert a
> filter or something above it and it's no longer at the root.
>
> We should probably prohibit such things, or at the very least toss out
> an error here instead of silently continuing.
>
> I think the only things valid to just *skip* are nameless bitmaps.
> Anything named we really ought to either migrate or error out over, I
> think, even if the circumstances leading to such a configuration are
> very unlikely.

agree, will fix.

>
>> +            continue;
>> +        }
>> +
>> +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
>> +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
>> +            if (!bdrv_dirty_bitmap_name(bitmap)) {
>> +                continue;
>> +            }
>> +
>> +            if (bdrv_dirty_bitmap_frozen(bitmap)) {
>> +                error_report("Can't migrate frozen dirty bitmap: '%s",
>> +                             bdrv_dirty_bitmap_name(bitmap));
>> +                return -1;
>> +            }
>> +        }
>> +    }
>> +
>> +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
>> +        if (!bdrv_get_device_or_node_name(bs)) {
>> +            /* not named non-root node */
>> +            continue;
>> +        }
> Why two-pass? I guess because we don't have to tear anything down if we
> check for errors in advance?
>
> I worry that if we need to amend the logic here that it's error-prone to
> update it in two places, so maybe we ought to just have one loop.

why? just check all errors in first loop and then do all preparations in 
the second..

>
>> +
>> +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
>> +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
>> +            if (!bdrv_dirty_bitmap_name(bitmap)) {
>> +                continue;
>> +            }
>> +
>> +            bdrv_ref(bs);
>> +            bdrv_dirty_bitmap_set_frozen(bitmap, true);
>> +
> We could say that for any bitmap in the list of pending bitmaps to
> migrate, we know that we have to un-freeze it, since we never add any
> bitmaps that are frozen to our list.
>
>> +            dbms = g_new0(DirtyBitmapMigBitmapState, 1);
>> +            dbms->bs = bs;
>> +            dbms->node_name = bdrv_get_node_name(bs);
>> +            if (!dbms->node_name || dbms->node_name[0] == '\0') {
>> +                dbms->node_name = bdrv_get_device_name(bs);
>> +            }
>> +            dbms->bitmap = bitmap;
>> +            dbms->total_sectors = bdrv_nb_sectors(bs);
>> +            dbms->sectors_per_chunk = CHUNK_SIZE * 8 *
>> +                bdrv_dirty_bitmap_granularity(bitmap) >> BDRV_SECTOR_BITS;
> Eric may want to avoid checking in new code that thinks in sectors, but
> for the sake of review I don't mind right now.
>
> (Sorry, Eric!)
>
>> +            if (bdrv_dirty_bitmap_enabled(bitmap)) {
>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_ENABLED;
>> +            }
>> +            if (bdrv_dirty_bitmap_get_persistance(bitmap)) {
>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
>> +            }
>> +            if (bdrv_dirty_bitmap_get_autoload(bitmap)) {
>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD;
>> +            }
>> +
>> +            bdrv_dirty_bitmap_set_persistance(bitmap, false);
> Oh, this might be stranger to undo. Perhaps what we CAN do is limit the
> second pass to just this action and allow ourselves to unroll everything
> else.
>
>> +
>> +            QSIMPLEQ_INSERT_TAIL(&dirty_bitmap_mig_state.dbms_list,
>> +                                 dbms, entry);
>> +        }
>> +    }
>> +

hmm, I need to think about correct bitmap locking in the code 
(BdrvDirtyBitmap.lock)

>> +    return 0;
>> +}
>> +
>> +/* Called with no lock taken.  */
>> +static void bulk_phase_send_chunk(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
>> +{
>> +    uint32_t nr_sectors = MIN(dbms->total_sectors - dbms->cur_sector,
>> +                             dbms->sectors_per_chunk);
>> +
>> +    send_bitmap_bits(f, dbms, dbms->cur_sector, nr_sectors);
>> +
>> +    dbms->cur_sector += nr_sectors;
>> +    if (dbms->cur_sector >= dbms->total_sectors) {
>> +        dbms->bulk_completed = true;
>> +    }
>> +}
>> +
>> +/* Called with no lock taken.  */
>> +static void bulk_phase(QEMUFile *f, bool limit)
>> +{
>> +    DirtyBitmapMigBitmapState *dbms;
>> +
>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>> +        while (!dbms->bulk_completed) {
>> +            bulk_phase_send_chunk(f, dbms);
>> +            if (limit && qemu_file_rate_limit(f)) {
>> +                return;
>> +            }
>> +        }
>> +    }
>> +
>> +    dirty_bitmap_mig_state.bulk_completed = true;
>> +}
>> +
>> +/* Called with iothread lock taken.  */
>> +static void dirty_bitmap_mig_cleanup(void)
>> +{
>> +    DirtyBitmapMigBitmapState *dbms;
>> +
>> +    while ((dbms = QSIMPLEQ_FIRST(&dirty_bitmap_mig_state.dbms_list)) != NULL) {
>> +        QSIMPLEQ_REMOVE_HEAD(&dirty_bitmap_mig_state.dbms_list, entry);
>> +        bdrv_dirty_bitmap_set_frozen(dbms->bitmap, false);
>> +        bdrv_unref(dbms->bs);
>> +        g_free(dbms);
>> +    }
>> +}
>> +
> ok
>
>> +/* for SaveVMHandlers */
>> +static void dirty_bitmap_save_cleanup(void *opaque)
>> +{
>> +    dirty_bitmap_mig_cleanup();
>> +}
>> +
> ok
>
>> +static int dirty_bitmap_save_iterate(QEMUFile *f, void *opaque)
>> +{
>> +    trace_dirty_bitmap_save_iterate(migration_in_postcopy());
>> +
>> +    if (migration_in_postcopy() && !dirty_bitmap_mig_state.bulk_completed) {
>> +        bulk_phase(f, true);
>> +    }
>> +
>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>> +
>> +    return dirty_bitmap_mig_state.bulk_completed;
>> +}
>> +
> What's the purpose behind doing bulk save both here and in
> dirty_bitmap_save_complete? Is there a path that isn't guaranteed to
> call one of the completion functions?
>
> (The way it's coded seems like it'll work fine, but I'm curious about
> what looks like a redundancy at a glance.)

bulk_phase(f, true) is not guaranteed to do all the work. so in complete()
we call it with false, to complete.

hmm, it is saved from precopy migration approach. And looks like really, 
in case of postcopy
we need only blulk_phase(f, false) in _complete and nothing else. I'll 
check.

>
>> +/* Called with iothread lock taken.  */
>> +
>> +static int dirty_bitmap_save_complete(QEMUFile *f, void *opaque)
>> +{
>> +    DirtyBitmapMigBitmapState *dbms;
>> +    trace_dirty_bitmap_save_complete_enter();
>> +
>> +    if (!dirty_bitmap_mig_state.bulk_completed) {
>> +        bulk_phase(f, false);
>> +    }
>> +
> funny now that we don't actually really iterate over the data, and the
> bulk phase is now really the _only_ phase :)
>
>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>> +        send_bitmap_complete(f, dbms);
>> +    }
>> +
>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>> +
>> +    trace_dirty_bitmap_save_complete_finish();
>> +
>> +    dirty_bitmap_mig_cleanup();
>> +    return 0;
>> +}
>> +
> ok
>
>> +static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque,
>> +                                      uint64_t max_size,
>> +                                      uint64_t *res_precopy_only,
>> +                                      uint64_t *res_compatible,
>> +                                      uint64_t *res_postcopy_only)
>> +{
>> +    DirtyBitmapMigBitmapState *dbms;
>> +    uint64_t pending = 0;
>> +
>> +    qemu_mutex_lock_iothread();
>> +
>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>> +        uint64_t gran = bdrv_dirty_bitmap_granularity(dbms->bitmap);
>> +        uint64_t sectors = dbms->bulk_completed ? 0 :
>> +                           dbms->total_sectors - dbms->cur_sector;
>> +
>> +        pending += (sectors * BDRV_SECTOR_SIZE + gran - 1) / gran;
>> +    }
>> +
>> +    qemu_mutex_unlock_iothread();
>> +
>> +    trace_dirty_bitmap_save_pending(pending, max_size);
>> +
>> +    *res_postcopy_only += pending;
>> +}
>> +
> ok
>
>> +/* First occurrence of this bitmap. It should be created if doesn't exist */
>> +static int dirty_bitmap_load_start(QEMUFile *f, DirtyBitmapLoadState *s)
>> +{
>> +    Error *local_err = NULL;
>> +    uint32_t granularity = qemu_get_be32(f);
>> +    uint8_t flags = qemu_get_byte(f);
>> +
>> +    if (!s->bitmap) {
>> +        s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
>> +                                             s->bitmap_name, &local_err);
>> +        if (!s->bitmap) {
>> +            error_report_err(local_err);
>> +            return -EINVAL;
>> +        }
>> +    } else {
>> +        uint32_t dest_granularity =
>> +            bdrv_dirty_bitmap_granularity(s->bitmap);
>> +        if (dest_granularity != granularity) {
>> +            error_report("Error: "
>> +                         "Migrated bitmap granularity (%" PRIu32 ") "
>> +                         "doesn't match the destination bitmap '%s' "
>> +                         "granularity (%" PRIu32 ")",
>> +                         granularity,
>> +                         bdrv_dirty_bitmap_name(s->bitmap),
>> +                         dest_granularity);
>> +            return -EINVAL;
>> +        }
>> +    }
>> +
> I'm a fan of auto-creating the bitmaps. Do you have a use-case for why
> creating them ahead of time is better, or are you just attempting to be
> flexible?

the second. I just was my first approach about two years ago and it was not
discussed until now). In our scenarios we use auto-creating way. So, it may
be better to just fail if corresponding bitmap exists on destination without
any granularity checks.

>
>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK) {
>> +        error_report("Unknown flags in migrated dirty bitmap header: %x",
>> +                     flags);
>> +        return -EINVAL;
>> +    }
>> +
>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) {
>> +        bdrv_dirty_bitmap_set_persistance(s->bitmap, true);
>> +    }
>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD) {
>> +        bdrv_dirty_bitmap_set_autoload(s->bitmap, true);
>> +    }
>> +
>> +    bdrv_disable_dirty_bitmap(s->bitmap);
> OK, so we start them off as disabled, and
>
>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
>> +        DirtyBitmapLoadBitmapState *b;
>> +
>> +        bdrv_dirty_bitmap_create_successor(s->bs, s->bitmap, &local_err);
>> +        if (local_err) {
>> +            error_report_err(local_err);
>> +            return -EINVAL;
>> +        }
>> +
> If they weren't disabled on the host, we create a successor to record
> writes while we wait for the rest of the data to arrive.
>
>> +        b = g_new(DirtyBitmapLoadBitmapState, 1);
>> +        b->bs = s->bs;
>> +        b->bitmap = s->bitmap;
>> +        b->migrated = false;
>> +        enabled_bitmaps = g_slist_prepend(enabled_bitmaps, b);
> And we make a note of which ones we were supposed to re-enable.
>
>> +    }
>> +
>> +    return 0;
>> +}
> OK
>
>> +
>> +void dirty_bitmap_mig_before_vm_start(void)
> Similarly, I guess I find it weird that this is a callable interface.
>
> David, no nice hook for just-prior-to-vm-start calls? a
> .postcopy_pivot() hook or something might be nice..
>
>> +{
>> +    GSList *item;
>> +
>> +    qemu_mutex_lock(&finish_lock);
>> +
>> +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
>> +        DirtyBitmapLoadBitmapState *b = item->data;
>> +
> Anyway, if I am reading this right; we call this in the postcopy phase
> prior to receiving the entirety of the bitmaps (so before receiving
> COMPLETE) ... right?
>
>> +        if (b->migrated) {
>> +            bdrv_enable_dirty_bitmap(b->bitmap);

This is the most difficult thing here. Race is possible between postcopy 
complete
and vm start. So, here is a finish_lock. And bitmap may be already 
migrated or not.

> ...or, am I confused, and we might receive a COMPLETE event prior to the
> postcopy pivot?
>
> Anyway, I suppose this code says "If we received the entire bitmap, go
> ahead and enable it."
>
>> +        } else {
>> +            bdrv_dirty_bitmap_enable_successor(b->bitmap);
> And this says "If we haven't received it yet, enable the successor to
> record writes until we get the rest of the data."

yes

>
>> +        }
>> +
>> +        g_free(b);
>> +    }
>> +
>> +    g_slist_free(enabled_bitmaps);
>> +    enabled_bitmaps = NULL;
>> +
>> +    qemu_mutex_unlock(&finish_lock);
>> +}
>> +
>> +static void dirty_bitmap_load_complete(QEMUFile *f, DirtyBitmapLoadState *s)
>> +{
>> +    GSList *item;
>> +    trace_dirty_bitmap_load_complete();
>> +    bdrv_dirty_bitmap_deserialize_finish(s->bitmap);
>> +
>> +    qemu_mutex_lock(&finish_lock);
>> +
>> +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
>> +        DirtyBitmapLoadBitmapState *b = item->data;
>> +
>> +        if (b->bitmap == s->bitmap) {
>> +            b->migrated = true;
> we can probably break; here now, right?

agree.

>
> (This whole stanza is a little strange, can't we cache the active
> DirtyBitmapLoadBitmapState in DirtyBitmapLoadState? I guess not, because
> we're looking up the BdrvDirtyBitmap itself and caching that instead, so
> either way we have some kind of lookup on every context switch.)

this search is needed only once, so caching will not help.

>
>> +        }
>> +    }
>> +
>> +    if (bdrv_dirty_bitmap_frozen(s->bitmap)) {
>> +        if (enabled_bitmaps == NULL) {
>> +            /* in postcopy */
>> +            AioContext *aio_context = bdrv_get_aio_context(s->bs);
>> +            aio_context_acquire(aio_context);

looks like it should be moved to use new BdrvDirtyBitmap locks.

>> +
>> +            bdrv_reclaim_dirty_bitmap(s->bs, s->bitmap, &error_abort);
>> +            bdrv_enable_dirty_bitmap(s->bitmap);
>> +
> OK, so if enabled_bitmaps is gone, that means we already pivoted and
> we're live on the receiving end here. We merge the successor into the
> fully deserialized bitmap and enable it.
>
>> +            aio_context_release(aio_context);
>> +        } else {
>> +            /* target not started, successor is empty */
>> +            bdrv_dirty_bitmap_release_successor(s->bs, s->bitmap);
> Otherwise we just trash the successor. Did we really need a new call for
> this? I suppose it's faster than merging a 0-bit bitmap, but the
> additional API complexity for the speed win here seems like premature
> optimization.
>
> ...well, you already wrote it, so I won't argue.

right idea. However in this case (and even with my approach) it is good 
to assert here
that successor is empty. and additional api is needed for it.

>
>> +        }
>> +    }
>> +
>> +    qemu_mutex_unlock(&finish_lock);
>> +}
>> +
>> +static int dirty_bitmap_load_bits(QEMUFile *f, DirtyBitmapLoadState *s)
>> +{
>> +    uint64_t first_byte = qemu_get_be64(f) << BDRV_SECTOR_BITS;
>> +    uint64_t nr_bytes = (uint64_t)qemu_get_be32(f) << BDRV_SECTOR_BITS;
>> +    trace_dirty_bitmap_load_bits_enter(first_byte >> BDRV_SECTOR_BITS,
>> +                                       nr_bytes >> BDRV_SECTOR_BITS);
>> +
>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
>> +        trace_dirty_bitmap_load_bits_zeroes();
>> +        bdrv_dirty_bitmap_deserialize_zeroes(s->bitmap, first_byte, nr_bytes,
>> +                                             false);
>> +    } else {
>> +        uint8_t *buf;
>> +        uint64_t buf_size = qemu_get_be64(f);
>> +        uint64_t needed_size =
>> +            bdrv_dirty_bitmap_serialization_size(s->bitmap,
>> +                                                 first_byte, nr_bytes);
>> +
>> +        if (needed_size > buf_size) {
>> +            error_report("Error: Migrated bitmap granularity doesn't "
>> +                         "match the destination bitmap '%s' granularity",
>> +                         bdrv_dirty_bitmap_name(s->bitmap));
>> +            return -EINVAL;
>> +        }
>> +
>> +        buf = g_malloc(buf_size);
>> +        qemu_get_buffer(f, buf, buf_size);
>> +        bdrv_dirty_bitmap_deserialize_part(s->bitmap, buf, first_byte, nr_bytes,
>> +                                           false);
>> +        g_free(buf);
>> +    }
>> +
>> +    return 0;
>> +}
>> +
> ok
>
>> +static int dirty_bitmap_load_header(QEMUFile *f, DirtyBitmapLoadState *s)
>> +{
>> +    Error *local_err = NULL;
>> +    s->flags = qemu_get_bitmap_flags(f);
>> +    trace_dirty_bitmap_load_header(s->flags);
>> +
>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
>> +        if (!qemu_get_counted_string(f, s->node_name)) {
>> +            error_report("Unable to read node name string");
>> +            return -EINVAL;
>> +        }
>> +        s->bs = bdrv_lookup_bs(s->node_name, s->node_name, &local_err);
>> +        if (!s->bs) {
>> +            error_report_err(local_err);
>> +            return -EINVAL;
>> +        }
>> +    } else if (!s->bs) {
>> +        error_report("Error: block device name is not set");
>> +        return -EINVAL;
>> +    }
>> +
>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
>> +        if (!qemu_get_counted_string(f, s->bitmap_name)) {
>> +            error_report("Unable to read node name string");
>> +            return -EINVAL;
>> +        }
>> +        s->bitmap = bdrv_find_dirty_bitmap(s->bs, s->bitmap_name);
>> +
>> +        /* bitmap may be NULL here, it wouldn't be an error if it is the
>> +         * first occurrence of the bitmap */
>> +        if (!s->bitmap && !(s->flags & DIRTY_BITMAP_MIG_FLAG_START)) {
>> +            error_report("Error: unknown dirty bitmap "
>> +                         "'%s' for block device '%s'",
>> +                         s->bitmap_name, s->node_name);
>> +            return -EINVAL;
>> +        }
>> +    } else if (!s->bitmap) {
>> +        error_report("Error: block device name is not set");
>> +        return -EINVAL;
>> +    }
>> +
>> +    return 0;
>> +}
>> +
> ok
>
>> +static int dirty_bitmap_load(QEMUFile *f, void *opaque, int version_id)
>> +{
>> +    static DirtyBitmapLoadState s;
>> +    int ret = 0;
>> +
>> +    trace_dirty_bitmap_load_enter();
>> +
>> +    if (version_id != 1) {
>> +        return -EINVAL;
>> +    }
>> +
>> +    do {
>> +        dirty_bitmap_load_header(f, &s);
>> +
>> +        if (s.flags & DIRTY_BITMAP_MIG_FLAG_START) {
>> +            ret = dirty_bitmap_load_start(f, &s);
>> +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_COMPLETE) {
>> +            dirty_bitmap_load_complete(f, &s);
>> +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_BITS) {
>> +            ret = dirty_bitmap_load_bits(f, &s);
>> +        }
>> +
>> +        if (!ret) {
>> +            ret = qemu_file_get_error(f);
>> +        }
>> +
>> +        if (ret) {
>> +            return ret;
>> +        }
>> +    } while (!(s.flags & DIRTY_BITMAP_MIG_FLAG_EOS));
>> +
>> +    trace_dirty_bitmap_load_success();
>> +    return 0;
>> +}
> OK
>
>> +
>> +static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
>> +{
>> +    DirtyBitmapMigBitmapState *dbms = NULL;
>> +    if (init_dirty_bitmap_migration() < 0) {
>> +        return -1;
>> +    }
>> +
>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>> +        send_bitmap_start(f, dbms);
>> +    }
>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>> +
>> +    return 0;
>> +}
>> +
> ok
>
>> +static bool dirty_bitmap_is_active(void *opaque)
>> +{
>> +    return migrate_dirty_bitmaps();
>> +}
>> +
> ok
>
>> +static bool dirty_bitmap_is_active_iterate(void *opaque)
>> +{
>> +    return dirty_bitmap_is_active(opaque) && !runstate_is_running();
>> +}
>> +
> On second thought, in patch 9, can you add a little tiny bit of
> documentation text explaining the exact nature of this callback?
>
> Is the second portion of the conditional here so that once we reach the
> postcopy state that .is_active_iterate starts returning true?
>
> "ok" if I'm reading this right, but it might be helped along by a little
> comment.

yes. ok, I'll add a comment.

>
>> +static bool dirty_bitmap_has_postcopy(void *opaque)
>> +{
>> +    return true;
>> +}
>> +
> ok! :)
>
>> +static SaveVMHandlers savevm_dirty_bitmap_handlers = {
>> +    .save_setup = dirty_bitmap_save_setup,
>> +    .save_live_complete_postcopy = dirty_bitmap_save_complete,
>> +    .save_live_complete_precopy = dirty_bitmap_save_complete,
>> +    .has_postcopy = dirty_bitmap_has_postcopy,
>> +    .save_live_pending = dirty_bitmap_save_pending,
>> +    .save_live_iterate = dirty_bitmap_save_iterate,
>> +    .is_active_iterate = dirty_bitmap_is_active_iterate,
>> +    .load_state = dirty_bitmap_load,
>> +    .save_cleanup = dirty_bitmap_save_cleanup,
>> +    .is_active = dirty_bitmap_is_active,
>> +};
>> +
>> +void dirty_bitmap_mig_init(void)
>> +{
>> +    QSIMPLEQ_INIT(&dirty_bitmap_mig_state.dbms_list);
>> +
>> +    register_savevm_live(NULL, "dirty-bitmap", 0, 1,
>> +                         &savevm_dirty_bitmap_handlers,
>> +                         &dirty_bitmap_mig_state);
>> +}
> ok
>
> dgilbert, would it be worth registering a block-driver-like registration
> trick that automatically invokes these functions instead of having to
> hook them up in vl.c? the more we add, the more hacky it looks to not
> have some subsystem-wide registration hook.
>
>> diff --git a/migration/migration.c b/migration/migration.c
>> index e973837bfd..66e9cf03cd 100644
>> --- a/migration/migration.c
>> +++ b/migration/migration.c
>> @@ -150,6 +150,9 @@ MigrationIncomingState *migration_incoming_get_current(void)
>>           memset(&mis_current, 0, sizeof(MigrationIncomingState));
>>           qemu_mutex_init(&mis_current.rp_mutex);
>>           qemu_event_init(&mis_current.main_thread_load_event, false);
>> +
>> +        init_dirty_bitmap_incoming_migration();
>> +
>>           once = true;
>>       }
>>       return &mis_current;
>> diff --git a/migration/savevm.c b/migration/savevm.c
>> index 9bbfb3fa1b..b0c37ef9f1 100644
>> --- a/migration/savevm.c
>> +++ b/migration/savevm.c
>> @@ -1673,6 +1673,8 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
>>   
>>       trace_loadvm_postcopy_handle_run_vmstart();
>>   
>> +    dirty_bitmap_mig_before_vm_start();
>> +
>>       if (autostart) {
>>           /* Hold onto your hats, starting the CPU */
>>           vm_start();
>> diff --git a/vl.c b/vl.c
>> index ec299099ff..3d393aaf2c 100644
>> --- a/vl.c
>> +++ b/vl.c
>> @@ -4642,6 +4642,7 @@ int main(int argc, char **argv, char **envp)
>>   
>>       blk_mig_init();
>>       ram_mig_init();
>> +    dirty_bitmap_mig_init();
>>   
>>       /* If the currently selected machine wishes to override the units-per-bus
>>        * property of its default HBA interface type, do so now. */
>> diff --git a/migration/Makefile.objs b/migration/Makefile.objs
>> index 99e038024d..c83ec47ba8 100644
>> --- a/migration/Makefile.objs
>> +++ b/migration/Makefile.objs
>> @@ -6,6 +6,7 @@ common-obj-y += qemu-file.o global_state.o
>>   common-obj-y += qemu-file-channel.o
>>   common-obj-y += xbzrle.o postcopy-ram.o
>>   common-obj-y += qjson.o
>> +common-obj-y += block-dirty-bitmap.o
>>   
>>   common-obj-$(CONFIG_RDMA) += rdma.o
>>   
>> diff --git a/migration/trace-events b/migration/trace-events
>> index a04fffb877..e9eb8078d4 100644
>> --- a/migration/trace-events
>> +++ b/migration/trace-events
>> @@ -227,3 +227,17 @@ colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'"
>>   colo_send_message(const char *msg) "Send '%s' message"
>>   colo_receive_message(const char *msg) "Receive '%s' message"
>>   colo_failover_set_state(const char *new_state) "new state %s"
>> +
>> +# migration/block-dirty-bitmap.c
>> +send_bitmap_header_enter(void) ""
>> +send_bitmap_bits(uint32_t flags, uint64_t start_sector, uint32_t nr_sectors, uint64_t data_size) "\n   flags:        0x%x\n   start_sector: %" PRIu64 "\n   nr_sectors:   %" PRIu32 "\n   data_size:    %" PRIu64 "\n"
>> +dirty_bitmap_save_iterate(int in_postcopy) "in postcopy: %d"
>> +dirty_bitmap_save_complete_enter(void) ""
>> +dirty_bitmap_save_complete_finish(void) ""
>> +dirty_bitmap_save_pending(uint64_t pending, uint64_t max_size) "pending %" PRIu64 " max: %" PRIu64
>> +dirty_bitmap_load_complete(void) ""
>> +dirty_bitmap_load_bits_enter(uint64_t first_sector, uint32_t nr_sectors) "chunk: %" PRIu64 " %" PRIu32
>> +dirty_bitmap_load_bits_zeroes(void) ""
>> +dirty_bitmap_load_header(uint32_t flags) "flags 0x%x"
>> +dirty_bitmap_load_enter(void) ""
>> +dirty_bitmap_load_success(void) ""
>>
> OK, I think everything here is probably in order, and it's only my
> understanding that is a barrier at this point. Help me understand the
> rest of this patch and I'll re-pester migration to get this staged for
> qemu-next.
>
> --js

Thank you for reviewing! I hope, I'll post new version next week.

-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps
  2017-11-15  1:58   ` John Snow
  2017-11-16 10:24     ` Vladimir Sementsov-Ogievskiy
@ 2017-11-16 16:50     ` Dr. David Alan Gilbert
  2017-11-17  1:27       ` John Snow
  1 sibling, 1 reply; 44+ messages in thread
From: Dr. David Alan Gilbert @ 2017-11-16 16:50 UTC (permalink / raw)
  To: John Snow
  Cc: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel, kwolf,
	peter.maydell, famz, lirans, quintela, armbru, mreitz, stefanha,
	den, amit.shah, pbonzini

* John Snow (jsnow@redhat.com) wrote:
> 
> 
> On 10/30/2017 12:33 PM, Vladimir Sementsov-Ogievskiy wrote:
> > Postcopy migration of dirty bitmaps. Only named dirty bitmaps,
> > associated with root nodes and non-root named nodes are migrated.
> > 
> > If destination qemu is already containing a dirty bitmap with the same name
> > as a migrated bitmap (for the same node), then, if their granularities are
> > the same the migration will be done, otherwise the error will be generated.
> > 
> > If destination qemu doesn't contain such bitmap it will be created.
> > 
> > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> > ---
> >  include/migration/misc.h       |   3 +
> >  migration/migration.h          |   3 +
> >  migration/block-dirty-bitmap.c | 734 +++++++++++++++++++++++++++++++++++++++++
> 
> Ouch :\
> 
> >  migration/migration.c          |   3 +
> >  migration/savevm.c             |   2 +
> >  vl.c                           |   1 +
> >  migration/Makefile.objs        |   1 +
> >  migration/trace-events         |  14 +
> >  8 files changed, 761 insertions(+)
> >  create mode 100644 migration/block-dirty-bitmap.c
> > 
> 
> Organizationally, you introduce three new 'public' prototypes:
> 
> dirty_bitmap_mig_init
> dirty_bitmap_mig_before_vm_start
> init_dirty_bitmap_incoming_migration
> 
> mig_init is advertised in migration/misc.h, the other two are in
> migration/migration.h.
> The definitions for all three are in migration/block-dirty-bitmap.c
> 
> In pure naivety, I find it weird to have something that you use in
> migration.c and advertised in migration.h actually exist separately in
> block-dirty-bitmap.c; but maybe this is the sanest thing to do.

Actually I think that's OK; it makes sense for all of the code for this
feature to sit in one place,   and there doesn't seem any point creating
a header just for this one function.

> > diff --git a/include/migration/misc.h b/include/migration/misc.h
> > index c079b7771b..9cc539e232 100644
> > --- a/include/migration/misc.h
> > +++ b/include/migration/misc.h
> > @@ -55,4 +55,7 @@ bool migration_has_failed(MigrationState *);
> >  bool migration_in_postcopy_after_devices(MigrationState *);
> >  void migration_global_dump(Monitor *mon);
> >  
> > +/* migration/block-dirty-bitmap.c */
> > +void dirty_bitmap_mig_init(void);
> > +
> >  #endif
> > diff --git a/migration/migration.h b/migration/migration.h
> > index 50d1f01346..4e3ad04664 100644
> > --- a/migration/migration.h
> > +++ b/migration/migration.h
> > @@ -211,4 +211,7 @@ void migrate_send_rp_pong(MigrationIncomingState *mis,
> >  void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
> >                                ram_addr_t start, size_t len);
> >  
> > +void dirty_bitmap_mig_before_vm_start(void);
> > +void init_dirty_bitmap_incoming_migration(void);
> > +
> >  #endif
> > diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
> > new file mode 100644
> > index 0000000000..53cb20045d
> > --- /dev/null
> > +++ b/migration/block-dirty-bitmap.c
> > @@ -0,0 +1,734 @@
> > +/*
> > + * Block dirty bitmap postcopy migration
> > + *
> > + * Copyright IBM, Corp. 2009
> > + * Copyright (c) 2016-2017 Parallels International GmbH
> > + *
> > + * Authors:
> > + *  Liran Schour   <lirans@il.ibm.com>
> > + *  Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> > + *
> > + * This work is licensed under the terms of the GNU GPL, version 2.  See
> > + * the COPYING file in the top-level directory.
> > + * This file is derived from migration/block.c, so it's author and IBM copyright
> > + * are here, although content is quite different.
> > + *
> > + * Contributions after 2012-01-13 are licensed under the terms of the
> > + * GNU GPL, version 2 or (at your option) any later version.
> > + *
> > + *                                ***
> > + *
> > + * Here postcopy migration of dirty bitmaps is realized. Only named dirty
> > + * bitmaps, associated with root nodes and non-root named nodes are migrated.
> 
> Put another way, only QMP-addressable bitmaps. Nodes without a name that
> are not the root have no way to be addressed.
> 
> > + *
> > + * If destination qemu is already containing a dirty bitmap with the same name
> 
> "If the destination QEMU already contains a dirty bitmap with the same name"
> 
> > + * as a migrated bitmap (for the same node), then, if their granularities are
> > + * the same the migration will be done, otherwise the error will be generated.
> 
> "an error"
> 
> > + *
> > + * If destination qemu doesn't contain such bitmap it will be created.
> 
> "If the destination QEMU doesn't contain such a bitmap, it will be created."
> 
> > + *
> > + * format of migration:
> > + *
> > + * # Header (shared for different chunk types)
> > + * 1, 2 or 4 bytes: flags (see qemu_{put,put}_flags)
> > + * [ 1 byte: node name size ] \  flags & DEVICE_NAME
> > + * [ n bytes: node name     ] /
> > + * [ 1 byte: bitmap name size ] \  flags & BITMAP_NAME
> > + * [ n bytes: bitmap name     ] /
> > + *
> > + * # Start of bitmap migration (flags & START)
> > + * header
> > + * be64: granularity
> > + * 1 byte: bitmap flags (corresponds to BdrvDirtyBitmap)
> > + *   bit 0    -  bitmap is enabled
> > + *   bit 1    -  bitmap is persistent
> > + *   bit 2    -  bitmap is autoloading
> > + *   bits 3-7 - reserved, must be zero
> > + *
> > + * # Complete of bitmap migration (flags & COMPLETE)
> > + * header
> > + *
> > + * # Data chunk of bitmap migration
> > + * header
> > + * be64: start sector
> > + * be32: number of sectors
> > + * [ be64: buffer size  ] \ ! (flags & ZEROES)
> > + * [ n bytes: buffer    ] /
> > + *
> > + * The last chunk in stream should contain flags & EOS. The chunk may skip
> > + * device and/or bitmap names, assuming them to be the same with the previous
> > + * chunk.
> > + */
> > +
> 
> Been a while since I reviewed the format, but it seems sane.
> 
> > +#include "qemu/osdep.h"
> > +#include "block/block.h"
> > +#include "block/block_int.h"
> > +#include "sysemu/block-backend.h"
> > +#include "qemu/main-loop.h"
> > +#include "qemu/error-report.h"
> > +#include "migration/misc.h"
> > +#include "migration/migration.h"
> > +#include "migration/qemu-file.h"
> > +#include "migration/vmstate.h"
> > +#include "migration/register.h"
> > +#include "qemu/hbitmap.h"
> > +#include "sysemu/sysemu.h"
> > +#include "qemu/cutils.h"
> > +#include "qapi/error.h"
> > +#include "trace.h"
> > +
> > +#define CHUNK_SIZE     (1 << 10)
> > +
> > +/* Flags occupy one, two or four bytes (Big Endian). The size is determined as
> > + * follows:
> > + * in first (most significant) byte bit 8 is clear  -->  one byte
> > + * in first byte bit 8 is set    -->  two or four bytes, depending on second
> > + *                                    byte:
> > + *    | in second byte bit 8 is clear  -->  two bytes
> > + *    | in second byte bit 8 is set    -->  four bytes
> > + */
> > +#define DIRTY_BITMAP_MIG_FLAG_EOS           0x01
> > +#define DIRTY_BITMAP_MIG_FLAG_ZEROES        0x02
> > +#define DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME   0x04
> > +#define DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME   0x08
> > +#define DIRTY_BITMAP_MIG_FLAG_START         0x10
> > +#define DIRTY_BITMAP_MIG_FLAG_COMPLETE      0x20
> > +#define DIRTY_BITMAP_MIG_FLAG_BITS          0x40
> > +
> > +#define DIRTY_BITMAP_MIG_EXTRA_FLAGS        0x80
> > +
> > +#define DIRTY_BITMAP_MIG_START_FLAG_ENABLED          0x01
> > +#define DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT       0x02
> > +#define DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD         0x04
> > +#define DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK    0xf8
> > +
> > +typedef struct DirtyBitmapMigBitmapState {
> > +    /* Written during setup phase. */
> > +    BlockDriverState *bs;
> > +    const char *node_name;
> > +    BdrvDirtyBitmap *bitmap;
> > +    uint64_t total_sectors;
> > +    uint64_t sectors_per_chunk;
> > +    QSIMPLEQ_ENTRY(DirtyBitmapMigBitmapState) entry;
> > +    uint8_t flags;
> > +
> > +    /* For bulk phase. */
> > +    bool bulk_completed;
> > +    uint64_t cur_sector;
> > +} DirtyBitmapMigBitmapState;
> > +
> > +typedef struct DirtyBitmapMigState {
> > +    QSIMPLEQ_HEAD(dbms_list, DirtyBitmapMigBitmapState) dbms_list;
> > +
> > +    bool bulk_completed;
> > +
> > +    /* for send_bitmap_bits() */
> > +    BlockDriverState *prev_bs;
> > +    BdrvDirtyBitmap *prev_bitmap;
> > +} DirtyBitmapMigState;
> > +
> > +typedef struct DirtyBitmapLoadState {
> > +    uint32_t flags;
> > +    char node_name[256];
> > +    char bitmap_name[256];
> > +    BlockDriverState *bs;
> > +    BdrvDirtyBitmap *bitmap;
> > +} DirtyBitmapLoadState;
> > +
> > +static DirtyBitmapMigState dirty_bitmap_mig_state;
> > +
> > +typedef struct DirtyBitmapLoadBitmapState {
> > +    BlockDriverState *bs;
> > +    BdrvDirtyBitmap *bitmap;
> > +    bool migrated;
> > +} DirtyBitmapLoadBitmapState;
> > +static GSList *enabled_bitmaps;
> > +QemuMutex finish_lock;
> > +
> > +void init_dirty_bitmap_incoming_migration(void)
> > +{
> > +    qemu_mutex_init(&finish_lock);
> > +}
> > +
> 
> This is a little odd as public interface. David, is there a nicer way to
> integrate in-migrate hooks? I guess it hasn't come up yet. Anyway, it
> might be nice to leave a comment here for now that says that the only
> caller is migration.c, and it will only ever call it once.

I don't think having an init_ function like that is a problem;
we've got an init_blk_migration, so I guess it's similar.
I generally prefer things to be part of the incoming state structure
rather than a file global; but that's not a huge one.

> > +static uint32_t qemu_get_bitmap_flags(QEMUFile *f)
> > +{
> > +    uint8_t flags = qemu_get_byte(f);
> > +    if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
> > +        flags = flags << 8 | qemu_get_byte(f);
> > +        if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
> > +            flags = flags << 16 | qemu_get_be16(f);
> > +        }
> > +    }
> > +
> > +    return flags;
> > +}
> > +
> 
> ok
> 
> (Sorry for the per-function ACKs, it's just helpful for me to know which
> functions I followed execution of on paper to make sure I got everything
> in this big patch.)
> 
> > +static void qemu_put_bitmap_flags(QEMUFile *f, uint32_t flags)
> > +{
> > +    /* The code currently do not send flags more than one byte */
> > +    assert(!(flags & (0xffffff00 | DIRTY_BITMAP_MIG_EXTRA_FLAGS)));
> > +
> > +    qemu_put_byte(f, flags);
> > +}
> > +
> 
> ok
> 
> > +static void send_bitmap_header(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
> > +                               uint32_t additional_flags)
> > +{
> > +    BlockDriverState *bs = dbms->bs;
> > +    BdrvDirtyBitmap *bitmap = dbms->bitmap;
> > +    uint32_t flags = additional_flags;
> > +    trace_send_bitmap_header_enter();
> > +
> > +    if (bs != dirty_bitmap_mig_state.prev_bs) {
> > +        dirty_bitmap_mig_state.prev_bs = bs;
> > +        flags |= DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME;
> > +    }
> > +
> > +    if (bitmap != dirty_bitmap_mig_state.prev_bitmap) {
> > +        dirty_bitmap_mig_state.prev_bitmap = bitmap;
> > +        flags |= DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME;
> > +    }
> > +
> 
> I guess the idea here is that we might be able to skip the node name
> broadcast, leaving the possibilities as:
> 
> - new node and bitmap: send both
> - new bitmap, but not node: send bitmap name only
> - same for both: send neither
> 
> and that otherwise it's not possible to have a new node but "same
> bitmap" by nature of how the structures are organized.
> 
> > +    qemu_put_bitmap_flags(f, flags);
> > +
> > +    if (flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
> > +        qemu_put_counted_string(f, dbms->node_name);
> > +    }
> > +
> > +    if (flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
> > +        qemu_put_counted_string(f, bdrv_dirty_bitmap_name(bitmap));
> > +    }
> > +}
> > +
> 
> ok
> 
> > +static void send_bitmap_start(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
> > +{
> > +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_START);
> > +    qemu_put_be32(f, bdrv_dirty_bitmap_granularity(dbms->bitmap));
> > +    qemu_put_byte(f, dbms->flags);
> > +}
> > +
> 
> ok
> 
> > +static void send_bitmap_complete(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
> > +{
> > +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_COMPLETE);
> > +}
> > +
> 
> ok
> 
> > +static void send_bitmap_bits(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
> > +                             uint64_t start_sector, uint32_t nr_sectors)
> > +{
> > +    /* align for buffer_is_zero() */
> > +    uint64_t align = 4 * sizeof(long);
> > +    uint64_t unaligned_size =
> > +        bdrv_dirty_bitmap_serialization_size(
> > +            dbms->bitmap, start_sector << BDRV_SECTOR_BITS,
> > +            (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
> > +    uint64_t buf_size = (unaligned_size + align - 1) & ~(align - 1);
> > +    uint8_t *buf = g_malloc0(buf_size);
> > +    uint32_t flags = DIRTY_BITMAP_MIG_FLAG_BITS;
> > +
> > +    bdrv_dirty_bitmap_serialize_part(
> > +        dbms->bitmap, buf, start_sector << BDRV_SECTOR_BITS,
> > +        (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
> > +
> > +    if (buffer_is_zero(buf, buf_size)) {
> > +        g_free(buf);
> > +        buf = NULL;
> > +        flags |= DIRTY_BITMAP_MIG_FLAG_ZEROES;
> > +    }
> > +
> > +    trace_send_bitmap_bits(flags, start_sector, nr_sectors, buf_size);
> > +
> > +    send_bitmap_header(f, dbms, flags);
> > +
> > +    qemu_put_be64(f, start_sector);
> > +    qemu_put_be32(f, nr_sectors);
> > +
> > +    /* if a block is zero we need to flush here since the network
> > +     * bandwidth is now a lot higher than the storage device bandwidth.
> > +     * thus if we queue zero blocks we slow down the migration. */
> 
> Can you elaborate on this for me?
> 
> > +    if (flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
> > +        qemu_fflush(f);
> > +    } else {
> > +        qemu_put_be64(f, buf_size);
> > +        qemu_put_buffer(f, buf, buf_size);
> > +    }
> > +
> > +    g_free(buf);
> > +}
> > +
> > +
> > +/* Called with iothread lock taken.  */
> > +
> > +static int init_dirty_bitmap_migration(void)
> > +{
> > +    BlockDriverState *bs;
> > +    BdrvDirtyBitmap *bitmap;
> > +    DirtyBitmapMigBitmapState *dbms;
> > +    BdrvNextIterator it;
> > +
> > +    dirty_bitmap_mig_state.bulk_completed = false;
> > +    dirty_bitmap_mig_state.prev_bs = NULL;
> > +    dirty_bitmap_mig_state.prev_bitmap = NULL;
> > +
> > +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
> > +        if (!bdrv_get_device_or_node_name(bs)) {
> > +            /* not named non-root node */
> 
> I can't imagine the situation it would arise in, but is it possible to
> have a named bitmap attached to a now-anonymous node?
> 
> Let's say we attach a bitmap to a root node, but then later we insert a
> filter or something above it and it's no longer at the root.
> 
> We should probably prohibit such things, or at the very least toss out
> an error here instead of silently continuing.
> 
> I think the only things valid to just *skip* are nameless bitmaps.
> Anything named we really ought to either migrate or error out over, I
> think, even if the circumstances leading to such a configuration are
> very unlikely.
> 
> > +            continue;
> > +        }
> > +
> > +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
> > +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
> > +            if (!bdrv_dirty_bitmap_name(bitmap)) {
> > +                continue;
> > +            }
> > +
> > +            if (bdrv_dirty_bitmap_frozen(bitmap)) {
> > +                error_report("Can't migrate frozen dirty bitmap: '%s",
> > +                             bdrv_dirty_bitmap_name(bitmap));
> > +                return -1;
> > +            }
> > +        }
> > +    }
> > +
> > +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
> > +        if (!bdrv_get_device_or_node_name(bs)) {
> > +            /* not named non-root node */
> > +            continue;
> > +        }
> 
> Why two-pass? I guess because we don't have to tear anything down if we
> check for errors in advance?
> 
> I worry that if we need to amend the logic here that it's error-prone to
> update it in two places, so maybe we ought to just have one loop.
> 
> > +
> > +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
> > +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
> > +            if (!bdrv_dirty_bitmap_name(bitmap)) {
> > +                continue;
> > +            }
> > +
> > +            bdrv_ref(bs);
> > +            bdrv_dirty_bitmap_set_frozen(bitmap, true);
> > +
> 
> We could say that for any bitmap in the list of pending bitmaps to
> migrate, we know that we have to un-freeze it, since we never add any
> bitmaps that are frozen to our list.
> 
> > +            dbms = g_new0(DirtyBitmapMigBitmapState, 1);
> > +            dbms->bs = bs;
> > +            dbms->node_name = bdrv_get_node_name(bs);
> > +            if (!dbms->node_name || dbms->node_name[0] == '\0') {
> > +                dbms->node_name = bdrv_get_device_name(bs);
> > +            }
> > +            dbms->bitmap = bitmap;
> > +            dbms->total_sectors = bdrv_nb_sectors(bs);
> > +            dbms->sectors_per_chunk = CHUNK_SIZE * 8 *
> > +                bdrv_dirty_bitmap_granularity(bitmap) >> BDRV_SECTOR_BITS;
> 
> Eric may want to avoid checking in new code that thinks in sectors, but
> for the sake of review I don't mind right now.
> 
> (Sorry, Eric!)
> 
> > +            if (bdrv_dirty_bitmap_enabled(bitmap)) {
> > +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_ENABLED;
> > +            }
> > +            if (bdrv_dirty_bitmap_get_persistance(bitmap)) {
> > +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
> > +            }
> > +            if (bdrv_dirty_bitmap_get_autoload(bitmap)) {
> > +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD;
> > +            }
> > +
> > +            bdrv_dirty_bitmap_set_persistance(bitmap, false);
> 
> Oh, this might be stranger to undo. Perhaps what we CAN do is limit the
> second pass to just this action and allow ourselves to unroll everything
> else.
> 
> > +
> > +            QSIMPLEQ_INSERT_TAIL(&dirty_bitmap_mig_state.dbms_list,
> > +                                 dbms, entry);
> > +        }
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> > +/* Called with no lock taken.  */
> > +static void bulk_phase_send_chunk(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
> > +{
> > +    uint32_t nr_sectors = MIN(dbms->total_sectors - dbms->cur_sector,
> > +                             dbms->sectors_per_chunk);
> > +
> > +    send_bitmap_bits(f, dbms, dbms->cur_sector, nr_sectors);
> > +
> > +    dbms->cur_sector += nr_sectors;
> > +    if (dbms->cur_sector >= dbms->total_sectors) {
> > +        dbms->bulk_completed = true;
> > +    }
> > +}
> > +
> > +/* Called with no lock taken.  */
> > +static void bulk_phase(QEMUFile *f, bool limit)
> > +{
> > +    DirtyBitmapMigBitmapState *dbms;
> > +
> > +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> > +        while (!dbms->bulk_completed) {
> > +            bulk_phase_send_chunk(f, dbms);
> > +            if (limit && qemu_file_rate_limit(f)) {
> > +                return;
> > +            }
> > +        }
> > +    }
> > +
> > +    dirty_bitmap_mig_state.bulk_completed = true;
> > +}
> > +
> > +/* Called with iothread lock taken.  */
> > +static void dirty_bitmap_mig_cleanup(void)
> > +{
> > +    DirtyBitmapMigBitmapState *dbms;
> > +
> > +    while ((dbms = QSIMPLEQ_FIRST(&dirty_bitmap_mig_state.dbms_list)) != NULL) {
> > +        QSIMPLEQ_REMOVE_HEAD(&dirty_bitmap_mig_state.dbms_list, entry);
> > +        bdrv_dirty_bitmap_set_frozen(dbms->bitmap, false);
> > +        bdrv_unref(dbms->bs);
> > +        g_free(dbms);
> > +    }
> > +}
> > +
> 
> ok
> 
> > +/* for SaveVMHandlers */
> > +static void dirty_bitmap_save_cleanup(void *opaque)
> > +{
> > +    dirty_bitmap_mig_cleanup();
> > +}
> > +
> 
> ok
> 
> > +static int dirty_bitmap_save_iterate(QEMUFile *f, void *opaque)
> > +{
> > +    trace_dirty_bitmap_save_iterate(migration_in_postcopy());
> > +
> > +    if (migration_in_postcopy() && !dirty_bitmap_mig_state.bulk_completed) {
> > +        bulk_phase(f, true);
> > +    }
> > +
> > +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
> > +
> > +    return dirty_bitmap_mig_state.bulk_completed;
> > +}
> > +
> 
> What's the purpose behind doing bulk save both here and in
> dirty_bitmap_save_complete? Is there a path that isn't guaranteed to
> call one of the completion functions?
> 
> (The way it's coded seems like it'll work fine, but I'm curious about
> what looks like a redundancy at a glance.)

I think I can see the reasoning; I think the idea is that in each
iteration you send a chunk of data (note the 'true' means that it
gets modulated by bandwidth limiting - although we currently don't
have that in postcopy - I need to fix that) - so it might
not actually send all of it.
The complete guarantees it's all sent.
So note this IS iterating potentially (OK but probably not
at the moment)

> > +/* Called with iothread lock taken.  */
> > +
> > +static int dirty_bitmap_save_complete(QEMUFile *f, void *opaque)
> > +{
> > +    DirtyBitmapMigBitmapState *dbms;
> > +    trace_dirty_bitmap_save_complete_enter();
> > +
> > +    if (!dirty_bitmap_mig_state.bulk_completed) {
> > +        bulk_phase(f, false);
> > +    }
> > +
> 
> funny now that we don't actually really iterate over the data, and the
> bulk phase is now really the _only_ phase :)
> 
> > +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> > +        send_bitmap_complete(f, dbms);
> > +    }
> > +
> > +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
> > +
> > +    trace_dirty_bitmap_save_complete_finish();
> > +
> > +    dirty_bitmap_mig_cleanup();
> > +    return 0;
> > +}
> > +
> 
> ok
> 
> > +static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque,
> > +                                      uint64_t max_size,
> > +                                      uint64_t *res_precopy_only,
> > +                                      uint64_t *res_compatible,
> > +                                      uint64_t *res_postcopy_only)
> > +{
> > +    DirtyBitmapMigBitmapState *dbms;
> > +    uint64_t pending = 0;
> > +
> > +    qemu_mutex_lock_iothread();
> > +
> > +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> > +        uint64_t gran = bdrv_dirty_bitmap_granularity(dbms->bitmap);
> > +        uint64_t sectors = dbms->bulk_completed ? 0 :
> > +                           dbms->total_sectors - dbms->cur_sector;
> > +
> > +        pending += (sectors * BDRV_SECTOR_SIZE + gran - 1) / gran;
> > +    }
> > +
> > +    qemu_mutex_unlock_iothread();
> > +
> > +    trace_dirty_bitmap_save_pending(pending, max_size);
> > +
> > +    *res_postcopy_only += pending;
> > +}
> > +
> 
> ok
> 
> > +/* First occurrence of this bitmap. It should be created if doesn't exist */
> > +static int dirty_bitmap_load_start(QEMUFile *f, DirtyBitmapLoadState *s)
> > +{
> > +    Error *local_err = NULL;
> > +    uint32_t granularity = qemu_get_be32(f);
> > +    uint8_t flags = qemu_get_byte(f);
> > +
> > +    if (!s->bitmap) {
> > +        s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
> > +                                             s->bitmap_name, &local_err);
> > +        if (!s->bitmap) {
> > +            error_report_err(local_err);
> > +            return -EINVAL;
> > +        }
> > +    } else {
> > +        uint32_t dest_granularity =
> > +            bdrv_dirty_bitmap_granularity(s->bitmap);
> > +        if (dest_granularity != granularity) {
> > +            error_report("Error: "
> > +                         "Migrated bitmap granularity (%" PRIu32 ") "
> > +                         "doesn't match the destination bitmap '%s' "
> > +                         "granularity (%" PRIu32 ")",
> > +                         granularity,
> > +                         bdrv_dirty_bitmap_name(s->bitmap),
> > +                         dest_granularity);
> > +            return -EINVAL;
> > +        }
> > +    }
> > +
> 
> I'm a fan of auto-creating the bitmaps. Do you have a use-case for why
> creating them ahead of time is better, or are you just attempting to be
> flexible?
> 
> > +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK) {
> > +        error_report("Unknown flags in migrated dirty bitmap header: %x",
> > +                     flags);
> > +        return -EINVAL;
> > +    }
> > +
> > +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) {
> > +        bdrv_dirty_bitmap_set_persistance(s->bitmap, true);
> > +    }
> > +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD) {
> > +        bdrv_dirty_bitmap_set_autoload(s->bitmap, true);
> > +    }
> > +
> > +    bdrv_disable_dirty_bitmap(s->bitmap);
> 
> OK, so we start them off as disabled, and
> 
> > +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
> > +        DirtyBitmapLoadBitmapState *b;
> > +
> > +        bdrv_dirty_bitmap_create_successor(s->bs, s->bitmap, &local_err);
> > +        if (local_err) {
> > +            error_report_err(local_err);
> > +            return -EINVAL;
> > +        }
> > +
> 
> If they weren't disabled on the host, we create a successor to record
> writes while we wait for the rest of the data to arrive.
> 
> > +        b = g_new(DirtyBitmapLoadBitmapState, 1);
> > +        b->bs = s->bs;
> > +        b->bitmap = s->bitmap;
> > +        b->migrated = false;
> > +        enabled_bitmaps = g_slist_prepend(enabled_bitmaps, b);
> 
> And we make a note of which ones we were supposed to re-enable.
> 
> > +    }
> > +
> > +    return 0;
> > +}
> 
> OK
> 
> > +
> > +void dirty_bitmap_mig_before_vm_start(void)
> 
> Similarly, I guess I find it weird that this is a callable interface.
> 
> David, no nice hook for just-prior-to-vm-start calls? a
> .postcopy_pivot() hook or something might be nice..

Hmm, the other way a lot of devices do it is to hook the runstate
change.

> > +{
> > +    GSList *item;
> > +
> > +    qemu_mutex_lock(&finish_lock);
> > +
> > +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
> > +        DirtyBitmapLoadBitmapState *b = item->data;
> > +
> 
> Anyway, if I am reading this right; we call this in the postcopy phase
> prior to receiving the entirety of the bitmaps (so before receiving
> COMPLETE) ... right?
> 
> > +        if (b->migrated) {
> > +            bdrv_enable_dirty_bitmap(b->bitmap);
> 
> ...or, am I confused, and we might receive a COMPLETE event prior to the
> postcopy pivot?
> 
> Anyway, I suppose this code says "If we received the entire bitmap, go
> ahead and enable it."
> 
> > +        } else {
> > +            bdrv_dirty_bitmap_enable_successor(b->bitmap);
> 
> And this says "If we haven't received it yet, enable the successor to
> record writes until we get the rest of the data."
> 
> > +        }
> > +
> > +        g_free(b);
> > +    }
> > +
> > +    g_slist_free(enabled_bitmaps);
> > +    enabled_bitmaps = NULL;
> > +
> > +    qemu_mutex_unlock(&finish_lock);
> > +}
> > +
> > +static void dirty_bitmap_load_complete(QEMUFile *f, DirtyBitmapLoadState *s)
> > +{
> > +    GSList *item;
> > +    trace_dirty_bitmap_load_complete();
> > +    bdrv_dirty_bitmap_deserialize_finish(s->bitmap);
> > +
> > +    qemu_mutex_lock(&finish_lock);
> > +
> > +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
> > +        DirtyBitmapLoadBitmapState *b = item->data;
> > +
> > +        if (b->bitmap == s->bitmap) {
> > +            b->migrated = true;
> 
> we can probably break; here now, right?
> 
> (This whole stanza is a little strange, can't we cache the active
> DirtyBitmapLoadBitmapState in DirtyBitmapLoadState? I guess not, because
> we're looking up the BdrvDirtyBitmap itself and caching that instead, so
> either way we have some kind of lookup on every context switch.)
> 
> > +        }
> > +    }
> > +
> > +    if (bdrv_dirty_bitmap_frozen(s->bitmap)) {
> > +        if (enabled_bitmaps == NULL) {
> > +            /* in postcopy */
> > +            AioContext *aio_context = bdrv_get_aio_context(s->bs);
> > +            aio_context_acquire(aio_context);
> > +
> > +            bdrv_reclaim_dirty_bitmap(s->bs, s->bitmap, &error_abort);
> > +            bdrv_enable_dirty_bitmap(s->bitmap);
> > +
> 
> OK, so if enabled_bitmaps is gone, that means we already pivoted and
> we're live on the receiving end here. We merge the successor into the
> fully deserialized bitmap and enable it.
> 
> > +            aio_context_release(aio_context);
> > +        } else {
> > +            /* target not started, successor is empty */
> > +            bdrv_dirty_bitmap_release_successor(s->bs, s->bitmap);
> 
> Otherwise we just trash the successor. Did we really need a new call for
> this? I suppose it's faster than merging a 0-bit bitmap, but the
> additional API complexity for the speed win here seems like premature
> optimization.
> 
> ...well, you already wrote it, so I won't argue.
> 
> > +        }
> > +    }
> > +
> > +    qemu_mutex_unlock(&finish_lock);
> > +}
> > +
> > +static int dirty_bitmap_load_bits(QEMUFile *f, DirtyBitmapLoadState *s)
> > +{
> > +    uint64_t first_byte = qemu_get_be64(f) << BDRV_SECTOR_BITS;
> > +    uint64_t nr_bytes = (uint64_t)qemu_get_be32(f) << BDRV_SECTOR_BITS;
> > +    trace_dirty_bitmap_load_bits_enter(first_byte >> BDRV_SECTOR_BITS,
> > +                                       nr_bytes >> BDRV_SECTOR_BITS);
> > +
> > +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
> > +        trace_dirty_bitmap_load_bits_zeroes();
> > +        bdrv_dirty_bitmap_deserialize_zeroes(s->bitmap, first_byte, nr_bytes,
> > +                                             false);
> > +    } else {
> > +        uint8_t *buf;
> > +        uint64_t buf_size = qemu_get_be64(f);
> > +        uint64_t needed_size =
> > +            bdrv_dirty_bitmap_serialization_size(s->bitmap,
> > +                                                 first_byte, nr_bytes);
> > +
> > +        if (needed_size > buf_size) {
> > +            error_report("Error: Migrated bitmap granularity doesn't "
> > +                         "match the destination bitmap '%s' granularity",
> > +                         bdrv_dirty_bitmap_name(s->bitmap));
> > +            return -EINVAL;
> > +        }
> > +
> > +        buf = g_malloc(buf_size);
> > +        qemu_get_buffer(f, buf, buf_size);
> > +        bdrv_dirty_bitmap_deserialize_part(s->bitmap, buf, first_byte, nr_bytes,
> > +                                           false);
> > +        g_free(buf);
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> 
> ok
> 
> > +static int dirty_bitmap_load_header(QEMUFile *f, DirtyBitmapLoadState *s)
> > +{
> > +    Error *local_err = NULL;
> > +    s->flags = qemu_get_bitmap_flags(f);
> > +    trace_dirty_bitmap_load_header(s->flags);
> > +
> > +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
> > +        if (!qemu_get_counted_string(f, s->node_name)) {
> > +            error_report("Unable to read node name string");
> > +            return -EINVAL;
> > +        }
> > +        s->bs = bdrv_lookup_bs(s->node_name, s->node_name, &local_err);
> > +        if (!s->bs) {
> > +            error_report_err(local_err);
> > +            return -EINVAL;
> > +        }
> > +    } else if (!s->bs) {
> > +        error_report("Error: block device name is not set");
> > +        return -EINVAL;
> > +    }
> > +
> > +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
> > +        if (!qemu_get_counted_string(f, s->bitmap_name)) {
> > +            error_report("Unable to read node name string");
> > +            return -EINVAL;
> > +        }
> > +        s->bitmap = bdrv_find_dirty_bitmap(s->bs, s->bitmap_name);
> > +
> > +        /* bitmap may be NULL here, it wouldn't be an error if it is the
> > +         * first occurrence of the bitmap */
> > +        if (!s->bitmap && !(s->flags & DIRTY_BITMAP_MIG_FLAG_START)) {
> > +            error_report("Error: unknown dirty bitmap "
> > +                         "'%s' for block device '%s'",
> > +                         s->bitmap_name, s->node_name);
> > +            return -EINVAL;
> > +        }
> > +    } else if (!s->bitmap) {
> > +        error_report("Error: block device name is not set");
> > +        return -EINVAL;
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> 
> ok
> 
> > +static int dirty_bitmap_load(QEMUFile *f, void *opaque, int version_id)
> > +{
> > +    static DirtyBitmapLoadState s;
> > +    int ret = 0;
> > +
> > +    trace_dirty_bitmap_load_enter();
> > +
> > +    if (version_id != 1) {
> > +        return -EINVAL;
> > +    }
> > +
> > +    do {
> > +        dirty_bitmap_load_header(f, &s);
> > +
> > +        if (s.flags & DIRTY_BITMAP_MIG_FLAG_START) {
> > +            ret = dirty_bitmap_load_start(f, &s);
> > +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_COMPLETE) {
> > +            dirty_bitmap_load_complete(f, &s);
> > +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_BITS) {
> > +            ret = dirty_bitmap_load_bits(f, &s);
> > +        }
> > +
> > +        if (!ret) {
> > +            ret = qemu_file_get_error(f);
> > +        }
> > +
> > +        if (ret) {
> > +            return ret;
> > +        }
> > +    } while (!(s.flags & DIRTY_BITMAP_MIG_FLAG_EOS));
> > +
> > +    trace_dirty_bitmap_load_success();
> > +    return 0;
> > +}
> 
> OK
> 
> > +
> > +static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
> > +{
> > +    DirtyBitmapMigBitmapState *dbms = NULL;
> > +    if (init_dirty_bitmap_migration() < 0) {
> > +        return -1;
> > +    }
> > +
> > +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> > +        send_bitmap_start(f, dbms);
> > +    }
> > +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
> > +
> > +    return 0;
> > +}
> > +
> 
> ok
> 
> > +static bool dirty_bitmap_is_active(void *opaque)
> > +{
> > +    return migrate_dirty_bitmaps();
> > +}
> > +
> 
> ok
> 
> > +static bool dirty_bitmap_is_active_iterate(void *opaque)
> > +{
> > +    return dirty_bitmap_is_active(opaque) && !runstate_is_running();
> > +}
> > +
> 
> On second thought, in patch 9, can you add a little tiny bit of
> documentation text explaining the exact nature of this callback?
> 
> Is the second portion of the conditional here so that once we reach the
> postcopy state that .is_active_iterate starts returning true?
> 
> "ok" if I'm reading this right, but it might be helped along by a little
> comment.
> 
> > +static bool dirty_bitmap_has_postcopy(void *opaque)
> > +{
> > +    return true;
> > +}
> > +
> 
> ok! :)
> 
> > +static SaveVMHandlers savevm_dirty_bitmap_handlers = {
> > +    .save_setup = dirty_bitmap_save_setup,
> > +    .save_live_complete_postcopy = dirty_bitmap_save_complete,
> > +    .save_live_complete_precopy = dirty_bitmap_save_complete,
> > +    .has_postcopy = dirty_bitmap_has_postcopy,
> > +    .save_live_pending = dirty_bitmap_save_pending,
> > +    .save_live_iterate = dirty_bitmap_save_iterate,
> > +    .is_active_iterate = dirty_bitmap_is_active_iterate,
> > +    .load_state = dirty_bitmap_load,
> > +    .save_cleanup = dirty_bitmap_save_cleanup,
> > +    .is_active = dirty_bitmap_is_active,
> > +};
> > +
> > +void dirty_bitmap_mig_init(void)
> > +{
> > +    QSIMPLEQ_INIT(&dirty_bitmap_mig_state.dbms_list);
> > +
> > +    register_savevm_live(NULL, "dirty-bitmap", 0, 1,
> > +                         &savevm_dirty_bitmap_handlers,
> > +                         &dirty_bitmap_mig_state);
> > +}
> 
> ok
> 
> dgilbert, would it be worth registering a block-driver-like registration
> trick that automatically invokes these functions instead of having to
> hook them up in vl.c? the more we add, the more hacky it looks to not
> have some subsystem-wide registration hook.

Maybe it's just simpler to put a mig_init in migration/migration.c and
make one call in vl.c; I'd rather keep a simple function than a whole
registration mechanism.

> > diff --git a/migration/migration.c b/migration/migration.c
> > index e973837bfd..66e9cf03cd 100644
> > --- a/migration/migration.c
> > +++ b/migration/migration.c
> > @@ -150,6 +150,9 @@ MigrationIncomingState *migration_incoming_get_current(void)
> >          memset(&mis_current, 0, sizeof(MigrationIncomingState));
> >          qemu_mutex_init(&mis_current.rp_mutex);
> >          qemu_event_init(&mis_current.main_thread_load_event, false);
> > +
> > +        init_dirty_bitmap_incoming_migration();
> > +
> >          once = true;
> >      }
> >      return &mis_current;
> > diff --git a/migration/savevm.c b/migration/savevm.c
> > index 9bbfb3fa1b..b0c37ef9f1 100644
> > --- a/migration/savevm.c
> > +++ b/migration/savevm.c
> > @@ -1673,6 +1673,8 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
> >  
> >      trace_loadvm_postcopy_handle_run_vmstart();
> >  
> > +    dirty_bitmap_mig_before_vm_start();
> > +
> >      if (autostart) {
> >          /* Hold onto your hats, starting the CPU */
> >          vm_start();
> > diff --git a/vl.c b/vl.c
> > index ec299099ff..3d393aaf2c 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -4642,6 +4642,7 @@ int main(int argc, char **argv, char **envp)
> >  
> >      blk_mig_init();
> >      ram_mig_init();
> > +    dirty_bitmap_mig_init();
> >  
> >      /* If the currently selected machine wishes to override the units-per-bus
> >       * property of its default HBA interface type, do so now. */
> > diff --git a/migration/Makefile.objs b/migration/Makefile.objs
> > index 99e038024d..c83ec47ba8 100644
> > --- a/migration/Makefile.objs
> > +++ b/migration/Makefile.objs
> > @@ -6,6 +6,7 @@ common-obj-y += qemu-file.o global_state.o
> >  common-obj-y += qemu-file-channel.o
> >  common-obj-y += xbzrle.o postcopy-ram.o
> >  common-obj-y += qjson.o
> > +common-obj-y += block-dirty-bitmap.o
> >  
> >  common-obj-$(CONFIG_RDMA) += rdma.o
> >  
> > diff --git a/migration/trace-events b/migration/trace-events
> > index a04fffb877..e9eb8078d4 100644
> > --- a/migration/trace-events
> > +++ b/migration/trace-events
> > @@ -227,3 +227,17 @@ colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'"
> >  colo_send_message(const char *msg) "Send '%s' message"
> >  colo_receive_message(const char *msg) "Receive '%s' message"
> >  colo_failover_set_state(const char *new_state) "new state %s"
> > +
> > +# migration/block-dirty-bitmap.c
> > +send_bitmap_header_enter(void) ""
> > +send_bitmap_bits(uint32_t flags, uint64_t start_sector, uint32_t nr_sectors, uint64_t data_size) "\n   flags:        0x%x\n   start_sector: %" PRIu64 "\n   nr_sectors:   %" PRIu32 "\n   data_size:    %" PRIu64 "\n"
> > +dirty_bitmap_save_iterate(int in_postcopy) "in postcopy: %d"
> > +dirty_bitmap_save_complete_enter(void) ""
> > +dirty_bitmap_save_complete_finish(void) ""
> > +dirty_bitmap_save_pending(uint64_t pending, uint64_t max_size) "pending %" PRIu64 " max: %" PRIu64
> > +dirty_bitmap_load_complete(void) ""
> > +dirty_bitmap_load_bits_enter(uint64_t first_sector, uint32_t nr_sectors) "chunk: %" PRIu64 " %" PRIu32
> > +dirty_bitmap_load_bits_zeroes(void) ""
> > +dirty_bitmap_load_header(uint32_t flags) "flags 0x%x"
> > +dirty_bitmap_load_enter(void) ""
> > +dirty_bitmap_load_success(void) ""
> > 
> 
> OK, I think everything here is probably in order, and it's only my
> understanding that is a barrier at this point. Help me understand the
> rest of this patch and I'll re-pester migration to get this staged for
> qemu-next.
> 
> --js

Dave

--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
  2017-11-16  8:56     ` Vladimir Sementsov-Ogievskiy
@ 2017-11-16 18:18       ` John Snow
  0 siblings, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-16 18:18 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 11/16/2017 03:56 AM, Vladimir Sementsov-Ogievskiy wrote:
> 11.11.2017 01:52, John Snow wrote:
>>
>> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>>> It is needed to realize bdrv_dirty_bitmap_release_successor in
>>> the following patch.
>>>
>> OK, but...
>>
>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> ---
>>>   block/dirty-bitmap.c | 25 ++++++++++++++++++++-----
>>>   1 file changed, 20 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>>> index 81adbeb6d4..981f99d362 100644
>>> --- a/block/dirty-bitmap.c
>>> +++ b/block/dirty-bitmap.c
>>> @@ -326,13 +326,13 @@ static bool
>>> bdrv_dirty_bitmap_has_name(BdrvDirtyBitmap *bitmap)
>>>       return !!bdrv_dirty_bitmap_name(bitmap);
>>>   }
>>>   -/* Called with BQL taken.  */
>>> -static void bdrv_do_release_matching_dirty_bitmap(
>>> +/* Called within bdrv_dirty_bitmap_lock..unlock */
>> ...Add this so it will compile:
>>
>> __attribute__((__unused__))
> 
> ok
> 
>>> +static void bdrv_do_release_matching_dirty_bitmap_locked(
>>>       BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
>>>       bool (*cond)(BdrvDirtyBitmap *bitmap))
>>>   {
>>>       BdrvDirtyBitmap *bm, *next;
>>> -    bdrv_dirty_bitmaps_lock(bs);
>>> +
>>>       QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
>>>           if ((!bitmap || bm == bitmap) && (!cond || cond(bm))) {
>>>               assert(!bm->active_iterators);
>>> @@ -344,18 +344,33 @@ static void bdrv_do_release_matching_dirty_bitmap(
>>>               g_free(bm);
>>>                 if (bitmap) {
>>> -                goto out;
>>> +                return;
>>>               }
>>>           }
>>>       }
>>> +
>>>       if (bitmap) {
>>>           abort();
>>>       }
>> Do we have any style guide rules on using abort() instead of assert()?
>> The rest of this function uses assert, and it'd be less lines to simply
>> write:
>>
>> assert(!bitmap);
>>
>> which I think might also carry better semantic information for coverity
>> beyond an actual runtime conditional branch.
>>
>> (I think. Please correct me if I am wrong, I'm a little hazy on this.)
> 
> agree, but it is a preexisting code, so I'll fix it with an additional
> patch.
> 

You're right. I didn't notice it was pre-existing where I was looking at
it. I'll send my own little fixup. My mistake.

>>
>>> +}
>>>   -out:
>>> +/* Called with BQL taken.  */
>>> +static void bdrv_do_release_matching_dirty_bitmap(
>>> +    BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
>>> +    bool (*cond)(BdrvDirtyBitmap *bitmap))
>>> +{
>>> +    bdrv_dirty_bitmaps_lock(bs);
>>> +    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, cond);
>>>       bdrv_dirty_bitmaps_unlock(bs);
>>>   }
>>>   +/* Called within bdrv_dirty_bitmap_lock..unlock */
>>> +static void bdrv_release_dirty_bitmap_locked(BlockDriverState *bs,
>>> +                                             BdrvDirtyBitmap *bitmap)
>>> +{
>>> +    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, NULL);
>>> +}
>>> +
>>>   /* Called with BQL taken.  */
>>>   void bdrv_release_dirty_bitmap(BlockDriverState *bs,
>>> BdrvDirtyBitmap *bitmap)
>>>   {
>>>
>> If you agree with those two changes, you may add:
> 
> ok
> 
>>
>> Reviewed-by: John Snow <jsnow@redhat.com>
> 
> 

Just make sure it compiles standalone by using the unused attribute and
you can add the RB.

--js

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps
  2017-11-16 10:24     ` Vladimir Sementsov-Ogievskiy
@ 2017-11-17  0:36       ` John Snow
  2017-11-17  0:47       ` John Snow
  1 sibling, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-17  0:36 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: stefanha, Peter Lieven



On 11/16/2017 05:24 AM, Vladimir Sementsov-Ogievskiy wrote:
>>> +    /* if a block is zero we need to flush here since the network
>>> +     * bandwidth is now a lot higher than the storage device bandwidth.
>>> +     * thus if we queue zero blocks we slow down the migration. */
>> Can you elaborate on this for me?
> 
> it comes from migration/block.c, as it was a prototype for dirty bitmaps
> migration.
> May be the original thought was to give destination storage more time to
> handle
> write-zeros? It may make sense if it can't do it fast but really writes
> zeros.
> 
>>
>>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
>>> +        qemu_fflush(f);
>>> +    } else {
>>> +        qemu_put_be64(f, buf_size);
>>> +        qemu_put_buffer(f, buf, buf_size);
>>> +    }
>>> +
>>> +    g_free(buf);
>>> +} 

Peter, Stefan; do you have any insight on the reason for this blurb's
appearance in migration/block.c? Looks like it showed up in
323004a39d4d8d33c744a5b108f80bfe6402fca3

I'm not sure I understand what the concern was that lead to this, unless
it's simply that without a flush() we can't guarantee progress.

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps
  2017-11-16 10:24     ` Vladimir Sementsov-Ogievskiy
  2017-11-17  0:36       ` John Snow
@ 2017-11-17  0:47       ` John Snow
  1 sibling, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-17  0:47 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 11/16/2017 05:24 AM, Vladimir Sementsov-Ogievskiy wrote:
> 15.11.2017 04:58, John Snow wrote:
>>
>> On 10/30/2017 12:33 PM, Vladimir Sementsov-Ogievskiy wrote:
>>> Postcopy migration of dirty bitmaps. Only named dirty bitmaps,
>>> associated with root nodes and non-root named nodes are migrated.
>>>
>>> If destination qemu is already containing a dirty bitmap with the
>>> same name
>>> as a migrated bitmap (for the same node), then, if their
>>> granularities are
>>> the same the migration will be done, otherwise the error will be
>>> generated.
>>>
>>> If destination qemu doesn't contain such bitmap it will be created.
>>>
>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> ---
>>>   include/migration/misc.h       |   3 +
>>>   migration/migration.h          |   3 +
>>>   migration/block-dirty-bitmap.c | 734
>>> +++++++++++++++++++++++++++++++++++++++++
>> Ouch :\
>>
>>>   migration/migration.c          |   3 +
>>>   migration/savevm.c             |   2 +
>>>   vl.c                           |   1 +
>>>   migration/Makefile.objs        |   1 +
>>>   migration/trace-events         |  14 +
>>>   8 files changed, 761 insertions(+)
>>>   create mode 100644 migration/block-dirty-bitmap.c
>>>
>> Organizationally, you introduce three new 'public' prototypes:
>>
>> dirty_bitmap_mig_init
>> dirty_bitmap_mig_before_vm_start
>> init_dirty_bitmap_incoming_migration
>>
>> mig_init is advertised in migration/misc.h, the other two are in
>> migration/migration.h.
>> The definitions for all three are in migration/block-dirty-bitmap.c
>>
>> In pure naivety, I find it weird to have something that you use in
>> migration.c and advertised in migration.h actually exist separately in
>> block-dirty-bitmap.c; but maybe this is the sanest thing to do.
>>
>>> diff --git a/include/migration/misc.h b/include/migration/misc.h
>>> index c079b7771b..9cc539e232 100644
>>> --- a/include/migration/misc.h
>>> +++ b/include/migration/misc.h
>>> @@ -55,4 +55,7 @@ bool migration_has_failed(MigrationState *);
>>>   bool migration_in_postcopy_after_devices(MigrationState *);
>>>   void migration_global_dump(Monitor *mon);
>>>   +/* migration/block-dirty-bitmap.c */
>>> +void dirty_bitmap_mig_init(void);
>>> +
>>>   #endif
>>> diff --git a/migration/migration.h b/migration/migration.h
>>> index 50d1f01346..4e3ad04664 100644
>>> --- a/migration/migration.h
>>> +++ b/migration/migration.h
>>> @@ -211,4 +211,7 @@ void migrate_send_rp_pong(MigrationIncomingState
>>> *mis,
>>>   void migrate_send_rp_req_pages(MigrationIncomingState *mis, const
>>> char* rbname,
>>>                                 ram_addr_t start, size_t len);
>>>   +void dirty_bitmap_mig_before_vm_start(void);
>>> +void init_dirty_bitmap_incoming_migration(void);
>>> +
>>>   #endif
>>> diff --git a/migration/block-dirty-bitmap.c
>>> b/migration/block-dirty-bitmap.c
>>> new file mode 100644
>>> index 0000000000..53cb20045d
>>> --- /dev/null
>>> +++ b/migration/block-dirty-bitmap.c
>>> @@ -0,0 +1,734 @@
>>> +/*
>>> + * Block dirty bitmap postcopy migration
>>> + *
>>> + * Copyright IBM, Corp. 2009
>>> + * Copyright (c) 2016-2017 Parallels International GmbH
>>> + *
>>> + * Authors:
>>> + *  Liran Schour   <lirans@il.ibm.com>
>>> + *  Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> + *
>>> + * This work is licensed under the terms of the GNU GPL, version 2. 
>>> See
>>> + * the COPYING file in the top-level directory.
>>> + * This file is derived from migration/block.c, so it's author and
>>> IBM copyright
>>> + * are here, although content is quite different.
>>> + *
>>> + * Contributions after 2012-01-13 are licensed under the terms of the
>>> + * GNU GPL, version 2 or (at your option) any later version.
>>> + *
>>> + *                                ***
>>> + *
>>> + * Here postcopy migration of dirty bitmaps is realized. Only named
>>> dirty
>>> + * bitmaps, associated with root nodes and non-root named nodes are
>>> migrated.
>> Put another way, only QMP-addressable bitmaps. Nodes without a name that
>> are not the root have no way to be addressed.
>>
>>> + *
>>> + * If destination qemu is already containing a dirty bitmap with the
>>> same name
>> "If the destination QEMU already contains a dirty bitmap with the same
>> name"
>>
>>> + * as a migrated bitmap (for the same node), then, if their
>>> granularities are
>>> + * the same the migration will be done, otherwise the error will be
>>> generated.
>> "an error"
>>
>>> + *
>>> + * If destination qemu doesn't contain such bitmap it will be created.
>> "If the destination QEMU doesn't contain such a bitmap, it will be
>> created."
>>
>>> + *
>>> + * format of migration:
>>> + *
>>> + * # Header (shared for different chunk types)
>>> + * 1, 2 or 4 bytes: flags (see qemu_{put,put}_flags)
>>> + * [ 1 byte: node name size ] \  flags & DEVICE_NAME
>>> + * [ n bytes: node name     ] /
>>> + * [ 1 byte: bitmap name size ] \  flags & BITMAP_NAME
>>> + * [ n bytes: bitmap name     ] /
>>> + *
>>> + * # Start of bitmap migration (flags & START)
>>> + * header
>>> + * be64: granularity
>>> + * 1 byte: bitmap flags (corresponds to BdrvDirtyBitmap)
>>> + *   bit 0    -  bitmap is enabled
>>> + *   bit 1    -  bitmap is persistent
>>> + *   bit 2    -  bitmap is autoloading
>>> + *   bits 3-7 - reserved, must be zero
>>> + *
>>> + * # Complete of bitmap migration (flags & COMPLETE)
>>> + * header
>>> + *
>>> + * # Data chunk of bitmap migration
>>> + * header
>>> + * be64: start sector
>>> + * be32: number of sectors
>>> + * [ be64: buffer size  ] \ ! (flags & ZEROES)
>>> + * [ n bytes: buffer    ] /
>>> + *
>>> + * The last chunk in stream should contain flags & EOS. The chunk
>>> may skip
>>> + * device and/or bitmap names, assuming them to be the same with the
>>> previous
>>> + * chunk.
>>> + */
>>> +
>> Been a while since I reviewed the format, but it seems sane.
>>
>>> +#include "qemu/osdep.h"
>>> +#include "block/block.h"
>>> +#include "block/block_int.h"
>>> +#include "sysemu/block-backend.h"
>>> +#include "qemu/main-loop.h"
>>> +#include "qemu/error-report.h"
>>> +#include "migration/misc.h"
>>> +#include "migration/migration.h"
>>> +#include "migration/qemu-file.h"
>>> +#include "migration/vmstate.h"
>>> +#include "migration/register.h"
>>> +#include "qemu/hbitmap.h"
>>> +#include "sysemu/sysemu.h"
>>> +#include "qemu/cutils.h"
>>> +#include "qapi/error.h"
>>> +#include "trace.h"
>>> +
>>> +#define CHUNK_SIZE     (1 << 10)
>>> +
>>> +/* Flags occupy one, two or four bytes (Big Endian). The size is
>>> determined as
>>> + * follows:
>>> + * in first (most significant) byte bit 8 is clear  -->  one byte
>>> + * in first byte bit 8 is set    -->  two or four bytes, depending
>>> on second
>>> + *                                    byte:
>>> + *    | in second byte bit 8 is clear  -->  two bytes
>>> + *    | in second byte bit 8 is set    -->  four bytes
>>> + */
>>> +#define DIRTY_BITMAP_MIG_FLAG_EOS           0x01
>>> +#define DIRTY_BITMAP_MIG_FLAG_ZEROES        0x02
>>> +#define DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME   0x04
>>> +#define DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME   0x08
>>> +#define DIRTY_BITMAP_MIG_FLAG_START         0x10
>>> +#define DIRTY_BITMAP_MIG_FLAG_COMPLETE      0x20
>>> +#define DIRTY_BITMAP_MIG_FLAG_BITS          0x40
>>> +
>>> +#define DIRTY_BITMAP_MIG_EXTRA_FLAGS        0x80
>>> +
>>> +#define DIRTY_BITMAP_MIG_START_FLAG_ENABLED          0x01
>>> +#define DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT       0x02
>>> +#define DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD         0x04
>>> +#define DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK    0xf8
>>> +
>>> +typedef struct DirtyBitmapMigBitmapState {
>>> +    /* Written during setup phase. */
>>> +    BlockDriverState *bs;
>>> +    const char *node_name;
>>> +    BdrvDirtyBitmap *bitmap;
>>> +    uint64_t total_sectors;
>>> +    uint64_t sectors_per_chunk;
>>> +    QSIMPLEQ_ENTRY(DirtyBitmapMigBitmapState) entry;
>>> +    uint8_t flags;
>>> +
>>> +    /* For bulk phase. */
>>> +    bool bulk_completed;
>>> +    uint64_t cur_sector;
>>> +} DirtyBitmapMigBitmapState;
>>> +
>>> +typedef struct DirtyBitmapMigState {
>>> +    QSIMPLEQ_HEAD(dbms_list, DirtyBitmapMigBitmapState) dbms_list;
>>> +
>>> +    bool bulk_completed;
>>> +
>>> +    /* for send_bitmap_bits() */
>>> +    BlockDriverState *prev_bs;
>>> +    BdrvDirtyBitmap *prev_bitmap;
>>> +} DirtyBitmapMigState;
>>> +
>>> +typedef struct DirtyBitmapLoadState {
>>> +    uint32_t flags;
>>> +    char node_name[256];
>>> +    char bitmap_name[256];
>>> +    BlockDriverState *bs;
>>> +    BdrvDirtyBitmap *bitmap;
>>> +} DirtyBitmapLoadState;
>>> +
>>> +static DirtyBitmapMigState dirty_bitmap_mig_state;
>>> +
>>> +typedef struct DirtyBitmapLoadBitmapState {
>>> +    BlockDriverState *bs;
>>> +    BdrvDirtyBitmap *bitmap;
>>> +    bool migrated;
>>> +} DirtyBitmapLoadBitmapState;
>>> +static GSList *enabled_bitmaps;
>>> +QemuMutex finish_lock;
>>> +
>>> +void init_dirty_bitmap_incoming_migration(void)
>>> +{
>>> +    qemu_mutex_init(&finish_lock);
>>> +}
>>> +
>> This is a little odd as public interface. David, is there a nicer way to
>> integrate in-migrate hooks? I guess it hasn't come up yet. Anyway, it
>> might be nice to leave a comment here for now that says that the only
>> caller is migration.c, and it will only ever call it once.
>>
>>> +static uint32_t qemu_get_bitmap_flags(QEMUFile *f)
>>> +{
>>> +    uint8_t flags = qemu_get_byte(f);
>>> +    if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
>>> +        flags = flags << 8 | qemu_get_byte(f);
>>> +        if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
>>> +            flags = flags << 16 | qemu_get_be16(f);
>>> +        }
>>> +    }
>>> +
>>> +    return flags;
>>> +}
>>> +
>> ok
>>
>> (Sorry for the per-function ACKs, it's just helpful for me to know which
>> functions I followed execution of on paper to make sure I got everything
>> in this big patch.)
>>
>>> +static void qemu_put_bitmap_flags(QEMUFile *f, uint32_t flags)
>>> +{
>>> +    /* The code currently do not send flags more than one byte */
>>> +    assert(!(flags & (0xffffff00 | DIRTY_BITMAP_MIG_EXTRA_FLAGS)));
>>> +
>>> +    qemu_put_byte(f, flags);
>>> +}
>>> +
>> ok
>>
>>> +static void send_bitmap_header(QEMUFile *f,
>>> DirtyBitmapMigBitmapState *dbms,
>>> +                               uint32_t additional_flags)
>>> +{
>>> +    BlockDriverState *bs = dbms->bs;
>>> +    BdrvDirtyBitmap *bitmap = dbms->bitmap;
>>> +    uint32_t flags = additional_flags;
>>> +    trace_send_bitmap_header_enter();
>>> +
>>> +    if (bs != dirty_bitmap_mig_state.prev_bs) {
>>> +        dirty_bitmap_mig_state.prev_bs = bs;
>>> +        flags |= DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME;
>>> +    }
>>> +
>>> +    if (bitmap != dirty_bitmap_mig_state.prev_bitmap) {
>>> +        dirty_bitmap_mig_state.prev_bitmap = bitmap;
>>> +        flags |= DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME;
>>> +    }
>>> +
>> I guess the idea here is that we might be able to skip the node name
>> broadcast, leaving the possibilities as:
>>
>> - new node and bitmap: send both
>> - new bitmap, but not node: send bitmap name only
>> - same for both: send neither
> 
> yes
> 
>>
>> and that otherwise it's not possible to have a new node but "same
>> bitmap" by nature of how the structures are organized.
> 
> I hope we don't have bitmaps, shared between nodes)
> 
>>
>>> +    qemu_put_bitmap_flags(f, flags);
>>> +
>>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
>>> +        qemu_put_counted_string(f, dbms->node_name);
>>> +    }
>>> +
>>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
>>> +        qemu_put_counted_string(f, bdrv_dirty_bitmap_name(bitmap));
>>> +    }
>>> +}
>>> +
>> ok
>>
>>> +static void send_bitmap_start(QEMUFile *f, DirtyBitmapMigBitmapState
>>> *dbms)
>>> +{
>>> +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_START);
>>> +    qemu_put_be32(f, bdrv_dirty_bitmap_granularity(dbms->bitmap));
>>> +    qemu_put_byte(f, dbms->flags);
>>> +}
>>> +
>> ok
>>
>>> +static void send_bitmap_complete(QEMUFile *f,
>>> DirtyBitmapMigBitmapState *dbms)
>>> +{
>>> +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_COMPLETE);
>>> +}
>>> +
>> ok
>>
>>> +static void send_bitmap_bits(QEMUFile *f, DirtyBitmapMigBitmapState
>>> *dbms,
>>> +                             uint64_t start_sector, uint32_t
>>> nr_sectors)
>>> +{
>>> +    /* align for buffer_is_zero() */
>>> +    uint64_t align = 4 * sizeof(long);
>>> +    uint64_t unaligned_size =
>>> +        bdrv_dirty_bitmap_serialization_size(
>>> +            dbms->bitmap, start_sector << BDRV_SECTOR_BITS,
>>> +            (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
>>> +    uint64_t buf_size = (unaligned_size + align - 1) & ~(align - 1);
>>> +    uint8_t *buf = g_malloc0(buf_size);
>>> +    uint32_t flags = DIRTY_BITMAP_MIG_FLAG_BITS;
>>> +
>>> +    bdrv_dirty_bitmap_serialize_part(
>>> +        dbms->bitmap, buf, start_sector << BDRV_SECTOR_BITS,
>>> +        (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
>>> +
>>> +    if (buffer_is_zero(buf, buf_size)) {
>>> +        g_free(buf);
>>> +        buf = NULL;
>>> +        flags |= DIRTY_BITMAP_MIG_FLAG_ZEROES;
>>> +    }
>>> +
>>> +    trace_send_bitmap_bits(flags, start_sector, nr_sectors, buf_size);
>>> +
>>> +    send_bitmap_header(f, dbms, flags);
>>> +
>>> +    qemu_put_be64(f, start_sector);
>>> +    qemu_put_be32(f, nr_sectors);
>>> +
>>> +    /* if a block is zero we need to flush here since the network
>>> +     * bandwidth is now a lot higher than the storage device bandwidth.
>>> +     * thus if we queue zero blocks we slow down the migration. */
>> Can you elaborate on this for me?
> 
> it comes from migration/block.c, as it was a prototype for dirty bitmaps
> migration.
> May be the original thought was to give destination storage more time to
> handle
> write-zeros? It may make sense if it can't do it fast but really writes
> zeros.
> 
>>
>>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
>>> +        qemu_fflush(f);
>>> +    } else {
>>> +        qemu_put_be64(f, buf_size);
>>> +        qemu_put_buffer(f, buf, buf_size);
>>> +    }
>>> +
>>> +    g_free(buf);
>>> +}
>>> +
>>> +
>>> +/* Called with iothread lock taken.  */
>>> +
>>> +static int init_dirty_bitmap_migration(void)
>>> +{
>>> +    BlockDriverState *bs;
>>> +    BdrvDirtyBitmap *bitmap;
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +    BdrvNextIterator it;
>>> +
>>> +    dirty_bitmap_mig_state.bulk_completed = false;
>>> +    dirty_bitmap_mig_state.prev_bs = NULL;
>>> +    dirty_bitmap_mig_state.prev_bitmap = NULL;
>>> +
>>> +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
>>> +        if (!bdrv_get_device_or_node_name(bs)) {
>>> +            /* not named non-root node */
>> I can't imagine the situation it would arise in, but is it possible to
>> have a named bitmap attached to a now-anonymous node?
>>
>> Let's say we attach a bitmap to a root node, but then later we insert a
>> filter or something above it and it's no longer at the root.
>>
>> We should probably prohibit such things, or at the very least toss out
>> an error here instead of silently continuing.
>>
>> I think the only things valid to just *skip* are nameless bitmaps.
>> Anything named we really ought to either migrate or error out over, I
>> think, even if the circumstances leading to such a configuration are
>> very unlikely.
> 
> agree, will fix.
> 
>>
>>> +            continue;
>>> +        }
>>> +
>>> +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
>>> +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
>>> +            if (!bdrv_dirty_bitmap_name(bitmap)) {
>>> +                continue;
>>> +            }
>>> +
>>> +            if (bdrv_dirty_bitmap_frozen(bitmap)) {
>>> +                error_report("Can't migrate frozen dirty bitmap: '%s",
>>> +                             bdrv_dirty_bitmap_name(bitmap));
>>> +                return -1;
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
>>> +        if (!bdrv_get_device_or_node_name(bs)) {
>>> +            /* not named non-root node */
>>> +            continue;
>>> +        }
>> Why two-pass? I guess because we don't have to tear anything down if we
>> check for errors in advance?
>>
>> I worry that if we need to amend the logic here that it's error-prone to
>> update it in two places, so maybe we ought to just have one loop.
> 
> why? just check all errors in first loop and then do all preparations in
> the second..
> 

Sure, keep it this way for now. It just struck me as odd, but you're the
one writing it and it's not wrong; I just wondered if there was a way to
not have to select the bitmaps to work on separately, twice.

If it doesn't strike you as particularly worth changing, then I wouldn't
worry about it.

>>
>>> +
>>> +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
>>> +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
>>> +            if (!bdrv_dirty_bitmap_name(bitmap)) {
>>> +                continue;
>>> +            }
>>> +
>>> +            bdrv_ref(bs);
>>> +            bdrv_dirty_bitmap_set_frozen(bitmap, true);
>>> +
>> We could say that for any bitmap in the list of pending bitmaps to
>> migrate, we know that we have to un-freeze it, since we never add any
>> bitmaps that are frozen to our list.
>>
>>> +            dbms = g_new0(DirtyBitmapMigBitmapState, 1);
>>> +            dbms->bs = bs;
>>> +            dbms->node_name = bdrv_get_node_name(bs);
>>> +            if (!dbms->node_name || dbms->node_name[0] == '\0') {
>>> +                dbms->node_name = bdrv_get_device_name(bs);
>>> +            }
>>> +            dbms->bitmap = bitmap;
>>> +            dbms->total_sectors = bdrv_nb_sectors(bs);
>>> +            dbms->sectors_per_chunk = CHUNK_SIZE * 8 *
>>> +                bdrv_dirty_bitmap_granularity(bitmap) >>
>>> BDRV_SECTOR_BITS;
>> Eric may want to avoid checking in new code that thinks in sectors, but
>> for the sake of review I don't mind right now.
>>
>> (Sorry, Eric!)
>>
>>> +            if (bdrv_dirty_bitmap_enabled(bitmap)) {
>>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_ENABLED;
>>> +            }
>>> +            if (bdrv_dirty_bitmap_get_persistance(bitmap)) {
>>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
>>> +            }
>>> +            if (bdrv_dirty_bitmap_get_autoload(bitmap)) {
>>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD;
>>> +            }
>>> +
>>> +            bdrv_dirty_bitmap_set_persistance(bitmap, false);
>> Oh, this might be stranger to undo. Perhaps what we CAN do is limit the
>> second pass to just this action and allow ourselves to unroll everything
>> else.
>>
>>> +
>>> +            QSIMPLEQ_INSERT_TAIL(&dirty_bitmap_mig_state.dbms_list,
>>> +                                 dbms, entry);
>>> +        }
>>> +    }
>>> +
> 
> hmm, I need to think about correct bitmap locking in the code
> (BdrvDirtyBitmap.lock)
> 

Only if you felt like combining the two loops.

>>> +    return 0;
>>> +}
>>> +
>>> +/* Called with no lock taken.  */
>>> +static void bulk_phase_send_chunk(QEMUFile *f,
>>> DirtyBitmapMigBitmapState *dbms)
>>> +{
>>> +    uint32_t nr_sectors = MIN(dbms->total_sectors - dbms->cur_sector,
>>> +                             dbms->sectors_per_chunk);
>>> +
>>> +    send_bitmap_bits(f, dbms, dbms->cur_sector, nr_sectors);
>>> +
>>> +    dbms->cur_sector += nr_sectors;
>>> +    if (dbms->cur_sector >= dbms->total_sectors) {
>>> +        dbms->bulk_completed = true;
>>> +    }
>>> +}
>>> +
>>> +/* Called with no lock taken.  */
>>> +static void bulk_phase(QEMUFile *f, bool limit)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +
>>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>>> +        while (!dbms->bulk_completed) {
>>> +            bulk_phase_send_chunk(f, dbms);
>>> +            if (limit && qemu_file_rate_limit(f)) {
>>> +                return;
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    dirty_bitmap_mig_state.bulk_completed = true;
>>> +}
>>> +
>>> +/* Called with iothread lock taken.  */
>>> +static void dirty_bitmap_mig_cleanup(void)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +
>>> +    while ((dbms =
>>> QSIMPLEQ_FIRST(&dirty_bitmap_mig_state.dbms_list)) != NULL) {
>>> +        QSIMPLEQ_REMOVE_HEAD(&dirty_bitmap_mig_state.dbms_list, entry);
>>> +        bdrv_dirty_bitmap_set_frozen(dbms->bitmap, false);
>>> +        bdrv_unref(dbms->bs);
>>> +        g_free(dbms);
>>> +    }
>>> +}
>>> +
>> ok
>>
>>> +/* for SaveVMHandlers */
>>> +static void dirty_bitmap_save_cleanup(void *opaque)
>>> +{
>>> +    dirty_bitmap_mig_cleanup();
>>> +}
>>> +
>> ok
>>
>>> +static int dirty_bitmap_save_iterate(QEMUFile *f, void *opaque)
>>> +{
>>> +    trace_dirty_bitmap_save_iterate(migration_in_postcopy());
>>> +
>>> +    if (migration_in_postcopy() &&
>>> !dirty_bitmap_mig_state.bulk_completed) {
>>> +        bulk_phase(f, true);
>>> +    }
>>> +
>>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>>> +
>>> +    return dirty_bitmap_mig_state.bulk_completed;
>>> +}
>>> +
>> What's the purpose behind doing bulk save both here and in
>> dirty_bitmap_save_complete? Is there a path that isn't guaranteed to
>> call one of the completion functions?
>>
>> (The way it's coded seems like it'll work fine, but I'm curious about
>> what looks like a redundancy at a glance.)
> 
> bulk_phase(f, true) is not guaranteed to do all the work. so in complete()
> we call it with false, to complete.
> 
> hmm, it is saved from precopy migration approach. And looks like really,
> in case of postcopy
> we need only blulk_phase(f, false) in _complete and nothing else. I'll
> check.
> 

OK, so more of a holdover that covers all the bases than something that
arose out of necessity. That makes sense to me.

>>
>>> +/* Called with iothread lock taken.  */
>>> +
>>> +static int dirty_bitmap_save_complete(QEMUFile *f, void *opaque)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +    trace_dirty_bitmap_save_complete_enter();
>>> +
>>> +    if (!dirty_bitmap_mig_state.bulk_completed) {
>>> +        bulk_phase(f, false);
>>> +    }
>>> +
>> funny now that we don't actually really iterate over the data, and the
>> bulk phase is now really the _only_ phase :)
>>
>>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>>> +        send_bitmap_complete(f, dbms);
>>> +    }
>>> +
>>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>>> +
>>> +    trace_dirty_bitmap_save_complete_finish();
>>> +
>>> +    dirty_bitmap_mig_cleanup();
>>> +    return 0;
>>> +}
>>> +
>> ok
>>
>>> +static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque,
>>> +                                      uint64_t max_size,
>>> +                                      uint64_t *res_precopy_only,
>>> +                                      uint64_t *res_compatible,
>>> +                                      uint64_t *res_postcopy_only)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +    uint64_t pending = 0;
>>> +
>>> +    qemu_mutex_lock_iothread();
>>> +
>>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>>> +        uint64_t gran = bdrv_dirty_bitmap_granularity(dbms->bitmap);
>>> +        uint64_t sectors = dbms->bulk_completed ? 0 :
>>> +                           dbms->total_sectors - dbms->cur_sector;
>>> +
>>> +        pending += (sectors * BDRV_SECTOR_SIZE + gran - 1) / gran;
>>> +    }
>>> +
>>> +    qemu_mutex_unlock_iothread();
>>> +
>>> +    trace_dirty_bitmap_save_pending(pending, max_size);
>>> +
>>> +    *res_postcopy_only += pending;
>>> +}
>>> +
>> ok
>>
>>> +/* First occurrence of this bitmap. It should be created if doesn't
>>> exist */
>>> +static int dirty_bitmap_load_start(QEMUFile *f, DirtyBitmapLoadState
>>> *s)
>>> +{
>>> +    Error *local_err = NULL;
>>> +    uint32_t granularity = qemu_get_be32(f);
>>> +    uint8_t flags = qemu_get_byte(f);
>>> +
>>> +    if (!s->bitmap) {
>>> +        s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
>>> +                                             s->bitmap_name,
>>> &local_err);
>>> +        if (!s->bitmap) {
>>> +            error_report_err(local_err);
>>> +            return -EINVAL;
>>> +        }
>>> +    } else {
>>> +        uint32_t dest_granularity =
>>> +            bdrv_dirty_bitmap_granularity(s->bitmap);
>>> +        if (dest_granularity != granularity) {
>>> +            error_report("Error: "
>>> +                         "Migrated bitmap granularity (%" PRIu32 ") "
>>> +                         "doesn't match the destination bitmap '%s' "
>>> +                         "granularity (%" PRIu32 ")",
>>> +                         granularity,
>>> +                         bdrv_dirty_bitmap_name(s->bitmap),
>>> +                         dest_granularity);
>>> +            return -EINVAL;
>>> +        }
>>> +    }
>>> +
>> I'm a fan of auto-creating the bitmaps. Do you have a use-case for why
>> creating them ahead of time is better, or are you just attempting to be
>> flexible?
> 
> the second. I just was my first approach about two years ago and it was not
> discussed until now). In our scenarios we use auto-creating way. So, it may
> be better to just fail if corresponding bitmap exists on destination
> without
> any granularity checks.
> 
I don't think you need to change anything yet, I was just curious as to
what inspired the flexibility here.

>>
>>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK) {
>>> +        error_report("Unknown flags in migrated dirty bitmap header:
>>> %x",
>>> +                     flags);
>>> +        return -EINVAL;
>>> +    }
>>> +
>>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) {
>>> +        bdrv_dirty_bitmap_set_persistance(s->bitmap, true);
>>> +    }
>>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD) {
>>> +        bdrv_dirty_bitmap_set_autoload(s->bitmap, true);
>>> +    }
>>> +
>>> +    bdrv_disable_dirty_bitmap(s->bitmap);
>> OK, so we start them off as disabled, and
>>
>>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
>>> +        DirtyBitmapLoadBitmapState *b;
>>> +
>>> +        bdrv_dirty_bitmap_create_successor(s->bs, s->bitmap,
>>> &local_err);
>>> +        if (local_err) {
>>> +            error_report_err(local_err);
>>> +            return -EINVAL;
>>> +        }
>>> +
>> If they weren't disabled on the host, we create a successor to record
>> writes while we wait for the rest of the data to arrive.
>>
>>> +        b = g_new(DirtyBitmapLoadBitmapState, 1);
>>> +        b->bs = s->bs;
>>> +        b->bitmap = s->bitmap;
>>> +        b->migrated = false;
>>> +        enabled_bitmaps = g_slist_prepend(enabled_bitmaps, b);
>> And we make a note of which ones we were supposed to re-enable.
>>
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>> OK
>>
>>> +
>>> +void dirty_bitmap_mig_before_vm_start(void)
>> Similarly, I guess I find it weird that this is a callable interface.
>>
>> David, no nice hook for just-prior-to-vm-start calls? a
>> .postcopy_pivot() hook or something might be nice..
>>
>>> +{
>>> +    GSList *item;
>>> +
>>> +    qemu_mutex_lock(&finish_lock);
>>> +
>>> +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
>>> +        DirtyBitmapLoadBitmapState *b = item->data;
>>> +
>> Anyway, if I am reading this right; we call this in the postcopy phase
>> prior to receiving the entirety of the bitmaps (so before receiving
>> COMPLETE) ... right?
>>
>>> +        if (b->migrated) {
>>> +            bdrv_enable_dirty_bitmap(b->bitmap);
> 
> This is the most difficult thing here. Race is possible between postcopy
> complete
> and vm start. So, here is a finish_lock. And bitmap may be already
> migrated or not.
> 

That makes sense. Figured it could be something of the kind, but wanted
to make sure I was reading it right.

>> ...or, am I confused, and we might receive a COMPLETE event prior to the
>> postcopy pivot?
>>
>> Anyway, I suppose this code says "If we received the entire bitmap, go
>> ahead and enable it."
>>
>>> +        } else {
>>> +            bdrv_dirty_bitmap_enable_successor(b->bitmap);
>> And this says "If we haven't received it yet, enable the successor to
>> record writes until we get the rest of the data."
> 
> yes
> 
>>
>>> +        }
>>> +
>>> +        g_free(b);
>>> +    }
>>> +
>>> +    g_slist_free(enabled_bitmaps);
>>> +    enabled_bitmaps = NULL;
>>> +
>>> +    qemu_mutex_unlock(&finish_lock);
>>> +}
>>> +
>>> +static void dirty_bitmap_load_complete(QEMUFile *f,
>>> DirtyBitmapLoadState *s)
>>> +{
>>> +    GSList *item;
>>> +    trace_dirty_bitmap_load_complete();
>>> +    bdrv_dirty_bitmap_deserialize_finish(s->bitmap);
>>> +
>>> +    qemu_mutex_lock(&finish_lock);
>>> +
>>> +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
>>> +        DirtyBitmapLoadBitmapState *b = item->data;
>>> +
>>> +        if (b->bitmap == s->bitmap) {
>>> +            b->migrated = true;
>> we can probably break; here now, right?
> 
> agree.
> 
>>
>> (This whole stanza is a little strange, can't we cache the active
>> DirtyBitmapLoadBitmapState in DirtyBitmapLoadState? I guess not, because
>> we're looking up the BdrvDirtyBitmap itself and caching that instead, so
>> either way we have some kind of lookup on every context switch.)
> 
> this search is needed only once, so caching will not help.
> 

Yep, gotcha.

>>
>>> +        }
>>> +    }
>>> +
>>> +    if (bdrv_dirty_bitmap_frozen(s->bitmap)) {
>>> +        if (enabled_bitmaps == NULL) {
>>> +            /* in postcopy */
>>> +            AioContext *aio_context = bdrv_get_aio_context(s->bs);
>>> +            aio_context_acquire(aio_context);
> 
> looks like it should be moved to use new BdrvDirtyBitmap locks.
> 

Good catch!

>>> +
>>> +            bdrv_reclaim_dirty_bitmap(s->bs, s->bitmap, &error_abort);
>>> +            bdrv_enable_dirty_bitmap(s->bitmap);
>>> +
>> OK, so if enabled_bitmaps is gone, that means we already pivoted and
>> we're live on the receiving end here. We merge the successor into the
>> fully deserialized bitmap and enable it.
>>
>>> +            aio_context_release(aio_context);
>>> +        } else {
>>> +            /* target not started, successor is empty */
>>> +            bdrv_dirty_bitmap_release_successor(s->bs, s->bitmap);
>> Otherwise we just trash the successor. Did we really need a new call for
>> this? I suppose it's faster than merging a 0-bit bitmap, but the
>> additional API complexity for the speed win here seems like premature
>> optimization.
>>
>> ...well, you already wrote it, so I won't argue.
> 
> right idea. However in this case (and even with my approach) it is good
> to assert here
> that successor is empty. and additional api is needed for it.
> 

Sure, it's less flexible and that will help us spot errors in our
thinking. Can't argue with that.

>>
>>> +        }
>>> +    }
>>> +
>>> +    qemu_mutex_unlock(&finish_lock);
>>> +}
>>> +
>>> +static int dirty_bitmap_load_bits(QEMUFile *f, DirtyBitmapLoadState *s)
>>> +{
>>> +    uint64_t first_byte = qemu_get_be64(f) << BDRV_SECTOR_BITS;
>>> +    uint64_t nr_bytes = (uint64_t)qemu_get_be32(f) << BDRV_SECTOR_BITS;
>>> +    trace_dirty_bitmap_load_bits_enter(first_byte >> BDRV_SECTOR_BITS,
>>> +                                       nr_bytes >> BDRV_SECTOR_BITS);
>>> +
>>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
>>> +        trace_dirty_bitmap_load_bits_zeroes();
>>> +        bdrv_dirty_bitmap_deserialize_zeroes(s->bitmap, first_byte,
>>> nr_bytes,
>>> +                                             false);
>>> +    } else {
>>> +        uint8_t *buf;
>>> +        uint64_t buf_size = qemu_get_be64(f);
>>> +        uint64_t needed_size =
>>> +            bdrv_dirty_bitmap_serialization_size(s->bitmap,
>>> +                                                 first_byte, nr_bytes);
>>> +
>>> +        if (needed_size > buf_size) {
>>> +            error_report("Error: Migrated bitmap granularity doesn't "
>>> +                         "match the destination bitmap '%s'
>>> granularity",
>>> +                         bdrv_dirty_bitmap_name(s->bitmap));
>>> +            return -EINVAL;
>>> +        }
>>> +
>>> +        buf = g_malloc(buf_size);
>>> +        qemu_get_buffer(f, buf, buf_size);
>>> +        bdrv_dirty_bitmap_deserialize_part(s->bitmap, buf,
>>> first_byte, nr_bytes,
>>> +                                           false);
>>> +        g_free(buf);
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>> ok
>>
>>> +static int dirty_bitmap_load_header(QEMUFile *f,
>>> DirtyBitmapLoadState *s)
>>> +{
>>> +    Error *local_err = NULL;
>>> +    s->flags = qemu_get_bitmap_flags(f);
>>> +    trace_dirty_bitmap_load_header(s->flags);
>>> +
>>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
>>> +        if (!qemu_get_counted_string(f, s->node_name)) {
>>> +            error_report("Unable to read node name string");
>>> +            return -EINVAL;
>>> +        }
>>> +        s->bs = bdrv_lookup_bs(s->node_name, s->node_name, &local_err);
>>> +        if (!s->bs) {
>>> +            error_report_err(local_err);
>>> +            return -EINVAL;
>>> +        }
>>> +    } else if (!s->bs) {
>>> +        error_report("Error: block device name is not set");
>>> +        return -EINVAL;
>>> +    }
>>> +
>>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
>>> +        if (!qemu_get_counted_string(f, s->bitmap_name)) {
>>> +            error_report("Unable to read node name string");
>>> +            return -EINVAL;
>>> +        }
>>> +        s->bitmap = bdrv_find_dirty_bitmap(s->bs, s->bitmap_name);
>>> +
>>> +        /* bitmap may be NULL here, it wouldn't be an error if it is
>>> the
>>> +         * first occurrence of the bitmap */
>>> +        if (!s->bitmap && !(s->flags & DIRTY_BITMAP_MIG_FLAG_START)) {
>>> +            error_report("Error: unknown dirty bitmap "
>>> +                         "'%s' for block device '%s'",
>>> +                         s->bitmap_name, s->node_name);
>>> +            return -EINVAL;
>>> +        }
>>> +    } else if (!s->bitmap) {
>>> +        error_report("Error: block device name is not set");
>>> +        return -EINVAL;
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>> ok
>>
>>> +static int dirty_bitmap_load(QEMUFile *f, void *opaque, int version_id)
>>> +{
>>> +    static DirtyBitmapLoadState s;
>>> +    int ret = 0;
>>> +
>>> +    trace_dirty_bitmap_load_enter();
>>> +
>>> +    if (version_id != 1) {
>>> +        return -EINVAL;
>>> +    }
>>> +
>>> +    do {
>>> +        dirty_bitmap_load_header(f, &s);
>>> +
>>> +        if (s.flags & DIRTY_BITMAP_MIG_FLAG_START) {
>>> +            ret = dirty_bitmap_load_start(f, &s);
>>> +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_COMPLETE) {
>>> +            dirty_bitmap_load_complete(f, &s);
>>> +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_BITS) {
>>> +            ret = dirty_bitmap_load_bits(f, &s);
>>> +        }
>>> +
>>> +        if (!ret) {
>>> +            ret = qemu_file_get_error(f);
>>> +        }
>>> +
>>> +        if (ret) {
>>> +            return ret;
>>> +        }
>>> +    } while (!(s.flags & DIRTY_BITMAP_MIG_FLAG_EOS));
>>> +
>>> +    trace_dirty_bitmap_load_success();
>>> +    return 0;
>>> +}
>> OK
>>
>>> +
>>> +static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms = NULL;
>>> +    if (init_dirty_bitmap_migration() < 0) {
>>> +        return -1;
>>> +    }
>>> +
>>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>>> +        send_bitmap_start(f, dbms);
>>> +    }
>>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>>> +
>>> +    return 0;
>>> +}
>>> +
>> ok
>>
>>> +static bool dirty_bitmap_is_active(void *opaque)
>>> +{
>>> +    return migrate_dirty_bitmaps();
>>> +}
>>> +
>> ok
>>
>>> +static bool dirty_bitmap_is_active_iterate(void *opaque)
>>> +{
>>> +    return dirty_bitmap_is_active(opaque) && !runstate_is_running();
>>> +}
>>> +
>> On second thought, in patch 9, can you add a little tiny bit of
>> documentation text explaining the exact nature of this callback?
>>
>> Is the second portion of the conditional here so that once we reach the
>> postcopy state that .is_active_iterate starts returning true?
>>
>> "ok" if I'm reading this right, but it might be helped along by a little
>> comment.
> 
> yes. ok, I'll add a comment.
> 
>>
>>> +static bool dirty_bitmap_has_postcopy(void *opaque)
>>> +{
>>> +    return true;
>>> +}
>>> +
>> ok! :)
>>
>>> +static SaveVMHandlers savevm_dirty_bitmap_handlers = {
>>> +    .save_setup = dirty_bitmap_save_setup,
>>> +    .save_live_complete_postcopy = dirty_bitmap_save_complete,
>>> +    .save_live_complete_precopy = dirty_bitmap_save_complete,
>>> +    .has_postcopy = dirty_bitmap_has_postcopy,
>>> +    .save_live_pending = dirty_bitmap_save_pending,
>>> +    .save_live_iterate = dirty_bitmap_save_iterate,
>>> +    .is_active_iterate = dirty_bitmap_is_active_iterate,
>>> +    .load_state = dirty_bitmap_load,
>>> +    .save_cleanup = dirty_bitmap_save_cleanup,
>>> +    .is_active = dirty_bitmap_is_active,
>>> +};
>>> +
>>> +void dirty_bitmap_mig_init(void)
>>> +{
>>> +    QSIMPLEQ_INIT(&dirty_bitmap_mig_state.dbms_list);
>>> +
>>> +    register_savevm_live(NULL, "dirty-bitmap", 0, 1,
>>> +                         &savevm_dirty_bitmap_handlers,
>>> +                         &dirty_bitmap_mig_state);
>>> +}
>> ok
>>
>> dgilbert, would it be worth registering a block-driver-like registration
>> trick that automatically invokes these functions instead of having to
>> hook them up in vl.c? the more we add, the more hacky it looks to not
>> have some subsystem-wide registration hook.
>>
>>> diff --git a/migration/migration.c b/migration/migration.c
>>> index e973837bfd..66e9cf03cd 100644
>>> --- a/migration/migration.c
>>> +++ b/migration/migration.c
>>> @@ -150,6 +150,9 @@ MigrationIncomingState
>>> *migration_incoming_get_current(void)
>>>           memset(&mis_current, 0, sizeof(MigrationIncomingState));
>>>           qemu_mutex_init(&mis_current.rp_mutex);
>>>           qemu_event_init(&mis_current.main_thread_load_event, false);
>>> +
>>> +        init_dirty_bitmap_incoming_migration();
>>> +
>>>           once = true;
>>>       }
>>>       return &mis_current;
>>> diff --git a/migration/savevm.c b/migration/savevm.c
>>> index 9bbfb3fa1b..b0c37ef9f1 100644
>>> --- a/migration/savevm.c
>>> +++ b/migration/savevm.c
>>> @@ -1673,6 +1673,8 @@ static void loadvm_postcopy_handle_run_bh(void
>>> *opaque)
>>>         trace_loadvm_postcopy_handle_run_vmstart();
>>>   +    dirty_bitmap_mig_before_vm_start();
>>> +
>>>       if (autostart) {
>>>           /* Hold onto your hats, starting the CPU */
>>>           vm_start();
>>> diff --git a/vl.c b/vl.c
>>> index ec299099ff..3d393aaf2c 100644
>>> --- a/vl.c
>>> +++ b/vl.c
>>> @@ -4642,6 +4642,7 @@ int main(int argc, char **argv, char **envp)
>>>         blk_mig_init();
>>>       ram_mig_init();
>>> +    dirty_bitmap_mig_init();
>>>         /* If the currently selected machine wishes to override the
>>> units-per-bus
>>>        * property of its default HBA interface type, do so now. */
>>> diff --git a/migration/Makefile.objs b/migration/Makefile.objs
>>> index 99e038024d..c83ec47ba8 100644
>>> --- a/migration/Makefile.objs
>>> +++ b/migration/Makefile.objs
>>> @@ -6,6 +6,7 @@ common-obj-y += qemu-file.o global_state.o
>>>   common-obj-y += qemu-file-channel.o
>>>   common-obj-y += xbzrle.o postcopy-ram.o
>>>   common-obj-y += qjson.o
>>> +common-obj-y += block-dirty-bitmap.o
>>>     common-obj-$(CONFIG_RDMA) += rdma.o
>>>   diff --git a/migration/trace-events b/migration/trace-events
>>> index a04fffb877..e9eb8078d4 100644
>>> --- a/migration/trace-events
>>> +++ b/migration/trace-events
>>> @@ -227,3 +227,17 @@ colo_vm_state_change(const char *old, const char
>>> *new) "Change '%s' => '%s'"
>>>   colo_send_message(const char *msg) "Send '%s' message"
>>>   colo_receive_message(const char *msg) "Receive '%s' message"
>>>   colo_failover_set_state(const char *new_state) "new state %s"
>>> +
>>> +# migration/block-dirty-bitmap.c
>>> +send_bitmap_header_enter(void) ""
>>> +send_bitmap_bits(uint32_t flags, uint64_t start_sector, uint32_t
>>> nr_sectors, uint64_t data_size) "\n   flags:        0x%x\n  
>>> start_sector: %" PRIu64 "\n   nr_sectors:   %" PRIu32 "\n  
>>> data_size:    %" PRIu64 "\n"
>>> +dirty_bitmap_save_iterate(int in_postcopy) "in postcopy: %d"
>>> +dirty_bitmap_save_complete_enter(void) ""
>>> +dirty_bitmap_save_complete_finish(void) ""
>>> +dirty_bitmap_save_pending(uint64_t pending, uint64_t max_size)
>>> "pending %" PRIu64 " max: %" PRIu64
>>> +dirty_bitmap_load_complete(void) ""
>>> +dirty_bitmap_load_bits_enter(uint64_t first_sector, uint32_t
>>> nr_sectors) "chunk: %" PRIu64 " %" PRIu32
>>> +dirty_bitmap_load_bits_zeroes(void) ""
>>> +dirty_bitmap_load_header(uint32_t flags) "flags 0x%x"
>>> +dirty_bitmap_load_enter(void) ""
>>> +dirty_bitmap_load_success(void) ""
>>>
>> OK, I think everything here is probably in order, and it's only my
>> understanding that is a barrier at this point. Help me understand the
>> rest of this patch and I'll re-pester migration to get this staged for
>> qemu-next.
>>
>> --js
> 
> Thank you for reviewing! I hope, I'll post new version next week.
> 

It looks pretty much all set from my end apart from just minor little
things. Max reviewed most of the tests and Juan reviewed most of the
migration system bits, so I'm hopeful that this will be done soon.

Thanks!

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps
  2017-11-16 16:50     ` Dr. David Alan Gilbert
@ 2017-11-17  1:27       ` John Snow
  0 siblings, 0 replies; 44+ messages in thread
From: John Snow @ 2017-11-17  1:27 UTC (permalink / raw)
  To: Dr. David Alan Gilbert
  Cc: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel, kwolf,
	peter.maydell, famz, lirans, quintela, armbru, mreitz, stefanha,
	den, amit.shah, pbonzini



On 11/16/2017 11:50 AM, Dr. David Alan Gilbert wrote:
> * John Snow (jsnow@redhat.com) wrote:
>>
>>
>> On 10/30/2017 12:33 PM, Vladimir Sementsov-Ogievskiy wrote:
>>> Postcopy migration of dirty bitmaps. Only named dirty bitmaps,
>>> associated with root nodes and non-root named nodes are migrated.
>>>
>>> If destination qemu is already containing a dirty bitmap with the same name
>>> as a migrated bitmap (for the same node), then, if their granularities are
>>> the same the migration will be done, otherwise the error will be generated.
>>>
>>> If destination qemu doesn't contain such bitmap it will be created.
>>>
>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> ---
>>>  include/migration/misc.h       |   3 +
>>>  migration/migration.h          |   3 +
>>>  migration/block-dirty-bitmap.c | 734 +++++++++++++++++++++++++++++++++++++++++
>>
>> Ouch :\
>>
>>>  migration/migration.c          |   3 +
>>>  migration/savevm.c             |   2 +
>>>  vl.c                           |   1 +
>>>  migration/Makefile.objs        |   1 +
>>>  migration/trace-events         |  14 +
>>>  8 files changed, 761 insertions(+)
>>>  create mode 100644 migration/block-dirty-bitmap.c
>>>
>>
>> Organizationally, you introduce three new 'public' prototypes:
>>
>> dirty_bitmap_mig_init
>> dirty_bitmap_mig_before_vm_start
>> init_dirty_bitmap_incoming_migration
>>
>> mig_init is advertised in migration/misc.h, the other two are in
>> migration/migration.h.
>> The definitions for all three are in migration/block-dirty-bitmap.c
>>
>> In pure naivety, I find it weird to have something that you use in
>> migration.c and advertised in migration.h actually exist separately in
>> block-dirty-bitmap.c; but maybe this is the sanest thing to do.
> 
> Actually I think that's OK; it makes sense for all of the code for this
> feature to sit in one place,   and there doesn't seem any point creating
> a header just for this one function.
> 

OK, just stood out to me at first. I don't really have better ideas.

>>> diff --git a/include/migration/misc.h b/include/migration/misc.h
>>> index c079b7771b..9cc539e232 100644
>>> --- a/include/migration/misc.h
>>> +++ b/include/migration/misc.h
>>> @@ -55,4 +55,7 @@ bool migration_has_failed(MigrationState *);
>>>  bool migration_in_postcopy_after_devices(MigrationState *);
>>>  void migration_global_dump(Monitor *mon);
>>>  
>>> +/* migration/block-dirty-bitmap.c */
>>> +void dirty_bitmap_mig_init(void);
>>> +
>>>  #endif
>>> diff --git a/migration/migration.h b/migration/migration.h
>>> index 50d1f01346..4e3ad04664 100644
>>> --- a/migration/migration.h
>>> +++ b/migration/migration.h
>>> @@ -211,4 +211,7 @@ void migrate_send_rp_pong(MigrationIncomingState *mis,
>>>  void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
>>>                                ram_addr_t start, size_t len);
>>>  
>>> +void dirty_bitmap_mig_before_vm_start(void);
>>> +void init_dirty_bitmap_incoming_migration(void);
>>> +
>>>  #endif
>>> diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
>>> new file mode 100644
>>> index 0000000000..53cb20045d
>>> --- /dev/null
>>> +++ b/migration/block-dirty-bitmap.c
>>> @@ -0,0 +1,734 @@
>>> +/*
>>> + * Block dirty bitmap postcopy migration
>>> + *
>>> + * Copyright IBM, Corp. 2009
>>> + * Copyright (c) 2016-2017 Parallels International GmbH
>>> + *
>>> + * Authors:
>>> + *  Liran Schour   <lirans@il.ibm.com>
>>> + *  Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> + *
>>> + * This work is licensed under the terms of the GNU GPL, version 2.  See
>>> + * the COPYING file in the top-level directory.
>>> + * This file is derived from migration/block.c, so it's author and IBM copyright
>>> + * are here, although content is quite different.
>>> + *
>>> + * Contributions after 2012-01-13 are licensed under the terms of the
>>> + * GNU GPL, version 2 or (at your option) any later version.
>>> + *
>>> + *                                ***
>>> + *
>>> + * Here postcopy migration of dirty bitmaps is realized. Only named dirty
>>> + * bitmaps, associated with root nodes and non-root named nodes are migrated.
>>
>> Put another way, only QMP-addressable bitmaps. Nodes without a name that
>> are not the root have no way to be addressed.
>>
>>> + *
>>> + * If destination qemu is already containing a dirty bitmap with the same name
>>
>> "If the destination QEMU already contains a dirty bitmap with the same name"
>>
>>> + * as a migrated bitmap (for the same node), then, if their granularities are
>>> + * the same the migration will be done, otherwise the error will be generated.
>>
>> "an error"
>>
>>> + *
>>> + * If destination qemu doesn't contain such bitmap it will be created.
>>
>> "If the destination QEMU doesn't contain such a bitmap, it will be created."
>>
>>> + *
>>> + * format of migration:
>>> + *
>>> + * # Header (shared for different chunk types)
>>> + * 1, 2 or 4 bytes: flags (see qemu_{put,put}_flags)
>>> + * [ 1 byte: node name size ] \  flags & DEVICE_NAME
>>> + * [ n bytes: node name     ] /
>>> + * [ 1 byte: bitmap name size ] \  flags & BITMAP_NAME
>>> + * [ n bytes: bitmap name     ] /
>>> + *
>>> + * # Start of bitmap migration (flags & START)
>>> + * header
>>> + * be64: granularity
>>> + * 1 byte: bitmap flags (corresponds to BdrvDirtyBitmap)
>>> + *   bit 0    -  bitmap is enabled
>>> + *   bit 1    -  bitmap is persistent
>>> + *   bit 2    -  bitmap is autoloading
>>> + *   bits 3-7 - reserved, must be zero
>>> + *
>>> + * # Complete of bitmap migration (flags & COMPLETE)
>>> + * header
>>> + *
>>> + * # Data chunk of bitmap migration
>>> + * header
>>> + * be64: start sector
>>> + * be32: number of sectors
>>> + * [ be64: buffer size  ] \ ! (flags & ZEROES)
>>> + * [ n bytes: buffer    ] /
>>> + *
>>> + * The last chunk in stream should contain flags & EOS. The chunk may skip
>>> + * device and/or bitmap names, assuming them to be the same with the previous
>>> + * chunk.
>>> + */
>>> +
>>
>> Been a while since I reviewed the format, but it seems sane.
>>
>>> +#include "qemu/osdep.h"
>>> +#include "block/block.h"
>>> +#include "block/block_int.h"
>>> +#include "sysemu/block-backend.h"
>>> +#include "qemu/main-loop.h"
>>> +#include "qemu/error-report.h"
>>> +#include "migration/misc.h"
>>> +#include "migration/migration.h"
>>> +#include "migration/qemu-file.h"
>>> +#include "migration/vmstate.h"
>>> +#include "migration/register.h"
>>> +#include "qemu/hbitmap.h"
>>> +#include "sysemu/sysemu.h"
>>> +#include "qemu/cutils.h"
>>> +#include "qapi/error.h"
>>> +#include "trace.h"
>>> +
>>> +#define CHUNK_SIZE     (1 << 10)
>>> +
>>> +/* Flags occupy one, two or four bytes (Big Endian). The size is determined as
>>> + * follows:
>>> + * in first (most significant) byte bit 8 is clear  -->  one byte
>>> + * in first byte bit 8 is set    -->  two or four bytes, depending on second
>>> + *                                    byte:
>>> + *    | in second byte bit 8 is clear  -->  two bytes
>>> + *    | in second byte bit 8 is set    -->  four bytes
>>> + */
>>> +#define DIRTY_BITMAP_MIG_FLAG_EOS           0x01
>>> +#define DIRTY_BITMAP_MIG_FLAG_ZEROES        0x02
>>> +#define DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME   0x04
>>> +#define DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME   0x08
>>> +#define DIRTY_BITMAP_MIG_FLAG_START         0x10
>>> +#define DIRTY_BITMAP_MIG_FLAG_COMPLETE      0x20
>>> +#define DIRTY_BITMAP_MIG_FLAG_BITS          0x40
>>> +
>>> +#define DIRTY_BITMAP_MIG_EXTRA_FLAGS        0x80
>>> +
>>> +#define DIRTY_BITMAP_MIG_START_FLAG_ENABLED          0x01
>>> +#define DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT       0x02
>>> +#define DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD         0x04
>>> +#define DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK    0xf8
>>> +
>>> +typedef struct DirtyBitmapMigBitmapState {
>>> +    /* Written during setup phase. */
>>> +    BlockDriverState *bs;
>>> +    const char *node_name;
>>> +    BdrvDirtyBitmap *bitmap;
>>> +    uint64_t total_sectors;
>>> +    uint64_t sectors_per_chunk;
>>> +    QSIMPLEQ_ENTRY(DirtyBitmapMigBitmapState) entry;
>>> +    uint8_t flags;
>>> +
>>> +    /* For bulk phase. */
>>> +    bool bulk_completed;
>>> +    uint64_t cur_sector;
>>> +} DirtyBitmapMigBitmapState;
>>> +
>>> +typedef struct DirtyBitmapMigState {
>>> +    QSIMPLEQ_HEAD(dbms_list, DirtyBitmapMigBitmapState) dbms_list;
>>> +
>>> +    bool bulk_completed;
>>> +
>>> +    /* for send_bitmap_bits() */
>>> +    BlockDriverState *prev_bs;
>>> +    BdrvDirtyBitmap *prev_bitmap;
>>> +} DirtyBitmapMigState;
>>> +
>>> +typedef struct DirtyBitmapLoadState {
>>> +    uint32_t flags;
>>> +    char node_name[256];
>>> +    char bitmap_name[256];
>>> +    BlockDriverState *bs;
>>> +    BdrvDirtyBitmap *bitmap;
>>> +} DirtyBitmapLoadState;
>>> +
>>> +static DirtyBitmapMigState dirty_bitmap_mig_state;
>>> +
>>> +typedef struct DirtyBitmapLoadBitmapState {
>>> +    BlockDriverState *bs;
>>> +    BdrvDirtyBitmap *bitmap;
>>> +    bool migrated;
>>> +} DirtyBitmapLoadBitmapState;
>>> +static GSList *enabled_bitmaps;
>>> +QemuMutex finish_lock;
>>> +
>>> +void init_dirty_bitmap_incoming_migration(void)
>>> +{
>>> +    qemu_mutex_init(&finish_lock);
>>> +}
>>> +
>>
>> This is a little odd as public interface. David, is there a nicer way to
>> integrate in-migrate hooks? I guess it hasn't come up yet. Anyway, it
>> might be nice to leave a comment here for now that says that the only
>> caller is migration.c, and it will only ever call it once.
> 
> I don't think having an init_ function like that is a problem;
> we've got an init_blk_migration, so I guess it's similar.
> I generally prefer things to be part of the incoming state structure
> rather than a file global; but that's not a huge one.
> 

Okey-Dokey.

>>> +static uint32_t qemu_get_bitmap_flags(QEMUFile *f)
>>> +{
>>> +    uint8_t flags = qemu_get_byte(f);
>>> +    if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
>>> +        flags = flags << 8 | qemu_get_byte(f);
>>> +        if (flags & DIRTY_BITMAP_MIG_EXTRA_FLAGS) {
>>> +            flags = flags << 16 | qemu_get_be16(f);
>>> +        }
>>> +    }
>>> +
>>> +    return flags;
>>> +}
>>> +
>>
>> ok
>>
>> (Sorry for the per-function ACKs, it's just helpful for me to know which
>> functions I followed execution of on paper to make sure I got everything
>> in this big patch.)
>>
>>> +static void qemu_put_bitmap_flags(QEMUFile *f, uint32_t flags)
>>> +{
>>> +    /* The code currently do not send flags more than one byte */
>>> +    assert(!(flags & (0xffffff00 | DIRTY_BITMAP_MIG_EXTRA_FLAGS)));
>>> +
>>> +    qemu_put_byte(f, flags);
>>> +}
>>> +
>>
>> ok
>>
>>> +static void send_bitmap_header(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
>>> +                               uint32_t additional_flags)
>>> +{
>>> +    BlockDriverState *bs = dbms->bs;
>>> +    BdrvDirtyBitmap *bitmap = dbms->bitmap;
>>> +    uint32_t flags = additional_flags;
>>> +    trace_send_bitmap_header_enter();
>>> +
>>> +    if (bs != dirty_bitmap_mig_state.prev_bs) {
>>> +        dirty_bitmap_mig_state.prev_bs = bs;
>>> +        flags |= DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME;
>>> +    }
>>> +
>>> +    if (bitmap != dirty_bitmap_mig_state.prev_bitmap) {
>>> +        dirty_bitmap_mig_state.prev_bitmap = bitmap;
>>> +        flags |= DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME;
>>> +    }
>>> +
>>
>> I guess the idea here is that we might be able to skip the node name
>> broadcast, leaving the possibilities as:
>>
>> - new node and bitmap: send both
>> - new bitmap, but not node: send bitmap name only
>> - same for both: send neither
>>
>> and that otherwise it's not possible to have a new node but "same
>> bitmap" by nature of how the structures are organized.
>>
>>> +    qemu_put_bitmap_flags(f, flags);
>>> +
>>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
>>> +        qemu_put_counted_string(f, dbms->node_name);
>>> +    }
>>> +
>>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
>>> +        qemu_put_counted_string(f, bdrv_dirty_bitmap_name(bitmap));
>>> +    }
>>> +}
>>> +
>>
>> ok
>>
>>> +static void send_bitmap_start(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
>>> +{
>>> +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_START);
>>> +    qemu_put_be32(f, bdrv_dirty_bitmap_granularity(dbms->bitmap));
>>> +    qemu_put_byte(f, dbms->flags);
>>> +}
>>> +
>>
>> ok
>>
>>> +static void send_bitmap_complete(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
>>> +{
>>> +    send_bitmap_header(f, dbms, DIRTY_BITMAP_MIG_FLAG_COMPLETE);
>>> +}
>>> +
>>
>> ok
>>
>>> +static void send_bitmap_bits(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
>>> +                             uint64_t start_sector, uint32_t nr_sectors)
>>> +{
>>> +    /* align for buffer_is_zero() */
>>> +    uint64_t align = 4 * sizeof(long);
>>> +    uint64_t unaligned_size =
>>> +        bdrv_dirty_bitmap_serialization_size(
>>> +            dbms->bitmap, start_sector << BDRV_SECTOR_BITS,
>>> +            (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
>>> +    uint64_t buf_size = (unaligned_size + align - 1) & ~(align - 1);
>>> +    uint8_t *buf = g_malloc0(buf_size);
>>> +    uint32_t flags = DIRTY_BITMAP_MIG_FLAG_BITS;
>>> +
>>> +    bdrv_dirty_bitmap_serialize_part(
>>> +        dbms->bitmap, buf, start_sector << BDRV_SECTOR_BITS,
>>> +        (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
>>> +
>>> +    if (buffer_is_zero(buf, buf_size)) {
>>> +        g_free(buf);
>>> +        buf = NULL;
>>> +        flags |= DIRTY_BITMAP_MIG_FLAG_ZEROES;
>>> +    }
>>> +
>>> +    trace_send_bitmap_bits(flags, start_sector, nr_sectors, buf_size);
>>> +
>>> +    send_bitmap_header(f, dbms, flags);
>>> +
>>> +    qemu_put_be64(f, start_sector);
>>> +    qemu_put_be32(f, nr_sectors);
>>> +
>>> +    /* if a block is zero we need to flush here since the network
>>> +     * bandwidth is now a lot higher than the storage device bandwidth.
>>> +     * thus if we queue zero blocks we slow down the migration. */
>>
>> Can you elaborate on this for me?
>>
>>> +    if (flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
>>> +        qemu_fflush(f);
>>> +    } else {
>>> +        qemu_put_be64(f, buf_size);
>>> +        qemu_put_buffer(f, buf, buf_size);
>>> +    }
>>> +
>>> +    g_free(buf);
>>> +}
>>> +
>>> +
>>> +/* Called with iothread lock taken.  */
>>> +
>>> +static int init_dirty_bitmap_migration(void)
>>> +{
>>> +    BlockDriverState *bs;
>>> +    BdrvDirtyBitmap *bitmap;
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +    BdrvNextIterator it;
>>> +
>>> +    dirty_bitmap_mig_state.bulk_completed = false;
>>> +    dirty_bitmap_mig_state.prev_bs = NULL;
>>> +    dirty_bitmap_mig_state.prev_bitmap = NULL;
>>> +
>>> +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
>>> +        if (!bdrv_get_device_or_node_name(bs)) {
>>> +            /* not named non-root node */
>>
>> I can't imagine the situation it would arise in, but is it possible to
>> have a named bitmap attached to a now-anonymous node?
>>
>> Let's say we attach a bitmap to a root node, but then later we insert a
>> filter or something above it and it's no longer at the root.
>>
>> We should probably prohibit such things, or at the very least toss out
>> an error here instead of silently continuing.
>>
>> I think the only things valid to just *skip* are nameless bitmaps.
>> Anything named we really ought to either migrate or error out over, I
>> think, even if the circumstances leading to such a configuration are
>> very unlikely.
>>
>>> +            continue;
>>> +        }
>>> +
>>> +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
>>> +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
>>> +            if (!bdrv_dirty_bitmap_name(bitmap)) {
>>> +                continue;
>>> +            }
>>> +
>>> +            if (bdrv_dirty_bitmap_frozen(bitmap)) {
>>> +                error_report("Can't migrate frozen dirty bitmap: '%s",
>>> +                             bdrv_dirty_bitmap_name(bitmap));
>>> +                return -1;
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
>>> +        if (!bdrv_get_device_or_node_name(bs)) {
>>> +            /* not named non-root node */
>>> +            continue;
>>> +        }
>>
>> Why two-pass? I guess because we don't have to tear anything down if we
>> check for errors in advance?
>>
>> I worry that if we need to amend the logic here that it's error-prone to
>> update it in two places, so maybe we ought to just have one loop.
>>
>>> +
>>> +        for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap;
>>> +             bitmap = bdrv_dirty_bitmap_next(bs, bitmap)) {
>>> +            if (!bdrv_dirty_bitmap_name(bitmap)) {
>>> +                continue;
>>> +            }
>>> +
>>> +            bdrv_ref(bs);
>>> +            bdrv_dirty_bitmap_set_frozen(bitmap, true);
>>> +
>>
>> We could say that for any bitmap in the list of pending bitmaps to
>> migrate, we know that we have to un-freeze it, since we never add any
>> bitmaps that are frozen to our list.
>>
>>> +            dbms = g_new0(DirtyBitmapMigBitmapState, 1);
>>> +            dbms->bs = bs;
>>> +            dbms->node_name = bdrv_get_node_name(bs);
>>> +            if (!dbms->node_name || dbms->node_name[0] == '\0') {
>>> +                dbms->node_name = bdrv_get_device_name(bs);
>>> +            }
>>> +            dbms->bitmap = bitmap;
>>> +            dbms->total_sectors = bdrv_nb_sectors(bs);
>>> +            dbms->sectors_per_chunk = CHUNK_SIZE * 8 *
>>> +                bdrv_dirty_bitmap_granularity(bitmap) >> BDRV_SECTOR_BITS;
>>
>> Eric may want to avoid checking in new code that thinks in sectors, but
>> for the sake of review I don't mind right now.
>>
>> (Sorry, Eric!)
>>
>>> +            if (bdrv_dirty_bitmap_enabled(bitmap)) {
>>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_ENABLED;
>>> +            }
>>> +            if (bdrv_dirty_bitmap_get_persistance(bitmap)) {
>>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
>>> +            }
>>> +            if (bdrv_dirty_bitmap_get_autoload(bitmap)) {
>>> +                dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD;
>>> +            }
>>> +
>>> +            bdrv_dirty_bitmap_set_persistance(bitmap, false);
>>
>> Oh, this might be stranger to undo. Perhaps what we CAN do is limit the
>> second pass to just this action and allow ourselves to unroll everything
>> else.
>>
>>> +
>>> +            QSIMPLEQ_INSERT_TAIL(&dirty_bitmap_mig_state.dbms_list,
>>> +                                 dbms, entry);
>>> +        }
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> +/* Called with no lock taken.  */
>>> +static void bulk_phase_send_chunk(QEMUFile *f, DirtyBitmapMigBitmapState *dbms)
>>> +{
>>> +    uint32_t nr_sectors = MIN(dbms->total_sectors - dbms->cur_sector,
>>> +                             dbms->sectors_per_chunk);
>>> +
>>> +    send_bitmap_bits(f, dbms, dbms->cur_sector, nr_sectors);
>>> +
>>> +    dbms->cur_sector += nr_sectors;
>>> +    if (dbms->cur_sector >= dbms->total_sectors) {
>>> +        dbms->bulk_completed = true;
>>> +    }
>>> +}
>>> +
>>> +/* Called with no lock taken.  */
>>> +static void bulk_phase(QEMUFile *f, bool limit)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +
>>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>>> +        while (!dbms->bulk_completed) {
>>> +            bulk_phase_send_chunk(f, dbms);
>>> +            if (limit && qemu_file_rate_limit(f)) {
>>> +                return;
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    dirty_bitmap_mig_state.bulk_completed = true;
>>> +}
>>> +
>>> +/* Called with iothread lock taken.  */
>>> +static void dirty_bitmap_mig_cleanup(void)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +
>>> +    while ((dbms = QSIMPLEQ_FIRST(&dirty_bitmap_mig_state.dbms_list)) != NULL) {
>>> +        QSIMPLEQ_REMOVE_HEAD(&dirty_bitmap_mig_state.dbms_list, entry);
>>> +        bdrv_dirty_bitmap_set_frozen(dbms->bitmap, false);
>>> +        bdrv_unref(dbms->bs);
>>> +        g_free(dbms);
>>> +    }
>>> +}
>>> +
>>
>> ok
>>
>>> +/* for SaveVMHandlers */
>>> +static void dirty_bitmap_save_cleanup(void *opaque)
>>> +{
>>> +    dirty_bitmap_mig_cleanup();
>>> +}
>>> +
>>
>> ok
>>
>>> +static int dirty_bitmap_save_iterate(QEMUFile *f, void *opaque)
>>> +{
>>> +    trace_dirty_bitmap_save_iterate(migration_in_postcopy());
>>> +
>>> +    if (migration_in_postcopy() && !dirty_bitmap_mig_state.bulk_completed) {
>>> +        bulk_phase(f, true);
>>> +    }
>>> +
>>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>>> +
>>> +    return dirty_bitmap_mig_state.bulk_completed;
>>> +}
>>> +
>>
>> What's the purpose behind doing bulk save both here and in
>> dirty_bitmap_save_complete? Is there a path that isn't guaranteed to
>> call one of the completion functions?
>>
>> (The way it's coded seems like it'll work fine, but I'm curious about
>> what looks like a redundancy at a glance.)
> 
> I think I can see the reasoning; I think the idea is that in each
> iteration you send a chunk of data (note the 'true' means that it
> gets modulated by bandwidth limiting - although we currently don't
> have that in postcopy - I need to fix that) - so it might
> not actually send all of it.
> The complete guarantees it's all sent.
> So note this IS iterating potentially (OK but probably not
> at the moment)
> 

OK, thanks for the insight on it! It's probably fine as-is, then, it
just looks odd at a glance.

>>> +/* Called with iothread lock taken.  */
>>> +
>>> +static int dirty_bitmap_save_complete(QEMUFile *f, void *opaque)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +    trace_dirty_bitmap_save_complete_enter();
>>> +
>>> +    if (!dirty_bitmap_mig_state.bulk_completed) {
>>> +        bulk_phase(f, false);
>>> +    }
>>> +
>>
>> funny now that we don't actually really iterate over the data, and the
>> bulk phase is now really the _only_ phase :)
>>
>>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>>> +        send_bitmap_complete(f, dbms);
>>> +    }
>>> +
>>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>>> +
>>> +    trace_dirty_bitmap_save_complete_finish();
>>> +
>>> +    dirty_bitmap_mig_cleanup();
>>> +    return 0;
>>> +}
>>> +
>>
>> ok
>>
>>> +static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque,
>>> +                                      uint64_t max_size,
>>> +                                      uint64_t *res_precopy_only,
>>> +                                      uint64_t *res_compatible,
>>> +                                      uint64_t *res_postcopy_only)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms;
>>> +    uint64_t pending = 0;
>>> +
>>> +    qemu_mutex_lock_iothread();
>>> +
>>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>>> +        uint64_t gran = bdrv_dirty_bitmap_granularity(dbms->bitmap);
>>> +        uint64_t sectors = dbms->bulk_completed ? 0 :
>>> +                           dbms->total_sectors - dbms->cur_sector;
>>> +
>>> +        pending += (sectors * BDRV_SECTOR_SIZE + gran - 1) / gran;
>>> +    }
>>> +
>>> +    qemu_mutex_unlock_iothread();
>>> +
>>> +    trace_dirty_bitmap_save_pending(pending, max_size);
>>> +
>>> +    *res_postcopy_only += pending;
>>> +}
>>> +
>>
>> ok
>>
>>> +/* First occurrence of this bitmap. It should be created if doesn't exist */
>>> +static int dirty_bitmap_load_start(QEMUFile *f, DirtyBitmapLoadState *s)
>>> +{
>>> +    Error *local_err = NULL;
>>> +    uint32_t granularity = qemu_get_be32(f);
>>> +    uint8_t flags = qemu_get_byte(f);
>>> +
>>> +    if (!s->bitmap) {
>>> +        s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
>>> +                                             s->bitmap_name, &local_err);
>>> +        if (!s->bitmap) {
>>> +            error_report_err(local_err);
>>> +            return -EINVAL;
>>> +        }
>>> +    } else {
>>> +        uint32_t dest_granularity =
>>> +            bdrv_dirty_bitmap_granularity(s->bitmap);
>>> +        if (dest_granularity != granularity) {
>>> +            error_report("Error: "
>>> +                         "Migrated bitmap granularity (%" PRIu32 ") "
>>> +                         "doesn't match the destination bitmap '%s' "
>>> +                         "granularity (%" PRIu32 ")",
>>> +                         granularity,
>>> +                         bdrv_dirty_bitmap_name(s->bitmap),
>>> +                         dest_granularity);
>>> +            return -EINVAL;
>>> +        }
>>> +    }
>>> +
>>
>> I'm a fan of auto-creating the bitmaps. Do you have a use-case for why
>> creating them ahead of time is better, or are you just attempting to be
>> flexible?
>>
>>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_RESERVED_MASK) {
>>> +        error_report("Unknown flags in migrated dirty bitmap header: %x",
>>> +                     flags);
>>> +        return -EINVAL;
>>> +    }
>>> +
>>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) {
>>> +        bdrv_dirty_bitmap_set_persistance(s->bitmap, true);
>>> +    }
>>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_AUTOLOAD) {
>>> +        bdrv_dirty_bitmap_set_autoload(s->bitmap, true);
>>> +    }
>>> +
>>> +    bdrv_disable_dirty_bitmap(s->bitmap);
>>
>> OK, so we start them off as disabled, and
>>
>>> +    if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
>>> +        DirtyBitmapLoadBitmapState *b;
>>> +
>>> +        bdrv_dirty_bitmap_create_successor(s->bs, s->bitmap, &local_err);
>>> +        if (local_err) {
>>> +            error_report_err(local_err);
>>> +            return -EINVAL;
>>> +        }
>>> +
>>
>> If they weren't disabled on the host, we create a successor to record
>> writes while we wait for the rest of the data to arrive.
>>
>>> +        b = g_new(DirtyBitmapLoadBitmapState, 1);
>>> +        b->bs = s->bs;
>>> +        b->bitmap = s->bitmap;
>>> +        b->migrated = false;
>>> +        enabled_bitmaps = g_slist_prepend(enabled_bitmaps, b);
>>
>> And we make a note of which ones we were supposed to re-enable.
>>
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>
>> OK
>>
>>> +
>>> +void dirty_bitmap_mig_before_vm_start(void)
>>
>> Similarly, I guess I find it weird that this is a callable interface.
>>
>> David, no nice hook for just-prior-to-vm-start calls? a
>> .postcopy_pivot() hook or something might be nice..
> 
> Hmm, the other way a lot of devices do it is to hook the runstate
> change.
> 

I guess we're not a device as-such, and that usually occurs after the
change, doesn't it? It's pretty vitally important that we *guarantee*
not a single bit gets written until we can install our bitmaps properly
to make sure we track every last write properly.

If you're fine with the hardcoded hook for now, I am too, but I wanted
to point it out.

>>> +{
>>> +    GSList *item;
>>> +
>>> +    qemu_mutex_lock(&finish_lock);
>>> +
>>> +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
>>> +        DirtyBitmapLoadBitmapState *b = item->data;
>>> +
>>
>> Anyway, if I am reading this right; we call this in the postcopy phase
>> prior to receiving the entirety of the bitmaps (so before receiving
>> COMPLETE) ... right?
>>
>>> +        if (b->migrated) {
>>> +            bdrv_enable_dirty_bitmap(b->bitmap);
>>
>> ...or, am I confused, and we might receive a COMPLETE event prior to the
>> postcopy pivot?
>>
>> Anyway, I suppose this code says "If we received the entire bitmap, go
>> ahead and enable it."
>>
>>> +        } else {
>>> +            bdrv_dirty_bitmap_enable_successor(b->bitmap);
>>
>> And this says "If we haven't received it yet, enable the successor to
>> record writes until we get the rest of the data."
>>
>>> +        }
>>> +
>>> +        g_free(b);
>>> +    }
>>> +
>>> +    g_slist_free(enabled_bitmaps);
>>> +    enabled_bitmaps = NULL;
>>> +
>>> +    qemu_mutex_unlock(&finish_lock);
>>> +}
>>> +
>>> +static void dirty_bitmap_load_complete(QEMUFile *f, DirtyBitmapLoadState *s)
>>> +{
>>> +    GSList *item;
>>> +    trace_dirty_bitmap_load_complete();
>>> +    bdrv_dirty_bitmap_deserialize_finish(s->bitmap);
>>> +
>>> +    qemu_mutex_lock(&finish_lock);
>>> +
>>> +    for (item = enabled_bitmaps; item; item = g_slist_next(item)) {
>>> +        DirtyBitmapLoadBitmapState *b = item->data;
>>> +
>>> +        if (b->bitmap == s->bitmap) {
>>> +            b->migrated = true;
>>
>> we can probably break; here now, right?
>>
>> (This whole stanza is a little strange, can't we cache the active
>> DirtyBitmapLoadBitmapState in DirtyBitmapLoadState? I guess not, because
>> we're looking up the BdrvDirtyBitmap itself and caching that instead, so
>> either way we have some kind of lookup on every context switch.)
>>
>>> +        }
>>> +    }
>>> +
>>> +    if (bdrv_dirty_bitmap_frozen(s->bitmap)) {
>>> +        if (enabled_bitmaps == NULL) {
>>> +            /* in postcopy */
>>> +            AioContext *aio_context = bdrv_get_aio_context(s->bs);
>>> +            aio_context_acquire(aio_context);
>>> +
>>> +            bdrv_reclaim_dirty_bitmap(s->bs, s->bitmap, &error_abort);
>>> +            bdrv_enable_dirty_bitmap(s->bitmap);
>>> +
>>
>> OK, so if enabled_bitmaps is gone, that means we already pivoted and
>> we're live on the receiving end here. We merge the successor into the
>> fully deserialized bitmap and enable it.
>>
>>> +            aio_context_release(aio_context);
>>> +        } else {
>>> +            /* target not started, successor is empty */
>>> +            bdrv_dirty_bitmap_release_successor(s->bs, s->bitmap);
>>
>> Otherwise we just trash the successor. Did we really need a new call for
>> this? I suppose it's faster than merging a 0-bit bitmap, but the
>> additional API complexity for the speed win here seems like premature
>> optimization.
>>
>> ...well, you already wrote it, so I won't argue.
>>
>>> +        }
>>> +    }
>>> +
>>> +    qemu_mutex_unlock(&finish_lock);
>>> +}
>>> +
>>> +static int dirty_bitmap_load_bits(QEMUFile *f, DirtyBitmapLoadState *s)
>>> +{
>>> +    uint64_t first_byte = qemu_get_be64(f) << BDRV_SECTOR_BITS;
>>> +    uint64_t nr_bytes = (uint64_t)qemu_get_be32(f) << BDRV_SECTOR_BITS;
>>> +    trace_dirty_bitmap_load_bits_enter(first_byte >> BDRV_SECTOR_BITS,
>>> +                                       nr_bytes >> BDRV_SECTOR_BITS);
>>> +
>>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
>>> +        trace_dirty_bitmap_load_bits_zeroes();
>>> +        bdrv_dirty_bitmap_deserialize_zeroes(s->bitmap, first_byte, nr_bytes,
>>> +                                             false);
>>> +    } else {
>>> +        uint8_t *buf;
>>> +        uint64_t buf_size = qemu_get_be64(f);
>>> +        uint64_t needed_size =
>>> +            bdrv_dirty_bitmap_serialization_size(s->bitmap,
>>> +                                                 first_byte, nr_bytes);
>>> +
>>> +        if (needed_size > buf_size) {
>>> +            error_report("Error: Migrated bitmap granularity doesn't "
>>> +                         "match the destination bitmap '%s' granularity",
>>> +                         bdrv_dirty_bitmap_name(s->bitmap));
>>> +            return -EINVAL;
>>> +        }
>>> +
>>> +        buf = g_malloc(buf_size);
>>> +        qemu_get_buffer(f, buf, buf_size);
>>> +        bdrv_dirty_bitmap_deserialize_part(s->bitmap, buf, first_byte, nr_bytes,
>>> +                                           false);
>>> +        g_free(buf);
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>>
>> ok
>>
>>> +static int dirty_bitmap_load_header(QEMUFile *f, DirtyBitmapLoadState *s)
>>> +{
>>> +    Error *local_err = NULL;
>>> +    s->flags = qemu_get_bitmap_flags(f);
>>> +    trace_dirty_bitmap_load_header(s->flags);
>>> +
>>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
>>> +        if (!qemu_get_counted_string(f, s->node_name)) {
>>> +            error_report("Unable to read node name string");
>>> +            return -EINVAL;
>>> +        }
>>> +        s->bs = bdrv_lookup_bs(s->node_name, s->node_name, &local_err);
>>> +        if (!s->bs) {
>>> +            error_report_err(local_err);
>>> +            return -EINVAL;
>>> +        }
>>> +    } else if (!s->bs) {
>>> +        error_report("Error: block device name is not set");
>>> +        return -EINVAL;
>>> +    }
>>> +
>>> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
>>> +        if (!qemu_get_counted_string(f, s->bitmap_name)) {
>>> +            error_report("Unable to read node name string");
>>> +            return -EINVAL;
>>> +        }
>>> +        s->bitmap = bdrv_find_dirty_bitmap(s->bs, s->bitmap_name);
>>> +
>>> +        /* bitmap may be NULL here, it wouldn't be an error if it is the
>>> +         * first occurrence of the bitmap */
>>> +        if (!s->bitmap && !(s->flags & DIRTY_BITMAP_MIG_FLAG_START)) {
>>> +            error_report("Error: unknown dirty bitmap "
>>> +                         "'%s' for block device '%s'",
>>> +                         s->bitmap_name, s->node_name);
>>> +            return -EINVAL;
>>> +        }
>>> +    } else if (!s->bitmap) {
>>> +        error_report("Error: block device name is not set");
>>> +        return -EINVAL;
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>>
>> ok
>>
>>> +static int dirty_bitmap_load(QEMUFile *f, void *opaque, int version_id)
>>> +{
>>> +    static DirtyBitmapLoadState s;
>>> +    int ret = 0;
>>> +
>>> +    trace_dirty_bitmap_load_enter();
>>> +
>>> +    if (version_id != 1) {
>>> +        return -EINVAL;
>>> +    }
>>> +
>>> +    do {
>>> +        dirty_bitmap_load_header(f, &s);
>>> +
>>> +        if (s.flags & DIRTY_BITMAP_MIG_FLAG_START) {
>>> +            ret = dirty_bitmap_load_start(f, &s);
>>> +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_COMPLETE) {
>>> +            dirty_bitmap_load_complete(f, &s);
>>> +        } else if (s.flags & DIRTY_BITMAP_MIG_FLAG_BITS) {
>>> +            ret = dirty_bitmap_load_bits(f, &s);
>>> +        }
>>> +
>>> +        if (!ret) {
>>> +            ret = qemu_file_get_error(f);
>>> +        }
>>> +
>>> +        if (ret) {
>>> +            return ret;
>>> +        }
>>> +    } while (!(s.flags & DIRTY_BITMAP_MIG_FLAG_EOS));
>>> +
>>> +    trace_dirty_bitmap_load_success();
>>> +    return 0;
>>> +}
>>
>> OK
>>
>>> +
>>> +static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
>>> +{
>>> +    DirtyBitmapMigBitmapState *dbms = NULL;
>>> +    if (init_dirty_bitmap_migration() < 0) {
>>> +        return -1;
>>> +    }
>>> +
>>> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
>>> +        send_bitmap_start(f, dbms);
>>> +    }
>>> +    qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>
>> ok
>>
>>> +static bool dirty_bitmap_is_active(void *opaque)
>>> +{
>>> +    return migrate_dirty_bitmaps();
>>> +}
>>> +
>>
>> ok
>>
>>> +static bool dirty_bitmap_is_active_iterate(void *opaque)
>>> +{
>>> +    return dirty_bitmap_is_active(opaque) && !runstate_is_running();
>>> +}
>>> +
>>
>> On second thought, in patch 9, can you add a little tiny bit of
>> documentation text explaining the exact nature of this callback?
>>
>> Is the second portion of the conditional here so that once we reach the
>> postcopy state that .is_active_iterate starts returning true?
>>
>> "ok" if I'm reading this right, but it might be helped along by a little
>> comment.
>>
>>> +static bool dirty_bitmap_has_postcopy(void *opaque)
>>> +{
>>> +    return true;
>>> +}
>>> +
>>
>> ok! :)
>>
>>> +static SaveVMHandlers savevm_dirty_bitmap_handlers = {
>>> +    .save_setup = dirty_bitmap_save_setup,
>>> +    .save_live_complete_postcopy = dirty_bitmap_save_complete,
>>> +    .save_live_complete_precopy = dirty_bitmap_save_complete,
>>> +    .has_postcopy = dirty_bitmap_has_postcopy,
>>> +    .save_live_pending = dirty_bitmap_save_pending,
>>> +    .save_live_iterate = dirty_bitmap_save_iterate,
>>> +    .is_active_iterate = dirty_bitmap_is_active_iterate,
>>> +    .load_state = dirty_bitmap_load,
>>> +    .save_cleanup = dirty_bitmap_save_cleanup,
>>> +    .is_active = dirty_bitmap_is_active,
>>> +};
>>> +
>>> +void dirty_bitmap_mig_init(void)
>>> +{
>>> +    QSIMPLEQ_INIT(&dirty_bitmap_mig_state.dbms_list);
>>> +
>>> +    register_savevm_live(NULL, "dirty-bitmap", 0, 1,
>>> +                         &savevm_dirty_bitmap_handlers,
>>> +                         &dirty_bitmap_mig_state);
>>> +}
>>
>> ok
>>
>> dgilbert, would it be worth registering a block-driver-like registration
>> trick that automatically invokes these functions instead of having to
>> hook them up in vl.c? the more we add, the more hacky it looks to not
>> have some subsystem-wide registration hook.
> 
> Maybe it's just simpler to put a mig_init in migration/migration.c and
> make one call in vl.c; I'd rather keep a simple function than a whole
> registration mechanism.
> 

Yup. I just sometimes think about if vl.c could be ... prettied up to
any acceptable level. It's kind of a wilderness up there.

>>> diff --git a/migration/migration.c b/migration/migration.c
>>> index e973837bfd..66e9cf03cd 100644
>>> --- a/migration/migration.c
>>> +++ b/migration/migration.c
>>> @@ -150,6 +150,9 @@ MigrationIncomingState *migration_incoming_get_current(void)
>>>          memset(&mis_current, 0, sizeof(MigrationIncomingState));
>>>          qemu_mutex_init(&mis_current.rp_mutex);
>>>          qemu_event_init(&mis_current.main_thread_load_event, false);
>>> +
>>> +        init_dirty_bitmap_incoming_migration();
>>> +
>>>          once = true;
>>>      }
>>>      return &mis_current;
>>> diff --git a/migration/savevm.c b/migration/savevm.c
>>> index 9bbfb3fa1b..b0c37ef9f1 100644
>>> --- a/migration/savevm.c
>>> +++ b/migration/savevm.c
>>> @@ -1673,6 +1673,8 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
>>>  
>>>      trace_loadvm_postcopy_handle_run_vmstart();
>>>  
>>> +    dirty_bitmap_mig_before_vm_start();
>>> +
>>>      if (autostart) {
>>>          /* Hold onto your hats, starting the CPU */
>>>          vm_start();
>>> diff --git a/vl.c b/vl.c
>>> index ec299099ff..3d393aaf2c 100644
>>> --- a/vl.c
>>> +++ b/vl.c
>>> @@ -4642,6 +4642,7 @@ int main(int argc, char **argv, char **envp)
>>>  
>>>      blk_mig_init();
>>>      ram_mig_init();
>>> +    dirty_bitmap_mig_init();
>>>  
>>>      /* If the currently selected machine wishes to override the units-per-bus
>>>       * property of its default HBA interface type, do so now. */
>>> diff --git a/migration/Makefile.objs b/migration/Makefile.objs
>>> index 99e038024d..c83ec47ba8 100644
>>> --- a/migration/Makefile.objs
>>> +++ b/migration/Makefile.objs
>>> @@ -6,6 +6,7 @@ common-obj-y += qemu-file.o global_state.o
>>>  common-obj-y += qemu-file-channel.o
>>>  common-obj-y += xbzrle.o postcopy-ram.o
>>>  common-obj-y += qjson.o
>>> +common-obj-y += block-dirty-bitmap.o
>>>  
>>>  common-obj-$(CONFIG_RDMA) += rdma.o
>>>  
>>> diff --git a/migration/trace-events b/migration/trace-events
>>> index a04fffb877..e9eb8078d4 100644
>>> --- a/migration/trace-events
>>> +++ b/migration/trace-events
>>> @@ -227,3 +227,17 @@ colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'"
>>>  colo_send_message(const char *msg) "Send '%s' message"
>>>  colo_receive_message(const char *msg) "Receive '%s' message"
>>>  colo_failover_set_state(const char *new_state) "new state %s"
>>> +
>>> +# migration/block-dirty-bitmap.c
>>> +send_bitmap_header_enter(void) ""
>>> +send_bitmap_bits(uint32_t flags, uint64_t start_sector, uint32_t nr_sectors, uint64_t data_size) "\n   flags:        0x%x\n   start_sector: %" PRIu64 "\n   nr_sectors:   %" PRIu32 "\n   data_size:    %" PRIu64 "\n"
>>> +dirty_bitmap_save_iterate(int in_postcopy) "in postcopy: %d"
>>> +dirty_bitmap_save_complete_enter(void) ""
>>> +dirty_bitmap_save_complete_finish(void) ""
>>> +dirty_bitmap_save_pending(uint64_t pending, uint64_t max_size) "pending %" PRIu64 " max: %" PRIu64
>>> +dirty_bitmap_load_complete(void) ""
>>> +dirty_bitmap_load_bits_enter(uint64_t first_sector, uint32_t nr_sectors) "chunk: %" PRIu64 " %" PRIu32
>>> +dirty_bitmap_load_bits_zeroes(void) ""
>>> +dirty_bitmap_load_header(uint32_t flags) "flags 0x%x"
>>> +dirty_bitmap_load_enter(void) ""
>>> +dirty_bitmap_load_success(void) ""
>>>
>>
>> OK, I think everything here is probably in order, and it's only my
>> understanding that is a barrier at this point. Help me understand the
>> rest of this patch and I'll re-pester migration to get this staged for
>> qemu-next.
>>
>> --js
> 
> Dave
> 
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
> 

Thanks for taking a peek, David.

--js

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
  2017-11-10 22:52   ` John Snow
  2017-11-16  8:56     ` Vladimir Sementsov-Ogievskiy
@ 2017-11-17  8:07     ` Vladimir Sementsov-Ogievskiy
  2017-11-17 18:25       ` John Snow
  1 sibling, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-11-17  8:07 UTC (permalink / raw)
  To: John Snow, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert

11.11.2017 01:52, John Snow wrote:
>
> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>> It is needed to realize bdrv_dirty_bitmap_release_successor in
>> the following patch.
>>
> OK, but...
>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   block/dirty-bitmap.c | 25 ++++++++++++++++++++-----
>>   1 file changed, 20 insertions(+), 5 deletions(-)
>>
>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>> index 81adbeb6d4..981f99d362 100644
>> --- a/block/dirty-bitmap.c
>> +++ b/block/dirty-bitmap.c
>> @@ -326,13 +326,13 @@ static bool bdrv_dirty_bitmap_has_name(BdrvDirtyBitmap *bitmap)
>>       return !!bdrv_dirty_bitmap_name(bitmap);
>>   }
>>   
>> -/* Called with BQL taken.  */
>> -static void bdrv_do_release_matching_dirty_bitmap(
>> +/* Called within bdrv_dirty_bitmap_lock..unlock */
> ...Add this so it will compile:

how do you compile to get an error? and what is unused?

>
> __attribute__((__unused__))
>> +static void bdrv_do_release_matching_dirty_bitmap_locked(
>>       BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
>>       bool (*cond)(BdrvDirtyBitmap *bitmap))
>>   {
>>       BdrvDirtyBitmap *bm, *next;
>> -    bdrv_dirty_bitmaps_lock(bs);
>> +
>>       QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
>>           if ((!bitmap || bm == bitmap) && (!cond || cond(bm))) {
>>               assert(!bm->active_iterators);
>> @@ -344,18 +344,33 @@ static void bdrv_do_release_matching_dirty_bitmap(
>>               g_free(bm);
>>   
>>               if (bitmap) {
>> -                goto out;
>> +                return;
>>               }
>>           }
>>       }
>> +
>>       if (bitmap) {
>>           abort();
>>       }
> Do we have any style guide rules on using abort() instead of assert()?
> The rest of this function uses assert, and it'd be less lines to simply
> write:
>
> assert(!bitmap);
>
> which I think might also carry better semantic information for coverity
> beyond an actual runtime conditional branch.
>
> (I think. Please correct me if I am wrong, I'm a little hazy on this.)
>
>> +}
>>   
>> -out:
>> +/* Called with BQL taken.  */
>> +static void bdrv_do_release_matching_dirty_bitmap(
>> +    BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
>> +    bool (*cond)(BdrvDirtyBitmap *bitmap))
>> +{
>> +    bdrv_dirty_bitmaps_lock(bs);
>> +    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, cond);
>>       bdrv_dirty_bitmaps_unlock(bs);
>>   }
>>   
>> +/* Called within bdrv_dirty_bitmap_lock..unlock */
>> +static void bdrv_release_dirty_bitmap_locked(BlockDriverState *bs,
>> +                                             BdrvDirtyBitmap *bitmap)
>> +{
>> +    bdrv_do_release_matching_dirty_bitmap_locked(bs, bitmap, NULL);
>> +}
>> +
>>   /* Called with BQL taken.  */
>>   void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
>>   {
>>
> If you agree with those two changes, you may add:
>
> Reviewed-by: John Snow <jsnow@redhat.com>


-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
  2017-11-13 23:32   ` John Snow
@ 2017-11-17 14:46     ` Vladimir Sementsov-Ogievskiy
  2017-11-17 17:20       ` John Snow
  0 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-11-17 14:46 UTC (permalink / raw)
  To: John Snow, qemu-block, qemu-devel, famz
  Cc: kwolf, peter.maydell, lirans, quintela, armbru, mreitz, stefanha,
	den, amit.shah, pbonzini, dgilbert

14.11.2017 02:32, John Snow wrote:
>
> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>> Make it possible to set bitmap 'frozen' without a successor.
>> This is needed to protect the bitmap during outgoing bitmap postcopy
>> migration.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   include/block/dirty-bitmap.h |  1 +
>>   block/dirty-bitmap.c         | 22 ++++++++++++++++++++--
>>   2 files changed, 21 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
>> index a9e2a92e4f..ae6d697850 100644
>> --- a/include/block/dirty-bitmap.h
>> +++ b/include/block/dirty-bitmap.h
>> @@ -39,6 +39,7 @@ uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
>>   uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap);
>>   bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
>>   bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
>> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool frozen);
>>   const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
>>   int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
>>   DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap);
>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>> index 7578863aa1..67fc6bd6e0 100644
>> --- a/block/dirty-bitmap.c
>> +++ b/block/dirty-bitmap.c
>> @@ -40,6 +40,8 @@ struct BdrvDirtyBitmap {
>>       QemuMutex *mutex;
>>       HBitmap *bitmap;            /* Dirty bitmap implementation */
>>       HBitmap *meta;              /* Meta dirty bitmap */
>> +    bool frozen;                /* Bitmap is frozen, it can't be modified
>> +                                   through QMP */
> I hesitate, because this now means that we have two independent bits of
> state we need to update and maintain consistency with.

it was your proposal)))

https://lists.gnu.org/archive/html/qemu-devel/2017-07/msg01172.html

"
Your new use case here sounds like Frozen to me, but it simply does not
have an anonymous successor to force it to be recognized as "frozen." We
can add a `bool protected` or `bool frozen` field to force recognition
of this status and adjust the json documentation accordingly.

I think then we'd have four recognized states:

FROZEN: Cannot be reset/deleted. Bitmap is in-use by a block job or
other internal process. Bitmap is otherwise ACTIVE.
DISABLED: Not recording any writes (by choice.)
READONLY: Not able to record any writes (by necessity.)
ACTIVE: Normal bitmap status.

Sound right?
"


>
> Before:
>
> Frozen: "Bitmap has a successor and is no longer itself recording
> writes, though we are guaranteed to have a successor doing so on our
> behalf."
>
> After:
>
> Frozen: "Bitmap may or may not have a successor, but it is disabled with
> an even more limited subset of tasks than a traditionally disabled bitmap."
>
> This changes the meaning of "frozen" a little, and I am not sure that is
> a problem as such, but it does make the interface seem a little
> "fuzzier" than it did prior.
>
>>       BdrvDirtyBitmap *successor; /* Anonymous child; implies frozen status */
>>       char *name;                 /* Optional non-empty unique ID */
>>       int64_t size;               /* Size of the bitmap, in bytes */
>> @@ -183,13 +185,22 @@ const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap)
>>   /* Called with BQL taken.  */
>>   bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
>>   {
>> -    return bitmap->successor;
>> +    return bitmap->frozen;
>> +}
> Are there any cases where we will be unfrozen, but actually have a
> successor now? If so, under what circumstances does that happen?
>
>> +
>> +/* Called with BQL taken.  */
>> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool frozen)
>> +{
>> +    qemu_mutex_lock(bitmap->mutex);
>> +    assert(bitmap->successor == NULL);
>> +    bitmap->frozen = frozen;
>> +    qemu_mutex_unlock(bitmap->mutex);
>>   }
>>   
> OK, so we can only "set frozen" (or unset) if we don't have a successor.
>
>>   /* Called with BQL taken.  */
>>   bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
>>   {
>> -    return !(bitmap->disabled || bitmap->successor);
>> +    return !(bitmap->disabled || (bitmap->successor != NULL));
>>   }
>>   
> I guess this just makes 'successor' more obviously non-boolean, which is
> fine.
>
>>   /* Called with BQL taken.  */
>> @@ -234,6 +245,7 @@ int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
>>   
>>       /* Install the successor and freeze the parent */
>>       bitmap->successor = child;
>> +    bitmap->frozen = true;
>>       return 0;
>>   }
>>   
>> @@ -266,6 +278,8 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
>>       name = bitmap->name;
>>       bitmap->name = NULL;
>>       successor->name = name;
>> +    assert(bitmap->frozen);
>> +    bitmap->frozen = false;
>>       bitmap->successor = NULL;
>>       successor->persistent = bitmap->persistent;
>>       bitmap->persistent = false;
>> @@ -298,6 +312,8 @@ BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
>>           return NULL;
>>       }
>>       bdrv_release_dirty_bitmap(bs, successor);
>> +    assert(parent->frozen);
>> +    parent->frozen = false;
>>       parent->successor = NULL;
>>   
>>       return parent;
>> @@ -439,6 +455,8 @@ void bdrv_dirty_bitmap_release_successor(BlockDriverState *bs,
>>   
>>       if (parent->successor) {
>>           bdrv_release_dirty_bitmap_locked(bs, parent->successor);
>> +        assert(parent->frozen);
>> +        parent->frozen = false;
>>           parent->successor = NULL;
>>       }
>>   
>>
> Tentatively:
>
> Reviewed-by: John Snow <jsnow@redhat.com>
>
> Fam, any thoughts?
>
> --John


-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
  2017-11-17 14:46     ` Vladimir Sementsov-Ogievskiy
@ 2017-11-17 17:20       ` John Snow
  2017-11-17 17:30         ` Vladimir Sementsov-Ogievskiy
  0 siblings, 1 reply; 44+ messages in thread
From: John Snow @ 2017-11-17 17:20 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel, famz
  Cc: kwolf, peter.maydell, lirans, quintela, armbru, mreitz, stefanha,
	den, amit.shah, pbonzini, dgilbert



On 11/17/2017 09:46 AM, Vladimir Sementsov-Ogievskiy wrote:
> 14.11.2017 02:32, John Snow wrote:
>>
>> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>>> Make it possible to set bitmap 'frozen' without a successor.
>>> This is needed to protect the bitmap during outgoing bitmap postcopy
>>> migration.
>>>
>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> ---
>>>   include/block/dirty-bitmap.h |  1 +
>>>   block/dirty-bitmap.c         | 22 ++++++++++++++++++++--
>>>   2 files changed, 21 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
>>> index a9e2a92e4f..ae6d697850 100644
>>> --- a/include/block/dirty-bitmap.h
>>> +++ b/include/block/dirty-bitmap.h
>>> @@ -39,6 +39,7 @@ uint32_t
>>> bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
>>>   uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap);
>>>   bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
>>>   bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
>>> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool
>>> frozen);
>>>   const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
>>>   int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
>>>   DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap);
>>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>>> index 7578863aa1..67fc6bd6e0 100644
>>> --- a/block/dirty-bitmap.c
>>> +++ b/block/dirty-bitmap.c
>>> @@ -40,6 +40,8 @@ struct BdrvDirtyBitmap {
>>>       QemuMutex *mutex;
>>>       HBitmap *bitmap;            /* Dirty bitmap implementation */
>>>       HBitmap *meta;              /* Meta dirty bitmap */
>>> +    bool frozen;                /* Bitmap is frozen, it can't be
>>> modified
>>> +                                   through QMP */
>> I hesitate, because this now means that we have two independent bits of
>> state we need to update and maintain consistency with.
> 
> it was your proposal)))
> 
> https://lists.gnu.org/archive/html/qemu-devel/2017-07/msg01172.html
> 
> "
> Your new use case here sounds like Frozen to me, but it simply does not
> have an anonymous successor to force it to be recognized as "frozen." We
> can add a `bool protected` or `bool frozen` field to force recognition
> of this status and adjust the json documentation accordingly.
> 
> I think then we'd have four recognized states:
> 
> FROZEN: Cannot be reset/deleted. Bitmap is in-use by a block job or
> other internal process. Bitmap is otherwise ACTIVE.
> DISABLED: Not recording any writes (by choice.)
> READONLY: Not able to record any writes (by necessity.)
> ACTIVE: Normal bitmap status.
> 
> Sound right?
> "
> 
> 

I was afraid you'd say that :(

It's okay, anyway. I shouldn't let myself go so long between reviews
like this, because you catch me changing my mind. Anyway, please go
ahead with it. I don't want to delay you on something that works because
I can't make up *my* mind.

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
  2017-11-17 17:20       ` John Snow
@ 2017-11-17 17:30         ` Vladimir Sementsov-Ogievskiy
  2017-11-17 23:46           ` John Snow
  0 siblings, 1 reply; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-11-17 17:30 UTC (permalink / raw)
  To: John Snow, qemu-block, qemu-devel, famz
  Cc: kwolf, peter.maydell, lirans, quintela, armbru, mreitz, stefanha,
	den, amit.shah, pbonzini, dgilbert

17.11.2017 20:20, John Snow wrote:
>
> On 11/17/2017 09:46 AM, Vladimir Sementsov-Ogievskiy wrote:
>> 14.11.2017 02:32, John Snow wrote:
>>> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>>>> Make it possible to set bitmap 'frozen' without a successor.
>>>> This is needed to protect the bitmap during outgoing bitmap postcopy
>>>> migration.
>>>>
>>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>>> ---
>>>>    include/block/dirty-bitmap.h |  1 +
>>>>    block/dirty-bitmap.c         | 22 ++++++++++++++++++++--
>>>>    2 files changed, 21 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
>>>> index a9e2a92e4f..ae6d697850 100644
>>>> --- a/include/block/dirty-bitmap.h
>>>> +++ b/include/block/dirty-bitmap.h
>>>> @@ -39,6 +39,7 @@ uint32_t
>>>> bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
>>>>    uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap);
>>>>    bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
>>>>    bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
>>>> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool
>>>> frozen);
>>>>    const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
>>>>    int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
>>>>    DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap);
>>>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>>>> index 7578863aa1..67fc6bd6e0 100644
>>>> --- a/block/dirty-bitmap.c
>>>> +++ b/block/dirty-bitmap.c
>>>> @@ -40,6 +40,8 @@ struct BdrvDirtyBitmap {
>>>>        QemuMutex *mutex;
>>>>        HBitmap *bitmap;            /* Dirty bitmap implementation */
>>>>        HBitmap *meta;              /* Meta dirty bitmap */
>>>> +    bool frozen;                /* Bitmap is frozen, it can't be
>>>> modified
>>>> +                                   through QMP */
>>> I hesitate, because this now means that we have two independent bits of
>>> state we need to update and maintain consistency with.
>> it was your proposal)))
>>
>> https://lists.gnu.org/archive/html/qemu-devel/2017-07/msg01172.html
>>
>> "
>> Your new use case here sounds like Frozen to me, but it simply does not
>> have an anonymous successor to force it to be recognized as "frozen." We
>> can add a `bool protected` or `bool frozen` field to force recognition
>> of this status and adjust the json documentation accordingly.
>>
>> I think then we'd have four recognized states:
>>
>> FROZEN: Cannot be reset/deleted. Bitmap is in-use by a block job or
>> other internal process. Bitmap is otherwise ACTIVE.
>> DISABLED: Not recording any writes (by choice.)
>> READONLY: Not able to record any writes (by necessity.)
>> ACTIVE: Normal bitmap status.
>>
>> Sound right?
>> "
>>
>>
> I was afraid you'd say that :(
>
> It's okay, anyway. I shouldn't let myself go so long between reviews
> like this, because you catch me changing my mind. Anyway, please go
> ahead with it. I don't want to delay you on something that works because
> I can't make up *my* mind.

Hm, if you remember, reusing "frozen" state was strange for me too. And 
it's not
late to move to
1. make a new state: MIGRATION, which disallows qmp operations on bitmap
2. or just make them unnamed, so they can't be touched by qmp

anything is ok for me as well as leaving it as is. It's all little 
things, the core is patch 10.

"frozen" sounds like unchanged, but user will see dirty-count changing 
in query-block.

-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
  2017-11-17  8:07     ` Vladimir Sementsov-Ogievskiy
@ 2017-11-17 18:25       ` John Snow
  2017-11-20  9:30         ` Vladimir Sementsov-Ogievskiy
  0 siblings, 1 reply; 44+ messages in thread
From: John Snow @ 2017-11-17 18:25 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert



On 11/17/2017 03:07 AM, Vladimir Sementsov-Ogievskiy wrote:
> 11.11.2017 01:52, John Snow wrote:
>>
>> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>>> It is needed to realize bdrv_dirty_bitmap_release_successor in
>>> the following patch.
>>>
>> OK, but...
>>
>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> ---
>>>   block/dirty-bitmap.c | 25 ++++++++++++++++++++-----
>>>   1 file changed, 20 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>>> index 81adbeb6d4..981f99d362 100644
>>> --- a/block/dirty-bitmap.c
>>> +++ b/block/dirty-bitmap.c
>>> @@ -326,13 +326,13 @@ static bool
>>> bdrv_dirty_bitmap_has_name(BdrvDirtyBitmap *bitmap)
>>>       return !!bdrv_dirty_bitmap_name(bitmap);
>>>   }
>>>   -/* Called with BQL taken.  */
>>> -static void bdrv_do_release_matching_dirty_bitmap(
>>> +/* Called within bdrv_dirty_bitmap_lock..unlock */
>> ...Add this so it will compile:
> 
> how do you compile to get an error? and what is unused?
> 

.../src/qemu/block/dirty-bitmap.c:368:13: error:
‘bdrv_release_dirty_bitmap_locked’ defined but not used
[-Werror=unused-function]
 static void bdrv_release_dirty_bitmap_locked(BlockDriverState *bs,
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors


I commented on the wrong prototype. The ((__unused__)) attribute just
quiets this warning so it can compile without you having to refactor.

--js

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
  2017-11-17 17:30         ` Vladimir Sementsov-Ogievskiy
@ 2017-11-17 23:46           ` John Snow
  2017-11-20  9:40             ` Vladimir Sementsov-Ogievskiy
  0 siblings, 1 reply; 44+ messages in thread
From: John Snow @ 2017-11-17 23:46 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy, qemu-block, qemu-devel, famz
  Cc: kwolf, peter.maydell, lirans, quintela, armbru, mreitz, stefanha,
	den, amit.shah, pbonzini, dgilbert



On 11/17/2017 12:30 PM, Vladimir Sementsov-Ogievskiy wrote:
> 17.11.2017 20:20, John Snow wrote:
>>
>> On 11/17/2017 09:46 AM, Vladimir Sementsov-Ogievskiy wrote:
>>> 14.11.2017 02:32, John Snow wrote:
>>>> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>>>>> Make it possible to set bitmap 'frozen' without a successor.
>>>>> This is needed to protect the bitmap during outgoing bitmap postcopy
>>>>> migration.
>>>>>
>>>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>>>> ---
>>>>>    include/block/dirty-bitmap.h |  1 +
>>>>>    block/dirty-bitmap.c         | 22 ++++++++++++++++++++--
>>>>>    2 files changed, 21 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/include/block/dirty-bitmap.h
>>>>> b/include/block/dirty-bitmap.h
>>>>> index a9e2a92e4f..ae6d697850 100644
>>>>> --- a/include/block/dirty-bitmap.h
>>>>> +++ b/include/block/dirty-bitmap.h
>>>>> @@ -39,6 +39,7 @@ uint32_t
>>>>> bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
>>>>>    uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap
>>>>> *bitmap);
>>>>>    bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
>>>>>    bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
>>>>> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool
>>>>> frozen);
>>>>>    const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
>>>>>    int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
>>>>>    DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap
>>>>> *bitmap);
>>>>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>>>>> index 7578863aa1..67fc6bd6e0 100644
>>>>> --- a/block/dirty-bitmap.c
>>>>> +++ b/block/dirty-bitmap.c
>>>>> @@ -40,6 +40,8 @@ struct BdrvDirtyBitmap {
>>>>>        QemuMutex *mutex;
>>>>>        HBitmap *bitmap;            /* Dirty bitmap implementation */
>>>>>        HBitmap *meta;              /* Meta dirty bitmap */
>>>>> +    bool frozen;                /* Bitmap is frozen, it can't be
>>>>> modified
>>>>> +                                   through QMP */
>>>> I hesitate, because this now means that we have two independent bits of
>>>> state we need to update and maintain consistency with.
>>> it was your proposal)))
>>>
>>> https://lists.gnu.org/archive/html/qemu-devel/2017-07/msg01172.html
>>>
>>> "
>>> Your new use case here sounds like Frozen to me, but it simply does not
>>> have an anonymous successor to force it to be recognized as "frozen." We
>>> can add a `bool protected` or `bool frozen` field to force recognition
>>> of this status and adjust the json documentation accordingly.
>>>
>>> I think then we'd have four recognized states:
>>>
>>> FROZEN: Cannot be reset/deleted. Bitmap is in-use by a block job or
>>> other internal process. Bitmap is otherwise ACTIVE.
>>> DISABLED: Not recording any writes (by choice.)
>>> READONLY: Not able to record any writes (by necessity.)
>>> ACTIVE: Normal bitmap status.
>>>
>>> Sound right?
>>> "
>>>
>>>
>> I was afraid you'd say that :(
>>
>> It's okay, anyway. I shouldn't let myself go so long between reviews
>> like this, because you catch me changing my mind. Anyway, please go
>> ahead with it. I don't want to delay you on something that works because
>> I can't make up *my* mind.
> 
> Hm, if you remember, reusing "frozen" state was strange for me too. And
> it's not
> late to move to
> 1. make a new state: MIGRATION, which disallows qmp operations on bitmap
> 2. or just make them unnamed, so they can't be touched by qmp

"Migrating" is fine as a state name. You could probably announce this by
having it be "frozen" in the usual way (it has a successor) and a new
bool that lets you do whatever special handling you need to do for it.

> 
> anything is ok for me as well as leaving it as is. It's all little
> things, the core is patch 10.
> 
> "frozen" sounds like unchanged, but user will see dirty-count changing
> in query-block.

I guess it's a strange misnomer now... or maybe just always was a bad
name, since it's not really "frozen" but rather "locked" in a way that
the QMP user cannot interfere with it -- but it's still a live,
functioning object.

> 

I'm remembering what I was talking about, but I think my preference is
illustrably worse. I was trying to avoid boolean bloat by advocating
re-use, but the re-use is kind of confusing...

I think I was hoping that a bitmap on the receiving end could simply be
"frozen" in the usual way, in that it has a successor recording writes.

I think the way you want to handle it though is with different semantics
for cleanup and recovery which makes it not quite the same state, which
needs either a new bool or some such.

Go with what you think is cleanest at this point, including if you want
to leave it alone. I don't want to cause you to respin it over bikeshedding.

--js

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap
  2017-11-17 18:25       ` John Snow
@ 2017-11-20  9:30         ` Vladimir Sementsov-Ogievskiy
  0 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-11-20  9:30 UTC (permalink / raw)
  To: John Snow, qemu-block, qemu-devel
  Cc: kwolf, peter.maydell, famz, lirans, quintela, armbru, mreitz,
	stefanha, den, amit.shah, pbonzini, dgilbert

17.11.2017 21:25, John Snow wrote:
>
> On 11/17/2017 03:07 AM, Vladimir Sementsov-Ogievskiy wrote:
>> 11.11.2017 01:52, John Snow wrote:
>>> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>>>> It is needed to realize bdrv_dirty_bitmap_release_successor in
>>>> the following patch.
>>>>
>>> OK, but...
>>>
>>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>>> ---
>>>>    block/dirty-bitmap.c | 25 ++++++++++++++++++++-----
>>>>    1 file changed, 20 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>>>> index 81adbeb6d4..981f99d362 100644
>>>> --- a/block/dirty-bitmap.c
>>>> +++ b/block/dirty-bitmap.c
>>>> @@ -326,13 +326,13 @@ static bool
>>>> bdrv_dirty_bitmap_has_name(BdrvDirtyBitmap *bitmap)
>>>>        return !!bdrv_dirty_bitmap_name(bitmap);
>>>>    }
>>>>    -/* Called with BQL taken.  */
>>>> -static void bdrv_do_release_matching_dirty_bitmap(
>>>> +/* Called within bdrv_dirty_bitmap_lock..unlock */
>>> ...Add this so it will compile:
>> how do you compile to get an error? and what is unused?
>>
> .../src/qemu/block/dirty-bitmap.c:368:13: error:
> ‘bdrv_release_dirty_bitmap_locked’ defined but not used
> [-Werror=unused-function]
>   static void bdrv_release_dirty_bitmap_locked(BlockDriverState *bs,
>               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> cc1: all warnings being treated as errors
>
>
> I commented on the wrong prototype. The ((__unused__)) attribute just
> quiets this warning so it can compile without you having to refactor.


aha ok, you are right

>
> --js


-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
  2017-11-17 23:46           ` John Snow
@ 2017-11-20  9:40             ` Vladimir Sementsov-Ogievskiy
  0 siblings, 0 replies; 44+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2017-11-20  9:40 UTC (permalink / raw)
  To: John Snow, qemu-block, qemu-devel, famz
  Cc: kwolf, peter.maydell, lirans, quintela, armbru, mreitz, stefanha,
	den, amit.shah, pbonzini, dgilbert

18.11.2017 02:46, John Snow wrote:
>
> On 11/17/2017 12:30 PM, Vladimir Sementsov-Ogievskiy wrote:
>> 17.11.2017 20:20, John Snow wrote:
>>> On 11/17/2017 09:46 AM, Vladimir Sementsov-Ogievskiy wrote:
>>>> 14.11.2017 02:32, John Snow wrote:
>>>>> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>>>>>> Make it possible to set bitmap 'frozen' without a successor.
>>>>>> This is needed to protect the bitmap during outgoing bitmap postcopy
>>>>>> migration.
>>>>>>
>>>>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>>>>> ---
>>>>>>     include/block/dirty-bitmap.h |  1 +
>>>>>>     block/dirty-bitmap.c         | 22 ++++++++++++++++++++--
>>>>>>     2 files changed, 21 insertions(+), 2 deletions(-)
>>>>>>
>>>>>> diff --git a/include/block/dirty-bitmap.h
>>>>>> b/include/block/dirty-bitmap.h
>>>>>> index a9e2a92e4f..ae6d697850 100644
>>>>>> --- a/include/block/dirty-bitmap.h
>>>>>> +++ b/include/block/dirty-bitmap.h
>>>>>> @@ -39,6 +39,7 @@ uint32_t
>>>>>> bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
>>>>>>     uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap
>>>>>> *bitmap);
>>>>>>     bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
>>>>>>     bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
>>>>>> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool
>>>>>> frozen);
>>>>>>     const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
>>>>>>     int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
>>>>>>     DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap
>>>>>> *bitmap);
>>>>>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>>>>>> index 7578863aa1..67fc6bd6e0 100644
>>>>>> --- a/block/dirty-bitmap.c
>>>>>> +++ b/block/dirty-bitmap.c
>>>>>> @@ -40,6 +40,8 @@ struct BdrvDirtyBitmap {
>>>>>>         QemuMutex *mutex;
>>>>>>         HBitmap *bitmap;            /* Dirty bitmap implementation */
>>>>>>         HBitmap *meta;              /* Meta dirty bitmap */
>>>>>> +    bool frozen;                /* Bitmap is frozen, it can't be
>>>>>> modified
>>>>>> +                                   through QMP */
>>>>> I hesitate, because this now means that we have two independent bits of
>>>>> state we need to update and maintain consistency with.
>>>> it was your proposal)))
>>>>
>>>> https://lists.gnu.org/archive/html/qemu-devel/2017-07/msg01172.html
>>>>
>>>> "
>>>> Your new use case here sounds like Frozen to me, but it simply does not
>>>> have an anonymous successor to force it to be recognized as "frozen." We
>>>> can add a `bool protected` or `bool frozen` field to force recognition
>>>> of this status and adjust the json documentation accordingly.
>>>>
>>>> I think then we'd have four recognized states:
>>>>
>>>> FROZEN: Cannot be reset/deleted. Bitmap is in-use by a block job or
>>>> other internal process. Bitmap is otherwise ACTIVE.
>>>> DISABLED: Not recording any writes (by choice.)
>>>> READONLY: Not able to record any writes (by necessity.)
>>>> ACTIVE: Normal bitmap status.
>>>>
>>>> Sound right?
>>>> "
>>>>
>>>>
>>> I was afraid you'd say that :(
>>>
>>> It's okay, anyway. I shouldn't let myself go so long between reviews
>>> like this, because you catch me changing my mind. Anyway, please go
>>> ahead with it. I don't want to delay you on something that works because
>>> I can't make up *my* mind.
>> Hm, if you remember, reusing "frozen" state was strange for me too. And
>> it's not
>> late to move to
>> 1. make a new state: MIGRATION, which disallows qmp operations on bitmap
>> 2. or just make them unnamed, so they can't be touched by qmp
> "Migrating" is fine as a state name. You could probably announce this by
> having it be "frozen" in the usual way (it has a successor) and a new
> bool that lets you do whatever special handling you need to do for it.

create a successor and merge it in before postcopy stage? it is possible 
but I don't like it, looks like cheat..

>
>> anything is ok for me as well as leaving it as is. It's all little
>> things, the core is patch 10.
>>
>> "frozen" sounds like unchanged, but user will see dirty-count changing
>> in query-block.
> I guess it's a strange misnomer now... or maybe just always was a bad
> name, since it's not really "frozen" but rather "locked" in a way that
> the QMP user cannot interfere with it -- but it's still a live,
> functioning object.

so, may be the best way is to add LOCKED state? which mean:

bitmap is under some operation and is not operable by qmp. dirty-count may
not reflect current state of the bitmap until operation end. and than we 
will be
able to move to 'locked' instead of 'frozen' for backups to, and 
deprecate frozen
state.

>
> I'm remembering what I was talking about, but I think my preference is
> illustrably worse. I was trying to avoid boolean bloat by advocating
> re-use, but the re-use is kind of confusing...
>
> I think I was hoping that a bitmap on the receiving end could simply be
> "frozen" in the usual way, in that it has a successor recording writes.
>
> I think the way you want to handle it though is with different semantics
> for cleanup and recovery which makes it not quite the same state, which
> needs either a new bool or some such.
>
> Go with what you think is cleanest at this point, including if you want
> to leave it alone. I don't want to cause you to respin it over bikeshedding.
>
> --js



-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 44+ messages in thread

end of thread, other threads:[~2017-11-20  9:41 UTC | newest]

Thread overview: 44+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 01/14] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor() Vladimir Sementsov-Ogievskiy
2017-11-10  0:47   ` John Snow
2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap Vladimir Sementsov-Ogievskiy
2017-11-10 22:52   ` John Snow
2017-11-16  8:56     ` Vladimir Sementsov-Ogievskiy
2017-11-16 18:18       ` John Snow
2017-11-17  8:07     ` Vladimir Sementsov-Ogievskiy
2017-11-17 18:25       ` John Snow
2017-11-20  9:30         ` Vladimir Sementsov-Ogievskiy
2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 03/14] block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor Vladimir Sementsov-Ogievskiy
2017-11-13 22:17   ` John Snow
2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen Vladimir Sementsov-Ogievskiy
2017-11-13 23:32   ` John Snow
2017-11-17 14:46     ` Vladimir Sementsov-Ogievskiy
2017-11-17 17:20       ` John Snow
2017-11-17 17:30         ` Vladimir Sementsov-Ogievskiy
2017-11-17 23:46           ` John Snow
2017-11-20  9:40             ` Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending Vladimir Sementsov-Ogievskiy
2017-10-30 17:31   ` Dr. David Alan Gilbert
2017-10-30 18:17     ` Vladimir Sementsov-Ogievskiy
2017-10-30 18:19   ` [Qemu-devel] [PATCH v8.1 " Vladimir Sementsov-Ogievskiy
2017-11-14  0:09     ` John Snow
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 06/14] qapi: add dirty-bitmaps migration capability Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 07/14] migration: include migrate_dirty_bitmaps in migrate_postcopy Vladimir Sementsov-Ogievskiy
2017-11-14  0:19   ` John Snow
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 08/14] migration/qemu-file: add qemu_put_counted_string() Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 09/14] migration: add is_active_iterate handler Vladimir Sementsov-Ogievskiy
2017-11-14  0:29   ` John Snow
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps Vladimir Sementsov-Ogievskiy
2017-11-15  1:58   ` John Snow
2017-11-16 10:24     ` Vladimir Sementsov-Ogievskiy
2017-11-17  0:36       ` John Snow
2017-11-17  0:47       ` John Snow
2017-11-16 16:50     ` Dr. David Alan Gilbert
2017-11-17  1:27       ` John Snow
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 11/14] iotests: add default node-name Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 12/14] iotests: add dirty bitmap migration test Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 13/14] iotests: add dirty bitmap postcopy test Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 14/14] iotests: add persistent bitmap migration test Vladimir Sementsov-Ogievskiy
2017-10-30 16:54 ` [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration no-reply
2017-10-30 16:55 ` no-reply
2017-10-30 18:22 ` Vladimir Sementsov-Ogievskiy

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.