2 * IOMMU helpers in MMU context.
4 * Copyright (C) 2015 IBM Corp. <aik@ozlabs.ru>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
13 #include <linux/sched/signal.h>
14 #include <linux/slab.h>
15 #include <linux/rculist.h>
16 #include <linux/vmalloc.h>
17 #include <linux/mutex.h>
18 #include <linux/migrate.h>
19 #include <linux/hugetlb.h>
20 #include <linux/swap.h>
21 #include <asm/mmu_context.h>
22 #include <asm/pte-walk.h>
24 static DEFINE_MUTEX(mem_list_mutex
);
26 struct mm_iommu_table_group_mem_t
{
27 struct list_head next
;
31 unsigned int pageshift
;
32 u64 ua
; /* userspace address */
33 u64 entries
; /* number of entries in hpas[] */
34 u64
*hpas
; /* vmalloc'ed */
37 static long mm_iommu_adjust_locked_vm(struct mm_struct
*mm
,
38 unsigned long npages
, bool incr
)
40 long ret
= 0, locked
, lock_limit
;
45 down_write(&mm
->mmap_sem
);
48 locked
= mm
->locked_vm
+ npages
;
49 lock_limit
= rlimit(RLIMIT_MEMLOCK
) >> PAGE_SHIFT
;
50 if (locked
> lock_limit
&& !capable(CAP_IPC_LOCK
))
53 mm
->locked_vm
+= npages
;
55 if (WARN_ON_ONCE(npages
> mm
->locked_vm
))
56 npages
= mm
->locked_vm
;
57 mm
->locked_vm
-= npages
;
60 pr_debug("[%d] RLIMIT_MEMLOCK HASH64 %c%ld %ld/%ld\n",
61 current
? current
->pid
: 0,
64 mm
->locked_vm
<< PAGE_SHIFT
,
65 rlimit(RLIMIT_MEMLOCK
));
66 up_write(&mm
->mmap_sem
);
71 bool mm_iommu_preregistered(struct mm_struct
*mm
)
73 return !list_empty(&mm
->context
.iommu_group_mem_list
);
75 EXPORT_SYMBOL_GPL(mm_iommu_preregistered
);
78 * Taken from alloc_migrate_target with changes to remove CMA allocations
80 struct page
*new_iommu_non_cma_page(struct page
*page
, unsigned long private)
82 gfp_t gfp_mask
= GFP_USER
;
83 struct page
*new_page
;
85 if (PageCompound(page
))
88 if (PageHighMem(page
))
89 gfp_mask
|= __GFP_HIGHMEM
;
92 * We don't want the allocation to force an OOM if possibe
94 new_page
= alloc_page(gfp_mask
| __GFP_NORETRY
| __GFP_NOWARN
);
98 static int mm_iommu_move_page_from_cma(struct page
*page
)
101 LIST_HEAD(cma_migrate_pages
);
103 /* Ignore huge pages for now */
104 if (PageCompound(page
))
108 ret
= isolate_lru_page(page
);
112 list_add(&page
->lru
, &cma_migrate_pages
);
113 put_page(page
); /* Drop the gup reference */
115 ret
= migrate_pages(&cma_migrate_pages
, new_iommu_non_cma_page
,
116 NULL
, 0, MIGRATE_SYNC
, MR_CONTIG_RANGE
);
118 if (!list_empty(&cma_migrate_pages
))
119 putback_movable_pages(&cma_migrate_pages
);
125 long mm_iommu_get(struct mm_struct
*mm
, unsigned long ua
, unsigned long entries
,
126 struct mm_iommu_table_group_mem_t
**pmem
)
128 struct mm_iommu_table_group_mem_t
*mem
;
129 long i
, j
, ret
= 0, locked_entries
= 0;
130 unsigned int pageshift
;
132 unsigned long cur_ua
;
133 struct page
*page
= NULL
;
135 mutex_lock(&mem_list_mutex
);
137 list_for_each_entry_rcu(mem
, &mm
->context
.iommu_group_mem_list
,
139 if ((mem
->ua
== ua
) && (mem
->entries
== entries
)) {
146 if ((mem
->ua
< (ua
+ (entries
<< PAGE_SHIFT
))) &&
148 (mem
->entries
<< PAGE_SHIFT
)))) {
155 ret
= mm_iommu_adjust_locked_vm(mm
, entries
, true);
159 locked_entries
= entries
;
161 mem
= kzalloc(sizeof(*mem
), GFP_KERNEL
);
168 * For a starting point for a maximum page size calculation
169 * we use @ua and @entries natural alignment to allow IOMMU pages
170 * smaller than huge pages but still bigger than PAGE_SIZE.
172 mem
->pageshift
= __ffs(ua
| (entries
<< PAGE_SHIFT
));
173 mem
->hpas
= vzalloc(array_size(entries
, sizeof(mem
->hpas
[0])));
180 for (i
= 0; i
< entries
; ++i
) {
181 cur_ua
= ua
+ (i
<< PAGE_SHIFT
);
182 if (1 != get_user_pages_fast(cur_ua
,
183 1/* pages */, 1/* iswrite */, &page
)) {
185 for (j
= 0; j
< i
; ++j
)
186 put_page(pfn_to_page(mem
->hpas
[j
] >>
193 * If we get a page from the CMA zone, since we are going to
194 * be pinning these entries, we might as well move them out
195 * of the CMA zone if possible. NOTE: faulting in + migration
196 * can be expensive. Batching can be considered later
198 if (is_migrate_cma_page(page
)) {
199 if (mm_iommu_move_page_from_cma(page
))
201 if (1 != get_user_pages_fast(cur_ua
,
202 1/* pages */, 1/* iswrite */,
205 for (j
= 0; j
< i
; ++j
)
206 put_page(pfn_to_page(mem
->hpas
[j
] >>
214 pageshift
= PAGE_SHIFT
;
215 if (mem
->pageshift
> PAGE_SHIFT
&& PageCompound(page
)) {
217 struct page
*head
= compound_head(page
);
218 unsigned int compshift
= compound_order(head
);
219 unsigned int pteshift
;
221 local_irq_save(flags
); /* disables as well */
222 pte
= find_linux_pte(mm
->pgd
, cur_ua
, NULL
, &pteshift
);
224 /* Double check it is still the same pinned page */
225 if (pte
&& pte_page(*pte
) == head
&&
226 pteshift
== compshift
+ PAGE_SHIFT
)
227 pageshift
= max_t(unsigned int, pteshift
,
229 local_irq_restore(flags
);
231 mem
->pageshift
= min(mem
->pageshift
, pageshift
);
232 mem
->hpas
[i
] = page_to_pfn(page
) << PAGE_SHIFT
;
235 atomic64_set(&mem
->mapped
, 1);
238 mem
->entries
= entries
;
241 list_add_rcu(&mem
->next
, &mm
->context
.iommu_group_mem_list
);
244 if (locked_entries
&& ret
)
245 mm_iommu_adjust_locked_vm(mm
, locked_entries
, false);
247 mutex_unlock(&mem_list_mutex
);
251 EXPORT_SYMBOL_GPL(mm_iommu_get
);
253 static void mm_iommu_unpin(struct mm_iommu_table_group_mem_t
*mem
)
256 struct page
*page
= NULL
;
258 for (i
= 0; i
< mem
->entries
; ++i
) {
262 page
= pfn_to_page(mem
->hpas
[i
] >> PAGE_SHIFT
);
271 static void mm_iommu_do_free(struct mm_iommu_table_group_mem_t
*mem
)
279 static void mm_iommu_free(struct rcu_head
*head
)
281 struct mm_iommu_table_group_mem_t
*mem
= container_of(head
,
282 struct mm_iommu_table_group_mem_t
, rcu
);
284 mm_iommu_do_free(mem
);
287 static void mm_iommu_release(struct mm_iommu_table_group_mem_t
*mem
)
289 list_del_rcu(&mem
->next
);
290 call_rcu(&mem
->rcu
, mm_iommu_free
);
293 long mm_iommu_put(struct mm_struct
*mm
, struct mm_iommu_table_group_mem_t
*mem
)
297 mutex_lock(&mem_list_mutex
);
299 if (mem
->used
== 0) {
305 /* There are still users, exit */
309 /* Are there still mappings? */
310 if (atomic_cmpxchg(&mem
->mapped
, 1, 0) != 1) {
316 /* @mapped became 0 so now mappings are disabled, release the region */
317 mm_iommu_release(mem
);
319 mm_iommu_adjust_locked_vm(mm
, mem
->entries
, false);
322 mutex_unlock(&mem_list_mutex
);
326 EXPORT_SYMBOL_GPL(mm_iommu_put
);
328 struct mm_iommu_table_group_mem_t
*mm_iommu_lookup(struct mm_struct
*mm
,
329 unsigned long ua
, unsigned long size
)
331 struct mm_iommu_table_group_mem_t
*mem
, *ret
= NULL
;
333 list_for_each_entry_rcu(mem
, &mm
->context
.iommu_group_mem_list
, next
) {
334 if ((mem
->ua
<= ua
) &&
335 (ua
+ size
<= mem
->ua
+
336 (mem
->entries
<< PAGE_SHIFT
))) {
344 EXPORT_SYMBOL_GPL(mm_iommu_lookup
);
346 struct mm_iommu_table_group_mem_t
*mm_iommu_lookup_rm(struct mm_struct
*mm
,
347 unsigned long ua
, unsigned long size
)
349 struct mm_iommu_table_group_mem_t
*mem
, *ret
= NULL
;
351 list_for_each_entry_lockless(mem
, &mm
->context
.iommu_group_mem_list
,
353 if ((mem
->ua
<= ua
) &&
354 (ua
+ size
<= mem
->ua
+
355 (mem
->entries
<< PAGE_SHIFT
))) {
363 EXPORT_SYMBOL_GPL(mm_iommu_lookup_rm
);
365 struct mm_iommu_table_group_mem_t
*mm_iommu_find(struct mm_struct
*mm
,
366 unsigned long ua
, unsigned long entries
)
368 struct mm_iommu_table_group_mem_t
*mem
, *ret
= NULL
;
370 list_for_each_entry_rcu(mem
, &mm
->context
.iommu_group_mem_list
, next
) {
371 if ((mem
->ua
== ua
) && (mem
->entries
== entries
)) {
379 EXPORT_SYMBOL_GPL(mm_iommu_find
);
381 long mm_iommu_ua_to_hpa(struct mm_iommu_table_group_mem_t
*mem
,
382 unsigned long ua
, unsigned int pageshift
, unsigned long *hpa
)
384 const long entry
= (ua
- mem
->ua
) >> PAGE_SHIFT
;
385 u64
*va
= &mem
->hpas
[entry
];
387 if (entry
>= mem
->entries
)
390 if (pageshift
> mem
->pageshift
)
393 *hpa
= *va
| (ua
& ~PAGE_MASK
);
397 EXPORT_SYMBOL_GPL(mm_iommu_ua_to_hpa
);
399 long mm_iommu_ua_to_hpa_rm(struct mm_iommu_table_group_mem_t
*mem
,
400 unsigned long ua
, unsigned int pageshift
, unsigned long *hpa
)
402 const long entry
= (ua
- mem
->ua
) >> PAGE_SHIFT
;
403 void *va
= &mem
->hpas
[entry
];
406 if (entry
>= mem
->entries
)
409 if (pageshift
> mem
->pageshift
)
412 pa
= (void *) vmalloc_to_phys(va
);
416 *hpa
= *pa
| (ua
& ~PAGE_MASK
);
420 EXPORT_SYMBOL_GPL(mm_iommu_ua_to_hpa_rm
);
422 long mm_iommu_mapped_inc(struct mm_iommu_table_group_mem_t
*mem
)
424 if (atomic64_inc_not_zero(&mem
->mapped
))
427 /* Last mm_iommu_put() has been called, no more mappings allowed() */
430 EXPORT_SYMBOL_GPL(mm_iommu_mapped_inc
);
432 void mm_iommu_mapped_dec(struct mm_iommu_table_group_mem_t
*mem
)
434 atomic64_add_unless(&mem
->mapped
, -1, 1);
436 EXPORT_SYMBOL_GPL(mm_iommu_mapped_dec
);
438 void mm_iommu_init(struct mm_struct
*mm
)
440 INIT_LIST_HEAD_RCU(&mm
->context
.iommu_group_mem_list
);