diff mbox

[19/20,v3] sparc/mm/fault_32.c: Port OOM changes to do_sparc_fault

Message ID CAFPAmTSyYJkATAD32WqHZY_PdWGjitEq4vgqCZeqjo+V24dh3Q@mail.gmail.com
State Not Applicable
Delegated to: David Miller
Headers show

Commit Message

Kautuk Consul March 26, 2012, 4:20 p.m. UTC
> David meant that the indentation should be aligned
> immediately after the open parenthesis:
>
> +       unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
> +                             (write ? FAULT_FLAG_WRITE : 0));
>
> though perhaps this is clearer as:
>
>        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
>
>        if (write)
>                flags |= FAULT_FLAG_WRITE;
>
> or even separate sets.
>
>        if (write)
>                flags = foo;
>        else
>                flags = bar;

This is how it is in the patch file(immediately after the paramthesis).
I have now attached both sparc patches to this email.

you must be having the same problem in viewing the patch file
as me due to the email client itself inserting invalid spaces here and there.

by the way, what tab-spaces are you using when you open it in vim ?

Comments

Joe Perches March 26, 2012, 4:32 p.m. UTC | #1
On Mon, 2012-03-26 at 12:20 -0400, Kautuk Consul wrote:
> > David meant that the indentation should be aligned
> > immediately after the open parenthesis:
> >
> > +       unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
> > +                             (write ? FAULT_FLAG_WRITE : 0));
> >
> > though perhaps this is clearer as:
> >
> >        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
> >
> >        if (write)
> >                flags |= FAULT_FLAG_WRITE;
> >
> > or even separate sets.
> >
> >        if (write)
> >                flags = foo;
> >        else
> >                flags = bar;
> 
> This is how it is in the patch file(immediately after the paramthesis).
> I have now attached both sparc patches to this email.
> 
> you must be having the same problem in viewing the patch file
> as me due to the email client itself inserting invalid spaces here and there.

Nope.  That's not it.

> by the way, what tab-spaces are you using when you open it in vim ?

I use vim as an editor as infrequently as possible.

Your original patch used 6 tabs and 2 spaces.
Tab size in kernel style is always 8.

Again, make sure your tab indentation is set to 8.

--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kautuk Consul March 26, 2012, 4:55 p.m. UTC | #2
>>
>> you must be having the same problem in viewing the patch file
>> as me due to the email client itself inserting invalid spaces here and there.
>
> Nope.  That's not it.
>
>> by the way, what tab-spaces are you using when you open it in vim ?
>
> I use vim as an editor as infrequently as possible.
>
> Your original patch used 6 tabs and 2 spaces.
> Tab size in kernel style is always 8.
>
> Again, make sure your tab indentation is set to 8.
>

I see what you are saying.
One question: Is it possible to include this kinda checking
(multiline statements with paranthesis checking assuming tab
indentation 8) in the
checkpatch.pl script ?
It would be easier to not make such mistakes in future with that kind of tool.
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Joe Perches March 26, 2012, 5:03 p.m. UTC | #3
On Mon, 2012-03-26 at 12:55 -0400, Kautuk Consul wrote:
> Is it possible to include this kinda checking
> (multiline statements with paranthesis checking assuming tab
> indentation 8) in the
> checkpatch.pl script ?
> It would be easier to not make such mistakes in future with that kind of tool.

Funny you should ask...

Use the latest version of checkpatch and
add the --strict option to the command line.

https://lkml.org/lkml/2012/3/2/15

It works for most cases.

--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kautuk Consul March 26, 2012, 5:05 p.m. UTC | #4
On Mon, Mar 26, 2012 at 1:03 PM, Joe Perches <joe@perches.com> wrote:
> On Mon, 2012-03-26 at 12:55 -0400, Kautuk Consul wrote:
>> Is it possible to include this kinda checking
>> (multiline statements with paranthesis checking assuming tab
>> indentation 8) in the
>> checkpatch.pl script ?
>> It would be easier to not make such mistakes in future with that kind of tool.
>
> Funny you should ask...
>
> Use the latest version of checkpatch and
> add the --strict option to the command line.
>
> https://lkml.org/lkml/2012/3/2/15
>
> It works for most cases.
>

Ah yes, I am not in the habit of using the --strict option.
I will use that in future, sorry for my ignorance.

And thanks to all you guys for helping me out here. :)
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

From 3f4a3166b5baff9d043fd39f0f0c2c8044c85cce Mon Sep 17 00:00:00 2001
From: Kautuk Consul <consul.kautuk@gmail.com>
Date: Mon, 26 Mar 2012 11:28:50 -0400
Subject: [PATCH 20/20 v3] sparc/mm/fault_64.c: Port OOM changes to
 do_sparc64_fault

Commit d065bd810b6deb67d4897a14bfe21f8eb526ba99
(mm: retry page fault when blocking on disk transfer) and
commit 37b23e0525d393d48a7d59f870b3bc061a30ccdb
(x86,mm: make pagefault killable)

The above commits introduced changes into the x86 pagefault handler
for making the page fault handler retryable as well as killable.

These changes reduce the mmap_sem hold time, which is crucial
during OOM killer invocation.

Port these changes to 64-bit sparc.

Signed-off-by: Kautuk Consul <consul.kautuk@gmail.com>
---
 arch/sparc/mm/fault_64.c |   38 +++++++++++++++++++++++++++++++-------
 1 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c
index 504c062..8322962 100644
--- a/arch/sparc/mm/fault_64.c
+++ b/arch/sparc/mm/fault_64.c
@@ -279,6 +279,7 @@  asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
 	unsigned int insn = 0;
 	int si_code, fault_code, fault;
 	unsigned long address, mm_rss;
+	unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
 	fault_code = get_thread_fault_code();
 
@@ -333,6 +334,8 @@  asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
 			insn = get_fault_insn(regs, insn);
 			goto handle_kernel_fault;
 		}
+
+retry:
 		down_read(&mm->mmap_sem);
 	}
 
@@ -423,7 +426,13 @@  good_area:
 			goto bad_area;
 	}
 
-	fault = handle_mm_fault(mm, vma, address, (fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0);
+	fault = handle_mm_fault(mm, vma, address,
+							flags | ((fault_code & FAULT_CODE_WRITE) ?
+									 FAULT_FLAG_WRITE : 0);
+
+	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
+		return;
+
 	if (unlikely(fault & VM_FAULT_ERROR)) {
 		if (fault & VM_FAULT_OOM)
 			goto out_of_memory;
@@ -431,12 +440,27 @@  good_area:
 			goto do_sigbus;
 		BUG();
 	}
-	if (fault & VM_FAULT_MAJOR) {
-		current->maj_flt++;
-		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address);
-	} else {
-		current->min_flt++;
-		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address);
+
+	if (flags & FAULT_FLAG_ALLOW_RETRY) {
+		if (fault & VM_FAULT_MAJOR) {
+			current->maj_flt++;
+			perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ,
+						  1, regs, address);
+		} else {
+			current->min_flt++;
+			perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN,
+						  1, regs, address);
+		}
+		if (fault & VM_FAULT_RETRY) {
+			flags &= ~FAULT_FLAG_ALLOW_RETRY;
+
+			/* No need to up_read(&mm->mmap_sem) as we would
+			 * have already released it in __lock_page_or_retry
+			 * in mm/filemap.c.
+			 */
+
+			goto retry;
+		}
 	}
 	up_read(&mm->mmap_sem);
 
-- 
1.7.5.4