linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: Linux-2.4.5
       [not found] <20010526171459.Y9634@athlon.random>
@ 2001-05-26 15:22 ` Rik van Riel
  2001-05-26 15:30   ` Linux-2.4.5 Andrea Arcangeli
  2001-05-26 15:23 ` Linux-2.4.5 Linus Torvalds
  2001-05-26 18:11 ` Linux-2.4.5 Ben LaHaise
  2 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 15:22 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:

> @@ -1416,11 +1416,9 @@
>  	 */
>  	run_task_queue(&tq_disk);
>  
> -	/* 
> -	 * Set our state for sleeping, then check again for buffer heads.
> -	 * This ensures we won't miss a wake_up from an interrupt.
> -	 */
> -	wait_event(buffer_wait, nr_unused_buffer_heads >= MAX_BUF_PER_PAGE);
> +	current->policy |= SCHED_YIELD;
> +	__set_current_state(TASK_RUNNING);
> +	schedule();
>  	goto try_again;
>  }

This cannot possibly fix the problem because this code is
never reached.

What was observed in the backtraces by arjan, ben, marcelo
and people at IBM was:

create_buffers -> get_unused_buffer_head -> __alloc_pages

with the system looping infinitely in __alloc_pages. The
code you are changing above ONLY gets reached in case the
__alloc_pages (and thus, get_unused_buffer_head) returns
failure.

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
       [not found] <20010526171459.Y9634@athlon.random>
  2001-05-26 15:22 ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:23 ` Linus Torvalds
  2001-05-26 15:31   ` Linux-2.4.5 Rik van Riel
  2001-05-26 15:38   ` Linux-2.4.5 Andrea Arcangeli
  2001-05-26 18:11 ` Linux-2.4.5 Ben LaHaise
  2 siblings, 2 replies; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26 15:23 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Rik van Riel, Ben LaHaise, Alan Cox, linux-kernel


On Sat, 26 May 2001, Andrea Arcangeli wrote:
> 
> I don't see where you fixed the deadlock in create_buffers, if you did
> please show me which line of code is supposed to do that, I show you
> below which lines of code in my patch should fix the wait_event deadlock
> in create_buffers:

Andrea, look at the page_alloc() path, and the "don't loop forever if
__GFP_IO isn't set and we're not making progress". That looks entirely
sane.

It's the other limiting that I don't think really addresses the problem
(and I like your patch that removes some more magic limits - I suspect the
proper fix is the 5 lines from Rik's patch in page_alloc.c, and your patch
together - amybody mind testing that out?)

Oh, and I still _do_ think that we should rename the silly "async" flag as
"can_do_io", and then use that to determine whether to do SLAB_KERNEL or
SLAB_BUFFER. That would make more things able to do IO, which in turn
should help balance things out.

		Linus "leaving for the airport" Torvalds


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:22 ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:30   ` Andrea Arcangeli
  2001-05-26 15:51     ` Linux-2.4.5 Rik van Riel
  0 siblings, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 15:30 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 12:22:59PM -0300, Rik van Riel wrote:
> On Sat, 26 May 2001, Andrea Arcangeli wrote:
> 
> > @@ -1416,11 +1416,9 @@
> >  	 */
> >  	run_task_queue(&tq_disk);
> >  
> > -	/* 
> > -	 * Set our state for sleeping, then check again for buffer heads.
> > -	 * This ensures we won't miss a wake_up from an interrupt.
> > -	 */
> > -	wait_event(buffer_wait, nr_unused_buffer_heads >= MAX_BUF_PER_PAGE);
> > +	current->policy |= SCHED_YIELD;
> > +	__set_current_state(TASK_RUNNING);
> > +	schedule();
> >  	goto try_again;
> >  }
> 
> This cannot possibly fix the problem because this code is
> never reached.
> 
> What was observed in the backtraces by arjan, ben, marcelo
> and people at IBM was:
> 
> create_buffers -> get_unused_buffer_head -> __alloc_pages
> 
> with the system looping infinitely in __alloc_pages. The
> code you are changing above ONLY gets reached in case the
> __alloc_pages (and thus, get_unused_buffer_head) returns
> failure.

Fine, then post the strict __alloc_pages patch, after that you will run
into the above code. Those are different issues, like I'm claiming since
the first place, your patch didn't addressed the above.

I definitely agree that if __alloc_pages itself deadlocks the above
cannot make differences.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:23 ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26 15:31   ` Rik van Riel
  2001-05-26 15:38   ` Linux-2.4.5 Andrea Arcangeli
  1 sibling, 0 replies; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 15:31 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel

On Sat, 26 May 2001, Linus Torvalds wrote:

> Oh, and I still _do_ think that we should rename the silly "async"
> flag as "can_do_io", and then use that to determine whether to do
> SLAB_KERNEL or SLAB_BUFFER. That would make more things able to do IO,
> which in turn should help balance things out.

Agreed, this simplifies things a lot.

regards,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:23 ` Linux-2.4.5 Linus Torvalds
  2001-05-26 15:31   ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:38   ` Andrea Arcangeli
  2001-05-26 16:03     ` Linux-2.4.5 Linus Torvalds
  1 sibling, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 15:38 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Rik van Riel, Ben LaHaise, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 08:23:00AM -0700, Linus Torvalds wrote:
> 
> On Sat, 26 May 2001, Andrea Arcangeli wrote:
> > 
> > I don't see where you fixed the deadlock in create_buffers, if you did
> > please show me which line of code is supposed to do that, I show you
> > below which lines of code in my patch should fix the wait_event deadlock
> > in create_buffers:
> 
> Andrea, look at the page_alloc() path, and the "don't loop forever if
> __GFP_IO isn't set and we're not making progress". That looks entirely
> sane.

yes, I was only talking about create_buffers, not __alloc_pages. That
patch can certainly address problems in alloc_pages.

> (and I like your patch that removes some more magic limits - I suspect the
> proper fix is the 5 lines from Rik's patch in page_alloc.c, and your patch
> together - amybody mind testing that out?)

Sounds the same to me.

> Oh, and I still _do_ think that we should rename the silly "async" flag as
> "can_do_io", and then use that to determine whether to do SLAB_KERNEL or
> SLAB_BUFFER. That would make more things able to do IO, which in turn
> should help balance things out.

getblk still needs to use SLAB_BUFFER, not sure how many callers will be
allowed to use SLAB_KERNEL, but certainly the "async" name was not very
appropriate to indicate if the bh allocation can fail or not.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:30   ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 15:51     ` Rik van Riel
  2001-05-26 16:04       ` Linux-2.4.5 Andrea Arcangeli
  0 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 15:51 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:

> > > -	/* 
> > > -	 * Set our state for sleeping, then check again for buffer heads.
> > > -	 * This ensures we won't miss a wake_up from an interrupt.
> > > -	 */
> > > -	wait_event(buffer_wait, nr_unused_buffer_heads >= MAX_BUF_PER_PAGE);
> > > +	current->policy |= SCHED_YIELD;
> > > +	__set_current_state(TASK_RUNNING);
> > > +	schedule();
> > >  	goto try_again;
> > >  }

I'm still curious ... is it _really_ needed to busy-spin here?

I've seen some big problems with processes eating CPU time
while not getting any work done and am slowly trying to
eliminate those places in the VM by waiting on things.

Is it really needed to introduce a new busy-wait place in the
kernel?

regards,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:38   ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 16:03     ` Linus Torvalds
  0 siblings, 0 replies; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26 16:03 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Rik van Riel, Ben LaHaise, Alan Cox, linux-kernel


On Sat, 26 May 2001, Andrea Arcangeli wrote:
> 
> getblk still needs to use SLAB_BUFFER, not sure how many callers will be
> allowed to use SLAB_KERNEL, but certainly the "async" name was not very
> appropriate to indicate if the bh allocation can fail or not.

Note that these days, on reasonable filesystems, getblk() and friends are
only used by meta-data. So on a normal setup that uses the page cache for
data (pretty much everything), you'd probably go from "100% SLAB_BUFFER"
to "less than 10% SLAB_BUFFER".

Which should cut down on the "this can happen under real load" stuff. 

Assuming, of course, that there aren't any other causes. I can imagine
schenarios where the buffer heads are the major cause of problems, and the
fact that Rik special-cased GFP_BUFFER makes me suspect that that is _his_
schenario, but there may be other, less obvious, ways to get into similar
trouble.

MM is hard. No question about it.

		Linus


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:51     ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 16:04       ` Andrea Arcangeli
  0 siblings, 0 replies; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 16:04 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 12:51:38PM -0300, Rik van Riel wrote:
> On Sat, 26 May 2001, Andrea Arcangeli wrote:
> 
> > > > -	/* 
> > > > -	 * Set our state for sleeping, then check again for buffer heads.
> > > > -	 * This ensures we won't miss a wake_up from an interrupt.
> > > > -	 */
> > > > -	wait_event(buffer_wait, nr_unused_buffer_heads >= MAX_BUF_PER_PAGE);
> > > > +	current->policy |= SCHED_YIELD;
> > > > +	__set_current_state(TASK_RUNNING);
> > > > +	schedule();
> > > >  	goto try_again;
> > > >  }
> 
> I'm still curious ... is it _really_ needed to busy-spin here?

As said we cannot wait_event, because those reserved bh will be released
only by the VM if there is memory pressure. If we sleep in wait_event
while I/O is in progress on the reserved bh and a big chunk of memory is
released under us, then those reserved bh may never get released and we
will hang in wait_event until there's memory pressure again, so unless
we implement another logic we need to somehow poll there and to try to
allocate again later. We should enter that path very seldom so I'm not
very concerned about the performance during the polling loop.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
       [not found] <20010526171459.Y9634@athlon.random>
  2001-05-26 15:22 ` Linux-2.4.5 Rik van Riel
  2001-05-26 15:23 ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26 18:11 ` Ben LaHaise
  2001-05-26 18:31   ` Linux-2.4.5 Andrea Arcangeli
  2 siblings, 1 reply; 50+ messages in thread
From: Ben LaHaise @ 2001-05-26 18:11 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Rik van Riel, Linus Torvalds, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:

> not being able to reproduce has nothing to do with a deadlock fixed or
> not. Also Ben's patch I think was claiming to fix the deadlock and it
> didn't even addressed the create_bounces that it is fixed in 2.4.5.

No.  It does not fix the deadlock.  Neither does the patch you posted.
But, if you're going to add a reserve pool for buffer heads and bounce
pages, please do it with generic, not yet another special case hack.

		-ben


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 18:11 ` Linux-2.4.5 Ben LaHaise
@ 2001-05-26 18:31   ` Andrea Arcangeli
  2001-05-26 19:42     ` Linux-2.4.5 Ingo Molnar
  0 siblings, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 18:31 UTC (permalink / raw)
  To: Ben LaHaise; +Cc: Rik van Riel, Linus Torvalds, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 02:11:15PM -0400, Ben LaHaise wrote:
> No.  It does not fix the deadlock.  Neither does the patch you posted.

can you give a try if you can deadlock 2.4.5aa1 just in case, and post a
SYSRQ+T + system.map if it still deadlocks?

> But, if you're going to add a reserve pool for buffer heads and bounce
> pages, please do it with generic, not yet another special case hack.

The reserved pool for buffer heads is there since the first time I used
linux I think. I won't certainly object to convert  all reserved pool to
an unified interface, as I'd like if all hashtables would be also sized
with an unified interface, but that's just a stylistic issue, at least
for 2.4 that's a very secondary object compared to people who can get
dealdocks during production.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 18:31   ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 19:42     ` Ingo Molnar
  2001-05-26 19:56       ` Linux-2.4.5 Andrea Arcangeli
  0 siblings, 1 reply; 50+ messages in thread
From: Ingo Molnar @ 2001-05-26 19:42 UTC (permalink / raw)
  To: Andrea Arcangeli
  Cc: Ben LaHaise, Rik van Riel, Linus Torvalds, Alan Cox, linux-kernel


On Sat, 26 May 2001, Andrea Arcangeli wrote:

> On Sat, May 26, 2001 at 02:11:15PM -0400, Ben LaHaise wrote:
> > No.  It does not fix the deadlock.  Neither does the patch you posted.
>
> can you give a try if you can deadlock 2.4.5aa1 just in case, and post a
> SYSRQ+T + system.map if it still deadlocks?

Andrea, can you rather start running the Cerberus testsuite instead? All
these deadlocks happen pretty early during the test, and we've been fixing
tons of these deadlocks, and no, it's not easy.

	Ingo


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 19:42     ` Linux-2.4.5 Ingo Molnar
@ 2001-05-26 19:56       ` Andrea Arcangeli
  0 siblings, 0 replies; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 19:56 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Ben LaHaise, Rik van Riel, Linus Torvalds, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 09:42:37PM +0200, Ingo Molnar wrote:
> Andrea, can you rather start running the Cerberus testsuite instead? All

I run cerberus all the time but I don't have locally x86 machines with
>1G of ram so it will take some time for me to try on a real highmem, I
am pretty sure I just tested cerberus with highmem emulation and it
didn't deadlocked for me, I can try again with an higher highmem/normal
ratio later. The ratio I am using right now is half of the ram in
highmem (that is almost the same ratio of a 2G machine):

diff -urN 2.4.3aa/arch/i386/config.in 2.4.3aa-highmemdebug/arch/i386/config.in
--- 2.4.3aa/arch/i386/config.in	Sun Apr  1 11:59:37 2001
+++ 2.4.3aa-highmemdebug/arch/i386/config.in	Sun Apr  1 13:00:01 2001
@@ -369,4 +369,7 @@
 
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+if [ "$CONFIG_HIGHMEM" = "y" ]; then
+   bool 'Debug HIGHMEM on lowmem machines' CONFIG_HIGHMEM_DEBUG
+fi
 endmenu
diff -urN 2.4.3aa/arch/i386/kernel/setup.c 2.4.3aa-highmemdebug/arch/i386/kernel/setup.c
--- 2.4.3aa/arch/i386/kernel/setup.c	Sat Mar 31 15:17:07 2001
+++ 2.4.3aa-highmemdebug/arch/i386/kernel/setup.c	Sun Apr  1 13:00:01 2001
@@ -649,7 +649,19 @@
  */
 #define VMALLOC_RESERVE	(unsigned long)(128 << 20)
 #define MAXMEM		(unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)
+#ifdef CONFIG_HIGHMEM_DEBUG
+#define MAXMEM_PFN				\
+({						\
+	int __max_pfn;				\
+	if (max_pfn > PFN_DOWN(MAXMEM))		\
+	     __max_pfn = PFN_DOWN(MAXMEM);	\
+	else					\
+	     __max_pfn = max_pfn / 2;		\
+	__max_pfn;				\
+})
+#else
 #define MAXMEM_PFN	PFN_DOWN(MAXMEM)
+#endif
 #define MAX_NONPAE_PFN	(1 << 20)
 
 	/*


Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-06-03 23:32                                   ` Linux-2.4.5 Linus Torvalds
@ 2001-06-05  2:21                                     ` Marcelo Tosatti
  0 siblings, 0 replies; 50+ messages in thread
From: Marcelo Tosatti @ 2001-06-05  2:21 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Rik van Riel, Andrea Arcangeli, Ben LaHaise, Alan Cox, lkml



(ugh, just found this mail lost around here)

On Sun, 3 Jun 2001, Linus Torvalds wrote:

> 
> [ Back from Japan - don't start sending me tons of emails yet, as you can
>   see I'm only picking up last weeks discussion where it ended right
>   now.. ]
> 
> On Sat-Sun, 26-27 May 2001, Marcelo Tosatti wrote:
> > 
> > You are not going to fix the problem by _only_ doing this bh allocation
> > change.
> 
> I would obviously not disagree with that statement. There are multiple
> users of the low-memory zone, and they are all likely to have some of the
> same problems. 
> 
> > Even if some bh allocators _can_ block on IO, there is no guarantee that
> > they are going to free low memory --- they may start more IO on highmem
> > pages.
> 
> Now, this was actually something I already referred to earlier in this
> same thread, see one of myt first mails about this:
> 
> Fri, 25 May 2001 21:22:05 Linus Torvalds wrote:
> >>
> >> For example, we used to have logic in swapout_process to _not_ swap
> >> out zones that don't need it. We changed swapout to happen in
> >> "page_launder()", but that logic got lost. It's entirely possible that
> >> we should just say "don't bother writing out dirty pages that are in
> >> zones that have no memory pressure", so that we don't use up pages
> >> from the _precious_ zones to free pages in zones that don't need
> >> freeing.
> 
> So note how there are multiple facets to this problem.
> 
> 
> Marcelo goes on to write:
> > 
> > I've just tried something similar to the attached patch, which is a "more
> > aggressive" version of your suggestion to use SLAB_KERNEL for bh
> > allocations when possible. This one makes all bh allocators block on IO. 
> 
> The patch looks fine. Has anybody else tried it?

The XFS people have been using GFP_PAGE_IO for sometime in their
CVS. (getblk is not using GFP_PAGE_IO there, though).

> Along with, for example, something like this [warning: whitespace damage,
> I just cut-and-pasted this as a test-patch], we might actually _fix_ the
> problem:
> 
> --- v2.4.5/linux/mm/vmscan.c    Fri May 25 18:28:55 2001
> +++ linux/mm/vmscan.c   Sun Jun  3 16:26:20 2001
> @@ -463,6 +463,7 @@
>  
>                 /* Page is or was in use?  Move it to the active list. */
>                 if (PageReferenced(page) || page->age > 0 ||
> +                               page->zone->free_pages > page->zone->pages_max ||
>                                 (!page->buffers && page_count(page) > 1) ||
>                                 page_ramdisk(page)) {
>                         del_page_from_inactive_dirty_list(page);
> 
> What the above does is fairly obvious: it considers all pages in zones
> that don't need to be free'd to be "young", and doesn't even try to write
> them out. Because we have absolutely no reason to do so.

This patch makes perfect sense, but it does not avoid us from writing out
highmem pages (_even_ if the highmem zone has a shortage) in case the
lowmem is under shortage.

We _need_ low memory to writeout high memory, thats my point.




^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-27  6:53                                 ` Linux-2.4.5 Marcelo Tosatti
@ 2001-06-03 23:32                                   ` Linus Torvalds
  2001-06-05  2:21                                     ` Linux-2.4.5 Marcelo Tosatti
  0 siblings, 1 reply; 50+ messages in thread
From: Linus Torvalds @ 2001-06-03 23:32 UTC (permalink / raw)
  To: Marcelo Tosatti
  Cc: Rik van Riel, Andrea Arcangeli, Ben LaHaise, Alan Cox, lkml


[ Back from Japan - don't start sending me tons of emails yet, as you can
  see I'm only picking up last weeks discussion where it ended right
  now.. ]

On Sat-Sun, 26-27 May 2001, Marcelo Tosatti wrote:
> 
> You are not going to fix the problem by _only_ doing this bh allocation
> change.

I would obviously not disagree with that statement. There are multiple
users of the low-memory zone, and they are all likely to have some of the
same problems. 

> Even if some bh allocators _can_ block on IO, there is no guarantee that
> they are going to free low memory --- they may start more IO on highmem
> pages.

Now, this was actually something I already referred to earlier in this
same thread, see one of myt first mails about this:

Fri, 25 May 2001 21:22:05 Linus Torvalds wrote:
>>
>> For example, we used to have logic in swapout_process to _not_ swap
>> out zones that don't need it. We changed swapout to happen in
>> "page_launder()", but that logic got lost. It's entirely possible that
>> we should just say "don't bother writing out dirty pages that are in
>> zones that have no memory pressure", so that we don't use up pages
>> from the _precious_ zones to free pages in zones that don't need
>> freeing.

So note how there are multiple facets to this problem.


Marcelo goes on to write:
> 
> I've just tried something similar to the attached patch, which is a "more
> aggressive" version of your suggestion to use SLAB_KERNEL for bh
> allocations when possible. This one makes all bh allocators block on IO. 

The patch looks fine. Has anybody else tried it?

Along with, for example, something like this [warning: whitespace damage,
I just cut-and-pasted this as a test-patch], we might actually _fix_ the
problem:

--- v2.4.5/linux/mm/vmscan.c    Fri May 25 18:28:55 2001
+++ linux/mm/vmscan.c   Sun Jun  3 16:26:20 2001
@@ -463,6 +463,7 @@
 
                /* Page is or was in use?  Move it to the active list. */
                if (PageReferenced(page) || page->age > 0 ||
+                               page->zone->free_pages > page->zone->pages_max ||
                                (!page->buffers && page_count(page) > 1) ||
                                page_ramdisk(page)) {
                        del_page_from_inactive_dirty_list(page);

What the above does is fairly obvious: it considers all pages in zones
that don't need to be free'd to be "young", and doesn't even try to write
them out. Because we have absolutely no reason to do so.

This is similar to what we used to do in "try_to_swap_out()" before, and
it still makes sense.

		Linus


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 22:12                               ` Linux-2.4.5 Marcelo Tosatti
@ 2001-05-27  6:53                                 ` Marcelo Tosatti
  2001-06-03 23:32                                   ` Linux-2.4.5 Linus Torvalds
  0 siblings, 1 reply; 50+ messages in thread
From: Marcelo Tosatti @ 2001-05-27  6:53 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Rik van Riel, Andrea Arcangeli, Ben LaHaise, Alan Cox, lkml



On Sat, 26 May 2001, Marcelo Tosatti wrote:

> > You're trying to fix the symptoms, by attacking the final end. And what
> > I've been trying to say is that this problem likely has a higher-level
> > _cause_, and I want that _cause_ fixed. Not the symptoms.
> 
> You are not going to fix the problem by _only_ doing this bh allocation
> change.
> 
> Even if some bh allocators _can_ block on IO, there is no guarantee that
> they are going to free low memory --- they may start more IO on highmem
> pages.
> 
> We cannot treat highmem as "yet another zone" zone. All highmem data goes
> through the lowmem before reaching the disk, so its clear for me that we
> should not try to write out highmem pages in case we have a lowmem
> shortage.
> 
> Well, IMO.

I've just tried something similar to the attached patch, which is a "more
aggressive" version of your suggestion to use SLAB_KERNEL for bh
allocations when possible. This one makes all bh allocators block on IO. 

I've tested multiple "dd if=/dev/zero of=bigfile..." calls. (8GB machine,
different amounts of data being written)

The patch makes the kernel handle heavier loads much better than .5 and
.5aa, but it does not fix the problem for this specific test.


(this one is not against 2.4.5, but what I tested under .5 is basically
the same patch) 

diff -Nur linux.orig/mm/vmscan.c linux/mm/vmscan.c
--- linux.orig/mm/vmscan.c	Mon Apr  2 23:41:08 2001
+++ linux/mm/vmscan.c	Tue Apr  3 01:53:13 2001
@@ -422,7 +422,7 @@
 int page_launder(int gfp_mask, int sync)
 {
 	int launder_loop, maxscan, cleaned_pages, maxlaunder;
-	int can_get_io_locks;
+	int can_get_io_locks, can_queue_buffers;
 	struct list_head * page_lru;
 	struct page * page;
 
@@ -431,6 +431,7 @@
 	 * buffers to disk) if __GFP_IO is set.
 	 */
 	can_get_io_locks = gfp_mask & __GFP_IO;
+	can_queue_buffers = gfp_mask & __GFP_PAGE_IO;
 
 	launder_loop = 0;
 	maxlaunder = 0;
@@ -482,7 +483,7 @@
 				goto page_active;
 
 			/* First time through? Move it to the back of the list */
-			if (!launder_loop) {
+			if (!launder_loop || can_queue_buffers) {
 				list_del(page_lru);
 				list_add(page_lru, &inactive_dirty_list);
 				UnlockPage(page);
@@ -612,7 +613,8 @@
 	 * loads, flush out the dirty pages before we have to wait on
 	 * IO.
 	 */
-	if (can_get_io_locks && !launder_loop && free_shortage()) {
+	if ((can_queue_buffers || can_get_io_locks) && !launder_loop 
+			&& free_shortage()) {
 		launder_loop = 1;
 		/* If we cleaned pages, never do synchronous IO. */
 		if (cleaned_pages)
diff -Nur linux.orig/fs/buffer.c linux/fs/buffer.c
--- linux.orig/fs/buffer.c	Mon Apr  2 23:40:59 2001
+++ linux/fs/buffer.c	Tue Apr  3 01:54:26 2001
@@ -1231,7 +1231,7 @@
 	 * more buffer heads, because the swap-out may need
 	 * more buffer-heads itself.  Thus SLAB_BUFFER.
 	 */
-	if((bh = kmem_cache_alloc(bh_cachep, SLAB_BUFFER)) != NULL) {
+	if((bh = kmem_cache_alloc(bh_cachep, SLAB_PAGE_IO)) != NULL) {
 		memset(bh, 0, sizeof(*bh));
 		init_waitqueue_head(&bh->b_wait);
 		return bh;
@@ -2261,7 +2261,7 @@
 		return 0;
 	}
 
-	page = alloc_page(GFP_BUFFER);
+	page = alloc_page(GFP_PAGE_IO);
 	if (!page)
 		goto out;
 	LockPage(page);
diff -Nur linux.orig/include/linux/mm.h linux/include/linux/mm.h
--- linux.orig/include/linux/mm.h	Mon Apr  2 23:41:09 2001
+++ linux/include/linux/mm.h	Tue Apr  3 01:49:29 2001
@@ -480,8 +480,9 @@
 #define __GFP_HIGHMEM	0x0 /* noop */
 #endif
 #define __GFP_VM	0x20
+#define __GFP_PAGE_IO	0x40
 
-
+#define GFP_PAGE_IO	(__GFP_HIGH | __GFP_WAIT | __GFP_PAGE_IO)
 #define GFP_BUFFER	(__GFP_HIGH | __GFP_WAIT)
 #define GFP_ATOMIC	(__GFP_HIGH)
 #define GFP_USER	(             __GFP_WAIT | __GFP_IO)
diff -Nur linux.orig/include/linux/slab.h linux/include/linux/slab.h
--- linux.orig/include/linux/slab.h	Mon Apr  2 23:41:11 2001
+++ linux/include/linux/slab.h	Tue Apr  3 01:50:01 2001
@@ -15,6 +15,7 @@
 #include	<linux/cache.h>
 
 /* flags for kmem_cache_alloc() */
+#define SLAB_PAGE_IO		GFP_PAGE_IO
 #define	SLAB_BUFFER		GFP_BUFFER
 #define	SLAB_ATOMIC		GFP_ATOMIC
 #define	SLAB_USER		GFP_USER
@@ -22,7 +23,7 @@
 #define	SLAB_NFS		GFP_NFS
 #define	SLAB_DMA		GFP_DMA
 
-#define SLAB_LEVEL_MASK		(__GFP_WAIT|__GFP_HIGH|__GFP_IO)
+#define SLAB_LEVEL_MASK		(__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_PAGE_IO)
 #define	SLAB_NO_GROW		0x00001000UL	/* don't grow a cache */
 
 /* flags to pass to kmem_cache_create().






^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:59                             ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26 22:12                               ` Marcelo Tosatti
  2001-05-27  6:53                                 ` Linux-2.4.5 Marcelo Tosatti
  0 siblings, 1 reply; 50+ messages in thread
From: Marcelo Tosatti @ 2001-05-26 22:12 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Rik van Riel, Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel



On Sat, 26 May 2001, Linus Torvalds wrote:

> 
> On Sat, 26 May 2001, Rik van Riel wrote:
> > 
> > > Testing is good. But I want to understand how we get into the
> > > situation in the first place, and whether there are ways to alleviate
> > > those problems too.
> > 
> > As I said  create_buffers() -> get_unused_buffer_head()
> > -> __alloc_pages() -> loop infinitely.
> 
> No no no.
> 
> Get outside the small world of where it's looping.

There are two problems here. 

It is senseless to make GFP_BUFFER allocations loop inside
__alloc_pages() (calling try_to_free_pages()) because these allocations
_can't_ block.

If there is no free memory, they are going to loop. 

This is "independant" from the highmem deadlock. 

See? 

Now lets talk about the highmem deadlock. 

> Think more on the problem of "how did we get into such a state that we're
> so low on memory for swapouts in the FIRST PLACE?"
> 
> That's the problem I want to fix. And I suspect part of the equation is
> exactly the fact that we use SLAB_BUFFER for the buffer heads. 
> 
> Example schenario:
>  - we're low on memory, but not disastrously so. We have lots of highmem
>    pages, but not that much NORMAL. But we're not uncomfortable yet.
>  - somebody starts writing out to a file. He nicely allocates HIGHMEM
>    pages for the actual data (no memory pressure on HIGHMEM, so no
>    "try_to_free_pages()" called at all)
>  - the writer _also_ needs the buffer heads for those written pages (ie
>    "generic_block_prepare_write()"), and here he allocates them with
>    SLAB_BUFFER. The NORMAL zone starts getting low, and we start calling
>    "try_to_free_pages()".
>  - we deplete "try_to_free_pages()" and start swapping. Except everybody
>    is calling "try_to_free_pages()" with GFP_BUFFER, so nobody can
>    actually do any IO, and if we're unlucky there's not much to be free'd
>    in the NORMAL zone.
> 
> Now do you start to see a pattern here? 
> 
> You're trying to fix the symptoms, by attacking the final end. And what
> I've been trying to say is that this problem likely has a higher-level
> _cause_, and I want that _cause_ fixed. Not the symptoms.

You are not going to fix the problem by _only_ doing this bh allocation
change.

Even if some bh allocators _can_ block on IO, there is no guarantee that
they are going to free low memory --- they may start more IO on highmem
pages.

We cannot treat highmem as "yet another zone" zone. All highmem data goes
through the lowmem before reaching the disk, so its clear for me that we
should not try to write out highmem pages in case we have a lowmem
shortage.

Well, IMO.



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:28                           ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:59                             ` Linus Torvalds
  2001-05-26 22:12                               ` Linux-2.4.5 Marcelo Tosatti
  0 siblings, 1 reply; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26 15:59 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel


On Sat, 26 May 2001, Rik van Riel wrote:
> 
> > Testing is good. But I want to understand how we get into the
> > situation in the first place, and whether there are ways to alleviate
> > those problems too.
> 
> As I said  create_buffers() -> get_unused_buffer_head()
> -> __alloc_pages() -> loop infinitely.

No no no.

Get outside the small world of where it's looping.

Think more on the problem of "how did we get into such a state that we're
so low on memory for swapouts in the FIRST PLACE?"

That's the problem I want to fix. And I suspect part of the equation is
exactly the fact that we use SLAB_BUFFER for the buffer heads. 

Example schenario:
 - we're low on memory, but not disastrously so. We have lots of highmem
   pages, but not that much NORMAL. But we're not uncomfortable yet.
 - somebody starts writing out to a file. He nicely allocates HIGHMEM
   pages for the actual data (no memory pressure on HIGHMEM, so no
   "try_to_free_pages()" called at all)
 - the writer _also_ needs the buffer heads for those written pages (ie
   "generic_block_prepare_write()"), and here he allocates them with
   SLAB_BUFFER. The NORMAL zone starts getting low, and we start calling
   "try_to_free_pages()".
 - we deplete "try_to_free_pages()" and start swapping. Except everybody
   is calling "try_to_free_pages()" with GFP_BUFFER, so nobody can
   actually do any IO, and if we're unlucky there's not much to be free'd
   in the NORMAL zone.

Now do you start to see a pattern here? 

You're trying to fix the symptoms, by attacking the final end. And what
I've been trying to say is that this problem likely has a higher-level
_cause_, and I want that _cause_ fixed. Not the symptoms.

Now, I suspect that part of the cause for this is the fact that we're
using GFP_BUFFER where we shouldn't, which is why we cannot free stuff up
properly in the NORMAL zone.

Now, there could be other things going on too. I'm not saying that it is
necessarily _just_ the experimental silly test-patch I sent out
yesterday. But I _am_ saying that we should try to fix the root cause
first, and then apply the page_alloc.c thing as a last-ditch effort (but
I'd like that "last effort" to be something that nobody can trigger under
any reasonable load).

Do you NOW see my argument? The argument of "we shouldn't have gotten us
into this situation in the first place". See?

		Linus


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  2:11       ` Linux-2.4.5 Ben LaHaise
  2001-05-26  2:38         ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 15:41         ` Rik van Riel
  1 sibling, 0 replies; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 15:41 UTC (permalink / raw)
  To: Ben LaHaise; +Cc: Andrea Arcangeli, Linus Torvalds, Alan Cox, linux-kernel

On Fri, 25 May 2001, Ben LaHaise wrote:

> +++ work/mm/vmscan.c	Mon May 14 16:43:05 2001
> @@ -636,6 +636,12 @@

> +		if (gfp_mask & __GFP_WAIT) {

Without __GFP_WAIT, we will never call do_try_to_free_pages()

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:26                           ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:40                             ` Andrea Arcangeli
  0 siblings, 0 replies; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 15:40 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 12:26:38PM -0300, Rik van Riel wrote:
> Guess what's in my patch?

that part is fine indeed, it's ages that I am telling that alloc_pages
must always be allowed to fail or things will deadlock, go back to the
discussion with Ingo of a few months ago, finally you seems convinced
about that.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:17                         ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26 15:28                           ` Rik van Riel
  2001-05-26 15:59                             ` Linux-2.4.5 Linus Torvalds
  0 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 15:28 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel

On Sat, 26 May 2001, Linus Torvalds wrote:

>                 if (gfp_mask & __GFP_WAIT) {
>                         memory_pressure++;
> -                       try_to_free_pages(gfp_mask);
> -                       goto try_again;
> +                       if (!order || free_shortage()) {
> +                               int progress = try_to_free_pages(gfp_mask);
> +                               if (progress || gfp_mask & __GFP_IO)
> +                                       goto try_again;
> +                       }
>                 }

Yes, this is it.

> Testing is good. But I want to understand how we get into the
> situation in the first place, and whether there are ways to alleviate
> those problems too.

As I said  create_buffers() -> get_unused_buffer_head()
-> __alloc_pages() -> loop infinitely.

Your simplification of get_unused_buffer_head() fits in
nicely with this.

regards,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:24                         ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 15:26                           ` Rik van Riel
  2001-05-26 15:40                             ` Linux-2.4.5 Andrea Arcangeli
  0 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 15:26 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:
> On Sat, May 26, 2001 at 12:18:07PM -0300, Rik van Riel wrote:
> > It's the changes to __alloc_pages(), where we don't loop forever
> > but fail the allocation.
> 
> __alloc_pages() should definitely not to loop forever but it should
> fail the allocation instead.

Guess what's in my patch?

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:18                       ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:24                         ` Andrea Arcangeli
  2001-05-26 15:26                           ` Linux-2.4.5 Rik van Riel
  0 siblings, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 15:24 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 12:18:07PM -0300, Rik van Riel wrote:
> It's the changes to __alloc_pages(), where we don't loop forever
> but fail the allocation.

__alloc_pages() should definitely not to loop forever but it should fail
the allocation instead. If it doesn't right now that is yet another bug,
at least with the 2.4 memory management design where we don't know if
there is memory available or not when we do the allocation. I'd really
appreciate if you could re-post this strictly necessary localized fix, I
will definitely agree about that one.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:08                       ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:20                         ` Andrea Arcangeli
  0 siblings, 0 replies; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 15:20 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Ben LaHaise, Linus Torvalds, Alan Cox, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 637 bytes --]

On Sat, May 26, 2001 at 12:08:34PM -0300, Rik van Riel wrote:
> On Sat, 26 May 2001, Andrea Arcangeli wrote:
> 
> > Others agreed that the real source of the create_buffers could be just
> > too few reserved pages in the unused_list
> 
> To quote you, from the message to which I replied with the
> "No Comment" comment:
> 
> ------> Andrea Arcangeli wrote:
> Anything supposed to work because there's enough memory between
> zone->pages_min*3/4 and zone->pages_min/4 is just obviously broken
> period.
> ------

What are you smoking again? You said "No Comment(tm)   *grin*" to my
suggestion to increase NR_RESERVED (attached).

Andrea

[-- Attachment #2: Type: message/rfc822, Size: 3674 bytes --]

From: Rik van Riel <riel@conectiva.com.br>
To: Andrea Arcangeli <andrea@suse.de>
Cc: Ben LaHaise <bcrl@redhat.com>, Linus Torvalds <torvalds@transmeta.com>, Alan Cox <alan@lxorguk.ukuu.org.uk>, linux-kernel@vger.kernel.org
Subject: Re: Linux-2.4.5
Date: Sat, 26 May 2001 01:45:27 -0300 (BRST)
Message-ID: <Pine.LNX.4.21.0105260137140.30264-100000@imladris.rielhome.conectiva>

On Sat, 26 May 2001, Andrea Arcangeli wrote:
> On Fri, May 25, 2001 at 10:49:38PM -0400, Ben LaHaise wrote:
> > Highmem.  0 free pages in ZONE_NORMAL.  Now try to allocate a buffer_head.
> 
> That's a longstanding deadlock, it was there the first time I read
> fs/buffer.c, nothing related to highmem, we have it in 2.2 too. Also
> getblk is deadlock prone in a smiliar manner.

Not only this, but the fix is _surprisingly_ simple...
All we need to make sure of is that the following order
of allocations is possible and that we back out instead
of deadlock when we don't succeed at any step.

1) normal user allocation
2) buffer allocation (bounce buffer + bufferhead)
3) allocation from interrupt (for device driver)

This is fixed by the patch I sent because:

1) user allocations stop when we reach zone->pages_min and
   keep looping until we freed some memory ... well, these
   don't just loop because we can guarantee that freeing
   memory with GFP_USER or GFP_KERNEL is possible

2) GFP_BUFFER allocations can allocate down to the point
   where free pages go to zone->pages_min * 3 / 4, so we
   can continue to swapout highmem pages when userland
   allocations have stopped ... this is needed because
   otherwise we cannot always make progress on highmem
   pages and we could have the effective amount of RAM
   in the system reduced to less than 1GB, in really bad
   cases not having this could even cause a deadlock

3) If the device driver needs to allocate something, it
   has from zone->pages_min*3/4 down to zone->pages_min/4
   space to allocate stuff, this should be very useful
   for swap or mmap() over the network, or to encrypted
   block devices, etc...

> Can you try to simply change NR_RESERVED to say 200*MAX_BUF_PER_PAGE
> and see if it makes a difference?

No Comment(tm)   *grin*

cheers,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:09                     ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26 15:18                       ` Rik van Riel
  2001-05-26 15:24                         ` Linux-2.4.5 Andrea Arcangeli
  0 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 15:18 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel

On Sat, 26 May 2001, Linus Torvalds wrote:
> On Sat, 26 May 2001, Rik van Riel wrote:
> > 
> > O, that part is fixed by the patch that Linus threw away
> > yesterday ;)
> 
> Rik, I threw away the parts of the patch that were bad and obvious
> band-aids, and it was hard to tell whether any of your patch was a
> "real" fix as opposed to just making more reservations.

1) Remove GFP_BUFFER and HIGHMEM related deadlocks, by letting
   these allocations fail instead of looping forever in
   __alloc_pages() when they cannot make any progress there.

It's the changes to __alloc_pages(), where we don't loop forever
but fail the allocation.

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 14:40                       ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:17                         ` Linus Torvalds
  2001-05-26 15:28                           ` Linux-2.4.5 Rik van Riel
  0 siblings, 1 reply; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26 15:17 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel


On Sat, 26 May 2001, Rik van Riel wrote:
> 
> I am smoking the "tested the patch and wasn't able to reproduce
> a deadlock" stuff.

I'd be happier if _anybody_ was smoking the "thought about the problem
some more" stuff as well.

I can easily imagine that this part of your patch

                if (gfp_mask & __GFP_WAIT) {
                        memory_pressure++;
-                       try_to_free_pages(gfp_mask);
-                       goto try_again;
+                       if (!order || free_shortage()) {
+                               int progress = try_to_free_pages(gfp_mask);
+                               if (progress || gfp_mask & __GFP_IO)
+                                       goto try_again;
+                       }
                }

is fine. The fact that other parts of your patch were NOT fine should make
you go "Hmm, maybe Linus dismissed it for a reason" instead.

Testing is good. But I want to understand how we get into the situation in
the first place, and whether there are ways to alleviate those problems
too.

Testing and finding that the bug went away under your workload is
good. But thinking that that should stop discussion about the _proper_ fix
is stupid, Rik.

		Linus


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 14:21                   ` Linux-2.4.5 Rik van Riel
  2001-05-26 14:38                     ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 15:09                     ` Linus Torvalds
  2001-05-26 15:18                       ` Linux-2.4.5 Rik van Riel
  1 sibling, 1 reply; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26 15:09 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel


On Sat, 26 May 2001, Rik van Riel wrote:
> 
> O, that part is fixed by the patch that Linus threw away
> yesterday ;)

Rik, I threw away the parts of the patch that were bad and obvious
band-aids, and it was hard to tell whether any of your patch was a
"real" fix as opposed to just making more reservations.

And you have not replied to any of the real arguments for fixing the
_real_ bugs. You jst repeat "my patch, my patch, my patch", without even
acknowledging that others are finding the real _underlying_ problems.

Please take a moment to realize that you're not exactly being helpful.

		Linus


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 15:03                     ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 15:08                       ` Rik van Riel
  2001-05-26 15:20                         ` Linux-2.4.5 Andrea Arcangeli
  0 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 15:08 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Ben LaHaise, Linus Torvalds, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:

> Others agreed that the real source of the create_buffers could be just
> too few reserved pages in the unused_list

To quote you, from the message to which I replied with the
"No Comment" comment:

------> Andrea Arcangeli wrote:
Anything supposed to work because there's enough memory between
zone->pages_min*3/4 and zone->pages_min/4 is just obviously broken
period.
------

And not 10 lines lower you decide to raise some magic
limit yourself. I guess my irony threshold must be
lower than yours, or something.

cheers,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 14:36                   ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 15:03                     ` Andrea Arcangeli
  2001-05-26 15:08                       ` Linux-2.4.5 Rik van Riel
  0 siblings, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 15:03 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Ben LaHaise, Linus Torvalds, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 11:36:22AM -0300, Rik van Riel wrote:
> On Sat, 26 May 2001, Andrea Arcangeli wrote:
> > > No Comment(tm)   *grin*
> > 
> > I'm having lots of fun, thanks.
> 
> Now _this_ is tweaking magic limits ;)

Others agreed that the real source of the create_buffers could be just
too few reserved pages in the unused_list, the unused_list is the only
"deadlock avoidance logic" designed to avoid create_buffers to deadlock,
so I really don't see why you don't listen to me and you just assume my
idea is obviously wrong while it obviously isn't. The only thing I can
do is to laugh while reading your illogical "No Comment(tm)   *grin*",
if I would take such comment serously I would just ignore the VM and
stay in other subsystem where those funny things never happens as far I
can tell, which I'm not going to do just because of your new funny "No
Comment(tm) *grin*". If for any reason you notice I somehow invite those
things to happen please let me know and I will certainly try to get
better from my part.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 14:38                     ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 14:40                       ` Rik van Riel
  2001-05-26 15:17                         ` Linux-2.4.5 Linus Torvalds
  0 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 14:40 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:
> On Sat, May 26, 2001 at 11:21:18AM -0300, Rik van Riel wrote:
> > On Sat, 26 May 2001, Andrea Arcangeli wrote:
> > 
> > > I didn't checked the alloc_pages() other thing mentioned by Ben, if
> > > alloc_pages() deadlocks internally that's yet another completly
> > > orthogonal bug and that will be addressed by another patch if it
> > > persists.
> > 
> > O, that part is fixed by the patch that Linus threw away
> > yesterday ;)
> 
> what are you smoking?

I am smoking the "tested the patch and wasn't able to reproduce
a deadlock" stuff.

> I read your patch and there's nothing related to
> such fix in your patch.

I explained the thing to you about 5 times now. If you don't
have the time to understand the deadlock, please don't try
to confuse the issue by sending out non-fixes.


Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 14:21                   ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 14:38                     ` Andrea Arcangeli
  2001-05-26 14:40                       ` Linux-2.4.5 Rik van Riel
  2001-05-26 15:09                     ` Linux-2.4.5 Linus Torvalds
  1 sibling, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 14:38 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 11:21:18AM -0300, Rik van Riel wrote:
> On Sat, 26 May 2001, Andrea Arcangeli wrote:
> 
> > I didn't checked the alloc_pages() other thing mentioned by Ben, if
> > alloc_pages() deadlocks internally that's yet another completly
> > orthogonal bug and that will be addressed by another patch if it
> > persists.
> 
> O, that part is fixed by the patch that Linus threw away
> yesterday ;)

what are you smoking? I read your patch and there's nothing related to
such fix in your patch. I won't have much more time to follow up on this
thread. From now on about the highmem deadlocks topic I will only listen
to real world bugreports of 2.4.5 plus the bugfix I posted a few minuts
ago. If anybody is able to reproduce the deadlocks press SYSRQ+T and
send me the output along the System.map. Thanks in advance for your
cooperation.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 14:32                 ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 14:36                   ` Rik van Riel
  2001-05-26 15:03                     ` Linux-2.4.5 Andrea Arcangeli
  0 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 14:36 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Ben LaHaise, Linus Torvalds, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:
> On Sat, May 26, 2001 at 01:45:27AM -0300, Rik van Riel wrote:
> > 3) If the device driver needs to allocate something, it
> >    has from zone->pages_min*3/4 down to zone->pages_min/4
> >    space to allocate stuff, this should be very useful
> >    for swap or mmap() over the network, or to encrypted
> >    block devices, etc...
> 
> Anything supposed to work because there's enough memory between
> zone->pages_min*3/4 and zone->pages_min/4 is just obviously broken
> period.

No. It's not about having enough memory between those levels.
It's about _failing_ the allocation when you reach a limit.

> > > Can you try to simply change NR_RESERVED to say 200*MAX_BUF_PER_PAGE
> > > and see if it makes a difference?
> >
> > No Comment(tm)   *grin*
> 
> I'm having lots of fun, thanks.

Now _this_ is tweaking magic limits ;)

cheers,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  4:45               ` Linux-2.4.5 Rik van Riel
  2001-05-26  4:47                 ` Linux-2.4.5 Rik van Riel
@ 2001-05-26 14:32                 ` Andrea Arcangeli
  2001-05-26 14:36                   ` Linux-2.4.5 Rik van Riel
  1 sibling, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 14:32 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Ben LaHaise, Linus Torvalds, Alan Cox, linux-kernel

On Sat, May 26, 2001 at 01:45:27AM -0300, Rik van Riel wrote:
> 3) If the device driver needs to allocate something, it
>    has from zone->pages_min*3/4 down to zone->pages_min/4
>    space to allocate stuff, this should be very useful
>    for swap or mmap() over the network, or to encrypted
>    block devices, etc...

Anything supposed to work because there's enough memory between
zone->pages_min*3/4 and zone->pages_min/4 is just obviously broken
period.

> > Can you try to simply change NR_RESERVED to say 200*MAX_BUF_PER_PAGE
> > and see if it makes a difference?
> 
> No Comment(tm)   *grin*

I'm having lots of fun, thanks.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26 14:18                 ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26 14:21                   ` Rik van Riel
  2001-05-26 14:38                     ` Linux-2.4.5 Andrea Arcangeli
  2001-05-26 15:09                     ` Linux-2.4.5 Linus Torvalds
  0 siblings, 2 replies; 50+ messages in thread
From: Rik van Riel @ 2001-05-26 14:21 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Linus Torvalds, Ben LaHaise, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:

> I didn't checked the alloc_pages() other thing mentioned by Ben, if
> alloc_pages() deadlocks internally that's yet another completly
> orthogonal bug and that will be addressed by another patch if it
> persists.

O, that part is fixed by the patch that Linus threw away
yesterday ;)

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  4:22               ` Linux-2.4.5 Linus Torvalds
  2001-05-26  4:31                 ` Linux-2.4.5 Rik van Riel
  2001-05-26  9:18                 ` Linux-2.4.5 arjan
@ 2001-05-26 14:18                 ` Andrea Arcangeli
  2001-05-26 14:21                   ` Linux-2.4.5 Rik van Riel
  2 siblings, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26 14:18 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Ben LaHaise, Alan Cox, Rik van Riel, linux-kernel

On Fri, May 25, 2001 at 09:22:05PM -0700, Linus Torvalds wrote:
> per zone, or that we have a real thinko somewhere that allows eating up

I think I found the real thinko for the create_buffers other deadlock
experienced by Ben, I suspect this fix is enough to address the
deadlock, this was real bug not just hiding factor (reserved bh aren't
released by irqs, the bounces frees memory, memory balancing stop, no bh
is released and we dealdock in wait_event), I also increased a bit the
reserved bh just in case:

--- 2.4.5pre6aa1/fs/buffer.c.~1~	Fri May 25 04:57:46 2001
+++ 2.4.5pre6aa1/fs/buffer.c	Sat May 26 16:15:03 2001
@@ -61,7 +61,7 @@
 
 #define BUFSIZE_INDEX(X) ((int) buffersize_index[(X)>>9])
 #define MAX_BUF_PER_PAGE (PAGE_CACHE_SIZE / 512)
-#define NR_RESERVED (2*MAX_BUF_PER_PAGE)
+#define NR_RESERVED (10*MAX_BUF_PER_PAGE)
 #define MAX_UNUSED_BUFFERS NR_RESERVED+20 /* don't ever have more than this 
 					     number of unused buffer heads */
 
@@ -1416,11 +1416,9 @@
 	 */
 	run_task_queue(&tq_disk);
 
-	/* 
-	 * Set our state for sleeping, then check again for buffer heads.
-	 * This ensures we won't miss a wake_up from an interrupt.
-	 */
-	wait_event(buffer_wait, nr_unused_buffer_heads >= MAX_BUF_PER_PAGE);
+	current->policy |= SCHED_YIELD;
+	__set_current_state(TASK_RUNNING);
+	schedule();
 	goto try_again;
 }
 

please people with >1G machines try to reproduce the deadlock with
cerberus on top of 2.4.5 + the above patch.

I didn't checked the alloc_pages() other thing mentioned by Ben, if
alloc_pages() deadlocks internally that's yet another completly
orthogonal bug and that will be addressed by another patch if it
persists.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  4:22               ` Linux-2.4.5 Linus Torvalds
  2001-05-26  4:31                 ` Linux-2.4.5 Rik van Riel
@ 2001-05-26  9:18                 ` arjan
  2001-05-26 14:18                 ` Linux-2.4.5 Andrea Arcangeli
  2 siblings, 0 replies; 50+ messages in thread
From: arjan @ 2001-05-26  9:18 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel

In article <Pine.LNX.4.21.0105252107010.1520-100000@penguin.transmeta.com> you wrote:

> If there are more situations like this, please get a stack trace on the
> deadlock (fairly easy these days with ctrl-scrolllock), and let's think
> about what make for the nasty pattern in the first place instead of trying
> to add more "reserved" pages.

What I've been seeing so far is that, say, 16 processes all need memory, and
start to write out stuff. All only half succeed, eg they allocate memory for
the writeout but don't actually get enough and sleep for more.
Now that isn't too much of a problem UNTIL kswapd is one of those.....


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  8:10                   ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26  9:01                     ` Linus Torvalds
  0 siblings, 0 replies; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26  9:01 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel


On Sat, 26 May 2001, Linus Torvalds wrote:
> 
> There's _one_ line of your patch special-cases GFP_BUFFER in page_alloc
> and protects the reserves, but the point is that they shouldn't need
> protecting: there's something else wrong that makes them be depleted in
> the first place. 

In fact, there seems to be a major confusion about the use of GFP_BUFFER
around the kernel.

The kernel uses GFP_BUFFER in a few places:

 - grow_buffers(), as called from bread() and friends.

   Here it is correct: we use GFP_BUFFER because we must not cause a
   deadlock on various filesystem datastructures, and whena filesystem
   does a bread() we'd better _never_ cause a writeout that could cause
   some nasty FS lock self-deadlock.

 - creating buffer heads on pages for the page cache uses SLAB_BUFFER.

   This is bogus. It should use SLAB_KERNEL here, because this is not
   called by low-level filesystems, it's called by the VM layer, and we
   don't hold any magic locks or anything like that.

The code actually has some comments to this effect, but is confusing the
issue of "async" and "sync", and that confusion makes the code (a) not
dare do the right thing (there's an attempt that is #ifdef'ed out), and
(b) even the right thing is kind of confused.

I'm leaving for Japan, so this is the last I'll write on this, but as a
request-for-discussion, what about this patch? Does it help? It should
decrease the GFP_BUFFER pressure noticeably (yeah, I removed too much of
the error handling code, but it shouldn't be all that noticeable when
using SLAB_KERNEL, as the allocations should succeed until the machine is
_so_ low on memory that it is truly dead).

Now, this is obviously untested and does a bit too much surgery, but I
really think that the reason for the deadlock is because buffer allocation
itself does things wrong, not so much that we should try to keep infinite
reserves. 

Anybody want to play with these kinds of approaches? Fixing the underlying
problems instead of trying to hide them with special reserve cases...

		Linus

-----
--- v2.4.5/linux/fs/buffer.c	Fri May 25 18:28:55 2001
+++ linux/fs/buffer.c	Sat May 26 01:52:43 2001
@@ -1206,7 +1206,7 @@
  * no-buffer-head deadlock.  Return NULL on failure; waiting for
  * buffer heads is now handled in create_buffers().
  */ 
-static struct buffer_head * get_unused_buffer_head(int async)
+static struct buffer_head * get_unused_buffer_head(int can_do_io)
 {
 	struct buffer_head * bh;
 
@@ -1220,46 +1220,7 @@
 	}
 	spin_unlock(&unused_list_lock);
 
-	/* This is critical.  We can't swap out pages to get
-	 * more buffer heads, because the swap-out may need
-	 * more buffer-heads itself.  Thus SLAB_BUFFER.
-	 */
-	if((bh = kmem_cache_alloc(bh_cachep, SLAB_BUFFER)) != NULL) {
-		bh->b_blocknr = -1;
-		bh->b_this_page = NULL;
-		return bh;
-	}
-
-	/*
-	 * If we need an async buffer, use the reserved buffer heads.
-	 */
-	if (async) {
-		spin_lock(&unused_list_lock);
-		if (unused_list) {
-			bh = unused_list;
-			unused_list = bh->b_next_free;
-			nr_unused_buffer_heads--;
-			spin_unlock(&unused_list_lock);
-			return bh;
-		}
-		spin_unlock(&unused_list_lock);
-	}
-#if 0
-	/*
-	 * (Pending further analysis ...)
-	 * Ordinary (non-async) requests can use a different memory priority
-	 * to free up pages. Any swapping thus generated will use async
-	 * buffer heads.
-	 */
-	if(!async &&
-	   (bh = kmem_cache_alloc(bh_cachep, SLAB_KERNEL)) != NULL) {
-		memset(bh, 0, sizeof(*bh));
-		init_waitqueue_head(&bh->b_wait);
-		return bh;
-	}
-#endif
-
-	return NULL;
+	return kmem_cache_alloc(bh_cachep, can_do_io ? SLAB_KERNEL : SLAB_BUFFER);
 }
 
 void set_bh_page (struct buffer_head *bh, struct page *page, unsigned long offset)
@@ -1285,16 +1246,16 @@
  * from ordinary buffer allocations, and only async requests are allowed
  * to sleep waiting for buffer heads. 
  */
-static struct buffer_head * create_buffers(struct page * page, unsigned long size, int async)
+static struct buffer_head * create_buffers(struct page * page, unsigned long size, int can_do_io)
 {
 	struct buffer_head *bh, *head;
 	long offset;
 
-try_again:
 	head = NULL;
 	offset = PAGE_SIZE;
 	while ((offset -= size) >= 0) {
-		bh = get_unused_buffer_head(async);
+		bh = get_unused_buffer_head(can_do_io);
+		/* Can return failure in the "!can_do_io" case */
 		if (!bh)
 			goto no_grow;
 
@@ -1331,29 +1292,7 @@
 		wake_up(&buffer_wait);
 	}
 
-	/*
-	 * Return failure for non-async IO requests.  Async IO requests
-	 * are not allowed to fail, so we have to wait until buffer heads
-	 * become available.  But we don't want tasks sleeping with 
-	 * partially complete buffers, so all were released above.
-	 */
-	if (!async)
-		return NULL;
-
-	/* We're _really_ low on memory. Now we just
-	 * wait for old buffer heads to become free due to
-	 * finishing IO.  Since this is an async request and
-	 * the reserve list is empty, we're sure there are 
-	 * async buffer heads in use.
-	 */
-	run_task_queue(&tq_disk);
-
-	/* 
-	 * Set our state for sleeping, then check again for buffer heads.
-	 * This ensures we won't miss a wake_up from an interrupt.
-	 */
-	wait_event(buffer_wait, nr_unused_buffer_heads >= MAX_BUF_PER_PAGE);
-	goto try_again;
+	return NULL;
 }
 
 static void unmap_buffer(struct buffer_head * bh)
@@ -1425,7 +1364,6 @@
 {
 	struct buffer_head *bh, *head, *tail;
 
-	/* FIXME: create_buffers should fail if there's no enough memory */
 	head = create_buffers(page, blocksize, 1);
 	if (page->buffers)
 		BUG();


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  4:31                 ` Linux-2.4.5 Rik van Riel
@ 2001-05-26  8:10                   ` Linus Torvalds
  2001-05-26  9:01                     ` Linux-2.4.5 Linus Torvalds
  0 siblings, 1 reply; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26  8:10 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel


On Sat, 26 May 2001, Rik van Riel wrote:
> 
> This is exactly what gets fixed in the patch I sent you.

This is not AT ALL what your patch does. 99% of your patch does other
things, including playing games with the "balance dirty" threshold etc. In
ways that make it look very much like the standard dbench kind of load
cannot use HIGHMEM for dirty buffers very effectively.

There's _one_ line of your patch special-cases GFP_BUFFER in page_alloc
and protects the reserves, but the point is that they shouldn't need
protecting: there's something else wrong that makes them be depleted in
the first place. 

Did you read my email?

		Linus



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  4:47                 ` Linux-2.4.5 Rik van Riel
@ 2001-05-26  6:07                   ` Ben LaHaise
  0 siblings, 0 replies; 50+ messages in thread
From: Ben LaHaise @ 2001-05-26  6:07 UTC (permalink / raw)
  To: Rik van Riel; +Cc: Andrea Arcangeli, Linus Torvalds, Alan Cox, linux-kernel

On Sat, 26 May 2001, Rik van Riel wrote:

> That might be a 2.5 thing, though ... Ben?

It isn't an immediate priority for me at this moment, but in a few weeks I
hope to have it back at the top of my concerns.  If anyone considers it
truely important, I might be persuaded to give it a bit more nudging
along, but if people try to explain to me that the concept is completely
unnescessary, I'll redirect their notes to /dev/null.

		-ben


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  4:45               ` Linux-2.4.5 Rik van Riel
@ 2001-05-26  4:47                 ` Rik van Riel
  2001-05-26  6:07                   ` Linux-2.4.5 Ben LaHaise
  2001-05-26 14:32                 ` Linux-2.4.5 Andrea Arcangeli
  1 sibling, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26  4:47 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Ben LaHaise, Linus Torvalds, Alan Cox, linux-kernel

On Sat, 26 May 2001, Rik van Riel wrote:

> 1) normal user allocation
> 2) buffer allocation (bounce buffer + bufferhead)
> 3) allocation from interrupt (for device driver)

Hmmmm, now that I think of it, we always need to be able
to guarantee _both_ 2) and 3).  For different allocators
and interrupts.  I guess the only long-term solution is
to have real memory reservation strategies, like the one
in Ben's patch.

That might be a 2.5 thing, though ... Ben?

regards,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  3:11             ` Linux-2.4.5 Andrea Arcangeli
  2001-05-26  4:22               ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26  4:45               ` Rik van Riel
  2001-05-26  4:47                 ` Linux-2.4.5 Rik van Riel
  2001-05-26 14:32                 ` Linux-2.4.5 Andrea Arcangeli
  1 sibling, 2 replies; 50+ messages in thread
From: Rik van Riel @ 2001-05-26  4:45 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Ben LaHaise, Linus Torvalds, Alan Cox, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:
> On Fri, May 25, 2001 at 10:49:38PM -0400, Ben LaHaise wrote:
> > Highmem.  0 free pages in ZONE_NORMAL.  Now try to allocate a buffer_head.
> 
> That's a longstanding deadlock, it was there the first time I read
> fs/buffer.c, nothing related to highmem, we have it in 2.2 too. Also
> getblk is deadlock prone in a smiliar manner.

Not only this, but the fix is _surprisingly_ simple...
All we need to make sure of is that the following order
of allocations is possible and that we back out instead
of deadlock when we don't succeed at any step.

1) normal user allocation
2) buffer allocation (bounce buffer + bufferhead)
3) allocation from interrupt (for device driver)

This is fixed by the patch I sent because:

1) user allocations stop when we reach zone->pages_min and
   keep looping until we freed some memory ... well, these
   don't just loop because we can guarantee that freeing
   memory with GFP_USER or GFP_KERNEL is possible

2) GFP_BUFFER allocations can allocate down to the point
   where free pages go to zone->pages_min * 3 / 4, so we
   can continue to swapout highmem pages when userland
   allocations have stopped ... this is needed because
   otherwise we cannot always make progress on highmem
   pages and we could have the effective amount of RAM
   in the system reduced to less than 1GB, in really bad
   cases not having this could even cause a deadlock

3) If the device driver needs to allocate something, it
   has from zone->pages_min*3/4 down to zone->pages_min/4
   space to allocate stuff, this should be very useful
   for swap or mmap() over the network, or to encrypted
   block devices, etc...

> Can you try to simply change NR_RESERVED to say 200*MAX_BUF_PER_PAGE
> and see if it makes a difference?

No Comment(tm)   *grin*

cheers,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  4:22               ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26  4:31                 ` Rik van Riel
  2001-05-26  8:10                   ` Linux-2.4.5 Linus Torvalds
  2001-05-26  9:18                 ` Linux-2.4.5 arjan
  2001-05-26 14:18                 ` Linux-2.4.5 Andrea Arcangeli
  2 siblings, 1 reply; 50+ messages in thread
From: Rik van Riel @ 2001-05-26  4:31 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Andrea Arcangeli, Ben LaHaise, Alan Cox, linux-kernel

On Fri, 25 May 2001, Linus Torvalds wrote:

> This is why we always leave a few pages free, exactly to allow nested
> page allocators to steal the reserved pages that we keep around. If
> that deadlocks, then that's a separate issue altogether.
> 
> If people are able to trigger the "we run out of reserved pages"
> behaviour under any load, that indicates that we either have too few
> reserved pages per zone, or that we have a real thinko somewhere that
> allows eating up the reserves we're supposed to have.

This is exactly what gets fixed in the patch I sent you.
Feel free to reimplement it in a complex way if you want ;)

> But sometimes the right solution is just to have more reserves.

Won't work if the ethernet card is allocating memory
at gigabit speed. And no, my patch won't protect against
this thing either, only memory reservations can.

All my patch does is give us a 2.4 kernel now which
doesn't hang immediately as soon as you run on highmem
machines with a heavy swapping load.

regards,

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  3:11             ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26  4:22               ` Linus Torvalds
  2001-05-26  4:31                 ` Linux-2.4.5 Rik van Riel
                                   ` (2 more replies)
  2001-05-26  4:45               ` Linux-2.4.5 Rik van Riel
  1 sibling, 3 replies; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26  4:22 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Ben LaHaise, Alan Cox, Rik van Riel, linux-kernel


On Sat, 26 May 2001, Andrea Arcangeli wrote:
>
> On Fri, May 25, 2001 at 10:49:38PM -0400, Ben LaHaise wrote:
> > Highmem.  0 free pages in ZONE_NORMAL.  Now try to allocate a buffer_head.
> 
> That's a longstanding deadlock, it was there the first time I read
> fs/buffer.c, nothing related to highmem, we have it in 2.2 too. Also
> getblk is deadlock prone in a smiliar manner.

Indeed. 

This is why we always leave a few pages free, exactly to allow nested page
allocators to steal the reserved pages that we keep around. If that
deadlocks, then that's a separate issue altogether.

If people are able to trigger the "we run out of reserved pages" behaviour
under any load, that indicates that we either have too few reserved pages
per zone, or that we have a real thinko somewhere that allows eating up
the reserves we're supposed to have.

And yes, things like spraying the box really hard with network packets can
temporarily eat up the reserves, but that's why kswapd and friends exist,
to get them back. But I could easily imagine that there are more schedule
points missing that could cause user mode to not get to run much. Andrea
fixed one, I think.

If there are more situations like this, please get a stack trace on the
deadlock (fairly easy these days with ctrl-scrolllock), and let's think
about what make for the nasty pattern in the first place instead of trying
to add more "reserved" pages.

For example, maybe we can use HIGHMEM pages more aggressively in some
places, to avoid the case where we're only freeing HIGHMEM pages and
making the non-HIGHMEM case just worse. 

For example, we used to have logic in swapout_process to _not_ swap out
zones that don't need it. We changed swapout to happen in
"page_launder()", but that logic got lost. It's entirely possible that we
should just say "don't bother writing out dirty pages that are in zones
that have no memory pressure", so that we don't use up pages from the
_precious_ zones to free pages in zones that don't need freeing.

So don't try to paper over this by making up new rules. We should think
about WHY the problem happens in the first place, not about trying to fix
it once it has happened (and see the above as an example of why it might
be happening).

But sometimes the right solution is just to have more reserves.

		Linus


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  2:49           ` Linux-2.4.5 Ben LaHaise
@ 2001-05-26  3:11             ` Andrea Arcangeli
  2001-05-26  4:22               ` Linux-2.4.5 Linus Torvalds
  2001-05-26  4:45               ` Linux-2.4.5 Rik van Riel
  0 siblings, 2 replies; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26  3:11 UTC (permalink / raw)
  To: Ben LaHaise; +Cc: Linus Torvalds, Alan Cox, Rik van Riel, linux-kernel

On Fri, May 25, 2001 at 10:49:38PM -0400, Ben LaHaise wrote:
> Highmem.  0 free pages in ZONE_NORMAL.  Now try to allocate a buffer_head.

That's a longstanding deadlock, it was there the first time I read
fs/buffer.c, nothing related to highmem, we have it in 2.2 too. Also
getblk is deadlock prone in a smiliar manner.

Can you try to simply change NR_RESERVED to say 200*MAX_BUF_PER_PAGE and
see if it makes a difference? The unused_list logic doesn't give a
guarantee either and it's one of the "hiding" logics, but it was working
pretty well usually, maybe something changed that needs more than 2
pages (16 bh) reserved?

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  2:38         ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26  2:49           ` Ben LaHaise
  2001-05-26  3:11             ` Linux-2.4.5 Andrea Arcangeli
  0 siblings, 1 reply; 50+ messages in thread
From: Ben LaHaise @ 2001-05-26  2:49 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Linus Torvalds, Alan Cox, Rik van Riel, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:

> Allocating a buffer head during out of memory is always been deadlock
> prone, 2.2 always had the same problem too. I'm not sure why you are
> telling me this, I didn't changed anything that happens to be in the
> swapout path (besides removing the deadlock in create_bounces with
> evolution of first Ingo's patch but that is not specific to the
> swapout). I only changed the getblk path (which is not used by the
> swapout, at least unless you swapout on a file not on a blkdev, but even
> in that case the change is fine).

Highmem.  0 free pages in ZONE_NORMAL.  Now try to allocate a buffer_head.
Running under heavy load runs into this even after there is a highmem
bounce buffer pool.

> btw in the below patch __GFP_FAIL is a noop.

<shrug>  merge that patch from -ac then.

		-ben


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  2:11       ` Linux-2.4.5 Ben LaHaise
@ 2001-05-26  2:38         ` Andrea Arcangeli
  2001-05-26  2:49           ` Linux-2.4.5 Ben LaHaise
  2001-05-26 15:41         ` Linux-2.4.5 Rik van Riel
  1 sibling, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26  2:38 UTC (permalink / raw)
  To: Ben LaHaise; +Cc: Linus Torvalds, Alan Cox, Rik van Riel, linux-kernel

On Fri, May 25, 2001 at 10:11:40PM -0400, Ben LaHaise wrote:
> On Sat, 26 May 2001, Andrea Arcangeli wrote:
> 
> > Now if you send some debugging info with deadlocks you gets with 2.4.5
> > vanilla I will be certainly interested to found their source. Also Rik
> > just said to have a fix for other bugs in that area, I didn't checked
> > that part.
> 
> In the red hat tree, we fixed the problem by adding __GFP_FAIL to
> GFP_BUFFER, as well as adding a yield to alloc_pages.  Think of what
> happens when you try to allocate a buffer_head to swap out a page when
> you're out of memory.  See below.

Allocating a buffer head during out of memory is always been deadlock
prone, 2.2 always had the same problem too. I'm not sure why you are
telling me this, I didn't changed anything that happens to be in the
swapout path (besides removing the deadlock in create_bounces with
evolution of first Ingo's patch but that is not specific to the
swapout). I only changed the getblk path (which is not used by the
swapout, at least unless you swapout on a file not on a blkdev, but even
in that case the change is fine).

About yelding interally to alloc_pages it would make sense if we
had a private pool internally to the allocator, otherwise with current
code you definitely want to return a faliure fast to the caller so the
caller will try the private pool before the yield.

btw in the below patch __GFP_FAIL is a noop.

> 
> 		-ben
> 
> diff -ur v2.4.4-ac9/include/linux/mm.h work/include/linux/mm.h
> --- v2.4.4-ac9/include/linux/mm.h	Mon May 14 15:22:17 2001
> +++ work/include/linux/mm.h	Mon May 14 18:33:21 2001
> @@ -528,7 +528,7 @@
> 
> 
>  #define GFP_BOUNCE	(__GFP_HIGH | __GFP_FAIL)
> -#define GFP_BUFFER	(__GFP_HIGH | __GFP_WAIT)
> +#define GFP_BUFFER	(__GFP_HIGH | __GFP_FAIL | __GFP_WAIT)
>  #define GFP_ATOMIC	(__GFP_HIGH)
>  #define GFP_USER	(             __GFP_WAIT | __GFP_IO)
>  #define GFP_HIGHUSER	(             __GFP_WAIT | __GFP_IO | __GFP_HIGHMEM)
> diff -ur v2.4.4-ac9/mm/vmscan.c work/mm/vmscan.c
> --- v2.4.4-ac9/mm/vmscan.c	Mon May 14 14:57:00 2001
> +++ work/mm/vmscan.c	Mon May 14 16:43:05 2001
> @@ -636,6 +636,12 @@
>  	 */
>  	shortage = free_shortage();
>  	if (can_get_io_locks && !launder_loop && shortage) {
> +		if (gfp_mask & __GFP_WAIT) {
> +			__set_current_state(TASK_RUNNING);
> +			current->policy |= SCHED_YIELD;
> +			schedule();
> +		}
> +
>  		launder_loop = 1;
> 
>  		/*
> 


Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  1:59     ` Linux-2.4.5 Andrea Arcangeli
@ 2001-05-26  2:11       ` Ben LaHaise
  2001-05-26  2:38         ` Linux-2.4.5 Andrea Arcangeli
  2001-05-26 15:41         ` Linux-2.4.5 Rik van Riel
  0 siblings, 2 replies; 50+ messages in thread
From: Ben LaHaise @ 2001-05-26  2:11 UTC (permalink / raw)
  To: Andrea Arcangeli; +Cc: Linus Torvalds, Alan Cox, Rik van Riel, linux-kernel

On Sat, 26 May 2001, Andrea Arcangeli wrote:

> Now if you send some debugging info with deadlocks you gets with 2.4.5
> vanilla I will be certainly interested to found their source. Also Rik
> just said to have a fix for other bugs in that area, I didn't checked
> that part.

In the red hat tree, we fixed the problem by adding __GFP_FAIL to
GFP_BUFFER, as well as adding a yield to alloc_pages.  Think of what
happens when you try to allocate a buffer_head to swap out a page when
you're out of memory.  See below.

		-ben

diff -ur v2.4.4-ac9/include/linux/mm.h work/include/linux/mm.h
--- v2.4.4-ac9/include/linux/mm.h	Mon May 14 15:22:17 2001
+++ work/include/linux/mm.h	Mon May 14 18:33:21 2001
@@ -528,7 +528,7 @@


 #define GFP_BOUNCE	(__GFP_HIGH | __GFP_FAIL)
-#define GFP_BUFFER	(__GFP_HIGH | __GFP_WAIT)
+#define GFP_BUFFER	(__GFP_HIGH | __GFP_FAIL | __GFP_WAIT)
 #define GFP_ATOMIC	(__GFP_HIGH)
 #define GFP_USER	(             __GFP_WAIT | __GFP_IO)
 #define GFP_HIGHUSER	(             __GFP_WAIT | __GFP_IO | __GFP_HIGHMEM)
diff -ur v2.4.4-ac9/mm/vmscan.c work/mm/vmscan.c
--- v2.4.4-ac9/mm/vmscan.c	Mon May 14 14:57:00 2001
+++ work/mm/vmscan.c	Mon May 14 16:43:05 2001
@@ -636,6 +636,12 @@
 	 */
 	shortage = free_shortage();
 	if (can_get_io_locks && !launder_loop && shortage) {
+		if (gfp_mask & __GFP_WAIT) {
+			__set_current_state(TASK_RUNNING);
+			current->policy |= SCHED_YIELD;
+			schedule();
+		}
+
 		launder_loop = 1;

 		/*


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  1:39   ` Linux-2.4.5 Ben LaHaise
@ 2001-05-26  1:59     ` Andrea Arcangeli
  2001-05-26  2:11       ` Linux-2.4.5 Ben LaHaise
  0 siblings, 1 reply; 50+ messages in thread
From: Andrea Arcangeli @ 2001-05-26  1:59 UTC (permalink / raw)
  To: Ben LaHaise; +Cc: Linus Torvalds, Alan Cox, Rik van Riel, linux-kernel

On Fri, May 25, 2001 at 09:39:36PM -0400, Ben LaHaise wrote:
> Sorry, this doesn't fix the problem.  It still hangs on highmem machines.
> Try running cerberus on a PAE kernel sometime.

There can be more bugs of course, two patches I posted are only meant to
fix deadlocks in the allocation fail path of alloc_bounces() and the
second patch in getblk() allocation fail path, nothing more. Those are
strictly necessary fixes as far I can tell, and their implementation was
quite obviously right to my eyes.

Now if you send some debugging info with deadlocks you gets with 2.4.5
vanilla I will be certainly interested to found their source. Also Rik
just said to have a fix for other bugs in that area, I didn't checked
that part.

What I can say is that with my tree I didn't reproduced deadlocks
highmem related with cerberus but I'm using highmem emulation not real
highmem.

Andrea

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  1:28 ` Linux-2.4.5 Linus Torvalds
  2001-05-26  1:35   ` Linux-2.4.5 Rik van Riel
@ 2001-05-26  1:39   ` Ben LaHaise
  2001-05-26  1:59     ` Linux-2.4.5 Andrea Arcangeli
  1 sibling, 1 reply; 50+ messages in thread
From: Ben LaHaise @ 2001-05-26  1:39 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Alan Cox, Andrea Arcangeli, Rik van Riel, linux-kernel

Sorry, this doesn't fix the problem.  It still hangs on highmem machines.
Try running cerberus on a PAE kernel sometime.

		-ben

On Fri, 25 May 2001, Linus Torvalds wrote:

> Ok, I applied Andrea's (nee Ingo's) version, as that one most clearly
> attacked the real deadlock cause. It's there as 2.4.5 now.
>
> I'm going to be gone in Japan for the next week (leaving tomorrow
> morning), so please don't send me patches - I won't be able to react to
> them anyway. Consider the -ac series and the kernel mailing list the
> regular communications channels..
>
> Thanks,
>
> 		Linus
>


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: Linux-2.4.5
  2001-05-26  1:28 ` Linux-2.4.5 Linus Torvalds
@ 2001-05-26  1:35   ` Rik van Riel
  2001-05-26  1:39   ` Linux-2.4.5 Ben LaHaise
  1 sibling, 0 replies; 50+ messages in thread
From: Rik van Riel @ 2001-05-26  1:35 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Alan Cox, Andrea Arcangeli, Ben LaHaise, linux-kernel

On Fri, 25 May 2001, Linus Torvalds wrote:

> Ok, I applied Andrea's (nee Ingo's) version, as that one most clearly
> attacked the real deadlock cause. It's there as 2.4.5 now.

But only for highmem bounce buffers. Normal GFP_BUFFER
allocations can still headlock.

> I'm going to be gone in Japan for the next week

Oh well, I guess people can always run the -ac kernel ;)

Rik
--
Virtual memory is like a game you can't win;
However, without VM there's truly nothing to lose...

http://www.surriel.com/		http://distro.conectiva.com/

Send all your spam to aardvark@nl.linux.org (spam digging piggy)


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Linux-2.4.5
  2001-05-26  0:34 [with-PATCH-really] highmem deadlock removal, balancing & cleanup Linus Torvalds
@ 2001-05-26  1:28 ` Linus Torvalds
  2001-05-26  1:35   ` Linux-2.4.5 Rik van Riel
  2001-05-26  1:39   ` Linux-2.4.5 Ben LaHaise
  0 siblings, 2 replies; 50+ messages in thread
From: Linus Torvalds @ 2001-05-26  1:28 UTC (permalink / raw)
  To: Alan Cox, Andrea Arcangeli, Ben LaHaise; +Cc: Rik van Riel, linux-kernel


Ok, I applied Andrea's (nee Ingo's) version, as that one most clearly
attacked the real deadlock cause. It's there as 2.4.5 now.

I'm going to be gone in Japan for the next week (leaving tomorrow
morning), so please don't send me patches - I won't be able to react to
them anyway. Consider the -ac series and the kernel mailing list the
regular communications channels..

Thanks,

		Linus


^ permalink raw reply	[flat|nested] 50+ messages in thread

end of thread, other threads:[~2001-06-05  3:58 UTC | newest]

Thread overview: 50+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20010526171459.Y9634@athlon.random>
2001-05-26 15:22 ` Linux-2.4.5 Rik van Riel
2001-05-26 15:30   ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 15:51     ` Linux-2.4.5 Rik van Riel
2001-05-26 16:04       ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 15:23 ` Linux-2.4.5 Linus Torvalds
2001-05-26 15:31   ` Linux-2.4.5 Rik van Riel
2001-05-26 15:38   ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 16:03     ` Linux-2.4.5 Linus Torvalds
2001-05-26 18:11 ` Linux-2.4.5 Ben LaHaise
2001-05-26 18:31   ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 19:42     ` Linux-2.4.5 Ingo Molnar
2001-05-26 19:56       ` Linux-2.4.5 Andrea Arcangeli
2001-05-26  0:34 [with-PATCH-really] highmem deadlock removal, balancing & cleanup Linus Torvalds
2001-05-26  1:28 ` Linux-2.4.5 Linus Torvalds
2001-05-26  1:35   ` Linux-2.4.5 Rik van Riel
2001-05-26  1:39   ` Linux-2.4.5 Ben LaHaise
2001-05-26  1:59     ` Linux-2.4.5 Andrea Arcangeli
2001-05-26  2:11       ` Linux-2.4.5 Ben LaHaise
2001-05-26  2:38         ` Linux-2.4.5 Andrea Arcangeli
2001-05-26  2:49           ` Linux-2.4.5 Ben LaHaise
2001-05-26  3:11             ` Linux-2.4.5 Andrea Arcangeli
2001-05-26  4:22               ` Linux-2.4.5 Linus Torvalds
2001-05-26  4:31                 ` Linux-2.4.5 Rik van Riel
2001-05-26  8:10                   ` Linux-2.4.5 Linus Torvalds
2001-05-26  9:01                     ` Linux-2.4.5 Linus Torvalds
2001-05-26  9:18                 ` Linux-2.4.5 arjan
2001-05-26 14:18                 ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 14:21                   ` Linux-2.4.5 Rik van Riel
2001-05-26 14:38                     ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 14:40                       ` Linux-2.4.5 Rik van Riel
2001-05-26 15:17                         ` Linux-2.4.5 Linus Torvalds
2001-05-26 15:28                           ` Linux-2.4.5 Rik van Riel
2001-05-26 15:59                             ` Linux-2.4.5 Linus Torvalds
2001-05-26 22:12                               ` Linux-2.4.5 Marcelo Tosatti
2001-05-27  6:53                                 ` Linux-2.4.5 Marcelo Tosatti
2001-06-03 23:32                                   ` Linux-2.4.5 Linus Torvalds
2001-06-05  2:21                                     ` Linux-2.4.5 Marcelo Tosatti
2001-05-26 15:09                     ` Linux-2.4.5 Linus Torvalds
2001-05-26 15:18                       ` Linux-2.4.5 Rik van Riel
2001-05-26 15:24                         ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 15:26                           ` Linux-2.4.5 Rik van Riel
2001-05-26 15:40                             ` Linux-2.4.5 Andrea Arcangeli
2001-05-26  4:45               ` Linux-2.4.5 Rik van Riel
2001-05-26  4:47                 ` Linux-2.4.5 Rik van Riel
2001-05-26  6:07                   ` Linux-2.4.5 Ben LaHaise
2001-05-26 14:32                 ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 14:36                   ` Linux-2.4.5 Rik van Riel
2001-05-26 15:03                     ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 15:08                       ` Linux-2.4.5 Rik van Riel
2001-05-26 15:20                         ` Linux-2.4.5 Andrea Arcangeli
2001-05-26 15:41         ` Linux-2.4.5 Rik van Riel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).