diff --git a/include/salloc.h b/include/salloc.h
index 4c9e8773a457d5159711875ba79536428c6cc355..b8545dc717930d40fd3699324d28378670f9bba9 100644
--- a/include/salloc.h
+++ b/include/salloc.h
@@ -34,7 +34,7 @@ struct tbuf;
 
 bool salloc_init(size_t size, size_t minimal, double factor);
 void salloc_destroy(void);
-void *salloc(size_t size);
+void *salloc(size_t size, const char *what);
 void sfree(void *ptr);
 void slab_validate();
 void slab_stat(struct tbuf *buf);
diff --git a/mod/box/index.m b/mod/box/index.m
index 9e8af16cb12979ebfbf0efe48f23d940422b142b..f71b3980707dae9f9270ea36012da7199dc09f6e 100644
--- a/mod/box/index.m
+++ b/mod/box/index.m
@@ -224,7 +224,7 @@ void
 hash_iterator_free(struct iterator *iterator)
 {
 	assert(iterator->next == hash_iterator_next);
-	sfree(iterator);
+	free(iterator);
 }
 
 
@@ -285,7 +285,7 @@ hash_iterator_free(struct iterator *iterator)
 
 - (struct iterator *) allocIterator
 {
-	struct hash_iterator *it = salloc(sizeof(struct hash_iterator));
+	struct hash_iterator *it = malloc(sizeof(struct hash_iterator));
 	if (it) {
 		memset(it, 0, sizeof(struct hash_iterator));
 		it->base.next = hash_iterator_next;
diff --git a/mod/box/tree.m b/mod/box/tree.m
index 73c35c974dba873447e8e5d178beeab5310d744e..b256bd31e2ba5589fcc86df0b117c2af1b3ec6b3 100644
--- a/mod/box/tree.m
+++ b/mod/box/tree.m
@@ -26,7 +26,6 @@
 #include "tree.h"
 #include "box.h"
 #include "tuple.h"
-#include <salloc.h>
 #include <pickle.h>
 
 /* {{{ Utilities. *************************************************/
@@ -801,7 +800,7 @@ tree_iterator_free(struct iterator *iterator)
 	if (it->iter)
 		sptree_index_iterator_free(it->iter);
 
-	sfree(it);
+	free(it);
 }
 
 /* }}} */
@@ -926,7 +925,7 @@ tree_iterator_free(struct iterator *iterator)
 - (struct iterator *) allocIterator
 {
 	struct tree_iterator *it
-		= salloc(sizeof(struct tree_iterator) + SIZEOF_SPARSE_PARTS(key_def));
+		= malloc(sizeof(struct tree_iterator) + SIZEOF_SPARSE_PARTS(key_def));
 
 	if (it) {
 		memset(it, 0, sizeof(struct tree_iterator));
diff --git a/mod/box/tuple.m b/mod/box/tuple.m
index c6af90b5b01fc73e75d9b772d930dcda62f44003..b7b5512267b13f1285110ed0cf6223d7d09da062 100644
--- a/mod/box/tuple.m
+++ b/mod/box/tuple.m
@@ -39,10 +39,7 @@ struct box_tuple *
 tuple_alloc(size_t size)
 {
 	size_t total = sizeof(struct box_tuple) + size;
-	struct box_tuple *tuple = salloc(total);
-
-	if (tuple == NULL)
-		tnt_raise(LoggedError, :ER_MEMORY_ISSUE, total, "slab allocator", "tuple");
+	struct box_tuple *tuple = salloc(total, "tuple");
 
 	tuple->flags = tuple->refs = 0;
 	tuple->bsize = size;
diff --git a/src/salloc.m b/src/salloc.m
index bb54a13ceb242d031100269962578dbf83c7b534..efe340ab113ba6c2b3104d206bc45fcd237f411f 100644
--- a/src/salloc.m
+++ b/src/salloc.m
@@ -38,6 +38,7 @@
 #include <util.h>
 #include <tbuf.h>
 #include <say.h>
+#include "exception.h"
 
 #define SLAB_ALIGN_PTR(ptr) (void *)((uintptr_t)(ptr) & ~(SLAB_SIZE - 1))
 
@@ -258,17 +259,18 @@ valid_item(struct slab *slab, void *item)
 #endif
 
 void *
-salloc(size_t size)
+salloc(size_t size, const char *what)
 {
 	struct slab_class *class;
 	struct slab *slab;
 	struct slab_item *item;
 
-	if ((class = class_for(size)) == NULL)
-		return NULL;
+	if ((class = class_for(size)) == NULL ||
+	    (slab = slab_of(class)) == NULL) {
 
-	if ((slab = slab_of(class)) == NULL)
-		return NULL;
+		tnt_raise(LoggedError, :ER_MEMORY_ISSUE, size,
+			  "slab allocator", what);
+	}
 
 	if (slab->free == NULL) {
 		assert(valid_item(slab, slab->brk));