All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
To: Alexey Brodkin <Alexey.Brodkin@synopsys.com>,
	<linux-snps-arc@lists.infradead.org>
Cc: <linux-kernel@vger.kernel.org>,
	Vineet Gupta <Vineet.Gupta1@synopsys.com>
Subject: Re: [PATCH] ARC: Improve handling of fatal signals in do_page_fault()
Date: Wed, 1 Aug 2018 12:49:38 -0700	[thread overview]
Message-ID: <432f2efe-e7cd-7bf1-40f5-f35f8954f224@synopsys.com> (raw)
In-Reply-To: <20180629182005.10243-1-abrodkin@synopsys.com>

Hi Alexey,

I was finally forced to revisit this for my glibc tst-tls3-malloc deadlock. And
indeed with this change we don'tsee the deadlock. But see below..


> @@ -139,12 +139,16 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
>  	 */
>  	fault = handle_mm_fault(vma, address, flags);
>  
> -	/* If Pagefault was interrupted by SIGKILL, exit page fault "early" */
> +	/* If we need to retry but a fatal signal is pending, handle the
> +	 * signal first. We do not need to release the mmap_sem because
> +	 * it would already be released in __lock_page_or_retry in
> +	 * mm/filemap.c. */

Right and we were already doing that: up_read() was called for !VM_FAULT_RETRY
meaning we relied on the core mm to do that already for VM_FAULT_RETRY case.

The issue here was additional check for VM_FAULT_ERROR. Typically this is not set
by handle_mm_fault() meaning for common user faults with signal pending, we were
not calling up_read, hence the ensuing deadlock.


>  	if (unlikely(fatal_signal_pending(current))) {
> -		if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY))
> -			up_read(&mm->mmap_sem);
> -		if (user_mode(regs))
> +		if (fault & VM_FAULT_RETRY) {
> +			if (!user_mode(regs))
> +				goto no_context;

Given this code is really tricky, lets only solve one problem with 1 one patch.

>  			return;
> +		}
>  	}

The fault handling is spaghetti mess of checks and more checks and has not really
been touched since upstreaming. I need to clean it up and essentially rewrite it
for v4.19

WARNING: multiple messages have this Message-ID (diff)
From: Vineet.Gupta1@synopsys.com (Vineet Gupta)
To: linux-snps-arc@lists.infradead.org
Subject: [PATCH] ARC: Improve handling of fatal signals in do_page_fault()
Date: Wed, 1 Aug 2018 12:49:38 -0700	[thread overview]
Message-ID: <432f2efe-e7cd-7bf1-40f5-f35f8954f224@synopsys.com> (raw)
In-Reply-To: <20180629182005.10243-1-abrodkin@synopsys.com>

Hi Alexey,

I was finally forced to revisit this for my glibc tst-tls3-malloc deadlock. And
indeed with this change we don'tsee the deadlock. But see below..


> @@ -139,12 +139,16 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
>  	 */
>  	fault = handle_mm_fault(vma, address, flags);
>  
> -	/* If Pagefault was interrupted by SIGKILL, exit page fault "early" */
> +	/* If we need to retry but a fatal signal is pending, handle the
> +	 * signal first. We do not need to release the mmap_sem because
> +	 * it would already be released in __lock_page_or_retry in
> +	 * mm/filemap.c. */

Right and we were already doing that: up_read() was called for !VM_FAULT_RETRY
meaning we relied on the core mm to do that already for VM_FAULT_RETRY case.

The issue here was additional check for VM_FAULT_ERROR. Typically this is not set
by handle_mm_fault() meaning for common user faults with signal pending, we were
not calling up_read, hence the ensuing deadlock.


>  	if (unlikely(fatal_signal_pending(current))) {
> -		if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY))
> -			up_read(&mm->mmap_sem);
> -		if (user_mode(regs))
> +		if (fault & VM_FAULT_RETRY) {
> +			if (!user_mode(regs))
> +				goto no_context;

Given this code is really tricky, lets only solve one problem with 1 one patch.

>  			return;
> +		}
>  	}

The fault handling is spaghetti mess of checks and more checks and has not really
been touched since upstreaming. I need to clean it up and essentially rewrite it
for v4.19

  parent reply	other threads:[~2018-08-01 19:49 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-29 18:20 [PATCH] ARC: Improve handling of fatal signals in do_page_fault() Alexey Brodkin
2018-06-29 18:20 ` Alexey Brodkin
2018-07-12  8:32 ` Alexey Brodkin
2018-07-12  8:32   ` Alexey Brodkin
2018-08-01 19:49 ` Vineet Gupta [this message]
2018-08-01 19:49   ` Vineet Gupta
2018-08-02  7:08   ` Alexey Brodkin
2018-08-02  7:08     ` Alexey Brodkin
2018-08-02 21:54     ` Vineet Gupta
2018-08-02 21:54       ` Vineet Gupta

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=432f2efe-e7cd-7bf1-40f5-f35f8954f224@synopsys.com \
    --to=vineet.gupta1@synopsys.com \
    --cc=Alexey.Brodkin@synopsys.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-snps-arc@lists.infradead.org \
    /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.