Looks good except one missed hunk.

We can handle excess pio->llist.next = NULL and INIT_LIST_HEADs, and list_for_each_ENTRY_safe separately later, as those are not directly connected to this rework.

note: Looks like you've accidentally over-wrote original patch authors.

Reviewed-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com>

On 2/12/25 17:32, Konstantin Khorenko wrote:
Ploop processes requsts in a different threads in parallel
where possible which results in significant improvement in
performance and makes further optimistations possible.

v1:
   - addressed feedback, i've left a few requests to merge changes
     into bigger patches out, as to keep changes in smaller chunks
   - patches merged and separated changes - generic cleanup
   - fix endio for md page writeback
   - background async allocation of space
   - move enospc pios dispatch from timer to thread
   - fixed allocations in atomic context
   - fixed locking wrt userspace/interrupt context
   - reworked discard cleanup
   - removed workqueue, only use kthread code
   - make metadata writeback works in parallel
   - end fsync pios in parallel
   - fixed current flags manipulation

v2:
   - commit "dm-ploop: introduce pio.llist" appeared
     It introduces the the pio.llist along with pio.list, gathered in an
     union, so during the processes of switching between list users and
     llist users, we could use appropriate fields without strict pointers
     casts.

TODO:
   - there are multiple INIT_LIST_HEAD() left in the code, most of them
     are just not needed, but let's looks precisely at each case.
     Same for "pio->llist.next = NULL;"

   - md_page.wb_link switched to llist and later - back to list along
     with introducing ploop.wb_batch_list and ploop.wb_batch_list_prio.
     Need to understand if we want the latter to be lists or llists and
     don't push wb_link back and forth.

RFC series:
v6 changes:
  - locking fixes
  - use READ_ONCE/WRITE_ONCE
  - properly handle DIO errors (ENOTBLK)
  - added support for data pios with REQ_FUA
  - convert more lists to lockless variants
  - resize/grow is good

v5 with changes in v4:
  - BAT writeback delay
  - Lists/Locking moving to lockless lists to reduce locking
  - Requests are prepared in the caller to reduce load of worker thread
  - REQ_FUA and REQ_PREFLUSH support
  - Convert bit fields to use atomic bitops - reduce locking
  - remove fsync worker to guarantee order of execution
  - Map all md pages at creation time - they are only freed on device
     destroy

Known bugs:
   - delayed metadata writeback is not working and is missing error handling
      - patch to disable it until fixed
   - fast path is not working - causes rcu lockups - patch to disable it

Further improvements:
   - optimize md pages lookups

Alexander Atanasov (42):
   dm-ploop: md_pages map all pages at creation time
   dm-ploop: Use READ_ONCE/WRITE_ONCE to access md page data
   dm-ploop: fsync after all pios are sent
   dm-ploop: move md status to use proper bitops
   dm-ploop: convert wait_list and wb_batch_llist to use lockless lists
   dm-ploop: convert enospc handling to use lockless lists
   dm-ploop: convert suspended_pios list to use lockless list
   dm-ploop: move from wq to kthread
   dm-ploop: do not use a wrapper for set_bit to make a page writeback
   dm-ploop: BAT use only one list for writeback
   dm-ploop: make md writeback timeout to be per page
   dm-ploop: add interface to disable bat writeback delay
   dm-ploop: convert wb_batch_list to lockless variant
   dm-ploop: convert high_prio to status
   dm-ploop: convert md page rw lock to spin lock
   dm-ploop: convert bat_rwlock to bat_lock spinlock
   dm-ploop: prepare bat updates under bat_lock
   dm-ploop: make ploop_bat_write_complete ready for parallel pio
     completion
   dm-ploop: make ploop_submit_metadata_writeback return number of
     requests sent
   dm-ploop: introduce pio runner threads
   dm-ploop: add pio list ids to be used when passing pios to runners
   dm-ploop: disable metadata writeback delay
   dm-ploop: use lockless lists for chained cow updates list
   dm-ploop: use lockless lists for data ready pios
   dm-ploop: give runner threads better name
   dm-ploop: resize operation - add holes bitmap locking
   dm-ploop: remove unnecessary operations
   dm-ploop: use filp per thread
   dm-ploop: catch if we try to advance pio past bio end
   dm-ploop: support REQ_FUA for data pios
   dm-ploop: proplerly access nr_bat_entries
   dm-ploop: fix locking and improve error handling when submitting pios
   dm-ploop: fix how ENOTBLK is handled
   dm-ploop: sync when suspended or stopping
   dm-ploop: rework logic in pio processing
   dm-ploop: end fsync pios in parallel
   dm-ploop: make filespace preallocations async
   dm-ploop: resubmit enospc pios from dispatcher thread
   dm-ploop: dm-ploop: simplify discard completion
   dm-ploop: use GFP_ATOMIC instead of GFP_NOIO
   dm-ploop: fix locks used in mixed context
   dm-ploop: fix how current flags are managed inside threads

Andrey Zhadchenko (13):
   dm-ploop: do not flush after metadata writes
   dm-ploop: set IOCB_DSYNC on all FUA requests
   dm-ploop: remove extra ploop_cluster_is_in_top_delta()
   dm-ploop: introduce per-md page locking
   dm-ploop: reduce BAT accesses on discard completion
   dm-ploop: simplify llseek
   dm-ploop: speed up ploop_prepare_bat_update()
   dm-ploop: make new allocations immediately visible in BAT
   dm-ploop: drop ploop_cluster_is_in_top_delta()
   dm-ploop: do not wait for BAT update for non-FUA requests
   dm-ploop: add delay for metadata writeback
   dm-ploop: submit all postponed metadata on REQ_OP_FLUSH
   dm-ploop: handle REQ_PREFLUSH

Konstantin Khorenko (10):
   dm-ploop: drop md_page.wb_link initialization
   dm-ploop: introduce pio.llist
   dm-ploop: convert the rest of the lists to use llist variant
   dm-ploop: combine processing of pios thru prepare list and remove
     fsync worker
   dm-ploop: move preparations of pios into the caller from worker
   dm-ploop: fast path execution for reads
   dm-ploop: split cow processing into two functions
   dm-ploop: process pios via runners
   dm-ploop: disable fast path
   dm-ploop: rework bat completion logic

  drivers/md/dm-ploop-bat.c    |   74 +-
  drivers/md/dm-ploop-cmd.c    |  174 ++--
  drivers/md/dm-ploop-map.c    | 1599 ++++++++++++++++++++++++----------
  drivers/md/dm-ploop-target.c |  168 +++-
  drivers/md/dm-ploop.h        |  120 ++-
  5 files changed, 1484 insertions(+), 651 deletions(-)


--
Best regards, Tikhomirov Pavel
Senior Software Developer, Virtuozzo.

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to