1. 28 12月, 2022 5 次提交
    • C
      vhost_vdpa: fix the crash in unmap a large memory · e794070a
      Cindy Lu 提交于
      While testing in vIOMMU, sometimes Guest will unmap very large memory,
      which will cause the crash. To fix this, add a new function
      vhost_vdpa_general_unmap(). This function will only unmap the memory
      that saved in iotlb.
      
      Call Trace:
      [  647.820144] ------------[ cut here ]------------
      [  647.820848] kernel BUG at drivers/iommu/intel/iommu.c:1174!
      [  647.821486] invalid opcode: 0000 [#1] PREEMPT SMP PTI
      [  647.822082] CPU: 10 PID: 1181 Comm: qemu-system-x86 Not tainted 6.0.0-rc1home_lulu_2452_lulu7_vhost+ #62
      [  647.823139] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.15.0-29-g6a62e0cb0dfe-prebuilt.qem4
      [  647.824365] RIP: 0010:domain_unmap+0x48/0x110
      [  647.825424] Code: 48 89 fb 8d 4c f6 1e 39 c1 0f 4f c8 83 e9 0c 83 f9 3f 7f 18 48 89 e8 48 d3 e8 48 85 c0 75 59
      [  647.828064] RSP: 0018:ffffae5340c0bbf0 EFLAGS: 00010202
      [  647.828973] RAX: 0000000000000001 RBX: ffff921793d10540 RCX: 000000000000001b
      [  647.830083] RDX: 00000000080000ff RSI: 0000000000000001 RDI: ffff921793d10540
      [  647.831214] RBP: 0000000007fc0100 R08: ffffae5340c0bcd0 R09: 0000000000000003
      [  647.832388] R10: 0000007fc0100000 R11: 0000000000100000 R12: 00000000080000ff
      [  647.833668] R13: ffffae5340c0bcd0 R14: ffff921793d10590 R15: 0000008000100000
      [  647.834782] FS:  00007f772ec90640(0000) GS:ffff921ce7a80000(0000) knlGS:0000000000000000
      [  647.836004] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  647.836990] CR2: 00007f02c27a3a20 CR3: 0000000101b0c006 CR4: 0000000000372ee0
      [  647.838107] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  647.839283] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [  647.840666] Call Trace:
      [  647.841437]  <TASK>
      [  647.842107]  intel_iommu_unmap_pages+0x93/0x140
      [  647.843112]  __iommu_unmap+0x91/0x1b0
      [  647.844003]  iommu_unmap+0x6a/0x95
      [  647.844885]  vhost_vdpa_unmap+0x1de/0x1f0 [vhost_vdpa]
      [  647.845985]  vhost_vdpa_process_iotlb_msg+0xf0/0x90b [vhost_vdpa]
      [  647.847235]  ? _raw_spin_unlock+0x15/0x30
      [  647.848181]  ? _copy_from_iter+0x8c/0x580
      [  647.849137]  vhost_chr_write_iter+0xb3/0x430 [vhost]
      [  647.850126]  vfs_write+0x1e4/0x3a0
      [  647.850897]  ksys_write+0x53/0xd0
      [  647.851688]  do_syscall_64+0x3a/0x90
      [  647.852508]  entry_SYSCALL_64_after_hwframe+0x63/0xcd
      [  647.853457] RIP: 0033:0x7f7734ef9f4f
      [  647.854408] Code: 89 54 24 18 48 89 74 24 10 89 7c 24 08 e8 29 76 f8 ff 48 8b 54 24 18 48 8b 74 24 10 41 89 c8
      [  647.857217] RSP: 002b:00007f772ec8f040 EFLAGS: 00000293 ORIG_RAX: 0000000000000001
      [  647.858486] RAX: ffffffffffffffda RBX: 00000000fef00000 RCX: 00007f7734ef9f4f
      [  647.859713] RDX: 0000000000000048 RSI: 00007f772ec8f090 RDI: 0000000000000010
      [  647.860942] RBP: 00007f772ec8f1a0 R08: 0000000000000000 R09: 0000000000000000
      [  647.862206] R10: 0000000000000001 R11: 0000000000000293 R12: 0000000000000010
      [  647.863446] R13: 0000000000000002 R14: 0000000000000000 R15: ffffffff01100000
      [  647.864692]  </TASK>
      [  647.865458] Modules linked in: rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver nfs lockd grace fscache netfs v]
      [  647.874688] ---[ end trace 0000000000000000 ]---
      
      Cc: stable@vger.kernel.org
      Fixes: 4c8cf318 ("vhost: introduce vDPA-based backend")
      Signed-off-by: NCindy Lu <lulu@redhat.com>
      Message-Id: <20221219073331.556140-1-lulu@redhat.com>
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      e794070a
    • S
      vhost-vdpa: fix an iotlb memory leak · c070c191
      Stefano Garzarella 提交于
      Before commit 3d569879 ("vhost-vdpa: introduce asid based IOTLB")
      we called vhost_vdpa_iotlb_unmap(v, iotlb, 0ULL, 0ULL - 1) during
      release to free all the resources allocated when processing user IOTLB
      messages through vhost_vdpa_process_iotlb_update().
      That commit changed the handling of IOTLB a bit, and we accidentally
      removed some code called during the release.
      
      We partially fixed this with commit 037d4305 ("vhost-vdpa: call
      vhost_vdpa_cleanup during the release") but a potential memory leak is
      still there as showed by kmemleak if the application does not send
      VHOST_IOTLB_INVALIDATE or crashes:
      
        unreferenced object 0xffff888007fbaa30 (size 16):
          comm "blkio-bench", pid 914, jiffies 4294993521 (age 885.500s)
          hex dump (first 16 bytes):
            40 73 41 07 80 88 ff ff 00 00 00 00 00 00 00 00  @sA.............
          backtrace:
            [<0000000087736d2a>] kmem_cache_alloc_trace+0x142/0x1c0
            [<0000000060740f50>] vhost_vdpa_process_iotlb_msg+0x68c/0x901 [vhost_vdpa]
            [<0000000083e8e205>] vhost_chr_write_iter+0xc0/0x4a0 [vhost]
            [<000000008f2f414a>] vhost_vdpa_chr_write_iter+0x18/0x20 [vhost_vdpa]
            [<00000000de1cd4a0>] vfs_write+0x216/0x4b0
            [<00000000a2850200>] ksys_write+0x71/0xf0
            [<00000000de8e720b>] __x64_sys_write+0x19/0x20
            [<0000000018b12cbb>] do_syscall_64+0x3f/0x90
            [<00000000986ec465>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
      
      Let's fix this calling vhost_vdpa_iotlb_unmap() on the whole range in
      vhost_vdpa_remove_as(). We move that call before vhost_dev_cleanup()
      since we need a valid v->vdev.mm in vhost_vdpa_pa_unmap().
      vhost_iotlb_reset() call can be removed, since vhost_vdpa_iotlb_unmap()
      on the whole range removes all the entries.
      
      The kmemleak log reported was observed with a vDPA device that has `use_va`
      set to true (e.g. VDUSE). This patch has been tested with both types of
      devices.
      
      Fixes: 037d4305 ("vhost-vdpa: call vhost_vdpa_cleanup during the release")
      Fixes: 3d569879 ("vhost-vdpa: introduce asid based IOTLB")
      Signed-off-by: NStefano Garzarella <sgarzare@redhat.com>
      Message-Id: <20221109154213.146789-1-sgarzare@redhat.com>
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      Acked-by: NJason Wang <jasowang@redhat.com>
      c070c191
    • S
      vhost: fix range used in translate_desc() · 98047313
      Stefano Garzarella 提交于
      vhost_iotlb_itree_first() requires `start` and `last` parameters
      to search for a mapping that overlaps the range.
      
      In translate_desc() we cyclically call vhost_iotlb_itree_first(),
      incrementing `addr` by the amount already translated, so rightly
      we move the `start` parameter passed to vhost_iotlb_itree_first(),
      but we should hold the `last` parameter constant.
      
      Let's fix it by saving the `last` parameter value before incrementing
      `addr` in the loop.
      
      Fixes: a9709d68 ("vhost: convert pre sorted vhost memory array to interval tree")
      Acked-by: NJason Wang <jasowang@redhat.com>
      Signed-off-by: NStefano Garzarella <sgarzare@redhat.com>
      Message-Id: <20221109102503.18816-3-sgarzare@redhat.com>
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      98047313
    • S
      vringh: fix range used in iotlb_translate() · f85efa9b
      Stefano Garzarella 提交于
      vhost_iotlb_itree_first() requires `start` and `last` parameters
      to search for a mapping that overlaps the range.
      
      In iotlb_translate() we cyclically call vhost_iotlb_itree_first(),
      incrementing `addr` by the amount already translated, so rightly
      we move the `start` parameter passed to vhost_iotlb_itree_first(),
      but we should hold the `last` parameter constant.
      
      Let's fix it by saving the `last` parameter value before incrementing
      `addr` in the loop.
      
      Fixes: 9ad9c49c ("vringh: IOTLB support")
      Acked-by: NJason Wang <jasowang@redhat.com>
      Signed-off-by: NStefano Garzarella <sgarzare@redhat.com>
      Message-Id: <20221109102503.18816-2-sgarzare@redhat.com>
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      f85efa9b
    • Y
      vhost/vsock: Fix error handling in vhost_vsock_init() · 7a4efe18
      Yuan Can 提交于
      A problem about modprobe vhost_vsock failed is triggered with the
      following log given:
      
      modprobe: ERROR: could not insert 'vhost_vsock': Device or resource busy
      
      The reason is that vhost_vsock_init() returns misc_register() directly
      without checking its return value, if misc_register() failed, it returns
      without calling vsock_core_unregister() on vhost_transport, resulting the
      vhost_vsock can never be installed later.
      A simple call graph is shown as below:
      
       vhost_vsock_init()
         vsock_core_register() # register vhost_transport
         misc_register()
           device_create_with_groups()
             device_create_groups_vargs()
               dev = kzalloc(...) # OOM happened
         # return without unregister vhost_transport
      
      Fix by calling vsock_core_unregister() when misc_register() returns error.
      
      Fixes: 433fc58e ("VSOCK: Introduce vhost_vsock.ko")
      Signed-off-by: NYuan Can <yuancan@huawei.com>
      Message-Id: <20221108101705.45981-1-yuancan@huawei.com>
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      Reviewed-by: NStefano Garzarella <sgarzare@redhat.com>
      Acked-by: NJason Wang <jasowang@redhat.com>
      7a4efe18
  2. 26 11月, 2022 2 次提交
  3. 07 10月, 2022 1 次提交
  4. 30 9月, 2022 1 次提交
    • J
      vhost/vsock: Use kvmalloc/kvfree for larger packets. · 0e3f7293
      Junichi Uekawa 提交于
      When copying a large file over sftp over vsock, data size is usually 32kB,
      and kmalloc seems to fail to try to allocate 32 32kB regions.
      
       vhost-5837: page allocation failure: order:4, mode:0x24040c0
       Call Trace:
        [<ffffffffb6a0df64>] dump_stack+0x97/0xdb
        [<ffffffffb68d6aed>] warn_alloc_failed+0x10f/0x138
        [<ffffffffb68d868a>] ? __alloc_pages_direct_compact+0x38/0xc8
        [<ffffffffb664619f>] __alloc_pages_nodemask+0x84c/0x90d
        [<ffffffffb6646e56>] alloc_kmem_pages+0x17/0x19
        [<ffffffffb6653a26>] kmalloc_order_trace+0x2b/0xdb
        [<ffffffffb66682f3>] __kmalloc+0x177/0x1f7
        [<ffffffffb66e0d94>] ? copy_from_iter+0x8d/0x31d
        [<ffffffffc0689ab7>] vhost_vsock_handle_tx_kick+0x1fa/0x301 [vhost_vsock]
        [<ffffffffc06828d9>] vhost_worker+0xf7/0x157 [vhost]
        [<ffffffffb683ddce>] kthread+0xfd/0x105
        [<ffffffffc06827e2>] ? vhost_dev_set_owner+0x22e/0x22e [vhost]
        [<ffffffffb683dcd1>] ? flush_kthread_worker+0xf3/0xf3
        [<ffffffffb6eb332e>] ret_from_fork+0x4e/0x80
        [<ffffffffb683dcd1>] ? flush_kthread_worker+0xf3/0xf3
      
      Work around by doing kvmalloc instead.
      
      Fixes: 433fc58e ("VSOCK: Introduce vhost_vsock.ko")
      Signed-off-by: NJunichi Uekawa <uekawa@chromium.org>
      Reviewed-by: NStefano Garzarella <sgarzare@redhat.com>
      Acked-by: NMichael S. Tsirkin <mst@redhat.com>
      Link: https://lore.kernel.org/r/20220928064538.667678-1-uekawa@chromium.orgSigned-off-by: NJakub Kicinski <kuba@kernel.org>
      0e3f7293
  5. 29 9月, 2022 1 次提交
  6. 11 8月, 2022 7 次提交
  7. 09 8月, 2022 1 次提交
  8. 27 6月, 2022 1 次提交
    • S
      vhost-vdpa: call vhost_vdpa_cleanup during the release · 037d4305
      Stefano Garzarella 提交于
      Before commit 3d569879 ("vhost-vdpa: introduce asid based IOTLB")
      we call vhost_vdpa_iotlb_free() during the release to clean all regions
      mapped in the iotlb.
      
      That commit removed vhost_vdpa_iotlb_free() and added vhost_vdpa_cleanup()
      to do some cleanup, including deleting all mappings, but we forgot to call
      it in vhost_vdpa_release().
      
      This causes that if an application does not remove all mappings explicitly
      (or it crashes), the mappings remain in the iotlb and subsequent
      applications may fail if they map the same addresses.
      
      Calling vhost_vdpa_cleanup() also fixes a memory leak since we are not
      freeing `v->vdev.vqs` during the release from the same commit.
      
      Since vhost_vdpa_cleanup() calls vhost_dev_cleanup() we can remove its
      call from vhost_vdpa_release().
      
      Fixes: 3d569879 ("vhost-vdpa: introduce asid based IOTLB")
      Cc: gautam.dawar@xilinx.com
      Signed-off-by: NStefano Garzarella <sgarzare@redhat.com>
      Message-Id: <20220622151407.51232-1-sgarzare@redhat.com>
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      Tested-by: NEugenio Pérez <eperezma@redhat.com>
      Acked-by: NJason Wang <jasowang@redhat.com>
      037d4305
  9. 09 6月, 2022 1 次提交
  10. 08 6月, 2022 1 次提交
  11. 01 6月, 2022 19 次提交