Index: arch/ia64/src/mm/as.c
===================================================================
--- arch/ia64/src/mm/as.c	(revision a3eeceb63abe66d5ad2d3892d18a91ad79b185fc)
+++ arch/ia64/src/mm/as.c	(revision d0a0f125da5e6e33ad6557453e99903f9057c78b)
@@ -29,4 +29,5 @@
 #include <arch/mm/as.h>
 #include <genarch/mm/as_ht.h>
+#include <genarch/mm/asid_fifo.h>
 
 /** Architecture dependent address space init. */
@@ -34,3 +35,4 @@
 {
 	as_operations = &as_ht_operations;
+	asid_fifo_init();
 }
Index: arch/mips32/src/mm/as.c
===================================================================
--- arch/mips32/src/mm/as.c	(revision a3eeceb63abe66d5ad2d3892d18a91ad79b185fc)
+++ arch/mips32/src/mm/as.c	(revision d0a0f125da5e6e33ad6557453e99903f9057c78b)
@@ -29,4 +29,5 @@
 #include <arch/mm/as.h>
 #include <genarch/mm/as_pt.h>
+#include <genarch/mm/asid_fifo.h>
 #include <arch/mm/tlb.h>
 #include <mm/tlb.h>
@@ -39,4 +40,5 @@
 {
         as_operations = &as_pt_operations;
+	asid_fifo_init();
 }
 
Index: arch/mips32/src/mm/tlb.c
===================================================================
--- arch/mips32/src/mm/tlb.c	(revision a3eeceb63abe66d5ad2d3892d18a91ad79b185fc)
+++ arch/mips32/src/mm/tlb.c	(revision d0a0f125da5e6e33ad6557453e99903f9057c78b)
@@ -29,5 +29,4 @@
 #include <arch/mm/tlb.h>
 #include <mm/asid.h>
-#include <genarch/mm/asid_fifo.h>
 #include <mm/tlb.h>
 #include <mm/page.h>
@@ -58,6 +57,4 @@
 {
 	int i;
-
-	asid_fifo_init();
 
 	cp0_pagemask_write(TLB_PAGE_MASK_16K);
Index: arch/sparc64/src/mm/as.c
===================================================================
--- arch/sparc64/src/mm/as.c	(revision a3eeceb63abe66d5ad2d3892d18a91ad79b185fc)
+++ arch/sparc64/src/mm/as.c	(revision d0a0f125da5e6e33ad6557453e99903f9057c78b)
@@ -29,4 +29,5 @@
 #include <arch/mm/as.h>
 #include <genarch/mm/as_ht.h>
+#include <genarch/mm/asid_fifo.h>
 
 /** Architecture dependent address space init. */
@@ -34,3 +35,4 @@
 {
 	as_operations = &as_ht_operations;
+	asid_fifo_init();
 }
Index: arch/sparc64/src/mm/tlb.c
===================================================================
--- arch/sparc64/src/mm/tlb.c	(revision a3eeceb63abe66d5ad2d3892d18a91ad79b185fc)
+++ arch/sparc64/src/mm/tlb.c	(revision d0a0f125da5e6e33ad6557453e99903f9057c78b)
@@ -29,5 +29,4 @@
 #include <arch/mm/tlb.h>
 #include <mm/tlb.h>
-#include <genarch/mm/asid_fifo.h>
 #include <arch/mm/frame.h>
 #include <arch/mm/page.h>
@@ -56,6 +55,4 @@
 	frame_address_t fr;
 	page_address_t pg;
-
-	asid_fifo_init();
 
 	fr.address = config.base;
Index: genarch/src/mm/asid_fifo.c
===================================================================
--- genarch/src/mm/asid_fifo.c	(revision a3eeceb63abe66d5ad2d3892d18a91ad79b185fc)
+++ genarch/src/mm/asid_fifo.c	(revision d0a0f125da5e6e33ad6557453e99903f9057c78b)
@@ -33,9 +33,15 @@
 #include <adt/fifo.h>
 
+#define FIFO_STATIC_LIMIT	1024
+#define FIFO_STATIC		(ASIDS_ALLOCABLE<FIFO_STATIC_LIMIT)
 /**
  * FIFO queue containing unassigned ASIDs. 
  * Can be only accessed when asidlock is held.
  */
-FIFO_INITIALIZE(free_asids, asid_t, ASIDS_ALLOCABLE);
+#if FIFO_STATIC
+FIFO_INITIALIZE_STATIC(free_asids, asid_t, ASIDS_ALLOCABLE);
+#else
+FIFO_INITIALIZE_DYNAMIC(free_asids, asid_t, ASIDS_ALLOCABLE);
+#endif
 
 /** Initialize data structures for O(1) ASID allocation and deallocation. */
@@ -43,5 +49,9 @@
 {
 	int i;
-	
+
+	#if (!FIFO_STATIC)
+	fifo_create(free_asids);
+	#endif
+		
 	for (i = 0; i < ASIDS_ALLOCABLE; i++) {
 		fifo_push(free_asids, ASID_START + i);
Index: generic/include/adt/fifo.h
===================================================================
--- generic/include/adt/fifo.h	(revision a3eeceb63abe66d5ad2d3892d18a91ad79b185fc)
+++ generic/include/adt/fifo.h	(revision d0a0f125da5e6e33ad6557453e99903f9057c78b)
@@ -28,11 +28,11 @@
 
 /*
- * This implementation of FIFO stores values in a statically
- * allocated array created on each FIFO's initialization.
- * As such, these FIFOs have upper bound on number of values
- * they can store. Push and pop operations are done via accessing
- * the array through head and tail indices. Because of better
- * operation ordering in fifo_pop(), the access policy for these
- * two indices is to 'increment (mod size of FIFO) and use'.
+ * This implementation of FIFO stores values in an array
+ * (static or dynamic). As such, these FIFOs have upper bound
+ * on number of values they can store. Push and pop operations
+ * are done via accessing the array through head and tail indices.
+ * Because of better operation ordering in fifo_pop(), the access
+ * policy for these two indices is to 'increment (mod size of FIFO)
+ * and use'.
  */
 
@@ -41,6 +41,10 @@
 
 #include <typedefs.h>
+#include <mm/slab.h>
 
-/** Create and initialize FIFO.
+/** Create and initialize static FIFO.
+ *
+ * FIFO is allocated statically.
+ * This macro is suitable for creating smaller FIFOs.
  *
  * @param name Name of FIFO.
@@ -48,5 +52,5 @@
  * @param itms Number of items that can be stored in FIFO.
  */
-#define FIFO_INITIALIZE(name, t, itms)			\
+#define FIFO_INITIALIZE_STATIC(name, t, itms)		\
 	struct {					\
 		t fifo[(itms)];				\
@@ -55,4 +59,26 @@
 		index_t tail;				\
 	} name = {					\
+		.items = (itms),			\
+		.head = 0,				\
+		.tail = 0				\
+	}
+
+/** Create and prepare dynamic FIFO.
+ *
+ * FIFO is allocated dynamically.
+ * This macro is suitable for creating larger FIFOs. 
+ *
+ * @param name Name of FIFO.
+ * @param t Type of values stored in FIFO.
+ * @param itms Number of items that can be stored in FIFO.
+ */
+#define FIFO_INITIALIZE_DYNAMIC(name, t, itms)		\
+	struct {					\
+		t *fifo;				\
+		count_t items;				\
+		index_t head;				\
+		index_t tail;				\
+	} name = {					\
+		.fifo = NULL,				\
 		.items = (itms),			\
 		.head = 0,				\
@@ -78,3 +104,10 @@
 	name.fifo[name.tail = (name.tail + 1) < name.items ? (name.tail + 1) : 0] = (value) 
 
+/** Allocate memory for dynamic FIFO.
+ *
+ * @param name FIFO name.
+ */
+#define fifo_create(name) \
+	name.fifo = malloc(sizeof(*name.fifo) * name.items, 0)
+
 #endif
