Index: kernel/generic/include/ddi/irq.h
===================================================================
--- kernel/generic/include/ddi/irq.h	(revision fa32c9fed494a266a88de2f081478dff9fe4f31f)
+++ kernel/generic/include/ddi/irq.h	(revision 431c4028beb348e60a9c7a784a49e94fb44766cc)
@@ -43,4 +43,5 @@
 #include <proc/task.h>
 #include <ipc/ipc.h>
+#include <mm/slab.h>
 
 typedef enum {
@@ -139,4 +140,6 @@
 extern hash_table_t irq_uspace_hash_table;
 
+extern slab_cache_t *irq_slab;
+
 extern inr_t last_inr;
 
Index: kernel/generic/src/ddi/irq.c
===================================================================
--- kernel/generic/src/ddi/irq.c	(revision fa32c9fed494a266a88de2f081478dff9fe4f31f)
+++ kernel/generic/src/ddi/irq.c	(revision 431c4028beb348e60a9c7a784a49e94fb44766cc)
@@ -49,4 +49,6 @@
 #include <arch.h>
 
+slab_cache_t *irq_slab = NULL;
+
 /** Spinlock protecting the kernel IRQ hash table
  *
@@ -95,4 +97,8 @@
 	buckets = chains;
 	last_inr = inrs - 1;
+
+	irq_slab = slab_cache_create("irq_t", sizeof(irq_t), 0, NULL, NULL,
+	    FRAME_ATOMIC);
+	assert(irq_slab);
 
 	hash_table_create(&irq_uspace_hash_table, chains, 2, &irq_ht_ops);
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision fa32c9fed494a266a88de2f081478dff9fe4f31f)
+++ kernel/generic/src/ipc/irq.c	(revision 431c4028beb348e60a9c7a784a49e94fb44766cc)
@@ -308,5 +308,5 @@
 		return handle;
 	
-	irq_t *irq = (irq_t *) malloc(sizeof(irq_t), FRAME_ATOMIC);
+	irq_t *irq = (irq_t *) slab_alloc(irq_slab, FRAME_ATOMIC);
 	if (!irq) {
 		cap_free(TASK, handle);
@@ -384,5 +384,5 @@
 	
 	/* Free up the IRQ capability and the underlying kernel object. */
-	free(cap->kobject);
+	slab_free(irq_slab, cap->kobject);
 	cap_free(TASK, handle);
 	
