.. | .. |
---|
90 | 90 | |
---|
91 | 91 | /** |
---|
92 | 92 | * pvrdma_create_srq - create shared receive queue |
---|
93 | | - * @pd: protection domain |
---|
| 93 | + * @ibsrq: the IB shared receive queue |
---|
94 | 94 | * @init_attr: shared receive queue attributes |
---|
95 | 95 | * @udata: user data |
---|
96 | 96 | * |
---|
97 | | - * @return: the ib_srq pointer on success, otherwise returns an errno. |
---|
| 97 | + * @return: 0 on success, otherwise returns an errno. |
---|
98 | 98 | */ |
---|
99 | | -struct ib_srq *pvrdma_create_srq(struct ib_pd *pd, |
---|
100 | | - struct ib_srq_init_attr *init_attr, |
---|
101 | | - struct ib_udata *udata) |
---|
| 99 | +int pvrdma_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr, |
---|
| 100 | + struct ib_udata *udata) |
---|
102 | 101 | { |
---|
103 | | - struct pvrdma_srq *srq = NULL; |
---|
104 | | - struct pvrdma_dev *dev = to_vdev(pd->device); |
---|
| 102 | + struct pvrdma_srq *srq = to_vsrq(ibsrq); |
---|
| 103 | + struct pvrdma_dev *dev = to_vdev(ibsrq->device); |
---|
105 | 104 | union pvrdma_cmd_req req; |
---|
106 | 105 | union pvrdma_cmd_resp rsp; |
---|
107 | 106 | struct pvrdma_cmd_create_srq *cmd = &req.create_srq; |
---|
108 | 107 | struct pvrdma_cmd_create_srq_resp *resp = &rsp.create_srq_resp; |
---|
109 | | - struct pvrdma_create_srq_resp srq_resp = {0}; |
---|
| 108 | + struct pvrdma_create_srq_resp srq_resp = {}; |
---|
110 | 109 | struct pvrdma_create_srq ucmd; |
---|
111 | 110 | unsigned long flags; |
---|
112 | 111 | int ret; |
---|
113 | 112 | |
---|
114 | | - if (!(pd->uobject && udata)) { |
---|
| 113 | + if (!udata) { |
---|
115 | 114 | /* No support for kernel clients. */ |
---|
116 | 115 | dev_warn(&dev->pdev->dev, |
---|
117 | 116 | "no shared receive queue support for kernel client\n"); |
---|
118 | | - return ERR_PTR(-EOPNOTSUPP); |
---|
| 117 | + return -EOPNOTSUPP; |
---|
119 | 118 | } |
---|
120 | 119 | |
---|
121 | 120 | if (init_attr->srq_type != IB_SRQT_BASIC) { |
---|
122 | 121 | dev_warn(&dev->pdev->dev, |
---|
123 | 122 | "shared receive queue type %d not supported\n", |
---|
124 | 123 | init_attr->srq_type); |
---|
125 | | - return ERR_PTR(-EINVAL); |
---|
| 124 | + return -EINVAL; |
---|
126 | 125 | } |
---|
127 | 126 | |
---|
128 | 127 | if (init_attr->attr.max_wr > dev->dsr->caps.max_srq_wr || |
---|
129 | 128 | init_attr->attr.max_sge > dev->dsr->caps.max_srq_sge) { |
---|
130 | 129 | dev_warn(&dev->pdev->dev, |
---|
131 | 130 | "shared receive queue size invalid\n"); |
---|
132 | | - return ERR_PTR(-EINVAL); |
---|
| 131 | + return -EINVAL; |
---|
133 | 132 | } |
---|
134 | 133 | |
---|
135 | 134 | if (!atomic_add_unless(&dev->num_srqs, 1, dev->dsr->caps.max_srq)) |
---|
136 | | - return ERR_PTR(-ENOMEM); |
---|
137 | | - |
---|
138 | | - srq = kmalloc(sizeof(*srq), GFP_KERNEL); |
---|
139 | | - if (!srq) { |
---|
140 | | - ret = -ENOMEM; |
---|
141 | | - goto err_srq; |
---|
142 | | - } |
---|
| 135 | + return -ENOMEM; |
---|
143 | 136 | |
---|
144 | 137 | spin_lock_init(&srq->lock); |
---|
145 | 138 | refcount_set(&srq->refcnt, 1); |
---|
.. | .. |
---|
153 | 146 | goto err_srq; |
---|
154 | 147 | } |
---|
155 | 148 | |
---|
156 | | - srq->umem = ib_umem_get(pd->uobject->context, |
---|
157 | | - ucmd.buf_addr, |
---|
158 | | - ucmd.buf_size, 0, 0); |
---|
| 149 | + srq->umem = ib_umem_get(ibsrq->device, ucmd.buf_addr, ucmd.buf_size, 0); |
---|
159 | 150 | if (IS_ERR(srq->umem)) { |
---|
160 | 151 | ret = PTR_ERR(srq->umem); |
---|
161 | 152 | goto err_srq; |
---|
162 | 153 | } |
---|
163 | 154 | |
---|
164 | | - srq->npages = ib_umem_page_count(srq->umem); |
---|
| 155 | + srq->npages = ib_umem_num_dma_blocks(srq->umem, PAGE_SIZE); |
---|
165 | 156 | |
---|
166 | 157 | if (srq->npages < 0 || srq->npages > PVRDMA_PAGE_DIR_MAX_PAGES) { |
---|
167 | 158 | dev_warn(&dev->pdev->dev, |
---|
.. | .. |
---|
183 | 174 | cmd->hdr.cmd = PVRDMA_CMD_CREATE_SRQ; |
---|
184 | 175 | cmd->srq_type = init_attr->srq_type; |
---|
185 | 176 | cmd->nchunks = srq->npages; |
---|
186 | | - cmd->pd_handle = to_vpd(pd)->pd_handle; |
---|
| 177 | + cmd->pd_handle = to_vpd(ibsrq->pd)->pd_handle; |
---|
187 | 178 | cmd->attrs.max_wr = init_attr->attr.max_wr; |
---|
188 | 179 | cmd->attrs.max_sge = init_attr->attr.max_sge; |
---|
189 | 180 | cmd->attrs.srq_limit = init_attr->attr.srq_limit; |
---|
.. | .. |
---|
206 | 197 | /* Copy udata back. */ |
---|
207 | 198 | if (ib_copy_to_udata(udata, &srq_resp, sizeof(srq_resp))) { |
---|
208 | 199 | dev_warn(&dev->pdev->dev, "failed to copy back udata\n"); |
---|
209 | | - pvrdma_destroy_srq(&srq->ibsrq); |
---|
210 | | - return ERR_PTR(-EINVAL); |
---|
| 200 | + pvrdma_destroy_srq(&srq->ibsrq, udata); |
---|
| 201 | + return -EINVAL; |
---|
211 | 202 | } |
---|
212 | 203 | |
---|
213 | | - return &srq->ibsrq; |
---|
| 204 | + return 0; |
---|
214 | 205 | |
---|
215 | 206 | err_page_dir: |
---|
216 | 207 | pvrdma_page_dir_cleanup(dev, &srq->pdir); |
---|
217 | 208 | err_umem: |
---|
218 | 209 | ib_umem_release(srq->umem); |
---|
219 | 210 | err_srq: |
---|
220 | | - kfree(srq); |
---|
221 | 211 | atomic_dec(&dev->num_srqs); |
---|
222 | 212 | |
---|
223 | | - return ERR_PTR(ret); |
---|
| 213 | + return ret; |
---|
224 | 214 | } |
---|
225 | 215 | |
---|
226 | 216 | static void pvrdma_free_srq(struct pvrdma_dev *dev, struct pvrdma_srq *srq) |
---|
.. | .. |
---|
240 | 230 | |
---|
241 | 231 | pvrdma_page_dir_cleanup(dev, &srq->pdir); |
---|
242 | 232 | |
---|
243 | | - kfree(srq); |
---|
244 | | - |
---|
245 | 233 | atomic_dec(&dev->num_srqs); |
---|
246 | 234 | } |
---|
247 | 235 | |
---|
248 | 236 | /** |
---|
249 | 237 | * pvrdma_destroy_srq - destroy shared receive queue |
---|
250 | 238 | * @srq: the shared receive queue to destroy |
---|
| 239 | + * @udata: user data or null for kernel object |
---|
251 | 240 | * |
---|
252 | 241 | * @return: 0 for success. |
---|
253 | 242 | */ |
---|
254 | | -int pvrdma_destroy_srq(struct ib_srq *srq) |
---|
| 243 | +int pvrdma_destroy_srq(struct ib_srq *srq, struct ib_udata *udata) |
---|
255 | 244 | { |
---|
256 | 245 | struct pvrdma_srq *vsrq = to_vsrq(srq); |
---|
257 | 246 | union pvrdma_cmd_req req; |
---|
.. | .. |
---|
270 | 259 | ret); |
---|
271 | 260 | |
---|
272 | 261 | pvrdma_free_srq(dev, vsrq); |
---|
273 | | - |
---|
274 | 262 | return 0; |
---|
275 | 263 | } |
---|
276 | 264 | |
---|