buggy GFP_KERNEL allocators

Andrea Arcangeli andrea en suse.de
Vie Ene 28 04:18:39 CST 2000


On Thu, 27 Jan 2000, David S. Miller wrote:

>Actually there is one place which cannot fail, allocation of the
>final FIN frame in TCP.  It may never fail, it will loop until
>it gets the memory.

So just move the sched_yield loop into the caller just like getblk just
does so the problem will become local to TCP.

--- 2.2.15pre4/net/ipv4/tcp_output.c.~1~	Tue Jan 25 15:40:06 2000
+++ 2.2.15pre4/net/ipv4/tcp_output.c	Fri Jan 28 10:27:13 2000
@@ -753,12 +753,16 @@
 		}
 	} else {
 		/* Socket is locked, keep trying until memory is available. */
-		do {
+		for (;;) {
 			skb = sock_wmalloc(sk,
 					   (MAX_HEADER +
 					    sk->prot->max_header),
 					   1, GFP_KERNEL);
-		} while (skb == NULL);
+			if (skb)
+				break;
+			current->policy |= SCHED_YIELD;
+			schedule();
+		}
 
 		/* Reserve space for headers and prepare control bits. */
 		skb_reserve(skb, MAX_HEADER + sk->prot->max_header);

>Andrea, please find another way.

Well, the other way is trivial :)

--- 2.2.15pre4/mm/page_alloc.c.~1~	Tue Jan 25 15:40:06 2000
+++ 2.2.15pre4/mm/page_alloc.c	Fri Jan 28 10:29:15 2000
@@ -242,6 +242,7 @@
 	 * waiting for us we need to allow it to run a bit.
 	 */
 	if (gfp_mask & __GFP_WAIT) {
+		current->state = TASK_RUNNING;
 		current->policy |= SCHED_YIELD;
 		schedule();
 	}


But I'd prefer to get rid of such schedule completly in the MM since it is
going to harm the good citizens.

comments?

Andrea


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo en vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



Más información sobre la lista de distribución Ayuda