[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