kernel - MPSAFE kern_mpipe.c

Venkatesh Srinivas me at endeavour.zapto.org
Thu Sep 9 04:36:46 PDT 2010


A patch to convert to a per-pipe token; it hasn't exploded my vkernel yet... :Ddiff --git a/sys/kern/kern_mpipe.c b/sys/kern/kern_mpipe.cindex 8a8559a..5b4a667 100644

--- a/sys/kern/kern_mpipe.c+++ b/sys/kern/kern_mpipe.c@@ -53,8 +53,6 @@  static MALLOC_DEFINE(M_MPIPEARY, "MPipe Array", "Auxillary MPIPE structure");

 -static struct lwkt_token mpipe_token = LWKT_TOKEN_MP_INITIALIZER(mpipe_token);- /*  * Initialize a malloc pipeline for the specified malloc type and allocation  * size.  Create an array to cache up to nom_count buffers and preallocate

@@ -93,6 +91,8 @@ mpipe_init(malloc_pipe_t mpipe, malloc_type_t type, int bytes, 	++mpipe->free_count; 	++mpipe->total_count;

     }++   lwkt_token_init(&mpipe->token, 1, "malloc pipeline token"); }  /*@@ -121,6 +121,8 @@ mpipe_done(malloc_pipe_t mpipe)

 	kfree(mpipe->array, M_MPIPEARY); 	mpipe->array = NULL;     }

++    lwkt_token_uninit(&mpipe->token); }  /*@@ -135,7 +137,7 @@ mpipe_alloc_nowait(malloc_pipe_t mpipe)     void *buf;     int n;

 -    lwkt_gettoken(&mpipe_token);+    lwkt_gettoken(&mpipe->token);     if ((n = mpipe->free_count) != 0) { 	/*

 	 * Use a free entry if it exists.@@ -157,7 +159,7 @@ mpipe_alloc_nowait(malloc_pipe_t mpipe) 	if (buf)

 	    ++mpipe->total_count;     }-    lwkt_reltoken(&mpipe_token);+    lwkt_reltoken(&mpipe->token);

     return(buf); } @@ -172,7 +174,7 @@ mpipe_alloc_waitok(malloc_pipe_t mpipe)     int n;     int mfailed; -    lwkt_gettoken(&mpipe_token);

+    lwkt_gettoken(&mpipe->token);     mfailed = 0;     for (;;) { 	if ((n = mpipe->free_count) != 0) {

@@ -204,7 +206,7 @@ mpipe_alloc_waitok(malloc_pipe_t mpipe) 	} 	mfailed = 1;

     }-    lwkt_reltoken(&mpipe_token);+    lwkt_reltoken(&mpipe->token);     return(buf); } @@ -219,7 +221,7 @@ mpipe_free(malloc_pipe_t mpipe, void *buf)

     if (buf == NULL) 	return; -    lwkt_gettoken(&mpipe_token);+    lwkt_gettoken(&mpipe->token);

     if ((n = mpipe->free_count) < mpipe->ary_count) { 	/* 	 * Free slot available in free array (LIFO)

@@ -228,7 +230,7 @@ mpipe_free(malloc_pipe_t mpipe, void *buf) 	++mpipe->free_count; 	if ((mpipe->mpflags & (MPF_CACHEDATA|MPF_NOZERO)) == 0) 

 	    bzero(buf, mpipe->bytes);-	lwkt_reltoken(&mpipe_token);+	lwkt_reltoken(&mpipe->token);

  	/* 	 * Wakeup anyone blocked in mpipe_alloc_*().@@ -245,7 +247,7 @@ mpipe_free(malloc_pipe_t mpipe, void *buf)

 	KKASSERT(mpipe->total_count >= mpipe->free_count); 	if (mpipe->deconstruct)

 	    mpipe->deconstruct(mpipe, buf);-	lwkt_reltoken(&mpipe_token);

+	lwkt_reltoken(&mpipe->token); 	kfree(buf, mpipe->type);     }

 }diff --git a/sys/sys/mpipe.h b/sys/sys/mpipe.hindex 832b518..b54959e 100644--- a/sys/sys/mpipe.h+++ b/sys/sys/mpipe.h@@ -83,6 +83,7 @@ struct malloc_pipe {

     int		total_count;	/* total outstanding allocations incl free */     int		ary_count;	/* guarenteed allocation count */

     int		max_count;	/* maximum count (M_NOWAIT used beyond nom) */+    lwkt_token	token;

     void	**array;	/* array[ary_count] */     void	(*deconstruct)(struct malloc_pipe *, void *buf);

 };-- vs




More information about the Kernel mailing list