| .. | .. |
|---|
| 91 | 91 | /* Convert to number of pages */ |
|---|
| 92 | 92 | size = DIV_ROUND_UP(size, PAGE_SIZE); |
|---|
| 93 | 93 | |
|---|
| 94 | | - down_read(&mm->mmap_sem); |
|---|
| 95 | | - pinned = mm->pinned_vm; |
|---|
| 96 | | - up_read(&mm->mmap_sem); |
|---|
| 94 | + pinned = atomic64_read(&mm->pinned_vm); |
|---|
| 97 | 95 | |
|---|
| 98 | 96 | /* First, check the absolute limit against all pinned pages. */ |
|---|
| 99 | 97 | if (pinned + npages >= ulimit && !can_lock) |
|---|
| .. | .. |
|---|
| 106 | 104 | bool writable, struct page **pages) |
|---|
| 107 | 105 | { |
|---|
| 108 | 106 | int ret; |
|---|
| 107 | + unsigned int gup_flags = FOLL_LONGTERM | (writable ? FOLL_WRITE : 0); |
|---|
| 109 | 108 | |
|---|
| 110 | | - ret = get_user_pages_fast(vaddr, npages, writable, pages); |
|---|
| 109 | + ret = pin_user_pages_fast(vaddr, npages, gup_flags, pages); |
|---|
| 111 | 110 | if (ret < 0) |
|---|
| 112 | 111 | return ret; |
|---|
| 113 | 112 | |
|---|
| 114 | | - down_write(&mm->mmap_sem); |
|---|
| 115 | | - mm->pinned_vm += ret; |
|---|
| 116 | | - up_write(&mm->mmap_sem); |
|---|
| 113 | + atomic64_add(ret, &mm->pinned_vm); |
|---|
| 117 | 114 | |
|---|
| 118 | 115 | return ret; |
|---|
| 119 | 116 | } |
|---|
| .. | .. |
|---|
| 121 | 118 | void hfi1_release_user_pages(struct mm_struct *mm, struct page **p, |
|---|
| 122 | 119 | size_t npages, bool dirty) |
|---|
| 123 | 120 | { |
|---|
| 124 | | - size_t i; |
|---|
| 125 | | - |
|---|
| 126 | | - for (i = 0; i < npages; i++) { |
|---|
| 127 | | - if (dirty) |
|---|
| 128 | | - set_page_dirty_lock(p[i]); |
|---|
| 129 | | - put_page(p[i]); |
|---|
| 130 | | - } |
|---|
| 121 | + unpin_user_pages_dirty_lock(p, npages, dirty); |
|---|
| 131 | 122 | |
|---|
| 132 | 123 | if (mm) { /* during close after signal, mm can be NULL */ |
|---|
| 133 | | - down_write(&mm->mmap_sem); |
|---|
| 134 | | - mm->pinned_vm -= npages; |
|---|
| 135 | | - up_write(&mm->mmap_sem); |
|---|
| 124 | + atomic64_sub(npages, &mm->pinned_vm); |
|---|
| 136 | 125 | } |
|---|
| 137 | 126 | } |
|---|