History

mm/hmm: replace the block argument to hmm_range_fault with a flags value

This allows easier expansion to other flags, and also makes the callers a little easier to read.

Christoph Hellwig committed 7 years ago

Commit 9a4903e1 parent d2e8d554 files · +48 −41Browse files

Unified · Split

4 files
  1. drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +1 −1
  2. drivers/gpu/drm/nouveau/nouveau_svm.c +1 −1
  3. include/linux/hmm.h +9 −2
  4. mm/hmm.c +37 −37
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c+1−1
@@ -832,7 +832,7 @@ retry: · 831 unmodified lines
832832
833833 down_read(&mm->mmap_sem);
834834
835− r = hmm_range_fault(range, true);
835+ r = hmm_range_fault(range, 0);
836836 if (unlikely(r < 0)) {
837837 if (likely(r == -EAGAIN)) {
838838 /*
drivers/gpu/drm/nouveau/nouveau_svm.c+1−1
@@ -505,7 +505,7 @@ nouveau_range_fault(struct hmm_mirror *mirror, struct hmm_range *range) · 504 unmodified lines
505505 return -EBUSY;
506506 }
507507
508− ret = hmm_range_fault(range, true);
508+ ret = hmm_range_fault(range, 0);
509509 if (ret <= 0) {
510510 if (ret == 0)
511511 ret = -EBUSY;
include/linux/hmm.h+9−2
@@ -407,12 +407,19 @@ int hmm_range_register(struct hmm_range *range, · 406 unmodified lines
407407 unsigned long end,
408408 unsigned page_shift);
409409 void hmm_range_unregister(struct hmm_range *range);
410+
411+/*
412+ * Retry fault if non-blocking, drop mmap_sem and return -EAGAIN in that case.
413+ */
414+#define HMM_FAULT_ALLOW_RETRY (1 << 0)
415+
410416 long hmm_range_snapshot(struct hmm_range *range);
411−long hmm_range_fault(struct hmm_range *range, bool block);
417+long hmm_range_fault(struct hmm_range *range, unsigned int flags);
418+
412419 long hmm_range_dma_map(struct hmm_range *range,
413420 struct device *device,
414421 dma_addr_t *daddrs,
415− bool block);
422+ unsigned int flags);
416423 long hmm_range_dma_unmap(struct hmm_range *range,
417424 struct vm_area_struct *vma,
418425 struct device *device,
mm/hmm.c+37−37
@@ -281,7 +281,7 @@ struct hmm_vma_walk { · 280 unmodified lines
281281 struct dev_pagemap *pgmap;
282282 unsigned long last;
283283 bool fault;
284− bool block;
284+ unsigned int flags;
285285 };
286286
287287 static int hmm_vma_do_fault(struct mm_walk *walk, unsigned long addr,
@@ -293,8 +293,11 @@ static int hmm_vma_do_fault(struct mm_walk *walk, unsigned long addr, · 5 unmodified lines
293293 struct vm_area_struct *vma = walk->vma;
294294 vm_fault_t ret;
295295
296− flags |= hmm_vma_walk->block ? 0 : FAULT_FLAG_ALLOW_RETRY;
297− flags |= write_fault ? FAULT_FLAG_WRITE : 0;
296+ if (hmm_vma_walk->flags & HMM_FAULT_ALLOW_RETRY)
297+ flags |= FAULT_FLAG_ALLOW_RETRY;
298+ if (write_fault)
299+ flags |= FAULT_FLAG_WRITE;
300+
298301 ret = handle_mm_fault(vma, addr, flags);
299302 if (ret & VM_FAULT_RETRY) {
300303 /* Note, handle_mm_fault did up_read(&mm->mmap_sem)) */
@@ -1012,26 +1015,26 @@ long hmm_range_snapshot(struct hmm_range *range) · 711 unmodified lines
10121015 }
10131016 EXPORT_SYMBOL(hmm_range_snapshot);
10141017
1015−/*
1016− * hmm_range_fault() - try to fault some address in a virtual address range
1017− * @range: range being faulted
1018− * @block: allow blocking on fault (if true it sleeps and do not drop mmap_sem)
1019− * Return: number of valid pages in range->pfns[] (from range start
1020− * address). This may be zero. If the return value is negative,
1021− * then one of the following values may be returned:
1018+/**
1019+ * hmm_range_fault - try to fault some address in a virtual address range
1020+ * @range: range being faulted
1021+ * @flags: HMM_FAULT_* flags
10221022 *
1023− * -EINVAL invalid arguments or mm or virtual address are in an
1024− * invalid vma (for instance device file vma).
1025− * -ENOMEM: Out of memory.
1026− * -EPERM: Invalid permission (for instance asking for write and
1027− * range is read only).
1028− * -EAGAIN: If you need to retry and mmap_sem was drop. This can only
1029− * happens if block argument is false.
1030− * -EBUSY: If the the range is being invalidated and you should wait
1031− * for invalidation to finish.
1032− * -EFAULT: Invalid (ie either no valid vma or it is illegal to access
1033− * that range), number of valid pages in range->pfns[] (from
1034− * range start address).
1023+ * Return: the number of valid pages in range->pfns[] (from range start
1024+ * address), which may be zero. On error one of the following status codes
1025+ * can be returned:
1026+ *
1027+ * -EINVAL: Invalid arguments or mm or virtual address is in an invalid vma
1028+ * (e.g., device file vma).
1029+ * -ENOMEM: Out of memory.
1030+ * -EPERM: Invalid permission (e.g., asking for write and range is read
1031+ * only).
1032+ * -EAGAIN: A page fault needs to be retried and mmap_sem was dropped.
1033+ * -EBUSY: The range has been invalidated and the caller needs to wait for
1034+ * the invalidation to finish.
1035+ * -EFAULT: Invalid (i.e., either no valid vma or it is illegal to access
1036+ * that range) number of valid pages in range->pfns[] (from
1037+ * range start address).
10351038 *
10361039 * This is similar to a regular CPU page fault except that it will not trigger
10371040 * any memory migration if the memory being faulted is not accessible by CPUs
@@ -1040,7 +1043,7 @@ EXPORT_SYMBOL(hmm_range_snapshot); · 2 unmodified lines
10401043 * On error, for one virtual address in the range, the function will mark the
10411044 * corresponding HMM pfn entry with an error flag.
10421045 */
1043−long hmm_range_fault(struct hmm_range *range, bool block)
1046+long hmm_range_fault(struct hmm_range *range, unsigned int flags)
10441047 {
10451048 const unsigned long device_vma = VM_IO | VM_PFNMAP | VM_MIXEDMAP;
10461049 unsigned long start = range->start, end;
@@ -1086,7 +1089,7 @@ long hmm_range_fault(struct hmm_range *range, bool block) · 39 unmodified lines
10861089 hmm_vma_walk.pgmap = NULL;
10871090 hmm_vma_walk.last = start;
10881091 hmm_vma_walk.fault = true;
1089− hmm_vma_walk.block = block;
1092+ hmm_vma_walk.flags = flags;
10901093 hmm_vma_walk.range = range;
10911094 mm_walk.private = &hmm_vma_walk;
10921095 end = min(range->end, vma->vm_end);
@@ -1125,25 +1128,22 @@ long hmm_range_fault(struct hmm_range *range, bool block) · 32 unmodified lines
11251128 EXPORT_SYMBOL(hmm_range_fault);
11261129
11271130 /**
1128− * hmm_range_dma_map() - hmm_range_fault() and dma map page all in one.
1129− * @range: range being faulted
1130− * @device: device against to dma map page to
1131− * @daddrs: dma address of mapped pages
1132− * @block: allow blocking on fault (if true it sleeps and do not drop mmap_sem)
1133− * Return: number of pages mapped on success, -EAGAIN if mmap_sem have been
1134− * drop and you need to try again, some other error value otherwise
1131+ * hmm_range_dma_map - hmm_range_fault() and dma map page all in one.
1132+ * @range: range being faulted
1133+ * @device: device to map page to
1134+ * @daddrs: array of dma addresses for the mapped pages
1135+ * @flags: HMM_FAULT_*
11351136 *
1136− * Note same usage pattern as hmm_range_fault().
1137+ * Return: the number of pages mapped on success (including zero), or any
1138+ * status return from hmm_range_fault() otherwise.
11371139 */
1138−long hmm_range_dma_map(struct hmm_range *range,
1139− struct device *device,
1140− dma_addr_t *daddrs,
1141− bool block)
1140+long hmm_range_dma_map(struct hmm_range *range, struct device *device,
1141+ dma_addr_t *daddrs, unsigned int flags)
11421142 {
11431143 unsigned long i, npages, mapped;
11441144 long ret;
11451145
1146− ret = hmm_range_fault(range, block);
1146+ ret = hmm_range_fault(range, flags);
11471147 if (ret <= 0)
11481148 return ret ? ret : -EBUSY;
11491149

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t