On Wed, Aug 10, 2022 at 4:47 AM Daniel Vetter <daniel@xxxxxxxx> wrote: > > On Wed, Jul 06, 2022 at 10:02:07AM +0300, Dmitry Osipenko wrote: > > On 7/6/22 00:48, Rob Clark wrote: > > > On Tue, Jul 5, 2022 at 4:51 AM Christian König <christian.koenig@xxxxxxx> wrote: > > >> > > >> Am 01.07.22 um 11:02 schrieb Dmitry Osipenko: > > >>> Drivers that use drm_gem_mmap() and drm_gem_mmap_obj() helpers don't > > >>> handle imported dma-bufs properly, which results in mapping of something > > >>> else than the imported dma-buf. On NVIDIA Tegra we get a hard lockup when > > >>> userspace writes to the memory mapping of a dma-buf that was imported into > > >>> Tegra's DRM GEM. > > >>> > > >>> Majority of DRM drivers prohibit mapping of the imported GEM objects. > > >>> Mapping of imported GEMs require special care from userspace since it > > >>> should sync dma-buf because mapping coherency of the exporter device may > > >>> not match the DRM device. Let's prohibit the mapping for all DRM drivers > > >>> for consistency. > > >>> > > >>> Suggested-by: Thomas Hellström <thomas.hellstrom@xxxxxxxxxxxxxxx> > > >>> Signed-off-by: Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx> > > >> > > >> I'm pretty sure that this is the right approach, but it's certainly more > > >> than possible that somebody abused this already. > > > > > > I suspect that this is abused if you run deqp cts on android.. ie. all > > > winsys buffers are dma-buf imports from gralloc. And then when you > > > hit readpix... > > > > > > You might only hit this in scenarios with separate gpu and display (or > > > dGPU+iGPU) because self-imports are handled differently in > > > drm_gem_prime_import_dev().. and maybe not in cases where you end up > > > with a blit from tiled/compressed to linear.. maybe that narrows the > > > scope enough to just fix it in userspace? > > > > Given that that only drivers which use DRM-SHMEM potentially could've > > map imported dma-bufs (Panfrost, Lima) and they already don't allow to > > do that, I think we're good. > > So can I have an ack from Rob here or are there still questions that this > might go boom? > > Dmitry, since you have a bunch of patches merged now I think would also be > good to get commit rights so you can drive this more yourself. I've asked > Daniel Stone to help you out with getting that. I *think* we'd be ok with this on msm, mostly just by dumb luck. Because the dma-buf's we import will be self-import. I'm less sure about panfrost (src/panfrost/lib/pan_bo.c doesn't seem to have a special path for imported dma-bufs either, and in that case they won't be self-imports.. but I guess no one has tried to run android cts on panfrost). What about something less drastic to start, like (apologies for hand-edited patch): diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 86d670c71286..fc9ec42fa0ab 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -1034,6 +1034,10 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size, { int ret; + WARN_ON_ONCE(obj->import_attach); + /* Check for valid size. */ if (obj_size < vma->vm_end - vma->vm_start) return -EINVAL; diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c index 8ad0e02991ca..6190f5018986 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -609,17 +609,8 @@ EXPORT_SYMBOL_GPL(drm_gem_shmem_vm_ops); */ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct *vma) { - struct drm_gem_object *obj = &shmem->base; int ret; if (obj->import_attach) { - /* Drop the reference drm_gem_mmap_obj() acquired.*/ - drm_gem_object_put(obj); - vma->vm_private_data = NULL; - - return dma_buf_mmap(obj->dma_buf, vma, 0); + return -EINVAL; } ret = drm_gem_shmem_get_pages(shmem); if (ret) { drm_gem_vm_close(vma); -- 2.36.1