.. | .. |
---|
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 | } |
---|