[Devel] [PATCH vz9 v1 55/63] dm-ploop: rework bat completion logic
Pavel Tikhomirov
ptikhomirov at virtuozzo.com
Mon Feb 10 09:26:49 MSK 2025
On 1/24/25 23:36, Alexander Atanasov wrote:
> @@ -915,28 +918,31 @@ static void ploop_free_piwb(struct ploop_index_wb *piwb)
> kfree(piwb);
> }
>
> +
> +static void ploop_bat_write_finish(struct pio *pio, void *piwb_ptr,
> + blk_status_t bi_status);
> static void ploop_put_piwb(struct ploop_index_wb *piwb)
> {
> if (atomic_dec_and_test(&piwb->count)) {
> - struct ploop *ploop = piwb->ploop;
> - /*
> - * Index wb failed. Mark clusters as unallocated again.
> - * piwb->count is zero, so all data writers compeleted.
> - */
> - if (piwb->bi_status)
> - ploop_advance_local_after_bat_wb(ploop, piwb, false);
> +
> + ploop_bat_write_finish(piwb->pio, piwb, piwb->bi_status);
It looks like piwb->bi_status can be read directly from piwb inside
ploop_bat_write_finish so we can ommit the third argument.
>
> if (piwb->comp) {
> if (piwb->comp_bi_status)
> *piwb->comp_bi_status = piwb->bi_status;
> complete(piwb->comp);
> }
> + /*
> + * Status is set from first call to ploop_bat_write_complete
> + * zero keeps it as is
> + */
> +
> ploop_free_piwb(piwb);
> }
> }
>
> /* This handler is called after BAT is updated. */
> -static void ploop_bat_write_complete(struct pio *pio, void *piwb_ptr,
> +static void ploop_bat_write_finish(struct pio *pio, void *piwb_ptr,
> blk_status_t bi_status)
> {
> struct ploop_index_wb *piwb = piwb_ptr;
> @@ -950,30 +956,30 @@ static void ploop_bat_write_complete(struct pio *pio, void *piwb_ptr,
> struct llist_node *pos, *t;
> struct llist_node *ll_cow_pios;
> struct llist_node *ll_ready_pios;
> - int completed = atomic_read(&piwb->count) == 1;
> -
> - if (completed) {
> - /* We are the last count so it is safe to advance bat */
> - if (!bi_status) {
> - /*
> - * Success: now update local BAT copy. We could do this
> - * from our delayed work, but we want to publish new
> - * mapping in the fastest way. This must be done before
> - * data bios completion, since right after we complete
> - * a bio, subsequent read wants to see written data
> - * (ploop_map() wants to see not zero bat_entries[.]).
> - */
> - ploop_advance_local_after_bat_wb(ploop, piwb, true);
> - }
> +
> + if (!bi_status) {
> + /*
> + * Success: now update local BAT copy. We could do this
> + * from our delayed work, but we want to publish new
> + * mapping in the fastest way. This must be done before
> + * data bios completion, since right after we complete
> + * a bio, subsequent read wants to see written data
> + * (ploop_map() wants to see not zero bat_entries[.]).
> + */
> + ploop_advance_local_after_bat_wb(ploop, piwb, true);
> + } else {
> + /*
> + * Index wb failed. Mark clusters as unallocated again.
> + * piwb->count is zero, so all data writers compeleted.
> + */
> + ploop_advance_local_after_bat_wb(ploop, piwb, false);
> }
>
> spin_lock_irqsave(&piwb->lock, flags);
> - if (completed)
> - piwb->completed = completed;
> - piwb->bi_status = bi_status;
> - ll_ready_pios = llist_reverse_order(llist_del_all(&piwb->llready_data_pios));
> + ll_ready_pios = llist_del_all(&piwb->llready_data_pios);
> + if (bi_status)
> + piwb->bi_status = bi_status;
The function ploop_bat_write_finish is always called with bi_status
argument set to piwb->bi_status, so this setting bi_status back to
piwb->bi_status seems excess.
> spin_unlock_irqrestore(&piwb->lock, flags);
> -
> ll_cow_pios = llist_reverse_order(llist_del_all(&piwb->cow_llist));
>
> /*
...
> @@ -1000,11 +1006,17 @@ static void ploop_bat_write_complete(struct pio *pio, void *piwb_ptr,
> ploop_dispatch_pios(ploop, flush_pio, NULL);
> piwb->flush_pio = NULL;
> }
> +}
> +
> +static void ploop_bat_write_complete(struct pio *pio, void *piwb_ptr,
> + blk_status_t bi_status)
> +
> +{
> + struct ploop_index_wb *piwb = piwb_ptr;
> +
> + if (bi_status)
> + piwb->bi_status = bi_status;
As we've already set it here beforehand.
>
> - /*
> - * In case of update BAT is failed, dst_clusters will be
> - * set back to holes_bitmap on last put_piwb().
> - */
> ploop_put_piwb(piwb);
> }
>
More information about the Devel
mailing list