srq_init_attr->attr.max_wr > dev->dparms.props.max_srq_wr)
                return ERR_PTR(-EINVAL);
 
-       srq = kmalloc(sizeof(*srq), GFP_KERNEL);
+       srq = kzalloc_node(sizeof(*srq), GFP_KERNEL, dev->dparms.node);
        if (!srq)
                return ERR_PTR(-ENOMEM);
 
        srq->rq.max_sge = srq_init_attr->attr.max_sge;
        sz = sizeof(struct ib_sge) * srq->rq.max_sge +
                sizeof(struct rvt_rwqe);
-       srq->rq.wq = vmalloc_user(sizeof(struct rvt_rwq) + srq->rq.size * sz);
+       srq->rq.wq = udata ?
+               vmalloc_user(sizeof(struct rvt_rwq) + srq->rq.size * sz) :
+               vzalloc_node(sizeof(struct rvt_rwq) + srq->rq.size * sz,
+                            dev->dparms.node);
        if (!srq->rq.wq) {
                ret = ERR_PTR(-ENOMEM);
                goto bail_srq;
                        ret = ERR_PTR(err);
                        goto bail_ip;
                }
-       } else {
-               srq->ip = NULL;
        }
 
        /*
         * ib_create_srq() will initialize srq->ibsrq.
         */
        spin_lock_init(&srq->rq.lock);
-       srq->rq.wq->head = 0;
-       srq->rq.wq->tail = 0;
        srq->limit = srq_init_attr->attr.srq_limit;
 
        spin_lock(&dev->n_srqs_lock);
                sz = sizeof(struct rvt_rwqe) +
                        srq->rq.max_sge * sizeof(struct ib_sge);
                size = attr->max_wr + 1;
-               wq = vmalloc_user(sizeof(struct rvt_rwq) + size * sz);
+               wq = udata ?
+                       vmalloc_user(sizeof(struct rvt_rwq) + size * sz) :
+                       vzalloc_node(sizeof(struct rvt_rwq) + size * sz,
+                                    dev->dparms.node);
                if (!wq)
                        return -ENOMEM;