diff options
| -rw-r--r-- | drivers/infiniband/hw/ehca/ipz_pt_fn.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.c b/drivers/infiniband/hw/ehca/ipz_pt_fn.c index a2605593ae79..1227c593627a 100644 --- a/drivers/infiniband/hw/ehca/ipz_pt_fn.c +++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.c | |||
| @@ -222,8 +222,11 @@ int ipz_queue_ctor(struct ehca_pd *pd, struct ipz_queue *queue, | |||
| 222 | /* allocate queue page pointers */ | 222 | /* allocate queue page pointers */ |
| 223 | queue->queue_pages = kmalloc(nr_of_pages * sizeof(void *), GFP_KERNEL); | 223 | queue->queue_pages = kmalloc(nr_of_pages * sizeof(void *), GFP_KERNEL); |
| 224 | if (!queue->queue_pages) { | 224 | if (!queue->queue_pages) { |
| 225 | ehca_gen_err("Couldn't allocate queue page list"); | 225 | queue->queue_pages = vmalloc(nr_of_pages * sizeof(void *)); |
| 226 | return 0; | 226 | if (!queue->queue_pages) { |
| 227 | ehca_gen_err("Couldn't allocate queue page list"); | ||
| 228 | return 0; | ||
| 229 | } | ||
| 227 | } | 230 | } |
| 228 | memset(queue->queue_pages, 0, nr_of_pages * sizeof(void *)); | 231 | memset(queue->queue_pages, 0, nr_of_pages * sizeof(void *)); |
| 229 | 232 | ||
| @@ -240,7 +243,10 @@ int ipz_queue_ctor(struct ehca_pd *pd, struct ipz_queue *queue, | |||
| 240 | ipz_queue_ctor_exit0: | 243 | ipz_queue_ctor_exit0: |
| 241 | ehca_gen_err("Couldn't alloc pages queue=%p " | 244 | ehca_gen_err("Couldn't alloc pages queue=%p " |
| 242 | "nr_of_pages=%x", queue, nr_of_pages); | 245 | "nr_of_pages=%x", queue, nr_of_pages); |
| 243 | kfree(queue->queue_pages); | 246 | if (is_vmalloc_addr(queue->queue_pages)) |
| 247 | vfree(queue->queue_pages); | ||
| 248 | else | ||
| 249 | kfree(queue->queue_pages); | ||
| 244 | 250 | ||
| 245 | return 0; | 251 | return 0; |
| 246 | } | 252 | } |
| @@ -262,7 +268,10 @@ int ipz_queue_dtor(struct ehca_pd *pd, struct ipz_queue *queue) | |||
| 262 | free_page((unsigned long)queue->queue_pages[i]); | 268 | free_page((unsigned long)queue->queue_pages[i]); |
| 263 | } | 269 | } |
| 264 | 270 | ||
| 265 | kfree(queue->queue_pages); | 271 | if (is_vmalloc_addr(queue->queue_pages)) |
| 272 | vfree(queue->queue_pages); | ||
| 273 | else | ||
| 274 | kfree(queue->queue_pages); | ||
| 266 | 275 | ||
| 267 | return 1; | 276 | return 1; |
| 268 | } | 277 | } |
