[Devel] [RFC PATCH vz9 v6 06/62] dm-ploop: reduce the time lock is hold, taking it only to protect data

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Thu Jan 9 06:52:14 MSK 2025



On 12/6/24 05:55, Alexander Atanasov wrote:
> Currently lock is taken once for all pios submitted(code block),
> move it to protect only the list insertion (data).
> The goal is to reduce lock contention on the deferred lock as
> it is in the top of lock stats.
> 
> https://virtuozzo.atlassian.net/browse/VSTOR-91820
> Signed-off-by: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
> ---
>   drivers/md/dm-ploop-map.c | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
> index 4b9e000e0f98..a0fe92a592a1 100644
> --- a/drivers/md/dm-ploop-map.c
> +++ b/drivers/md/dm-ploop-map.c
> @@ -340,8 +340,9 @@ static void ploop_dispatch_pio(struct ploop *ploop, struct pio *pio,
>   			       bool *is_data, bool *is_flush)
>   {
>   	struct list_head *list = &ploop->pios[pio->queue_list_id];
> +	unsigned long flags;
>   
> -	lockdep_assert_held(&ploop->deferred_lock);
> +	lockdep_assert_not_held(&ploop->deferred_lock);
>   	WARN_ON_ONCE(pio->queue_list_id >= PLOOP_LIST_COUNT);
>   
>   	if (pio->queue_list_id == PLOOP_LIST_FLUSH)
> @@ -349,23 +350,22 @@ static void ploop_dispatch_pio(struct ploop *ploop, struct pio *pio,
>   	else
>   		*is_data = true;
>   
> +	spin_lock_irqsave(&ploop->deferred_lock, flags);
>   	list_add_tail(&pio->list, list);
> +	spin_unlock_irqrestore(&ploop->deferred_lock, flags);

This patch can be merged to "[RFC PATCH vz9 v6 10/62] dm-ploop: convert 
the rest of the lists to use llist variant".

Also I think that having one lock around the whole loop introduces much 
less lock contention than doing multiple take/release on each iteration 
of the loop.

>   }
>   
>   void ploop_dispatch_pios(struct ploop *ploop, struct pio *pio,
>   			 struct list_head *pio_list)
>   {
>   	bool is_data = false, is_flush = false;
> -	unsigned long flags;
>   
> -	spin_lock_irqsave(&ploop->deferred_lock, flags);
>   	if (pio)
>   		ploop_dispatch_pio(ploop, pio, &is_data, &is_flush);
>   	if (pio_list) {
>   		while ((pio = ploop_pio_list_pop(pio_list)) != NULL)
>   			ploop_dispatch_pio(ploop, pio, &is_data, &is_flush);
>   	}
> -	spin_unlock_irqrestore(&ploop->deferred_lock, flags);
>   
>   	if (is_data)
>   		queue_work(ploop->wq, &ploop->worker);

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



More information about the Devel mailing list