1. 17 6月, 2020 5 次提交
    • E
      block: Refactor subdirectory recursion during make · e37adbeb
      Eric Blake 提交于
      Rather than listing block/monitor from the top-level Makefile.objs, we
      should instead list monitor from block/Makefile.objs.
      Suggested-by: NKevin Wolf <kwolf@redhat.com>
      Fixes: bb4e58c6Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20200608173339.3244211-1-eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      e37adbeb
    • S
      virtio-blk: On restart, process queued requests in the proper context · 49b44549
      Sergio Lopez 提交于
      On restart, we were scheduling a BH to process queued requests, which
      would run before starting up the data plane, leading to those requests
      being assigned and started on coroutines on the main context.
      
      This could cause requests to be wrongly processed in parallel from
      different threads (the main thread and the iothread managing the data
      plane), potentially leading to multiple issues.
      
      For example, stopping and resuming a VM multiple times while the guest
      is generating I/O on a virtio_blk device can trigger a crash with a
      stack tracing looking like this one:
      
      <------>
       Thread 2 (Thread 0x7ff736765700 (LWP 1062503)):
       #0  0x00005567a13b99d6 in iov_memset
           (iov=0x6563617073206f4e, iov_cnt=1717922848, offset=516096, fillc=0, bytes=7018105756081554803)
           at util/iov.c:69
       #1  0x00005567a13bab73 in qemu_iovec_memset
           (qiov=0x7ff73ec99748, offset=516096, fillc=0, bytes=7018105756081554803) at util/iov.c:530
       #2  0x00005567a12f411c in qemu_laio_process_completion (laiocb=0x7ff6512ee6c0) at block/linux-aio.c:86
       #3  0x00005567a12f42ff in qemu_laio_process_completions (s=0x7ff7182e8420) at block/linux-aio.c:217
       #4  0x00005567a12f480d in ioq_submit (s=0x7ff7182e8420) at block/linux-aio.c:323
       #5  0x00005567a12f43d9 in qemu_laio_process_completions_and_submit (s=0x7ff7182e8420)
           at block/linux-aio.c:236
       #6  0x00005567a12f44c2 in qemu_laio_poll_cb (opaque=0x7ff7182e8430) at block/linux-aio.c:267
       #7  0x00005567a13aed83 in run_poll_handlers_once (ctx=0x5567a2b58c70, timeout=0x7ff7367645f8)
           at util/aio-posix.c:520
       #8  0x00005567a13aee9f in run_poll_handlers (ctx=0x5567a2b58c70, max_ns=16000, timeout=0x7ff7367645f8)
           at util/aio-posix.c:562
       #9  0x00005567a13aefde in try_poll_mode (ctx=0x5567a2b58c70, timeout=0x7ff7367645f8)
           at util/aio-posix.c:597
       #10 0x00005567a13af115 in aio_poll (ctx=0x5567a2b58c70, blocking=true) at util/aio-posix.c:639
       #11 0x00005567a109acca in iothread_run (opaque=0x5567a2b29760) at iothread.c:75
       #12 0x00005567a13b2790 in qemu_thread_start (args=0x5567a2b694c0) at util/qemu-thread-posix.c:519
       #13 0x00007ff73eedf2de in start_thread () at /lib64/libpthread.so.0
       #14 0x00007ff73ec10e83 in clone () at /lib64/libc.so.6
      
       Thread 1 (Thread 0x7ff743986f00 (LWP 1062500)):
       #0  0x00005567a13b99d6 in iov_memset
           (iov=0x6563617073206f4e, iov_cnt=1717922848, offset=516096, fillc=0, bytes=7018105756081554803)
           at util/iov.c:69
       #1  0x00005567a13bab73 in qemu_iovec_memset
           (qiov=0x7ff73ec99748, offset=516096, fillc=0, bytes=7018105756081554803) at util/iov.c:530
       #2  0x00005567a12f411c in qemu_laio_process_completion (laiocb=0x7ff6512ee6c0) at block/linux-aio.c:86
       #3  0x00005567a12f42ff in qemu_laio_process_completions (s=0x7ff7182e8420) at block/linux-aio.c:217
       #4  0x00005567a12f480d in ioq_submit (s=0x7ff7182e8420) at block/linux-aio.c:323
       #5  0x00005567a12f4a2f in laio_do_submit (fd=19, laiocb=0x7ff5f4ff9ae0, offset=472363008, type=2)
           at block/linux-aio.c:375
       #6  0x00005567a12f4af2 in laio_co_submit
           (bs=0x5567a2b8c460, s=0x7ff7182e8420, fd=19, offset=472363008, qiov=0x7ff5f4ff9ca0, type=2)
           at block/linux-aio.c:394
       #7  0x00005567a12f1803 in raw_co_prw
           (bs=0x5567a2b8c460, offset=472363008, bytes=20480, qiov=0x7ff5f4ff9ca0, type=2)
           at block/file-posix.c:1892
       #8  0x00005567a12f1941 in raw_co_pwritev
           (bs=0x5567a2b8c460, offset=472363008, bytes=20480, qiov=0x7ff5f4ff9ca0, flags=0)
           at block/file-posix.c:1925
       #9  0x00005567a12fe3e1 in bdrv_driver_pwritev
           (bs=0x5567a2b8c460, offset=472363008, bytes=20480, qiov=0x7ff5f4ff9ca0, qiov_offset=0, flags=0)
           at block/io.c:1183
       #10 0x00005567a1300340 in bdrv_aligned_pwritev
           (child=0x5567a2b5b070, req=0x7ff5f4ff9db0, offset=472363008, bytes=20480, align=512, qiov=0x7ff72c0425b8, qiov_offset=0, flags=0) at block/io.c:1980
       #11 0x00005567a1300b29 in bdrv_co_pwritev_part
           (child=0x5567a2b5b070, offset=472363008, bytes=20480, qiov=0x7ff72c0425b8, qiov_offset=0, flags=0)
           at block/io.c:2137
       #12 0x00005567a12baba1 in qcow2_co_pwritev_task
           (bs=0x5567a2b92740, file_cluster_offset=472317952, offset=487305216, bytes=20480, qiov=0x7ff72c0425b8, qiov_offset=0, l2meta=0x0) at block/qcow2.c:2444
       #13 0x00005567a12bacdb in qcow2_co_pwritev_task_entry (task=0x5567a2b48540) at block/qcow2.c:2475
       #14 0x00005567a13167d8 in aio_task_co (opaque=0x5567a2b48540) at block/aio_task.c:45
       #15 0x00005567a13cf00c in coroutine_trampoline (i0=738245600, i1=32759) at util/coroutine-ucontext.c:115
       #16 0x00007ff73eb622e0 in __start_context () at /lib64/libc.so.6
       #17 0x00007ff6626f1350 in  ()
       #18 0x0000000000000000 in  ()
      <------>
      
      This is also known to cause crashes with this message (assertion
      failed):
      
       aio_co_schedule: Co-routine was already scheduled in 'aio_co_schedule'
      
      RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1812765Signed-off-by: NSergio Lopez <slp@redhat.com>
      Message-Id: <20200603093240.40489-3-slp@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      49b44549
    • S
      virtio-blk: Refactor the code that processes queued requests · 7aa1c247
      Sergio Lopez 提交于
      Move the code that processes queued requests from
      virtio_blk_dma_restart_bh() to its own, non-static, function. This
      will allow us to call it from the virtio_blk_data_plane_start() in a
      future patch.
      Signed-off-by: NSergio Lopez <slp@redhat.com>
      Message-Id: <20200603093240.40489-2-slp@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      7aa1c247
    • P
      icount: make dma reads deterministic · 5fb0a6b5
      Pavel Dovgalyuk 提交于
      Windows guest sometimes makes DMA requests with overlapping
      target addresses. This leads to the following structure of iov for
      the block driver:
      
      addr size1
      addr size2
      addr size3
      
      It means that three adjacent disk blocks should be read into the same
      memory buffer. Windows does not expects anything from these bytes
      (should it be data from the first block, or the last one, or some mix),
      but uses them somehow. It leads to non-determinism of the guest execution,
      because block driver does not preserve any order of reading.
      
      This situation was discusses in the mailing list at least twice:
      https://lists.gnu.org/archive/html/qemu-devel/2010-09/msg01996.html
      https://lists.gnu.org/archive/html/qemu-devel/2020-02/msg05185.html
      
      This patch makes such disk reads deterministic in icount mode.
      It splits the whole request into several parts. Parts may overlap,
      but SGs inside one part do not overlap.
      Parts that are processed later overwrite the prior ones in case
      of overlapping.
      
      Examples for different SG part sequences:
      
      1)
      A1 1000
      A2 1000
      A1 1000
      A3 1000
      ->
      One request is split into two.
      A1 1000
      A2 1000
      --
      A1 1000
      A3 1000
      
      2)
      A1 800
      A2 1000
      A1 1000
      ->
      A1 800
      A2 1000
      --
      A1 1000
      Signed-off-by: NPavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
      Message-Id: <159117972206.12193.12939621311413561779.stgit@pasha-ThinkPad-X280>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      5fb0a6b5
    • P
      hw/ide: Make IDEDMAOps handlers take a const IDEDMA pointer · ae0cebd7
      Philippe Mathieu-Daudé 提交于
      Handlers don't need to modify the IDEDMA structure.
      Make it const.
      Signed-off-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Message-Id: <20200512194917.15807-1-philmd@redhat.com>
      Acked-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      ae0cebd7
  2. 16 6月, 2020 35 次提交