* [PATCH v4 1/3] drm/shmem: add support for per object caching flags. [not found] <20191218125645.9211-1-kraxel@redhat.com> @ 2019-12-18 12:56 ` Gerd Hoffmann 2019-12-18 12:56 ` [PATCH v4 2/3] drm/virtio: fix mmap page attributes Gerd Hoffmann 2019-12-18 12:56 ` [PATCH v4 3/3] drm/udl: simplify gem object mapping Gerd Hoffmann 2 siblings, 0 replies; 4+ messages in thread From: Gerd Hoffmann @ 2019-12-18 12:56 UTC (permalink / raw) To: dri-devel Cc: tzimmermann, gurchetansingh, Gerd Hoffmann, Maarten Lankhorst, Maxime Ripard, David Airlie, Daniel Vetter, open list Add map_cached bool to drm_gem_shmem_object, to request cached mappings on a per-object base. Check the flag before adding writecombine to pgprot bits. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- include/drm/drm_gem_shmem_helper.h | 5 +++++ drivers/gpu/drm/drm_gem_shmem_helper.c | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h index 6748379a0b44..e69f58d467c6 100644 --- a/include/drm/drm_gem_shmem_helper.h +++ b/include/drm/drm_gem_shmem_helper.h @@ -83,6 +83,11 @@ struct drm_gem_shmem_object { * The address are un-mapped when the count reaches zero. */ unsigned int vmap_use_count; + + /** + * @map_cached: map object cached (instead of using writecombine). + */ + bool map_cached; }; #define to_drm_gem_shmem_obj(obj) \ diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c index a421a2eed48a..443265a4fc5a 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -256,9 +256,13 @@ static void *drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem) if (obj->import_attach) shmem->vaddr = dma_buf_vmap(obj->import_attach->dmabuf); - else + else { + pgprot_t prot = PAGE_KERNEL; + if (!shmem->map_cached) + prot = pgprot_writecombine(prot); shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT, - VM_MAP, pgprot_writecombine(PAGE_KERNEL)); + VM_MAP, prot); + } if (!shmem->vaddr) { DRM_DEBUG_KMS("Failed to vmap pages\n"); @@ -540,7 +544,9 @@ int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) } vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND; - vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); + vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); + if (!shmem->map_cached) + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); vma->vm_ops = &drm_gem_shmem_vm_ops; -- 2.18.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 2/3] drm/virtio: fix mmap page attributes [not found] <20191218125645.9211-1-kraxel@redhat.com> 2019-12-18 12:56 ` [PATCH v4 1/3] drm/shmem: add support for per object caching flags Gerd Hoffmann @ 2019-12-18 12:56 ` Gerd Hoffmann 2019-12-18 12:56 ` [PATCH v4 3/3] drm/udl: simplify gem object mapping Gerd Hoffmann 2 siblings, 0 replies; 4+ messages in thread From: Gerd Hoffmann @ 2019-12-18 12:56 UTC (permalink / raw) To: dri-devel Cc: tzimmermann, gurchetansingh, Gerd Hoffmann, David Airlie, Daniel Vetter, open list:VIRTIO GPU DRIVER, open list virtio-gpu uses cached mappings, set drm_gem_shmem_object.map_cached accordingly. Reported-by: Gurchetan Singh <gurchetansingh@chromium.org> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> virtio fixup --- drivers/gpu/drm/virtio/virtgpu_object.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index 017a9e0fc3bb..7f991e03ea2c 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -99,6 +99,7 @@ struct drm_gem_object *virtio_gpu_create_object(struct drm_device *dev, return NULL; bo->base.base.funcs = &virtio_gpu_gem_funcs; + bo->base.map_cached = true; return &bo->base.base; } -- 2.18.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 3/3] drm/udl: simplify gem object mapping. [not found] <20191218125645.9211-1-kraxel@redhat.com> 2019-12-18 12:56 ` [PATCH v4 1/3] drm/shmem: add support for per object caching flags Gerd Hoffmann 2019-12-18 12:56 ` [PATCH v4 2/3] drm/virtio: fix mmap page attributes Gerd Hoffmann @ 2019-12-18 12:56 ` Gerd Hoffmann 2019-12-18 22:34 ` Chia-I Wu 2 siblings, 1 reply; 4+ messages in thread From: Gerd Hoffmann @ 2019-12-18 12:56 UTC (permalink / raw) To: dri-devel Cc: tzimmermann, gurchetansingh, Gerd Hoffmann, Dave Airlie, Sean Paul, David Airlie, Daniel Vetter, open list With shmem helpers allowing to update pgprot caching flags via drm_gem_shmem_object.map_cached we can just use that and ditch our own implementations of mmap() and vmap(). We also don't need a special case for imported objects, any map requests are handled by the exporter not udl. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- drivers/gpu/drm/udl/udl_gem.c | 62 ++--------------------------------- 1 file changed, 3 insertions(+), 59 deletions(-) diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c index b6e26f98aa0a..7e3a88b25b6b 100644 --- a/drivers/gpu/drm/udl/udl_gem.c +++ b/drivers/gpu/drm/udl/udl_gem.c @@ -17,72 +17,15 @@ * GEM object funcs */ -static int udl_gem_object_mmap(struct drm_gem_object *obj, - struct vm_area_struct *vma) -{ - int ret; - - ret = drm_gem_shmem_mmap(obj, vma); - if (ret) - return ret; - - vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); - if (obj->import_attach) - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); - - return 0; -} - -static void *udl_gem_object_vmap(struct drm_gem_object *obj) -{ - struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); - int ret; - - ret = mutex_lock_interruptible(&shmem->vmap_lock); - if (ret) - return ERR_PTR(ret); - - if (shmem->vmap_use_count++ > 0) - goto out; - - ret = drm_gem_shmem_get_pages(shmem); - if (ret) - goto err_zero_use; - - if (obj->import_attach) - shmem->vaddr = dma_buf_vmap(obj->import_attach->dmabuf); - else - shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT, - VM_MAP, PAGE_KERNEL); - - if (!shmem->vaddr) { - DRM_DEBUG_KMS("Failed to vmap pages\n"); - ret = -ENOMEM; - goto err_put_pages; - } - -out: - mutex_unlock(&shmem->vmap_lock); - return shmem->vaddr; - -err_put_pages: - drm_gem_shmem_put_pages(shmem); -err_zero_use: - shmem->vmap_use_count = 0; - mutex_unlock(&shmem->vmap_lock); - return ERR_PTR(ret); -} - static const struct drm_gem_object_funcs udl_gem_object_funcs = { .free = drm_gem_shmem_free_object, .print_info = drm_gem_shmem_print_info, .pin = drm_gem_shmem_pin, .unpin = drm_gem_shmem_unpin, .get_sg_table = drm_gem_shmem_get_sg_table, - .vmap = udl_gem_object_vmap, + .vmap = drm_gem_shmem_vmap, .vunmap = drm_gem_shmem_vunmap, - .mmap = udl_gem_object_mmap, + .mmap = drm_gem_shmem_mmap, }; /* @@ -101,6 +44,7 @@ struct drm_gem_object *udl_driver_gem_create_object(struct drm_device *dev, obj = &shmem->base; obj->funcs = &udl_gem_object_funcs; + shmem->map_cached = true; return obj; } -- 2.18.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4 3/3] drm/udl: simplify gem object mapping. 2019-12-18 12:56 ` [PATCH v4 3/3] drm/udl: simplify gem object mapping Gerd Hoffmann @ 2019-12-18 22:34 ` Chia-I Wu 0 siblings, 0 replies; 4+ messages in thread From: Chia-I Wu @ 2019-12-18 22:34 UTC (permalink / raw) To: Gerd Hoffmann Cc: ML dri-devel, David Airlie, open list, Gurchetan Singh, tzimmermann, Dave Airlie, Sean Paul On Wed, Dec 18, 2019 at 4:56 AM Gerd Hoffmann <kraxel@redhat.com> wrote: > > With shmem helpers allowing to update pgprot caching flags via > drm_gem_shmem_object.map_cached we can just use that and ditch > our own implementations of mmap() and vmap(). > > We also don't need a special case for imported objects, any map > requests are handled by the exporter not udl. > > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> > --- > drivers/gpu/drm/udl/udl_gem.c | 62 ++--------------------------------- > 1 file changed, 3 insertions(+), 59 deletions(-) > > diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c > index b6e26f98aa0a..7e3a88b25b6b 100644 > --- a/drivers/gpu/drm/udl/udl_gem.c > +++ b/drivers/gpu/drm/udl/udl_gem.c > @@ -17,72 +17,15 @@ > * GEM object funcs > */ > > -static int udl_gem_object_mmap(struct drm_gem_object *obj, > - struct vm_area_struct *vma) > -{ > - int ret; > - > - ret = drm_gem_shmem_mmap(obj, vma); > - if (ret) > - return ret; > - > - vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); > - if (obj->import_attach) > - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); > - vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); > - > - return 0; > -} > - > -static void *udl_gem_object_vmap(struct drm_gem_object *obj) > -{ > - struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); > - int ret; > - > - ret = mutex_lock_interruptible(&shmem->vmap_lock); > - if (ret) > - return ERR_PTR(ret); > - > - if (shmem->vmap_use_count++ > 0) > - goto out; > - > - ret = drm_gem_shmem_get_pages(shmem); > - if (ret) > - goto err_zero_use; > - > - if (obj->import_attach) > - shmem->vaddr = dma_buf_vmap(obj->import_attach->dmabuf); > - else > - shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT, > - VM_MAP, PAGE_KERNEL); > - > - if (!shmem->vaddr) { > - DRM_DEBUG_KMS("Failed to vmap pages\n"); > - ret = -ENOMEM; > - goto err_put_pages; > - } > - > -out: > - mutex_unlock(&shmem->vmap_lock); > - return shmem->vaddr; > - > -err_put_pages: > - drm_gem_shmem_put_pages(shmem); > -err_zero_use: > - shmem->vmap_use_count = 0; > - mutex_unlock(&shmem->vmap_lock); > - return ERR_PTR(ret); > -} > - > static const struct drm_gem_object_funcs udl_gem_object_funcs = { > .free = drm_gem_shmem_free_object, > .print_info = drm_gem_shmem_print_info, > .pin = drm_gem_shmem_pin, > .unpin = drm_gem_shmem_unpin, > .get_sg_table = drm_gem_shmem_get_sg_table, > - .vmap = udl_gem_object_vmap, > + .vmap = drm_gem_shmem_vmap, > .vunmap = drm_gem_shmem_vunmap, > - .mmap = udl_gem_object_mmap, > + .mmap = drm_gem_shmem_mmap, > }; It looks like we can just use the default ops (drm_gem_shmem_funcs). With that, this series is Reviewed-by: Chia-I Wu <olvaffe@gmail.com>. > > /* > @@ -101,6 +44,7 @@ struct drm_gem_object *udl_driver_gem_create_object(struct drm_device *dev, > > obj = &shmem->base; > obj->funcs = &udl_gem_object_funcs; > + shmem->map_cached = true; > > return obj; > } > -- > 2.18.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-12-18 22:34 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <20191218125645.9211-1-kraxel@redhat.com> 2019-12-18 12:56 ` [PATCH v4 1/3] drm/shmem: add support for per object caching flags Gerd Hoffmann 2019-12-18 12:56 ` [PATCH v4 2/3] drm/virtio: fix mmap page attributes Gerd Hoffmann 2019-12-18 12:56 ` [PATCH v4 3/3] drm/udl: simplify gem object mapping Gerd Hoffmann 2019-12-18 22:34 ` Chia-I Wu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).