mbox series

[v4,00/21] virtio-mem: Paravirtualized memory hot(un)plug

Message ID 20200610115419.51688-1-david@redhat.com (mailing list archive)
Headers show
Series virtio-mem: Paravirtualized memory hot(un)plug | expand

Message

David Hildenbrand June 10, 2020, 11:53 a.m. UTC
This is the very basic, initial version of virtio-mem. More info on
virtio-mem in general can be found in the Linux kernel driver v2 posting
[1] and in patch #10. The Linux driver is currently on its way upstream.

This series is based on [3]:
    "[PATCH v1] pc: Support coldplugging of virtio-pmem-pci devices on all
     buses"
And [4]:
    "[PATCH v2] hmp: Make json format optional for qom-set"

The patches can be found at:
    https://github.com/davidhildenbrand/qemu.git virtio-mem-v4

"The basic idea of virtio-mem is to provide a flexible,
cross-architecture memory hot(un)plug solution that avoids many limitations
imposed by existing technologies, architectures, and interfaces."

There are a lot of addons in the works (esp. protection of unplugged
memory, better hugepage support (esp. when reading unplugged memory),
resizeable memory backends, support for more architectures, ...), this is
the very basic version to get the ball rolling.

The first 8 patches make sure we don't have any sudden surprises e.g., if
somebody tries to pin all memory in RAM blocks, resulting in a higher
memory consumption than desired. The remaining patches add basic virtio-mem
along with support for x86-64. The last patch indicates to the guest OS
the maximum possible PFN using ACPI SRAT, such that Linux can properly
enable the swiotlb when booting only with DMA memory.

[1] https://lkml.kernel.org/r/20200311171422.10484-1-david@redhat.com
[2] https://lkml.kernel.org/r/20200507140139.17083-1-david@redhat.com
[3] https://lkml.kernel.org/r/20200525084511.51379-1-david@redhat.com
[3] https://lkml.kernel.org/r/20200610075153.33892-1-david@redhat.com

Based-on: <20200525084511.51379-1-david@redhat.com>
Based-on: <20200610075153.33892-1-david@redhat.com>
Cc: teawater <teawaterz@linux.alibaba.com>
Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com>

v3 -> v4
- Adapt to virtio-mem config layout change (block size now is 64bit)
- Added "numa: Auto-enable NUMA when any memory devices are possible"

v2 -> v3:
- Rebased on upstream/[3]
- "virtio-mem: Exclude unplugged memory during migration"
-- Added
- "virtio-mem: Paravirtualized memory hot(un)plug"
-- Simplify bitmap operations, find consecutive areas
-- Tweak error messages
-- Reshuffle some checks
-- Minor cleanups
- "accel/kvm: Convert to ram_block_discard_disable()"
- "target/i386: sev: Use ram_block_discard_disable()"
-- Keep asserts clean of functional things

v1 -> v2:
- Rebased to object_property_*() changes
- "exec: Introduce ram_block_discard_(disable|require)()"
-- Change the function names and rephrase/add comments
- "virtio-balloon: Rip out qemu_balloon_inhibit()"
-- Add and use "migration_in_incoming_postcopy()"
- "migration/rdma: Use ram_block_discard_disable()"
-- Add a comment regarding pin_all vs. !pin_all
- "virtio-mem: Paravirtualized memory hot(un)plug"
-- Replace virtio_mem_discard_inhibited() by
   migration_in_incoming_postcopy()
-- Drop some asserts
-- Drop virtio_mem_bad_request(), use virtio_error() directly, printing
   more information
-- Replace "Note: Discarding should never fail ..." comments by
   error_report()
-- Replace virtio_stw_p() by cpu_to_le16()
-- Drop migration_addr and migration_block_size
-- Minor cleanups
- "linux-headers: update to contain virtio-mem"
-- Updated to latest v4 in Linux
- General changes
-- Fixup the users of the renamed ram_block_discard_(disable|require)
-- Use "X: cannot disable RAM discard"-styled error messages
- Added
-- "virtio-mem: Migration sanity checks"
-- "virtio-mem: Add trace events"

David Hildenbrand (21):
  exec: Introduce ram_block_discard_(disable|require)()
  vfio: Convert to ram_block_discard_disable()
  accel/kvm: Convert to ram_block_discard_disable()
  s390x/pv: Convert to ram_block_discard_disable()
  virtio-balloon: Rip out qemu_balloon_inhibit()
  target/i386: sev: Use ram_block_discard_disable()
  migration/rdma: Use ram_block_discard_disable()
  migration/colo: Use ram_block_discard_disable()
  linux-headers: update to contain virtio-mem
  virtio-mem: Paravirtualized memory hot(un)plug
  virtio-pci: Proxy for virtio-mem
  MAINTAINERS: Add myself as virtio-mem maintainer
  hmp: Handle virtio-mem when printing memory device info
  numa: Handle virtio-mem in NUMA stats
  pc: Support for virtio-mem-pci
  virtio-mem: Allow notifiers for size changes
  virtio-pci: Send qapi events when the virtio-mem size changes
  virtio-mem: Migration sanity checks
  virtio-mem: Add trace events
  virtio-mem: Exclude unplugged memory during migration
  numa: Auto-enable NUMA when any memory devices are possible

 MAINTAINERS                                 |   8 +
 accel/kvm/kvm-all.c                         |   4 +-
 balloon.c                                   |  17 -
 exec.c                                      |  52 ++
 hw/arm/virt.c                               |   2 +
 hw/core/numa.c                              |  17 +-
 hw/i386/Kconfig                             |   1 +
 hw/i386/microvm.c                           |   1 +
 hw/i386/pc.c                                |  50 +-
 hw/i386/pc_piix.c                           |   1 +
 hw/i386/pc_q35.c                            |   1 +
 hw/s390x/s390-virtio-ccw.c                  |  22 +-
 hw/vfio/ap.c                                |  10 +-
 hw/vfio/ccw.c                               |  11 +-
 hw/vfio/common.c                            |  53 +-
 hw/vfio/pci.c                               |   6 +-
 hw/virtio/Kconfig                           |  11 +
 hw/virtio/Makefile.objs                     |   2 +
 hw/virtio/trace-events                      |  10 +
 hw/virtio/virtio-balloon.c                  |   8 +-
 hw/virtio/virtio-mem-pci.c                  | 157 ++++
 hw/virtio/virtio-mem-pci.h                  |  34 +
 hw/virtio/virtio-mem.c                      | 872 ++++++++++++++++++++
 include/exec/memory.h                       |  41 +
 include/hw/boards.h                         |   1 +
 include/hw/pci/pci.h                        |   1 +
 include/hw/vfio/vfio-common.h               |   4 +-
 include/hw/virtio/virtio-mem.h              |  86 ++
 include/migration/colo.h                    |   2 +-
 include/migration/misc.h                    |   2 +
 include/standard-headers/linux/virtio_ids.h |   1 +
 include/standard-headers/linux/virtio_mem.h | 211 +++++
 include/sysemu/balloon.h                    |   2 -
 migration/migration.c                       |  15 +-
 migration/postcopy-ram.c                    |  23 -
 migration/rdma.c                            |  18 +-
 migration/savevm.c                          |  11 +-
 monitor/hmp-cmds.c                          |  16 +
 monitor/monitor.c                           |   1 +
 qapi/misc.json                              |  64 +-
 target/i386/sev.c                           |   7 +
 41 files changed, 1730 insertions(+), 126 deletions(-)
 create mode 100644 hw/virtio/virtio-mem-pci.c
 create mode 100644 hw/virtio/virtio-mem-pci.h
 create mode 100644 hw/virtio/virtio-mem.c
 create mode 100644 include/hw/virtio/virtio-mem.h
 create mode 100644 include/standard-headers/linux/virtio_mem.h

Comments

Michael S. Tsirkin June 24, 2020, 3:33 p.m. UTC | #1
On Wed, Jun 10, 2020 at 01:53:58PM +0200, David Hildenbrand wrote:
> This is the very basic, initial version of virtio-mem. More info on
> virtio-mem in general can be found in the Linux kernel driver v2 posting
> [1] and in patch #10. The Linux driver is currently on its way upstream.
> 
> This series is based on [3]:
>     "[PATCH v1] pc: Support coldplugging of virtio-pmem-pci devices on all
>      buses"
> And [4]:
>     "[PATCH v2] hmp: Make json format optional for qom-set"
> 
> The patches can be found at:
>     https://github.com/davidhildenbrand/qemu.git virtio-mem-v4


OK so looks sane to me.
IIUC there are a couple of minor tweaks still so I'm expecting v5
of this.
You want me to merge this, right?


> "The basic idea of virtio-mem is to provide a flexible,
> cross-architecture memory hot(un)plug solution that avoids many limitations
> imposed by existing technologies, architectures, and interfaces."
> 
> There are a lot of addons in the works (esp. protection of unplugged
> memory, better hugepage support (esp. when reading unplugged memory),
> resizeable memory backends, support for more architectures, ...), this is
> the very basic version to get the ball rolling.
> 
> The first 8 patches make sure we don't have any sudden surprises e.g., if
> somebody tries to pin all memory in RAM blocks, resulting in a higher
> memory consumption than desired. The remaining patches add basic virtio-mem
> along with support for x86-64. The last patch indicates to the guest OS
> the maximum possible PFN using ACPI SRAT, such that Linux can properly
> enable the swiotlb when booting only with DMA memory.
> 
> [1] https://lkml.kernel.org/r/20200311171422.10484-1-david@redhat.com
> [2] https://lkml.kernel.org/r/20200507140139.17083-1-david@redhat.com
> [3] https://lkml.kernel.org/r/20200525084511.51379-1-david@redhat.com
> [3] https://lkml.kernel.org/r/20200610075153.33892-1-david@redhat.com
> 
> Based-on: <20200525084511.51379-1-david@redhat.com>
> Based-on: <20200610075153.33892-1-david@redhat.com>
> Cc: teawater <teawaterz@linux.alibaba.com>
> Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
> 
> v3 -> v4
> - Adapt to virtio-mem config layout change (block size now is 64bit)
> - Added "numa: Auto-enable NUMA when any memory devices are possible"
> 
> v2 -> v3:
> - Rebased on upstream/[3]
> - "virtio-mem: Exclude unplugged memory during migration"
> -- Added
> - "virtio-mem: Paravirtualized memory hot(un)plug"
> -- Simplify bitmap operations, find consecutive areas
> -- Tweak error messages
> -- Reshuffle some checks
> -- Minor cleanups
> - "accel/kvm: Convert to ram_block_discard_disable()"
> - "target/i386: sev: Use ram_block_discard_disable()"
> -- Keep asserts clean of functional things
> 
> v1 -> v2:
> - Rebased to object_property_*() changes
> - "exec: Introduce ram_block_discard_(disable|require)()"
> -- Change the function names and rephrase/add comments
> - "virtio-balloon: Rip out qemu_balloon_inhibit()"
> -- Add and use "migration_in_incoming_postcopy()"
> - "migration/rdma: Use ram_block_discard_disable()"
> -- Add a comment regarding pin_all vs. !pin_all
> - "virtio-mem: Paravirtualized memory hot(un)plug"
> -- Replace virtio_mem_discard_inhibited() by
>    migration_in_incoming_postcopy()
> -- Drop some asserts
> -- Drop virtio_mem_bad_request(), use virtio_error() directly, printing
>    more information
> -- Replace "Note: Discarding should never fail ..." comments by
>    error_report()
> -- Replace virtio_stw_p() by cpu_to_le16()
> -- Drop migration_addr and migration_block_size
> -- Minor cleanups
> - "linux-headers: update to contain virtio-mem"
> -- Updated to latest v4 in Linux
> - General changes
> -- Fixup the users of the renamed ram_block_discard_(disable|require)
> -- Use "X: cannot disable RAM discard"-styled error messages
> - Added
> -- "virtio-mem: Migration sanity checks"
> -- "virtio-mem: Add trace events"
> 
> David Hildenbrand (21):
>   exec: Introduce ram_block_discard_(disable|require)()
>   vfio: Convert to ram_block_discard_disable()
>   accel/kvm: Convert to ram_block_discard_disable()
>   s390x/pv: Convert to ram_block_discard_disable()
>   virtio-balloon: Rip out qemu_balloon_inhibit()
>   target/i386: sev: Use ram_block_discard_disable()
>   migration/rdma: Use ram_block_discard_disable()
>   migration/colo: Use ram_block_discard_disable()
>   linux-headers: update to contain virtio-mem
>   virtio-mem: Paravirtualized memory hot(un)plug
>   virtio-pci: Proxy for virtio-mem
>   MAINTAINERS: Add myself as virtio-mem maintainer
>   hmp: Handle virtio-mem when printing memory device info
>   numa: Handle virtio-mem in NUMA stats
>   pc: Support for virtio-mem-pci
>   virtio-mem: Allow notifiers for size changes
>   virtio-pci: Send qapi events when the virtio-mem size changes
>   virtio-mem: Migration sanity checks
>   virtio-mem: Add trace events
>   virtio-mem: Exclude unplugged memory during migration
>   numa: Auto-enable NUMA when any memory devices are possible
> 
>  MAINTAINERS                                 |   8 +
>  accel/kvm/kvm-all.c                         |   4 +-
>  balloon.c                                   |  17 -
>  exec.c                                      |  52 ++
>  hw/arm/virt.c                               |   2 +
>  hw/core/numa.c                              |  17 +-
>  hw/i386/Kconfig                             |   1 +
>  hw/i386/microvm.c                           |   1 +
>  hw/i386/pc.c                                |  50 +-
>  hw/i386/pc_piix.c                           |   1 +
>  hw/i386/pc_q35.c                            |   1 +
>  hw/s390x/s390-virtio-ccw.c                  |  22 +-
>  hw/vfio/ap.c                                |  10 +-
>  hw/vfio/ccw.c                               |  11 +-
>  hw/vfio/common.c                            |  53 +-
>  hw/vfio/pci.c                               |   6 +-
>  hw/virtio/Kconfig                           |  11 +
>  hw/virtio/Makefile.objs                     |   2 +
>  hw/virtio/trace-events                      |  10 +
>  hw/virtio/virtio-balloon.c                  |   8 +-
>  hw/virtio/virtio-mem-pci.c                  | 157 ++++
>  hw/virtio/virtio-mem-pci.h                  |  34 +
>  hw/virtio/virtio-mem.c                      | 872 ++++++++++++++++++++
>  include/exec/memory.h                       |  41 +
>  include/hw/boards.h                         |   1 +
>  include/hw/pci/pci.h                        |   1 +
>  include/hw/vfio/vfio-common.h               |   4 +-
>  include/hw/virtio/virtio-mem.h              |  86 ++
>  include/migration/colo.h                    |   2 +-
>  include/migration/misc.h                    |   2 +
>  include/standard-headers/linux/virtio_ids.h |   1 +
>  include/standard-headers/linux/virtio_mem.h | 211 +++++
>  include/sysemu/balloon.h                    |   2 -
>  migration/migration.c                       |  15 +-
>  migration/postcopy-ram.c                    |  23 -
>  migration/rdma.c                            |  18 +-
>  migration/savevm.c                          |  11 +-
>  monitor/hmp-cmds.c                          |  16 +
>  monitor/monitor.c                           |   1 +
>  qapi/misc.json                              |  64 +-
>  target/i386/sev.c                           |   7 +
>  41 files changed, 1730 insertions(+), 126 deletions(-)
>  create mode 100644 hw/virtio/virtio-mem-pci.c
>  create mode 100644 hw/virtio/virtio-mem-pci.h
>  create mode 100644 hw/virtio/virtio-mem.c
>  create mode 100644 include/hw/virtio/virtio-mem.h
>  create mode 100644 include/standard-headers/linux/virtio_mem.h
> 
> -- 
> 2.26.2
David Hildenbrand June 24, 2020, 3:40 p.m. UTC | #2
On 24.06.20 17:33, Michael S. Tsirkin wrote:
> On Wed, Jun 10, 2020 at 01:53:58PM +0200, David Hildenbrand wrote:
>> This is the very basic, initial version of virtio-mem. More info on
>> virtio-mem in general can be found in the Linux kernel driver v2 posting
>> [1] and in patch #10. The Linux driver is currently on its way upstream.
>>
>> This series is based on [3]:
>>     "[PATCH v1] pc: Support coldplugging of virtio-pmem-pci devices on all
>>      buses"
>> And [4]:
>>     "[PATCH v2] hmp: Make json format optional for qom-set"
>>
>> The patches can be found at:
>>     https://github.com/davidhildenbrand/qemu.git virtio-mem-v4
> 
> 
> OK so looks sane to me.
> IIUC there are a couple of minor tweaks still so I'm expecting v5
> of this.
> You want me to merge this, right?

Yes, I am planning to send (rebased) v5 most probably tomorrow. Thanks!