Index: generic/include/adt/fifo.h
===================================================================
--- generic/include/adt/fifo.h	(revision a3eeceb63abe66d5ad2d3892d18a91ad79b185fc)
+++ generic/include/adt/fifo.h	(revision ecbdc7245534ef719f1c33d657c2cee6ab034ab6)
@@ -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
