[Devel] [RFC PATCH vz9 v6 44/62] dm-ploop: introduce pio runner threads
Pavel Tikhomirov
ptikhomirov at virtuozzo.com
Mon Jan 20 13:08:49 MSK 2025
On 12/6/24 05:56, Alexander Atanasov wrote:
> +static inline int ploop_runners_add_work(struct ploop *ploop, struct pio *pio)
> +{
> + int i;
> + struct ploop_worker *wrkr;
> +
> + if (++ploop->last_used_runner >= ploop->nkt_runners)
> + ploop->last_used_runner = 0;
> + wrkr = ploop->kt_runners[ploop->last_used_runner];
This can potentially lead to out of bound read, as we don't have locks
around wrapping last_used_runner increment to zero (i.e. it's not
atomic), here we can see ploop->last_used_runner >= nkt_runners.
Note: I see (in final version, with all patches applied) multiple stacks
which probably can run concurrently:
+-< ploop_runners_add_work
+-< ploop_index_wb_submit
| +-< ploop_grow_relocate_cluster
| | +-< ploop_process_resize_cmd
| | | +-< ploop_resize
| | | | +-< ploop_message
| +-< ploop_grow_update_header
| | +-< ploop_process_resize_cmd
| | | +-< ploop_resize
| | | | +-< ploop_message
| +-< ploop_submit_metadata_writeback
| | +-< do_ploop_run_work
| | | +-< do_ploop_work
| | | +-< ploop_worker
+-< process_ploop_fsync_work
| +-< do_ploop_run_work
| | +-< do_ploop_work
| | +-< ploop_worker
+-< ploop_runners_add_work_list
| +-< do_ploop_run_work
| | +-< do_ploop_work
| | +-< ploop_worker
> +
> + atomic_inc(&ploop->kt_worker->inflight_pios);
> + llist_add((struct llist_node *)(&pio->list), &wrkr->work_llist);
> + wake_up_process(wrkr->task);
> +
> + return 0;
> +}
--
Best regards, Tikhomirov Pavel
Senior Software Developer, Virtuozzo.
More information about the Devel
mailing list