All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrea Arcangeli <andrea@suse.de>
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org, Nick Piggin <npiggin@novell.com>
Subject: OOM fixes 4/5
Date: Fri, 21 Jan 2005 06:50:04 +0100	[thread overview]
Message-ID: <20050121055004.GD12647@dualathlon.random> (raw)
In-Reply-To: <20050121054945.GC12647@dualathlon.random>

From: Andrea Arcangeli <andrea@suse.de>
Subject: convert memdie to an atomic thread bitflag

On Sat, Dec 25, 2004 at 03:27:21AM +0100, Andrea Arcangeli wrote:
> So my current plan is to make used_math a PF_USED_MATH, and memdie a
> TIF_MEMDIE. And of course oomtaskadj an int (that one requires more than

This makes memdie a TIF_MEMDIE.

memdie will not be modified by the current task, so it cannot be a
PF_MEMDIE but it must be a TIF_MEMDIE.

Signed-off-by: Andrea Arcangeli <andrea@suse.de>

--- mainline-4/include/asm-alpha/thread_info.h.orig	2004-12-04 08:55:03.000000000 +0100
+++ mainline-4/include/asm-alpha/thread_info.h	2005-01-21 06:17:24.780786576 +0100
@@ -77,6 +77,7 @@ register struct thread_info *__current_t
 #define TIF_UAC_NOPRINT		6	/* see sysinfo.h */
 #define TIF_UAC_NOFIX		7
 #define TIF_UAC_SIGBUS		8
+#define TIF_MEMDIE		9
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
--- mainline-4/include/asm-arm/thread_info.h.orig	2005-01-04 01:13:27.000000000 +0100
+++ mainline-4/include/asm-arm/thread_info.h	2005-01-21 06:17:24.792784752 +0100
@@ -128,6 +128,7 @@ extern void iwmmxt_task_release(struct t
 #define TIF_SYSCALL_TRACE	8
 #define TIF_POLLING_NRFLAG	16
 #define TIF_USING_IWMMXT	17
+#define TIF_MEMDIE		18
 
 #define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
 #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
--- mainline-4/include/asm-arm26/thread_info.h.orig	2005-01-15 20:44:58.000000000 +0100
+++ mainline-4/include/asm-arm26/thread_info.h	2005-01-21 06:17:24.797783992 +0100
@@ -126,6 +126,7 @@ extern void free_thread_info(struct thre
 #define TIF_SYSCALL_TRACE	8
 #define TIF_USED_FPU		16
 #define TIF_POLLING_NRFLAG	17
+#define TIF_MEMDIE		18
 
 #define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
 #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
--- mainline-4/include/asm-cris/thread_info.h.orig	2003-07-10 19:33:07.000000000 +0200
+++ mainline-4/include/asm-cris/thread_info.h	2005-01-21 06:17:24.803783080 +0100
@@ -85,6 +85,7 @@ struct thread_info {
 #define TIF_SIGPENDING		2	/* signal pending */
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */
+#define TIF_MEMDIE		17
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
--- mainline-4/include/asm-h8300/thread_info.h.orig	2004-08-25 02:47:35.000000000 +0200
+++ mainline-4/include/asm-h8300/thread_info.h	2005-01-21 06:17:24.814781408 +0100
@@ -93,6 +93,7 @@ static inline struct thread_info *curren
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_POLLING_NRFLAG	4	/* true if poll_idle() is polling
 					   TIF_NEED_RESCHED */
+#define TIF_MEMDIE		5
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
--- mainline-4/include/asm-i386/thread_info.h.orig	2005-01-04 01:13:27.000000000 +0100
+++ mainline-4/include/asm-i386/thread_info.h	2005-01-21 06:17:24.828779280 +0100
@@ -141,6 +141,7 @@ register unsigned long current_stack_poi
 #define TIF_IRET		5	/* return with iret */
 #define TIF_SYSCALL_AUDIT	7	/* syscall auditing active */
 #define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */
+#define TIF_MEMDIE		17
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
--- mainline-4/include/asm-ia64/thread_info.h.orig	2004-12-04 08:55:04.000000000 +0100
+++ mainline-4/include/asm-ia64/thread_info.h	2005-01-21 06:17:24.841777304 +0100
@@ -67,6 +67,7 @@ struct thread_info {
 #define TIF_SYSCALL_TRACE	3	/* syscall trace active */
 #define TIF_SYSCALL_AUDIT	4	/* syscall auditing active */
 #define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */
+#define TIF_MEMDIE		17
 
 #define TIF_WORK_MASK		0x7	/* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE */
 #define TIF_ALLWORK_MASK	0x1f	/* bits 0..4 are "work to do on user-return" bits */
--- mainline-4/include/asm-m68k/thread_info.h.orig	2004-08-25 02:47:35.000000000 +0200
+++ mainline-4/include/asm-m68k/thread_info.h	2005-01-21 06:17:24.851775784 +0100
@@ -48,6 +48,7 @@ struct thread_info {
 #define TIF_NOTIFY_RESUME	2	/* resumption notification requested */
 #define TIF_SIGPENDING		3	/* signal pending */
 #define TIF_NEED_RESCHED	4	/* rescheduling necessary */
+#define TIF_MEMDIE		5
 
 extern int thread_flag_fixme(void);
 
--- mainline-4/include/asm-m68knommu/thread_info.h.orig	2005-01-15 20:44:59.000000000 +0100
+++ mainline-4/include/asm-m68knommu/thread_info.h	2005-01-21 06:17:24.858774720 +0100
@@ -85,6 +85,7 @@ static inline struct thread_info *curren
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_POLLING_NRFLAG	4	/* true if poll_idle() is polling
 					   TIF_NEED_RESCHED */
+#define TIF_MEMDIE		5
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
--- mainline-4/include/asm-mips/thread_info.h.orig	2005-01-04 01:13:29.000000000 +0100
+++ mainline-4/include/asm-mips/thread_info.h	2005-01-21 06:17:24.871772744 +0100
@@ -116,6 +116,7 @@ register struct thread_info *__current_t
 #define TIF_SYSCALL_AUDIT	4	/* syscall auditing active */
 #define TIF_USEDFPU		16	/* FPU was used by this task this quantum (SMP) */
 #define TIF_POLLING_NRFLAG	17	/* true if poll_idle() is polling TIF_NEED_RESCHED */
+#define TIF_MEMDIE		18
 #define TIF_SYSCALL_TRACE	31	/* syscall trace active */
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
--- mainline-4/include/asm-parisc/thread_info.h.orig	2005-01-04 01:13:29.000000000 +0100
+++ mainline-4/include/asm-parisc/thread_info.h	2005-01-21 06:17:24.885770616 +0100
@@ -63,6 +63,7 @@ struct thread_info {
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_POLLING_NRFLAG	4	/* true if poll_idle() is polling TIF_NEED_RESCHED */
 #define TIF_32BIT               5       /* 32 bit binary */
+#define TIF_MEMDIE		6
 
 #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
--- mainline-4/include/asm-ppc/thread_info.h.orig	2005-01-04 01:13:29.000000000 +0100
+++ mainline-4/include/asm-ppc/thread_info.h	2005-01-21 06:17:24.892769552 +0100
@@ -76,6 +76,7 @@ static inline struct thread_info *curren
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_POLLING_NRFLAG	4	/* true if poll_idle() is polling
 					   TIF_NEED_RESCHED */
+#define TIF_MEMDIE		5
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
--- mainline-4/include/asm-ppc64/thread_info.h.orig	2005-01-20 18:20:10.000000000 +0100
+++ mainline-4/include/asm-ppc64/thread_info.h	2005-01-21 06:17:50.185924408 +0100
@@ -100,6 +100,7 @@ static inline struct thread_info *curren
 #define TIF_ABI_PENDING		7	/* 32/64 bit switch needed */
 #define TIF_SYSCALL_AUDIT	8	/* syscall auditing active */
 #define TIF_SINGLESTEP		9	/* singlestepping active */
+#define TIF_MEMDIE		10
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
--- mainline-4/include/asm-s390/thread_info.h.orig	2004-12-04 08:55:04.000000000 +0100
+++ mainline-4/include/asm-s390/thread_info.h	2005-01-21 06:17:24.911766664 +0100
@@ -100,6 +100,7 @@ static inline struct thread_info *curren
 #define TIF_POLLING_NRFLAG	17	/* true if poll_idle() is polling 
 					   TIF_NEED_RESCHED */
 #define TIF_31BIT		18	/* 32bit process */ 
+#define TIF_MEMDIE		19
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
--- mainline-4/include/asm-sh/thread_info.h.orig	2005-01-04 01:13:29.000000000 +0100
+++ mainline-4/include/asm-sh/thread_info.h	2005-01-21 06:17:24.919765448 +0100
@@ -83,6 +83,7 @@ static inline struct thread_info *curren
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_USEDFPU		16	/* FPU was used by this task this quantum (SMP) */
 #define TIF_POLLING_NRFLAG	17	/* true if poll_idle() is polling TIF_NEED_RESCHED */
+#define TIF_MEMDIE		18
 #define TIF_USERSPACE		31	/* true if FS sets userspace */
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
--- mainline-4/include/asm-sh64/thread_info.h.orig	2004-08-25 02:47:51.000000000 +0200
+++ mainline-4/include/asm-sh64/thread_info.h	2005-01-21 06:17:24.925764536 +0100
@@ -74,6 +74,7 @@ static inline struct thread_info *curren
 #define TIF_SYSCALL_TRACE	0	/* syscall trace active */
 #define TIF_SIGPENDING		2	/* signal pending */
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
+#define TIF_MEMDIE		4
 
 #define THREAD_SIZE	16384
 
--- mainline-4/include/asm-sparc/thread_info.h.orig	2004-08-25 02:47:35.000000000 +0200
+++ mainline-4/include/asm-sparc/thread_info.h	2005-01-21 06:17:24.930763776 +0100
@@ -138,6 +138,7 @@ BTFIXUPDEF_CALL(void, free_thread_info, 
 					 * this quantum (SMP) */
 #define TIF_POLLING_NRFLAG	9	/* true if poll_idle() is polling
 					 * TIF_NEED_RESCHED */
+#define TIF_MEMDIE		10
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
--- mainline-4/include/asm-sparc64/thread_info.h.orig	2004-08-25 02:47:57.000000000 +0200
+++ mainline-4/include/asm-sparc64/thread_info.h	2005-01-21 06:17:24.937762712 +0100
@@ -228,6 +228,7 @@ register struct thread_info *current_thr
  *       an immediate value in instructions such as andcc.
  */
 #define TIF_ABI_PENDING		12
+#define TIF_MEMDIE		13
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
--- mainline-4/include/asm-um/thread_info.h.orig	2005-01-15 20:45:00.000000000 +0100
+++ mainline-4/include/asm-um/thread_info.h	2005-01-21 06:17:24.943761800 +0100
@@ -71,6 +71,7 @@ static inline struct thread_info *curren
 					 * TIF_NEED_RESCHED 
 					 */
 #define TIF_RESTART_BLOCK 	4
+#define TIF_MEMDIE	 	5
 
 #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)
 #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
--- mainline-4/include/asm-v850/thread_info.h.orig	2003-06-17 11:31:42.000000000 +0200
+++ mainline-4/include/asm-v850/thread_info.h	2005-01-21 06:17:24.954760128 +0100
@@ -83,6 +83,7 @@ struct thread_info {
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_POLLING_NRFLAG	4	/* true if poll_idle() is polling
 					   TIF_NEED_RESCHED */
+#define TIF_MEMDIE		5
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
--- mainline-4/include/asm-x86_64/thread_info.h.orig	2005-01-04 01:13:29.000000000 +0100
+++ mainline-4/include/asm-x86_64/thread_info.h	2005-01-21 06:17:24.965758456 +0100
@@ -106,6 +106,7 @@ static inline struct thread_info *stack_
 #define TIF_IA32		17	/* 32bit process */ 
 #define TIF_FORK		18	/* ret_from_fork */
 #define TIF_ABI_PENDING		19
+#define TIF_MEMDIE		20
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
--- mainline-4/include/linux/sched.h.orig	2005-01-21 06:01:08.585190864 +0100
+++ mainline-4/include/linux/sched.h	2005-01-21 06:17:24.967758152 +0100
@@ -615,11 +615,6 @@ struct task_struct {
 	struct key *thread_keyring;	/* keyring private to this thread */
 #endif
 /*
- * All archs should support atomic ops with
- * 1 byte granularity.
- */
-	unsigned char memdie;
-/*
  * Must be changed atomically so it shouldn't be
  * be a shareable bitflag.
  */
--- mainline-4/include/asm-m32r/thread_info.h.orig	2005-01-15 20:44:59.000000000 +0100
+++ mainline-4/include/asm-m32r/thread_info.h	2005-01-21 06:18:25.045624928 +0100
@@ -155,6 +155,7 @@ static inline unsigned int get_thread_fa
 #define TIF_IRET		5	/* return with iret */
 #define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */
 					/* 31..28 fault code */
+#define TIF_MEMDIE		17
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
--- mainline-4/mm/oom_kill.c.orig	2005-01-21 06:14:00.290873768 +0100
+++ mainline-4/mm/oom_kill.c	2005-01-21 06:17:24.980756176 +0100
@@ -152,7 +152,8 @@ static struct task_struct * select_bad_p
 			 * This is in the process of releasing memory so wait it
 			 * to finish before killing some other task by mistake.
 			 */
-			if ((p->memdie || (p->flags & PF_EXITING)) && !(p->flags & PF_DEAD))
+			if ((unlikely(test_tsk_thread_flag(p, TIF_MEMDIE)) || (p->flags & PF_EXITING)) &&
+			    !(p->flags & PF_DEAD))
 				return ERR_PTR(-1UL);
 			if (p->flags & PF_SWAPOFF)
 				return p;
@@ -196,7 +197,7 @@ static void __oom_kill_task(task_t *p)
 	 * exit() and clear out its resources quickly...
 	 */
 	p->time_slice = HZ;
-	p->memdie = 1;
+	set_tsk_thread_flag(p, TIF_MEMDIE);
 
 	/* This process has hardware access, be more careful. */
 	if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_RAWIO)) {
--- mainline-4/mm/page_alloc.c.orig	2005-01-21 06:09:43.068977440 +0100
+++ mainline-4/mm/page_alloc.c	2005-01-21 06:17:24.996753744 +0100
@@ -756,7 +756,7 @@ __alloc_pages(unsigned int gfp_mask, uns
 	}
 
 	/* This allocation should allow future memory freeing. */
-	if (((p->flags & PF_MEMALLOC) || p->memdie) && !in_interrupt()) {
+	if (((p->flags & PF_MEMALLOC) || unlikely(test_thread_flag(TIF_MEMDIE))) && !in_interrupt()) {
 		/* go through the zonelist yet again, ignoring mins */
 		for (i = 0; (z = zones[i]) != NULL; i++) {
 			page = buffered_rmqueue(z, order, gfp_mask);

  reply	other threads:[~2005-01-21  5:54 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-01-21  5:48 OOM fixes 1/5 Andrea Arcangeli
2005-01-21  5:49 ` OOM fixes 2/5 Andrea Arcangeli
2005-01-21  5:49   ` OOM fixes 3/5 Andrea Arcangeli
2005-01-21  5:50     ` Andrea Arcangeli [this message]
2005-01-21  5:50       ` OOM fixes 5/5 Andrea Arcangeli
2005-01-21  6:01         ` writeback-highmem Andrea Arcangeli
2005-01-21  6:26           ` writeback-highmem Andrew Morton
2005-01-21  6:41             ` writeback-highmem Andrea Arcangeli
2005-01-21 13:46             ` writeback-highmem Rik van Riel
2005-01-21  6:20   ` OOM fixes 2/5 Andrew Morton
2005-01-21  6:35     ` Andrea Arcangeli
2005-01-21  6:36     ` Nick Piggin
2005-01-21  6:46       ` Andrew Morton
2005-01-21  7:04         ` Nick Piggin
2005-01-21  7:17           ` Andrea Arcangeli
2005-01-21  7:04         ` Andrea Arcangeli
2005-01-21  7:08         ` Andi Kleen
2005-01-21  7:21           ` Andrea Arcangeli
2005-01-21  6:52       ` Andrea Arcangeli
2005-01-21  7:00         ` Andrew Morton
2005-01-21  7:10           ` Andrea Arcangeli
2005-01-22  6:35 ` OOM fixes 1/5 Andrea Arcangeli

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=20050121055004.GD12647@dualathlon.random \
    --to=andrea@suse.de \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=npiggin@novell.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.