.name           = "rxe-uc",
                .size           = sizeof(struct rxe_ucontext),
                .elem_offset    = offsetof(struct rxe_ucontext, elem),
-               .flags          = RXE_POOL_NO_ALLOC,
        },
        [RXE_TYPE_PD] = {
                .name           = "rxe-pd",
                .size           = sizeof(struct rxe_pd),
                .elem_offset    = offsetof(struct rxe_pd, elem),
-               .flags          = RXE_POOL_NO_ALLOC,
        },
        [RXE_TYPE_AH] = {
                .name           = "rxe-ah",
                .size           = sizeof(struct rxe_ah),
                .elem_offset    = offsetof(struct rxe_ah, elem),
-               .flags          = RXE_POOL_INDEX | RXE_POOL_NO_ALLOC,
+               .flags          = RXE_POOL_INDEX,
                .min_index      = RXE_MIN_AH_INDEX,
                .max_index      = RXE_MAX_AH_INDEX,
        },
                .name           = "rxe-srq",
                .size           = sizeof(struct rxe_srq),
                .elem_offset    = offsetof(struct rxe_srq, elem),
-               .flags          = RXE_POOL_INDEX | RXE_POOL_NO_ALLOC,
+               .flags          = RXE_POOL_INDEX,
                .min_index      = RXE_MIN_SRQ_INDEX,
                .max_index      = RXE_MAX_SRQ_INDEX,
        },
                .size           = sizeof(struct rxe_qp),
                .elem_offset    = offsetof(struct rxe_qp, elem),
                .cleanup        = rxe_qp_cleanup,
-               .flags          = RXE_POOL_INDEX | RXE_POOL_NO_ALLOC,
+               .flags          = RXE_POOL_INDEX,
                .min_index      = RXE_MIN_QP_INDEX,
                .max_index      = RXE_MAX_QP_INDEX,
        },
                .name           = "rxe-cq",
                .size           = sizeof(struct rxe_cq),
                .elem_offset    = offsetof(struct rxe_cq, elem),
-               .flags          = RXE_POOL_NO_ALLOC,
                .cleanup        = rxe_cq_cleanup,
        },
        [RXE_TYPE_MR] = {
                .size           = sizeof(struct rxe_mr),
                .elem_offset    = offsetof(struct rxe_mr, elem),
                .cleanup        = rxe_mr_cleanup,
-               .flags          = RXE_POOL_INDEX,
+               .flags          = RXE_POOL_INDEX | RXE_POOL_ALLOC,
                .min_index      = RXE_MIN_MR_INDEX,
                .max_index      = RXE_MAX_MR_INDEX,
        },
                .size           = sizeof(struct rxe_mw),
                .elem_offset    = offsetof(struct rxe_mw, elem),
                .cleanup        = rxe_mw_cleanup,
-               .flags          = RXE_POOL_INDEX | RXE_POOL_NO_ALLOC,
+               .flags          = RXE_POOL_INDEX,
                .min_index      = RXE_MIN_MW_INDEX,
                .max_index      = RXE_MAX_MW_INDEX,
        },
        struct rxe_pool_elem *elem;
        void *obj;
 
+       if (WARN_ON(!(pool->flags & RXE_POOL_ALLOC)))
+               return NULL;
+
        if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
                goto out_cnt;
 
 
 int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem)
 {
+       if (WARN_ON(pool->flags & RXE_POOL_ALLOC))
+               return -EINVAL;
+
        if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
                goto out_cnt;
 
        if (pool->cleanup)
                pool->cleanup(elem);
 
-       if (!(pool->flags & RXE_POOL_NO_ALLOC)) {
+       if (pool->flags & RXE_POOL_ALLOC) {
                obj = elem->obj;
                kfree(obj);
        }