mbox series

[v6,00/19] migration/multifd: Remove multifd_send_state->pages

Message ID 20240827174606.10352-1-farosas@suse.de (mailing list archive)
Headers show
Series migration/multifd: Remove multifd_send_state->pages | expand

Message

Fabiano Rosas Aug. 27, 2024, 5:45 p.m. UTC
Hi,

Added some docs for the multifd methods since I removed the docstrings
from the various implementations.

For the recv packet cleanup, I decided to go with the const packet
suggestion. I generally prefer to not have that sort of side effect,
even if it's for sanitization.

CI run: https://gitlab.com/farosas/qemu/-/pipelines/1429203972

================================================================
v5:
https://lore.kernel.org/r/20240826195322.16532-1-farosas@suse.de

Hi, thank you all for the reviews. One more version to address a
couple of cleanups suggested by Philippe.

CI run: https://gitlab.com/farosas/qemu/-/pipelines/1427843439

v4:
https://lore.kernel.org/r/20240823173911.6712-1-farosas@suse.de

Not much changed sinced v3, the most notable is that I kept the nocomp
names and created multifd-nocomp.c. I think "plain" is even more
misterious, so let's keep what we are already used to.

CI run: https://gitlab.com/farosas/qemu/-/pipelines/1425141484

v3:
https://lore.kernel.org/r/20240801123516.4498-1-farosas@suse.de

This v3 incorporates the suggestions done by Peter in v2. Aside from
those, of note:

- fixed the allocation of MultiFDSendData. The previous version didn't
  account for compiler-inserted holes;

- kept the packet split patch;

- added some patches to remove p->page_count, p->page_size,
  pages->allocated. These are all constants and don't need to be
  per-channel;

- moved the code into multifd-ram.c.

  However, I left the p->packet allocation (depends on page_count) and
  p->normal + p->zero behind because I need to see how the device
  state patches will deal with the packet stuff before I can come up
  with a way to move those out of the MultiFD*Params. It might not be
  worth it adding another struct just for the ram code to store
  p->normal, p->zero.

With this I'm pretty much done with what I think needs to be changed
as a prereq for the device state work. I don't have anything else in
mind to add to this series.

CI run: https://gitlab.com/farosas/qemu/-/pipelines/1395572680

v2:
https://lore.kernel.org/r/20240722175914.24022-1-farosas@suse.de

v1:
https://lore.kernel.org/r/20240620212111.29319-1-farosas@suse.de

First of all, apologies for the roughness of the series. I'm off for
the next couple of weeks and wanted to put something together early
for your consideration.

This series is a refactoring (based on an earlier, off-list
attempt[0]), aimed to remove the usage of the MultiFDPages_t type in
the multifd core. If we're going to add support for more data types to
multifd, we first need to clean that up.

This time around this work was prompted by Maciej's series[1]. I see
you're having to add a bunch of is_device_state checks to work around
the rigidity of the code.

Aside from the VFIO work, there is also the intent (coming back from
Juan's ideas) to make multifd the default code path for migration,
which will have to include the vmstate migration and anything else we
put on the stream via QEMUFile.

I have long since been bothered by having 'pages' sprinkled all over
the code, so I might be coming at this with a bit of a narrow focus,
but I believe in order to support more types of payloads in multifd,
we need to first allow the scheduling at multifd_send_pages() to be
independent of MultiFDPages_t. So here it is. Let me know what you
think.

(as I said, I'll be off for a couple of weeks, so feel free to
incorporate any of this code if it's useful. Or to ignore it
completely).

CI run: https://gitlab.com/farosas/qemu/-/pipelines/1340992028

0- https://github.com/farosas/qemu/commits/multifd-packet-cleanups/
1- https://lore.kernel.org/r/cover.1718717584.git.maciej.szmigiero@oracle.com

Fabiano Rosas (19):
  migration/multifd: Reduce access to p->pages
  migration/multifd: Inline page_size and page_count
  migration/multifd: Remove pages->allocated
  migration/multifd: Pass in MultiFDPages_t to file_write_ramblock_iov
  migration/multifd: Introduce MultiFDSendData
  migration/multifd: Make MultiFDPages_t:offset a flexible array member
  migration/multifd: Replace p->pages with an union pointer
  migration/multifd: Move pages accounting into
    multifd_send_zero_page_detect()
  migration/multifd: Remove total pages tracing
  migration/multifd: Isolate ram pages packet data
  migration/multifd: Don't send ram data during SYNC
  migration/multifd: Replace multifd_send_state->pages with client data
  migration/multifd: Allow multifd sync without flush
  migration/multifd: Standardize on multifd ops names
  migration/multifd: Register nocomp ops dynamically
  migration/multifd: Move nocomp code into multifd-nocomp.c
  migration/multifd: Make MultiFDMethods const
  migration/multifd: Stop changing the packet on recv side
  migration/multifd: Add documentation for multifd methods

 migration/file.c              |   3 +-
 migration/file.h              |   2 +-
 migration/meson.build         |   1 +
 migration/multifd-nocomp.c    | 388 +++++++++++++++++++++++
 migration/multifd-qpl.c       |  79 +----
 migration/multifd-uadk.c      | 102 ++-----
 migration/multifd-zero-page.c |  13 +-
 migration/multifd-zlib.c      |  99 ++----
 migration/multifd-zstd.c      |  98 ++----
 migration/multifd.c           | 557 ++++++----------------------------
 migration/multifd.h           | 152 ++++++++--
 migration/ram.c               |  10 +-
 migration/trace-events        |   9 +-
 13 files changed, 709 insertions(+), 804 deletions(-)
 create mode 100644 migration/multifd-nocomp.c