All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH 1/3] drm/i915: Introduce remap_io_sg() to prefault discontiguous objects
@ 2019-12-23  4:15 Abdiel Janulgue
  2019-12-23  4:15 ` [Intel-gfx] [PATCH 2/3] drm/i915: Add lmem fault handler Abdiel Janulgue
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Abdiel Janulgue @ 2019-12-23  4:15 UTC (permalink / raw)
  To: intel-gfx

Provide a way to set the PTE within apply_page_range for discontiguous
objects in addition to the existing method of just incrementing the pfn
for a page range.

Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_drv.h |  3 ++
 drivers/gpu/drm/i915/i915_mm.c  | 67 +++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 95db8017f138..71a20387f931 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2015,6 +2015,9 @@ int i915_reg_read_ioctl(struct drm_device *dev, void *data,
 int remap_io_mapping(struct vm_area_struct *vma,
 		     unsigned long addr, unsigned long pfn, unsigned long size,
 		     struct io_mapping *iomap);
+int remap_io_sg(struct vm_area_struct *vma,
+		unsigned long addr, resource_size_t io_start, struct scatterlist *sgl,
+		unsigned long size, struct io_mapping *iomap);
 
 static inline int intel_hws_csb_write_index(struct drm_i915_private *i915)
 {
diff --git a/drivers/gpu/drm/i915/i915_mm.c b/drivers/gpu/drm/i915/i915_mm.c
index 318562ce64c0..4ae9ef470ad2 100644
--- a/drivers/gpu/drm/i915/i915_mm.c
+++ b/drivers/gpu/drm/i915/i915_mm.c
@@ -32,7 +32,13 @@
 struct remap_pfn {
 	struct mm_struct *mm;
 	unsigned long pfn;
+	unsigned long start_pfn;
+	unsigned long size;
 	pgprot_t prot;
+
+	resource_size_t io_start;
+	struct sg_dma_page_iter sgiter;
+	struct scatterlist *sgl;
 };
 
 static int remap_pfn(pte_t *pte, unsigned long addr, void *data)
@@ -46,6 +52,31 @@ static int remap_pfn(pte_t *pte, unsigned long addr, void *data)
 	return 0;
 }
 
+static int remap_io(pte_t *pte, unsigned long addr, void *data)
+{
+	struct remap_pfn *r = data;
+	struct sg_dma_page_iter *sgiter = &r->sgiter;
+	if (!r->pfn)
+		__sg_page_iter_start(&sgiter->base, r->sgl,
+				     r->size >> PAGE_SHIFT, 0);
+
+	if (__sg_page_iter_dma_next(sgiter)) {
+		dma_addr_t addr = sg_page_iter_dma_address(sgiter);
+		unsigned long pfn = (r->io_start + addr) >> PAGE_SHIFT;
+
+		if (!r->pfn)
+			r->start_pfn = pfn;
+		r->pfn = pfn;
+		/* Special PTE are not associated with any struct page */
+		set_pte_at(r->mm, addr, pte, pte_mkspecial(pfn_pte(r->pfn, r->prot)));
+
+		return 0;
+	}
+
+	GEM_WARN_ON("invalid range");
+	return -EINVAL;
+}
+
 /**
  * remap_io_mapping - remap an IO mapping to userspace
  * @vma: user vma to map to
@@ -80,3 +111,39 @@ int remap_io_mapping(struct vm_area_struct *vma,
 
 	return 0;
 }
+
+/**
+ * remap_io_sg - remap an IO mapping to userspace
+ * @vma: user vma to map to
+ * @addr: target user address to start at
+ * @io_start: IO start
+ * @sgl: Start sg entry
+ * @size: size of map area
+ * @iomap: the source io_mapping
+ *
+ *  Note: this is only safe if the mm semaphore is held when called.
+ */
+int remap_io_sg(struct vm_area_struct *vma,
+		unsigned long addr, resource_size_t io_start, struct scatterlist *sgl,
+		unsigned long size, struct io_mapping *iomap)
+{
+	struct remap_pfn r = { 0 };
+	int err;
+	GEM_BUG_ON((vma->vm_flags & EXPECTED_FLAGS) != EXPECTED_FLAGS);
+
+	/* We rely on prevalidation of the io-mapping to skip track_pfn(). */
+	r.mm = vma->vm_mm;
+	r.size = size;
+	r.io_start = io_start;
+	r.sgl = sgl;
+	r.prot = __pgprot((pgprot_val(iomap->prot) & _PAGE_CACHE_MASK) |
+			  (pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK));
+
+	err = apply_to_page_range(r.mm, addr, size, remap_io, &r);
+	if (unlikely(err)) {
+		zap_vma_ptes(vma, addr, (r.pfn - r.start_pfn) << PAGE_SHIFT);
+		return err;
+	}
+
+	return 0;
+}
-- 
2.23.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread
* [Intel-gfx] [PATCH 1/3] drm/i915: allow prefaulting discontiguous objects in remap_io_mapping()
@ 2019-12-19 11:21 Abdiel Janulgue
  2019-12-19 11:21 ` [Intel-gfx] [PATCH 2/3] drm/i915: Add lmem fault handler Abdiel Janulgue
  0 siblings, 1 reply; 12+ messages in thread
From: Abdiel Janulgue @ 2019-12-19 11:21 UTC (permalink / raw)
  To: intel-gfx

Provide a way to set the PTE of the physical address of kernel memory in
addition to just incrementing the pfn for a page range.

Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gem/i915_gem_mman.c |  1 +
 drivers/gpu/drm/i915/i915_drv.h          |  4 +++-
 drivers/gpu/drm/i915/i915_mm.c           | 17 ++++++++++++++---
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 879fff8adc48..aa5d6623d86c 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -360,6 +360,7 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
 			       area->vm_start + (vma->ggtt_view.partial.offset << PAGE_SHIFT),
 			       (ggtt->gmadr.start + vma->node.start) >> PAGE_SHIFT,
 			       min_t(u64, vma->size, area->vm_end - area->vm_start),
+			       NULL,
 			       &ggtt->iomap);
 	if (ret)
 		goto err_fence;
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 0781b6326b8c..5ee0fe4d492b 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2015,9 +2015,11 @@ int i915_reg_read_ioctl(struct drm_device *dev, void *data,
 	intel_de_wait_for_register((dev_priv_), (reg_), (mask_), 0, (timeout_))
 
 /* i915_mm.c */
+typedef unsigned long (*io_pfn_t)(struct drm_i915_gem_object *obj,
+				  unsigned long n);
 int remap_io_mapping(struct vm_area_struct *vma,
 		     unsigned long addr, unsigned long pfn, unsigned long size,
-		     struct io_mapping *iomap);
+		     io_pfn_t fn, struct io_mapping *iomap);
 
 static inline int intel_hws_csb_write_index(struct drm_i915_private *i915)
 {
diff --git a/drivers/gpu/drm/i915/i915_mm.c b/drivers/gpu/drm/i915/i915_mm.c
index 318562ce64c0..86a73444bed4 100644
--- a/drivers/gpu/drm/i915/i915_mm.c
+++ b/drivers/gpu/drm/i915/i915_mm.c
@@ -32,7 +32,11 @@
 struct remap_pfn {
 	struct mm_struct *mm;
 	unsigned long pfn;
+	unsigned long start_pfn;
 	pgprot_t prot;
+
+	io_pfn_t fn;
+	struct drm_i915_gem_object *obj;
 };
 
 static int remap_pfn(pte_t *pte, unsigned long addr, void *data)
@@ -41,7 +45,10 @@ static int remap_pfn(pte_t *pte, unsigned long addr, void *data)
 
 	/* Special PTE are not associated with any struct page */
 	set_pte_at(r->mm, addr, pte, pte_mkspecial(pfn_pte(r->pfn, r->prot)));
-	r->pfn++;
+	if (r->fn)
+		r->pfn = r->fn(r->obj, r->start_pfn++);
+	else
+		r->pfn++;
 
 	return 0;
 }
@@ -52,15 +59,17 @@ static int remap_pfn(pte_t *pte, unsigned long addr, void *data)
  * @addr: target user address to start at
  * @pfn: physical address of kernel memory
  * @size: size of map area
+ * @fn: if provided, the function translates each increment of @pfn to io pfn
  * @iomap: the source io_mapping
  *
  *  Note: this is only safe if the mm semaphore is held when called.
  */
 int remap_io_mapping(struct vm_area_struct *vma,
 		     unsigned long addr, unsigned long pfn, unsigned long size,
-		     struct io_mapping *iomap)
+		     io_pfn_t fn, struct io_mapping *iomap)
 {
-	struct remap_pfn r;
+	struct remap_pfn r = { 0 };
+	struct i915_mmap_offset *priv = vma->vm_private_data;
 	int err;
 
 #define EXPECTED_FLAGS (VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP)
@@ -69,6 +78,8 @@ int remap_io_mapping(struct vm_area_struct *vma,
 	/* We rely on prevalidation of the io-mapping to skip track_pfn(). */
 	r.mm = vma->vm_mm;
 	r.pfn = pfn;
+	r.fn = fn;
+	r.obj = priv->obj;
 	r.prot = __pgprot((pgprot_val(iomap->prot) & _PAGE_CACHE_MASK) |
 			  (pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK));
 
-- 
2.17.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2019-12-27 13:54 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-23  4:15 [Intel-gfx] [PATCH 1/3] drm/i915: Introduce remap_io_sg() to prefault discontiguous objects Abdiel Janulgue
2019-12-23  4:15 ` [Intel-gfx] [PATCH 2/3] drm/i915: Add lmem fault handler Abdiel Janulgue
2019-12-23  4:15 ` [Intel-gfx] [PATCH 3/3] drm/i915/selftests: Add selftest for memory region PF handling Abdiel Janulgue
2019-12-27 13:52   ` kbuild test robot
2019-12-27 13:52     ` kbuild test robot
2019-12-23  4:23 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/3] drm/i915: Introduce remap_io_sg() to prefault discontiguous objects Patchwork
2019-12-23  4:25 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2019-12-23  4:52 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2019-12-23 17:13 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
2019-12-27  9:43 ` [Intel-gfx] [PATCH 1/3] " kbuild test robot
2019-12-27  9:43   ` kbuild test robot
  -- strict thread matches above, loose matches on Subject: below --
2019-12-19 11:21 [Intel-gfx] [PATCH 1/3] drm/i915: allow prefaulting discontiguous objects in remap_io_mapping() Abdiel Janulgue
2019-12-19 11:21 ` [Intel-gfx] [PATCH 2/3] drm/i915: Add lmem fault handler Abdiel Janulgue

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.