Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/shmem-helpers: Ensure get_pages is not called on imported dma-buf

Just a bit of light paranoia. Also sprinkle this check over
drm_gem_shmem_get_sg_table, which should only be called when
exporting, same for the pin/unpin functions, on which it relies to
work correctly.

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Tested-by: Boris Brezillon <boris.brezillon@collabora.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Noralf Trønnes <noralf@tronnes.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200511093554.211493-9-daniel.vetter@ffwll.ch

+10
+10
drivers/gpu/drm/drm_gem_shmem_helper.c
··· 170 170 { 171 171 int ret; 172 172 173 + WARN_ON(shmem->base.import_attach); 174 + 173 175 ret = mutex_lock_interruptible(&shmem->pages_lock); 174 176 if (ret) 175 177 return ret; ··· 227 225 { 228 226 struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); 229 227 228 + WARN_ON(shmem->base.import_attach); 229 + 230 230 return drm_gem_shmem_get_pages(shmem); 231 231 } 232 232 EXPORT_SYMBOL(drm_gem_shmem_pin); ··· 243 239 void drm_gem_shmem_unpin(struct drm_gem_object *obj) 244 240 { 245 241 struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); 242 + 243 + WARN_ON(shmem->base.import_attach); 246 244 247 245 drm_gem_shmem_put_pages(shmem); 248 246 } ··· 516 510 struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); 517 511 int ret; 518 512 513 + WARN_ON(shmem->base.import_attach); 514 + 519 515 ret = drm_gem_shmem_get_pages(shmem); 520 516 WARN_ON_ONCE(ret != 0); 521 517 ··· 618 610 struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_object *obj) 619 611 { 620 612 struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); 613 + 614 + WARN_ON(shmem->base.import_attach); 621 615 622 616 return drm_prime_pages_to_sg(shmem->pages, obj->size >> PAGE_SHIFT); 623 617 }