| .. | .. |
|---|
| 58 | 58 | u64 uvirt; |
|---|
| 59 | 59 | struct scatterlist mem; |
|---|
| 60 | 60 | int refcount; |
|---|
| 61 | | - } page[0]; |
|---|
| 61 | + } page[]; |
|---|
| 62 | 62 | }; |
|---|
| 63 | 63 | |
|---|
| 64 | 64 | static void mthca_free_icm_pages(struct mthca_dev *dev, struct mthca_icm_chunk *chunk) |
|---|
| .. | .. |
|---|
| 472 | 472 | goto out; |
|---|
| 473 | 473 | } |
|---|
| 474 | 474 | |
|---|
| 475 | | - ret = get_user_pages_fast(uaddr & PAGE_MASK, 1, FOLL_WRITE, pages); |
|---|
| 475 | + ret = pin_user_pages_fast(uaddr & PAGE_MASK, 1, |
|---|
| 476 | + FOLL_WRITE | FOLL_LONGTERM, pages); |
|---|
| 476 | 477 | if (ret < 0) |
|---|
| 477 | 478 | goto out; |
|---|
| 478 | 479 | |
|---|
| .. | .. |
|---|
| 481 | 482 | |
|---|
| 482 | 483 | ret = pci_map_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); |
|---|
| 483 | 484 | if (ret < 0) { |
|---|
| 484 | | - put_page(pages[0]); |
|---|
| 485 | + unpin_user_page(pages[0]); |
|---|
| 485 | 486 | goto out; |
|---|
| 486 | 487 | } |
|---|
| 487 | 488 | |
|---|
| .. | .. |
|---|
| 489 | 490 | mthca_uarc_virt(dev, uar, i)); |
|---|
| 490 | 491 | if (ret) { |
|---|
| 491 | 492 | pci_unmap_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); |
|---|
| 492 | | - put_page(sg_page(&db_tab->page[i].mem)); |
|---|
| 493 | + unpin_user_page(sg_page(&db_tab->page[i].mem)); |
|---|
| 493 | 494 | goto out; |
|---|
| 494 | 495 | } |
|---|
| 495 | 496 | |
|---|
| .. | .. |
|---|
| 555 | 556 | if (db_tab->page[i].uvirt) { |
|---|
| 556 | 557 | mthca_UNMAP_ICM(dev, mthca_uarc_virt(dev, uar, i), 1); |
|---|
| 557 | 558 | pci_unmap_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); |
|---|
| 558 | | - put_page(sg_page(&db_tab->page[i].mem)); |
|---|
| 559 | + unpin_user_page(sg_page(&db_tab->page[i].mem)); |
|---|
| 559 | 560 | } |
|---|
| 560 | 561 | } |
|---|
| 561 | 562 | |
|---|
| .. | .. |
|---|
| 623 | 624 | page = dev->db_tab->page + end; |
|---|
| 624 | 625 | |
|---|
| 625 | 626 | alloc: |
|---|
| 626 | | - page->db_rec = dma_zalloc_coherent(&dev->pdev->dev, MTHCA_ICM_PAGE_SIZE, |
|---|
| 627 | | - &page->mapping, GFP_KERNEL); |
|---|
| 627 | + page->db_rec = dma_alloc_coherent(&dev->pdev->dev, |
|---|
| 628 | + MTHCA_ICM_PAGE_SIZE, &page->mapping, |
|---|
| 629 | + GFP_KERNEL); |
|---|
| 628 | 630 | if (!page->db_rec) { |
|---|
| 629 | 631 | ret = -ENOMEM; |
|---|
| 630 | 632 | goto out; |
|---|