All of lore.kernel.org
 help / color / mirror / Atom feed
From: Goldwyn Rodrigues <rgoldwyn@suse.de>
To: Guoqing Jiang <gqjiang@suse.com>, neilb@suse.de
Cc: linux-raid@vger.kernel.org
Subject: Re: [PATCH 04/12] md-cluster: fix deadlock issue on message lock
Date: Mon, 27 Jul 2015 11:25:35 -0500	[thread overview]
Message-ID: <55B65B7F.7010809@suse.de> (raw)
In-Reply-To: <1436518883-12783-1-git-send-email-gqjiang@suse.com>



On 07/10/2015 04:01 AM, Guoqing Jiang wrote:
> There is problem with previous communication mechanism, and we got below
> deadlock scenario with cluster which has 3 nodes.
>
> 	Sender                	    Receiver        		Receiver
>
> 	token(EX)
>         message(EX)
>        writes message
>     downconverts message(CR)
>        requests ack(EX)
> 		                  get message(CR)            gets message(CR)
>                  		  reads message                reads message
> 		               requests EX on message    requests EX on message
>
> To fix this problem, we do the following changes:
>
> 1. the sender downconverts MESSAGE to CW rather than CR.
> 2. and the receiver request PR lock not EX lock on message.
>
> And in case we failed to down-convert EX to CW on message, it is better to
> unlock message otherthan still hold the lock.
>
> Signed-off-by: Lidong Zhong <ldzhong@suse.com>
> Signed-off-by: Guoqing Jiang <gqjiang@suse.com>


Reviewed-by: Goldwyn Rodrigues <rgoldwyn@suse.com>

> ---
>   Documentation/md-cluster.txt |  4 ++--
>   drivers/md/md-cluster.c      | 14 +++++++-------
>   2 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/md-cluster.txt b/Documentation/md-cluster.txt
> index de1af7d..1b79436 100644
> --- a/Documentation/md-cluster.txt
> +++ b/Documentation/md-cluster.txt
> @@ -91,7 +91,7 @@ The algorithm is:
>       this message inappropriate or redundant.
>
>    3. sender write LVB.
> -    sender down-convert MESSAGE from EX to CR
> +    sender down-convert MESSAGE from EX to CW
>       sender try to get EX of ACK
>       [ wait until all receiver has *processed* the MESSAGE ]
>
> @@ -112,7 +112,7 @@ The algorithm is:
>       sender down-convert ACK from EX to CR
>       sender release MESSAGE
>       sender release TOKEN
> -                               receiver upconvert to EX of MESSAGE
> +                               receiver upconvert to PR of MESSAGE
>                                  receiver get CR of ACK
>                                  receiver release MESSAGE
>
> diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
> index 47199ad..85b7836 100644
> --- a/drivers/md/md-cluster.c
> +++ b/drivers/md/md-cluster.c
> @@ -488,8 +488,8 @@ static void recv_daemon(struct md_thread *thread)
>
>   	/*release CR on ack_lockres*/
>   	dlm_unlock_sync(ack_lockres);
> -	/*up-convert to EX on message_lockres*/
> -	dlm_lock_sync(message_lockres, DLM_LOCK_EX);
> +	/*up-convert to PR on message_lockres*/
> +	dlm_lock_sync(message_lockres, DLM_LOCK_PR);
>   	/*get CR on ack_lockres again*/
>   	dlm_lock_sync(ack_lockres, DLM_LOCK_CR);
>   	/*release CR on message_lockres*/
> @@ -522,7 +522,7 @@ static void unlock_comm(struct md_cluster_info *cinfo)
>    * The function:
>    * 1. Grabs the message lockresource in EX mode
>    * 2. Copies the message to the message LVB
> - * 3. Downconverts message lockresource to CR
> + * 3. Downconverts message lockresource to CW
>    * 4. Upconverts ack lock resource from CR to EX. This forces the BAST on other nodes
>    *    and the other nodes read the message. The thread will wait here until all other
>    *    nodes have released ack lock resource.
> @@ -543,12 +543,12 @@ static int __sendmsg(struct md_cluster_info *cinfo, struct cluster_msg *cmsg)
>
>   	memcpy(cinfo->message_lockres->lksb.sb_lvbptr, (void *)cmsg,
>   			sizeof(struct cluster_msg));
> -	/*down-convert EX to CR on Message*/
> -	error = dlm_lock_sync(cinfo->message_lockres, DLM_LOCK_CR);
> +	/*down-convert EX to CW on Message*/
> +	error = dlm_lock_sync(cinfo->message_lockres, DLM_LOCK_CW);
>   	if (error) {
> -		pr_err("md-cluster: failed to convert EX to CR on MESSAGE(%d)\n",
> +		pr_err("md-cluster: failed to convert EX to CW on MESSAGE(%d)\n",
>   				error);
> -		goto failed_message;
> +		goto failed_ack;
>   	}
>
>   	/*up-convert CR to EX on Ack*/
>

-- 
Goldwyn

      parent reply	other threads:[~2015-07-27 16:25 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-10  8:54 [PATCH 00/12] md-cluster: code improvement, fixs and new feature Guoqing Jiang
2015-07-10  8:54 ` [PATCH 01/12] md-cluster: use %pU to print UUIDs Guoqing Jiang
2015-07-27 16:21   ` Goldwyn Rodrigues
2015-07-10  8:54 ` [PATCH 02/12] md-cluster: split recover_slot for future code reuse Guoqing Jiang
2015-07-10  8:54 ` [PATCH 03/12] md-cluster: transfer the resync ownership to another node Guoqing Jiang
2015-07-27 16:24   ` Goldwyn Rodrigues
2015-07-10  9:01 ` [PATCH 04/12] md-cluster: fix deadlock issue on message lock Guoqing Jiang
2015-07-10  9:01   ` [PATCH 05/12] md-cluster: init completion within lockres_init Guoqing Jiang
2015-07-27 16:44     ` Goldwyn Rodrigues
2015-07-10  9:01   ` [PATCH 06/12] md-cluster: add the error check if failed to get dlm lock Guoqing Jiang
2015-07-27 16:48     ` Goldwyn Rodrigues
2015-07-28  3:04       ` Guoqing Jiang
2015-07-29  0:22         ` NeilBrown
2015-07-29  2:03           ` Guoqing Jiang
2015-07-29 23:39         ` Goldwyn Rodrigues
2015-07-10  9:01   ` [PATCH 07/12] md-cluster: init suspend_list and suspend_lock early in join Guoqing Jiang
2015-07-27 16:29     ` Goldwyn Rodrigues
2015-07-10  9:01   ` [PATCH 08/12] md-cluster: remove the unused sb_lock Guoqing Jiang
2015-07-27 16:29     ` Goldwyn Rodrigues
2015-07-10  9:01   ` [PATCH 09/12] md-cluster: add missed lockres_free Guoqing Jiang
2015-07-27 16:30     ` Goldwyn Rodrigues
2015-07-10  9:01   ` [PATCH 10/12] md-cluster: only call complete(&cinfo->completion) when node join cluster Guoqing Jiang
2015-07-27 16:49     ` Goldwyn Rodrigues
2015-07-10  9:01   ` [PATCH 11/12] md-cluster: Read the disk bitmap sb and check if it needs recovery Guoqing Jiang
2015-07-27 16:31     ` Goldwyn Rodrigues
2015-07-10  9:01   ` [PATCH 12/12] md-cluster: handle error situations more precisely in lockres_init Guoqing Jiang
2015-07-27 16:34     ` Goldwyn Rodrigues
2015-07-28  3:05       ` Guoqing Jiang
2015-07-27 16:25   ` Goldwyn Rodrigues [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55B65B7F.7010809@suse.de \
    --to=rgoldwyn@suse.de \
    --cc=gqjiang@suse.com \
    --cc=linux-raid@vger.kernel.org \
    --cc=neilb@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.