All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eugeniy Paltsev <eugeniy.paltsev@synopsys.com>
To: "vineet.gupta1@synopsys.com" <vineet.gupta1@synopsys.com>,
	"linux-snps-arc@lists.infradead.org"
	<linux-snps-arc@lists.infradead.org>
Cc: "linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	"peterz@infradead.org" <peterz@infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/2] ARC: show_regs: avoid page allocator
Date: Wed, 19 Dec 2018 17:04:09 +0000	[thread overview]
Message-ID: <1545239047.14089.13.camel@synopsys.com> (raw)
In-Reply-To: <1545159239-30628-2-git-send-email-vgupta@synopsys.com>

Hi Vineet,

Just curious: isn't that enough to use GFP_NOWAIT instead
of GFP_KERNEL when we allocate page in show_regs()?

As I can see x86 use print_vma_addr() in their show_signal_msg()
function which allocate page with __get_free_page(GFP_NOWAIT);

On Tue, 2018-12-18 at 10:53 -0800, Vineet Gupta wrote:
> Use on-stack smaller buffers instead of dynamic pages.
> 
> The motivation for this change was to address lockdep splat when
> signal handling code calls show_regs (with preemption disabled) and
> ARC show_regs calls into sleepable page allocator.
> 
> > potentially unexpected fatal signal 11.
> > BUG: sleeping function called from invalid context at ../mm/page_alloc.c:4317
> > in_atomic(): 1, irqs_disabled(): 0, pid: 57, name: segv
> > no locks held by segv/57.
> > Preemption disabled at:
> > [<8182f17e>] get_signal+0x4a6/0x7c4
> > CPU: 0 PID: 57 Comm: segv Not tainted 4.17.0+ #23
> > 
> > Stack Trace:
> >  arc_unwind_core.constprop.1+0xd0/0xf4
> >  __might_sleep+0x1f6/0x234
> >  __get_free_pages+0x174/0xca0
> >  show_regs+0x22/0x330
> >  get_signal+0x4ac/0x7c4     # print_fatal_signals() -> preempt_disable()
> >  do_signal+0x30/0x224
> >  resume_user_mode_begin+0x90/0xd8
> 
> Despite this, lockdep still barfs (see next change), but this patch
> still has merit as in we use smaller/localized buffers now and there's
> less instructoh trace to sift thru when debugging pesky issues.
> 
> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
> ---
>  arch/arc/kernel/troubleshoot.c | 22 +++++++++-------------
>  1 file changed, 9 insertions(+), 13 deletions(-)
> 
> diff --git a/arch/arc/kernel/troubleshoot.c b/arch/arc/kernel/troubleshoot.c
> index e8d9fb452346..2885bec71fb8 100644
> --- a/arch/arc/kernel/troubleshoot.c
> +++ b/arch/arc/kernel/troubleshoot.c
> @@ -58,11 +58,12 @@ static void show_callee_regs(struct callee_regs *cregs)
>  	print_reg_file(&(cregs->r13), 13);
>  }
>  
> -static void print_task_path_n_nm(struct task_struct *tsk, char *buf)
> +static void print_task_path_n_nm(struct task_struct *tsk)
>  {
>  	char *path_nm = NULL;
>  	struct mm_struct *mm;
>  	struct file *exe_file;
> +	char buf[256];
>  
>  	mm = get_task_mm(tsk);
>  	if (!mm)
> @@ -80,10 +81,9 @@ static void print_task_path_n_nm(struct task_struct *tsk, char *buf)
>  	pr_info("Path: %s\n", !IS_ERR(path_nm) ? path_nm : "?");
>  }
>  
> -static void show_faulting_vma(unsigned long address, char *buf)
> +static void show_faulting_vma(unsigned long address)
>  {
>  	struct vm_area_struct *vma;
> -	char *nm = buf;
>  	struct mm_struct *active_mm = current->active_mm;
>  
>  	/* can't use print_vma_addr() yet as it doesn't check for
> @@ -96,8 +96,11 @@ static void show_faulting_vma(unsigned long address, char *buf)
>  	 * if the container VMA is not found
>  	 */
>  	if (vma && (vma->vm_start <= address)) {
> +		char buf[256];
> +		char *nm = "?";
> +
>  		if (vma->vm_file) {
> -			nm = file_path(vma->vm_file, buf, PAGE_SIZE - 1);
> +			nm = file_path(vma->vm_file, buf, 256-1);
>  			if (IS_ERR(nm))
>  				nm = "?";
>  		}
> @@ -173,13 +176,8 @@ void show_regs(struct pt_regs *regs)
>  {
>  	struct task_struct *tsk = current;
>  	struct callee_regs *cregs;
> -	char *buf;
> -
> -	buf = (char *)__get_free_page(GFP_KERNEL);
> -	if (!buf)
> -		return;
>  
> -	print_task_path_n_nm(tsk, buf);
> +	print_task_path_n_nm(tsk);
>  	show_regs_print_info(KERN_INFO);
>  
>  	show_ecr_verbose(regs);
> @@ -189,7 +187,7 @@ void show_regs(struct pt_regs *regs)
>  		(void *)regs->blink, (void *)regs->ret);
>  
>  	if (user_mode(regs))
> -		show_faulting_vma(regs->ret, buf); /* faulting code, not data */
> +		show_faulting_vma(regs->ret); /* faulting code, not data */
>  
>  	pr_info("[STAT32]: 0x%08lx", regs->status32);
>  
> @@ -221,8 +219,6 @@ void show_regs(struct pt_regs *regs)
>  	cregs = (struct callee_regs *)current->thread.callee_reg;
>  	if (cregs)
>  		show_callee_regs(cregs);
> -
> -	free_page((unsigned long)buf);
>  }
>  
>  void show_kernel_fault_diag(const char *str, struct pt_regs *regs,
-- 
 Eugeniy Paltsev

WARNING: multiple messages have this Message-ID (diff)
From: eugeniy.paltsev@synopsys.com (Eugeniy Paltsev)
To: linux-snps-arc@lists.infradead.org
Subject: [PATCH 1/2] ARC: show_regs: avoid page allocator
Date: Wed, 19 Dec 2018 17:04:09 +0000	[thread overview]
Message-ID: <1545239047.14089.13.camel@synopsys.com> (raw)
In-Reply-To: <1545159239-30628-2-git-send-email-vgupta@synopsys.com>

Hi Vineet,

Just curious: isn't that enough to use GFP_NOWAIT instead
of GFP_KERNEL when we allocate page in show_regs()?

As I can see x86 use print_vma_addr() in their show_signal_msg()
function which allocate page with __get_free_page(GFP_NOWAIT);

On Tue, 2018-12-18@10:53 -0800, Vineet Gupta wrote:
> Use on-stack smaller buffers instead of dynamic pages.
> 
> The motivation for this change was to address lockdep splat when
> signal handling code calls show_regs (with preemption disabled) and
> ARC show_regs calls into sleepable page allocator.
> 
> > potentially unexpected fatal signal 11.
> > BUG: sleeping function called from invalid context at ../mm/page_alloc.c:4317
> > in_atomic(): 1, irqs_disabled(): 0, pid: 57, name: segv
> > no locks held by segv/57.
> > Preemption disabled at:
> > [<8182f17e>] get_signal+0x4a6/0x7c4
> > CPU: 0 PID: 57 Comm: segv Not tainted 4.17.0+ #23
> > 
> > Stack Trace:
> >  arc_unwind_core.constprop.1+0xd0/0xf4
> >  __might_sleep+0x1f6/0x234
> >  __get_free_pages+0x174/0xca0
> >  show_regs+0x22/0x330
> >  get_signal+0x4ac/0x7c4     # print_fatal_signals() -> preempt_disable()
> >  do_signal+0x30/0x224
> >  resume_user_mode_begin+0x90/0xd8
> 
> Despite this, lockdep still barfs (see next change), but this patch
> still has merit as in we use smaller/localized buffers now and there's
> less instructoh trace to sift thru when debugging pesky issues.
> 
> Signed-off-by: Vineet Gupta <vgupta at synopsys.com>
> ---
>  arch/arc/kernel/troubleshoot.c | 22 +++++++++-------------
>  1 file changed, 9 insertions(+), 13 deletions(-)
> 
> diff --git a/arch/arc/kernel/troubleshoot.c b/arch/arc/kernel/troubleshoot.c
> index e8d9fb452346..2885bec71fb8 100644
> --- a/arch/arc/kernel/troubleshoot.c
> +++ b/arch/arc/kernel/troubleshoot.c
> @@ -58,11 +58,12 @@ static void show_callee_regs(struct callee_regs *cregs)
>  	print_reg_file(&(cregs->r13), 13);
>  }
>  
> -static void print_task_path_n_nm(struct task_struct *tsk, char *buf)
> +static void print_task_path_n_nm(struct task_struct *tsk)
>  {
>  	char *path_nm = NULL;
>  	struct mm_struct *mm;
>  	struct file *exe_file;
> +	char buf[256];
>  
>  	mm = get_task_mm(tsk);
>  	if (!mm)
> @@ -80,10 +81,9 @@ static void print_task_path_n_nm(struct task_struct *tsk, char *buf)
>  	pr_info("Path: %s\n", !IS_ERR(path_nm) ? path_nm : "?");
>  }
>  
> -static void show_faulting_vma(unsigned long address, char *buf)
> +static void show_faulting_vma(unsigned long address)
>  {
>  	struct vm_area_struct *vma;
> -	char *nm = buf;
>  	struct mm_struct *active_mm = current->active_mm;
>  
>  	/* can't use print_vma_addr() yet as it doesn't check for
> @@ -96,8 +96,11 @@ static void show_faulting_vma(unsigned long address, char *buf)
>  	 * if the container VMA is not found
>  	 */
>  	if (vma && (vma->vm_start <= address)) {
> +		char buf[256];
> +		char *nm = "?";
> +
>  		if (vma->vm_file) {
> -			nm = file_path(vma->vm_file, buf, PAGE_SIZE - 1);
> +			nm = file_path(vma->vm_file, buf, 256-1);
>  			if (IS_ERR(nm))
>  				nm = "?";
>  		}
> @@ -173,13 +176,8 @@ void show_regs(struct pt_regs *regs)
>  {
>  	struct task_struct *tsk = current;
>  	struct callee_regs *cregs;
> -	char *buf;
> -
> -	buf = (char *)__get_free_page(GFP_KERNEL);
> -	if (!buf)
> -		return;
>  
> -	print_task_path_n_nm(tsk, buf);
> +	print_task_path_n_nm(tsk);
>  	show_regs_print_info(KERN_INFO);
>  
>  	show_ecr_verbose(regs);
> @@ -189,7 +187,7 @@ void show_regs(struct pt_regs *regs)
>  		(void *)regs->blink, (void *)regs->ret);
>  
>  	if (user_mode(regs))
> -		show_faulting_vma(regs->ret, buf); /* faulting code, not data */
> +		show_faulting_vma(regs->ret); /* faulting code, not data */
>  
>  	pr_info("[STAT32]: 0x%08lx", regs->status32);
>  
> @@ -221,8 +219,6 @@ void show_regs(struct pt_regs *regs)
>  	cregs = (struct callee_regs *)current->thread.callee_reg;
>  	if (cregs)
>  		show_callee_regs(cregs);
> -
> -	free_page((unsigned long)buf);
>  }
>  
>  void show_kernel_fault_diag(const char *str, struct pt_regs *regs,
-- 
 Eugeniy Paltsev

  reply	other threads:[~2018-12-19 17:04 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-18 18:53 [PATCH 0/2] ARC show_regs fixes Vineet Gupta
2018-12-18 18:53 ` Vineet Gupta
2018-12-18 18:53 ` Vineet Gupta
2018-12-18 18:53 ` [PATCH 1/2] ARC: show_regs: avoid page allocator Vineet Gupta
2018-12-18 18:53   ` Vineet Gupta
2018-12-18 18:53   ` Vineet Gupta
2018-12-19 17:04   ` Eugeniy Paltsev [this message]
2018-12-19 17:04     ` Eugeniy Paltsev
2018-12-19 17:36     ` Vineet Gupta
2018-12-19 17:36       ` Vineet Gupta
2018-12-20  1:16     ` Vineet Gupta
2018-12-20  1:16       ` Vineet Gupta
2018-12-20 13:30       ` Tetsuo Handa
2018-12-20 13:30         ` Tetsuo Handa
2018-12-20 18:36         ` Vineet Gupta
2018-12-20 18:36           ` Vineet Gupta
2018-12-20 18:43         ` Vineet Gupta
2018-12-20 18:43           ` Vineet Gupta
2018-12-19 20:46   ` William Kucharski
2018-12-19 20:46     ` William Kucharski
2018-12-19 20:46     ` William Kucharski
2018-12-19 21:36     ` Vineet Gupta
2018-12-19 21:36       ` Vineet Gupta
2018-12-19 21:36       ` Vineet Gupta
2018-12-20 12:57   ` Michal Hocko
2018-12-20 12:57     ` Michal Hocko
2018-12-20 18:38     ` Vineet Gupta
2018-12-20 18:38       ` Vineet Gupta
2018-12-18 18:53 ` [PATCH 2/2] ARC: show_regs: fix lockdep splat for good Vineet Gupta
2018-12-18 18:53   ` Vineet Gupta
2018-12-18 18:53   ` Vineet Gupta
2018-12-20 13:04   ` Michal Hocko
2018-12-20 13:04     ` Michal Hocko
2018-12-20 18:45     ` Vineet Gupta
2018-12-20 18:45       ` Vineet Gupta
2018-12-21 13:04       ` Michal Hocko
2018-12-21 13:04         ` Michal Hocko
2018-12-21 13:27         ` Michal Hocko
2018-12-21 13:27           ` Michal Hocko
2018-12-21 17:55         ` Vineet Gupta
2018-12-21 17:55           ` Vineet Gupta
2018-12-21 17:55           ` Vineet Gupta
2018-12-21 17:55           ` Vineet Gupta
2018-12-24 19:10           ` Michal Hocko
2018-12-24 19:10             ` Michal Hocko

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=1545239047.14089.13.camel@synopsys.com \
    --to=eugeniy.paltsev@synopsys.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-snps-arc@lists.infradead.org \
    --cc=peterz@infradead.org \
    --cc=vineet.gupta1@synopsys.com \
    /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.