1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright 2018 Noralf Trønnes 4 */ 5 6 #include <linux/dma-buf.h> 7 #include <linux/export.h> 8 #include <linux/module.h> 9 #include <linux/mutex.h> 10 #include <linux/shmem_fs.h> 11 #include <linux/slab.h> 12 #include <linux/vmalloc.h> 13 14 #ifdef CONFIG_X86 15 #include <asm/set_memory.h> 16 #endif 17 18 #include <kunit/visibility.h> 19 20 #include <drm/drm.h> 21 #include <drm/drm_device.h> 22 #include <drm/drm_drv.h> 23 #include <drm/drm_dumb_buffers.h> 24 #include <drm/drm_gem_shmem_helper.h> 25 #include <drm/drm_prime.h> 26 #include <drm/drm_print.h> 27 28 MODULE_IMPORT_NS("DMA_BUF"); 29 30 /** 31 * DOC: overview 32 * 33 * This library provides helpers for GEM objects backed by shmem buffers 34 * allocated using anonymous pageable memory. 35 * 36 * Functions that operate on the GEM object receive struct &drm_gem_shmem_object. 37 * For GEM callback helpers in struct &drm_gem_object functions, see likewise 38 * named functions with an _object_ infix (e.g., drm_gem_shmem_object_vmap() wraps 39 * drm_gem_shmem_vmap()). These helpers perform the necessary type conversion. 40 */ 41 42 static const struct drm_gem_object_funcs drm_gem_shmem_funcs = { 43 .free = drm_gem_shmem_object_free, 44 .print_info = drm_gem_shmem_object_print_info, 45 .pin = drm_gem_shmem_object_pin, 46 .unpin = drm_gem_shmem_object_unpin, 47 .get_sg_table = drm_gem_shmem_object_get_sg_table, 48 .vmap = drm_gem_shmem_object_vmap, 49 .vunmap = drm_gem_shmem_object_vunmap, 50 .mmap = drm_gem_shmem_object_mmap, 51 .vm_ops = &drm_gem_shmem_vm_ops, 52 }; 53 54 static int __drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem, 55 size_t size, bool private) 56 { 57 struct drm_gem_object *obj = &shmem->base; 58 int ret = 0; 59 60 if (!obj->funcs) 61 obj->funcs = &drm_gem_shmem_funcs; 62 63 if (private) { 64 drm_gem_private_object_init(dev, obj, size); 65 shmem->map_wc = false; /* dma-buf mappings use always writecombine */ 66 } else { 67 ret = drm_gem_object_init(dev, obj, size); 68 } 69 if (ret) { 70 drm_gem_private_object_fini(obj); 71 return ret; 72 } 73 74 ret = drm_gem_create_mmap_offset(obj); 75 if (ret) 76 goto err_release; 77 78 INIT_LIST_HEAD(&shmem->madv_list); 79 80 if (!private) { 81 /* 82 * Our buffers are kept pinned, so allocating them 83 * from the MOVABLE zone is a really bad idea, and 84 * conflicts with CMA. See comments above new_inode() 85 * why this is required _and_ expected if you're 86 * going to pin these pages. 87 */ 88 mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER | 89 __GFP_RETRY_MAYFAIL | __GFP_NOWARN); 90 } 91 92 return 0; 93 err_release: 94 drm_gem_object_release(obj); 95 return ret; 96 } 97 98 /** 99 * drm_gem_shmem_init - Initialize an allocated object. 100 * @dev: DRM device 101 * @shmem: shmem GEM object to initialize 102 * @size: Buffer size in bytes 103 * 104 * This function initializes an allocated shmem GEM object. 105 * 106 * Returns: 107 * 0 on success, or a negative error code on failure. 108 */ 109 int drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem, size_t size) 110 { 111 return __drm_gem_shmem_init(dev, shmem, size, false); 112 } 113 EXPORT_SYMBOL_GPL(drm_gem_shmem_init); 114 115 static struct drm_gem_shmem_object * 116 __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private) 117 { 118 struct drm_gem_shmem_object *shmem; 119 struct drm_gem_object *obj; 120 int ret = 0; 121 122 size = PAGE_ALIGN(size); 123 124 if (dev->driver->gem_create_object) { 125 obj = dev->driver->gem_create_object(dev, size); 126 if (IS_ERR(obj)) 127 return ERR_CAST(obj); 128 shmem = to_drm_gem_shmem_obj(obj); 129 } else { 130 shmem = kzalloc_obj(*shmem); 131 if (!shmem) 132 return ERR_PTR(-ENOMEM); 133 obj = &shmem->base; 134 } 135 136 ret = __drm_gem_shmem_init(dev, shmem, size, private); 137 if (ret) { 138 kfree(obj); 139 return ERR_PTR(ret); 140 } 141 142 return shmem; 143 } 144 /** 145 * drm_gem_shmem_create - Allocate an object with the given size 146 * @dev: DRM device 147 * @size: Size of the object to allocate 148 * 149 * This function creates a shmem GEM object. 150 * 151 * Returns: 152 * A struct drm_gem_shmem_object * on success or an ERR_PTR()-encoded negative 153 * error code on failure. 154 */ 155 struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size) 156 { 157 return __drm_gem_shmem_create(dev, size, false); 158 } 159 EXPORT_SYMBOL_GPL(drm_gem_shmem_create); 160 161 /** 162 * __drm_gem_shmem_release_sgt_locked - Unpin and DMA unmap pages, and release the 163 * cached scatter/gather table for an shmem GEM object. 164 * @shmem: shmem GEM object 165 * 166 * If the passed shmem object has an active scatter/gather table for driver 167 * usage, this function will unmap it and release the memory associated with it. 168 * It is the responsibility of the caller to ensure it holds the dma_resv_lock 169 * for this object. 170 * 171 * Drivers should not need to call this function themselves, it is mainly 172 * intended for usage in the Rust shmem bindings. 173 */ 174 void __drm_gem_shmem_free_sgt_locked(struct drm_gem_shmem_object *shmem) 175 { 176 dma_resv_assert_held(shmem->base.resv); 177 178 dma_unmap_sgtable(shmem->base.dev->dev, shmem->sgt, DMA_BIDIRECTIONAL, 0); 179 sg_free_table(shmem->sgt); 180 kfree(shmem->sgt); 181 shmem->sgt = NULL; 182 } 183 EXPORT_SYMBOL_GPL(__drm_gem_shmem_free_sgt_locked); 184 185 /** 186 * drm_gem_shmem_release - Release resources associated with a shmem GEM object. 187 * @shmem: shmem GEM object 188 * 189 * This function cleans up the GEM object state, but does not free the memory used to store the 190 * object itself. This function is meant to be a dedicated helper for the Rust GEM bindings. 191 */ 192 void drm_gem_shmem_release(struct drm_gem_shmem_object *shmem) 193 { 194 struct drm_gem_object *obj = &shmem->base; 195 196 if (drm_gem_is_imported(obj)) { 197 drm_prime_gem_destroy(obj, shmem->sgt); 198 } else { 199 dma_resv_lock(shmem->base.resv, NULL); 200 201 drm_WARN_ON(obj->dev, refcount_read(&shmem->vmap_use_count)); 202 203 if (shmem->sgt) 204 __drm_gem_shmem_free_sgt_locked(shmem); 205 if (shmem->pages) 206 drm_gem_shmem_put_pages_locked(shmem); 207 208 drm_WARN_ON(obj->dev, refcount_read(&shmem->pages_use_count)); 209 drm_WARN_ON(obj->dev, refcount_read(&shmem->pages_pin_count)); 210 211 dma_resv_unlock(shmem->base.resv); 212 } 213 214 drm_gem_object_release(obj); 215 } 216 EXPORT_SYMBOL_GPL(drm_gem_shmem_release); 217 218 /** 219 * drm_gem_shmem_free - Free resources associated with a shmem GEM object 220 * @shmem: shmem GEM object to free 221 * 222 * This function cleans up the GEM object state and frees the memory used to 223 * store the object itself. 224 */ 225 void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem) 226 { 227 drm_gem_shmem_release(shmem); 228 kfree(shmem); 229 } 230 EXPORT_SYMBOL_GPL(drm_gem_shmem_free); 231 232 static int drm_gem_shmem_get_pages_locked(struct drm_gem_shmem_object *shmem) 233 { 234 struct drm_gem_object *obj = &shmem->base; 235 struct page **pages; 236 237 dma_resv_assert_held(shmem->base.resv); 238 239 if (refcount_inc_not_zero(&shmem->pages_use_count)) 240 return 0; 241 242 pages = drm_gem_get_pages(obj); 243 if (IS_ERR(pages)) { 244 drm_dbg_kms(obj->dev, "Failed to get pages (%ld)\n", 245 PTR_ERR(pages)); 246 return PTR_ERR(pages); 247 } 248 249 /* 250 * TODO: Allocating WC pages which are correctly flushed is only 251 * supported on x86. Ideal solution would be a GFP_WC flag, which also 252 * ttm_pool.c could use. 253 */ 254 #ifdef CONFIG_X86 255 if (shmem->map_wc) 256 set_pages_array_wc(pages, obj->size >> PAGE_SHIFT); 257 #endif 258 259 shmem->pages = pages; 260 261 refcount_set(&shmem->pages_use_count, 1); 262 263 return 0; 264 } 265 266 /* 267 * drm_gem_shmem_put_pages_locked - Decrease use count on the backing pages for a shmem GEM object 268 * @shmem: shmem GEM object 269 * 270 * This function decreases the use count and puts the backing pages when use drops to zero. 271 */ 272 void drm_gem_shmem_put_pages_locked(struct drm_gem_shmem_object *shmem) 273 { 274 struct drm_gem_object *obj = &shmem->base; 275 276 dma_resv_assert_held(shmem->base.resv); 277 278 if (refcount_dec_and_test(&shmem->pages_use_count)) { 279 #ifdef CONFIG_X86 280 if (shmem->map_wc) 281 set_pages_array_wb(shmem->pages, obj->size >> PAGE_SHIFT); 282 #endif 283 284 drm_gem_put_pages(obj, shmem->pages, 285 shmem->pages_mark_dirty_on_put, 286 shmem->pages_mark_accessed_on_put); 287 shmem->pages = NULL; 288 shmem->pages_mark_accessed_on_put = false; 289 shmem->pages_mark_dirty_on_put = false; 290 } 291 } 292 EXPORT_SYMBOL_GPL(drm_gem_shmem_put_pages_locked); 293 294 int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem) 295 { 296 int ret; 297 298 dma_resv_assert_held(shmem->base.resv); 299 300 drm_WARN_ON(shmem->base.dev, drm_gem_is_imported(&shmem->base)); 301 302 if (refcount_inc_not_zero(&shmem->pages_pin_count)) 303 return 0; 304 305 ret = drm_gem_shmem_get_pages_locked(shmem); 306 if (!ret) 307 refcount_set(&shmem->pages_pin_count, 1); 308 309 return ret; 310 } 311 EXPORT_SYMBOL(drm_gem_shmem_pin_locked); 312 313 void drm_gem_shmem_unpin_locked(struct drm_gem_shmem_object *shmem) 314 { 315 dma_resv_assert_held(shmem->base.resv); 316 317 if (refcount_dec_and_test(&shmem->pages_pin_count)) 318 drm_gem_shmem_put_pages_locked(shmem); 319 } 320 EXPORT_SYMBOL(drm_gem_shmem_unpin_locked); 321 322 /** 323 * drm_gem_shmem_pin - Pin backing pages for a shmem GEM object 324 * @shmem: shmem GEM object 325 * 326 * This function makes sure the backing pages are pinned in memory while the 327 * buffer is exported. 328 * 329 * Returns: 330 * 0 on success or a negative error code on failure. 331 */ 332 int drm_gem_shmem_pin(struct drm_gem_shmem_object *shmem) 333 { 334 struct drm_gem_object *obj = &shmem->base; 335 int ret; 336 337 drm_WARN_ON(obj->dev, drm_gem_is_imported(obj)); 338 339 if (refcount_inc_not_zero(&shmem->pages_pin_count)) 340 return 0; 341 342 ret = dma_resv_lock_interruptible(shmem->base.resv, NULL); 343 if (ret) 344 return ret; 345 ret = drm_gem_shmem_pin_locked(shmem); 346 dma_resv_unlock(shmem->base.resv); 347 348 return ret; 349 } 350 EXPORT_SYMBOL_GPL(drm_gem_shmem_pin); 351 352 /** 353 * drm_gem_shmem_unpin - Unpin backing pages for a shmem GEM object 354 * @shmem: shmem GEM object 355 * 356 * This function removes the requirement that the backing pages are pinned in 357 * memory. 358 */ 359 void drm_gem_shmem_unpin(struct drm_gem_shmem_object *shmem) 360 { 361 struct drm_gem_object *obj = &shmem->base; 362 363 drm_WARN_ON(obj->dev, drm_gem_is_imported(obj)); 364 365 if (refcount_dec_not_one(&shmem->pages_pin_count)) 366 return; 367 368 dma_resv_lock(shmem->base.resv, NULL); 369 drm_gem_shmem_unpin_locked(shmem); 370 dma_resv_unlock(shmem->base.resv); 371 } 372 EXPORT_SYMBOL_GPL(drm_gem_shmem_unpin); 373 374 /* 375 * drm_gem_shmem_vmap_locked - Create a virtual mapping for a shmem GEM object 376 * @shmem: shmem GEM object 377 * @map: Returns the kernel virtual address of the SHMEM GEM object's backing 378 * store. 379 * 380 * This function makes sure that a contiguous kernel virtual address mapping 381 * exists for the buffer backing the shmem GEM object. It hides the differences 382 * between dma-buf imported and natively allocated objects. 383 * 384 * Acquired mappings should be cleaned up by calling drm_gem_shmem_vunmap_locked(). 385 * 386 * Returns: 387 * 0 on success or a negative error code on failure. 388 */ 389 int drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem, 390 struct iosys_map *map) 391 { 392 struct drm_gem_object *obj = &shmem->base; 393 int ret = 0; 394 395 dma_resv_assert_held(obj->resv); 396 397 if (drm_gem_is_imported(obj)) { 398 ret = dma_buf_vmap(obj->import_attach->dmabuf, map); 399 } else { 400 pgprot_t prot = PAGE_KERNEL; 401 402 dma_resv_assert_held(shmem->base.resv); 403 404 if (refcount_inc_not_zero(&shmem->vmap_use_count)) { 405 iosys_map_set_vaddr(map, shmem->vaddr); 406 return 0; 407 } 408 409 ret = drm_gem_shmem_pin_locked(shmem); 410 if (ret) 411 return ret; 412 413 if (shmem->map_wc) 414 prot = pgprot_writecombine(prot); 415 shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT, 416 VM_MAP, prot); 417 if (!shmem->vaddr) { 418 ret = -ENOMEM; 419 } else { 420 iosys_map_set_vaddr(map, shmem->vaddr); 421 refcount_set(&shmem->vmap_use_count, 1); 422 shmem->pages_mark_accessed_on_put = true; 423 shmem->pages_mark_dirty_on_put = true; 424 } 425 } 426 427 if (ret) { 428 drm_dbg_kms(obj->dev, "Failed to vmap pages, error %d\n", ret); 429 goto err_put_pages; 430 } 431 432 return 0; 433 434 err_put_pages: 435 if (!drm_gem_is_imported(obj)) 436 drm_gem_shmem_unpin_locked(shmem); 437 438 return ret; 439 } 440 EXPORT_SYMBOL_GPL(drm_gem_shmem_vmap_locked); 441 442 /* 443 * drm_gem_shmem_vunmap_locked - Unmap a virtual mapping for a shmem GEM object 444 * @shmem: shmem GEM object 445 * @map: Kernel virtual address where the SHMEM GEM object was mapped 446 * 447 * This function cleans up a kernel virtual address mapping acquired by 448 * drm_gem_shmem_vmap_locked(). The mapping is only removed when the use count 449 * drops to zero. 450 * 451 * This function hides the differences between dma-buf imported and natively 452 * allocated objects. 453 */ 454 void drm_gem_shmem_vunmap_locked(struct drm_gem_shmem_object *shmem, 455 struct iosys_map *map) 456 { 457 struct drm_gem_object *obj = &shmem->base; 458 459 dma_resv_assert_held(obj->resv); 460 461 if (drm_gem_is_imported(obj)) { 462 dma_buf_vunmap(obj->import_attach->dmabuf, map); 463 } else { 464 dma_resv_assert_held(shmem->base.resv); 465 466 if (refcount_dec_and_test(&shmem->vmap_use_count)) { 467 vunmap(shmem->vaddr); 468 shmem->vaddr = NULL; 469 470 drm_gem_shmem_unpin_locked(shmem); 471 } 472 } 473 } 474 EXPORT_SYMBOL_GPL(drm_gem_shmem_vunmap_locked); 475 476 /** 477 * drm_gem_shmem_create_with_handle - Allocate an object with the given size and 478 * returns a GEM handle 479 * @file_priv: DRM file structure to create the dumb buffer for 480 * @dev: DRM device 481 * @size: Size of the object to allocate 482 * @handle: Returns the GEM handle on success 483 * 484 * Allocates an shmem GEM buffer using drm_gem_shmem_create() and returns 485 * a GEM handle to it. 486 * 487 * Returns: 488 * Zero on success, or an error code otherwise. 489 */ 490 int drm_gem_shmem_create_with_handle(struct drm_file *file_priv, 491 struct drm_device *dev, size_t size, 492 uint32_t *handle) 493 { 494 struct drm_gem_shmem_object *shmem; 495 int ret; 496 497 shmem = drm_gem_shmem_create(dev, size); 498 if (IS_ERR(shmem)) 499 return PTR_ERR(shmem); 500 501 /* 502 * Allocate an id of idr table where the obj is registered 503 * and handle has the id what user can see. 504 */ 505 ret = drm_gem_handle_create(file_priv, &shmem->base, handle); 506 /* drop reference from allocate - handle holds it now. */ 507 drm_gem_object_put(&shmem->base); 508 509 return ret; 510 } 511 EXPORT_SYMBOL_GPL(drm_gem_shmem_create_with_handle); 512 513 /* Update madvise status, returns true if not purged, else 514 * false or -errno. 515 */ 516 int drm_gem_shmem_madvise_locked(struct drm_gem_shmem_object *shmem, int madv) 517 { 518 dma_resv_assert_held(shmem->base.resv); 519 520 if (shmem->madv >= 0) 521 shmem->madv = madv; 522 523 madv = shmem->madv; 524 525 return (madv >= 0); 526 } 527 EXPORT_SYMBOL_GPL(drm_gem_shmem_madvise_locked); 528 529 void drm_gem_shmem_purge_locked(struct drm_gem_shmem_object *shmem) 530 { 531 struct drm_gem_object *obj = &shmem->base; 532 struct drm_device *dev = obj->dev; 533 534 dma_resv_assert_held(shmem->base.resv); 535 536 drm_WARN_ON(obj->dev, !drm_gem_shmem_is_purgeable(shmem)); 537 538 dma_unmap_sgtable(dev->dev, shmem->sgt, DMA_BIDIRECTIONAL, 0); 539 sg_free_table(shmem->sgt); 540 kfree(shmem->sgt); 541 shmem->sgt = NULL; 542 543 drm_gem_shmem_put_pages_locked(shmem); 544 545 shmem->madv = -1; 546 547 drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping); 548 drm_gem_free_mmap_offset(obj); 549 550 /* Our goal here is to return as much of the memory as 551 * is possible back to the system as we are called from OOM. 552 * To do this we must instruct the shmfs to drop all of its 553 * backing pages, *now*. 554 */ 555 shmem_truncate_range(file_inode(obj->filp), 0, (loff_t)-1); 556 557 invalidate_mapping_pages(file_inode(obj->filp)->i_mapping, 0, (loff_t)-1); 558 } 559 EXPORT_SYMBOL_GPL(drm_gem_shmem_purge_locked); 560 561 /** 562 * drm_gem_shmem_dumb_create - Create a dumb shmem buffer object 563 * @file: DRM file structure to create the dumb buffer for 564 * @dev: DRM device 565 * @args: IOCTL data 566 * 567 * This function computes the pitch of the dumb buffer and rounds it up to an 568 * integer number of bytes per pixel. Drivers for hardware that doesn't have 569 * any additional restrictions on the pitch can directly use this function as 570 * their &drm_driver.dumb_create callback. 571 * 572 * For hardware with additional restrictions, drivers can adjust the fields 573 * set up by userspace before calling into this function. 574 * 575 * Returns: 576 * 0 on success or a negative error code on failure. 577 */ 578 int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev, 579 struct drm_mode_create_dumb *args) 580 { 581 int ret; 582 583 ret = drm_mode_size_dumb(dev, args, 0, 0); 584 if (ret) 585 return ret; 586 587 return drm_gem_shmem_create_with_handle(file, dev, args->size, &args->handle); 588 } 589 EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create); 590 591 static void drm_gem_shmem_record_mkwrite(struct vm_fault *vmf) 592 { 593 struct vm_area_struct *vma = vmf->vma; 594 struct drm_gem_object *obj = vma->vm_private_data; 595 struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); 596 loff_t num_pages = obj->size >> PAGE_SHIFT; 597 pgoff_t page_offset = vmf->pgoff - vma->vm_pgoff; /* page offset within VMA */ 598 599 if (drm_WARN_ON(obj->dev, !shmem->pages || page_offset >= num_pages)) 600 return; 601 602 file_update_time(vma->vm_file); 603 folio_mark_dirty(page_folio(shmem->pages[page_offset])); 604 } 605 606 static vm_fault_t try_insert_pfn(struct vm_fault *vmf, unsigned int order, 607 unsigned long pfn) 608 { 609 if (!order) { 610 return vmf_insert_pfn(vmf->vma, vmf->address, pfn); 611 #ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP 612 } else if (order == PMD_ORDER) { 613 unsigned long paddr = pfn << PAGE_SHIFT; 614 bool aligned = (vmf->address & ~PMD_MASK) == (paddr & ~PMD_MASK); 615 616 if (aligned && 617 folio_test_pmd_mappable(page_folio(pfn_to_page(pfn)))) { 618 vm_fault_t ret; 619 620 pfn &= PMD_MASK >> PAGE_SHIFT; 621 622 /* Unlike PTEs which are automatically upgraded to 623 * writeable entries, the PMD upgrades go through 624 * .huge_fault(). Make sure we pass the "write" info 625 * along in that case. 626 * This also means we have to record the write fault 627 * here, instead of in .pfn_mkwrite(). 628 */ 629 ret = vmf_insert_pfn_pmd(vmf, pfn, 630 vmf->flags & FAULT_FLAG_WRITE); 631 if (ret == VM_FAULT_NOPAGE && (vmf->flags & FAULT_FLAG_WRITE)) 632 drm_gem_shmem_record_mkwrite(vmf); 633 634 return ret; 635 } 636 #endif 637 } 638 return VM_FAULT_FALLBACK; 639 } 640 641 static vm_fault_t drm_gem_shmem_any_fault(struct vm_fault *vmf, unsigned int order) 642 { 643 struct vm_area_struct *vma = vmf->vma; 644 struct drm_gem_object *obj = vma->vm_private_data; 645 struct drm_device *dev = obj->dev; 646 struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); 647 loff_t num_pages = obj->size >> PAGE_SHIFT; 648 vm_fault_t ret = VM_FAULT_SIGBUS; 649 struct page **pages = shmem->pages; 650 pgoff_t page_offset = vmf->pgoff - vma->vm_pgoff; /* page offset within VMA */ 651 struct page *page; 652 struct folio *folio; 653 unsigned long pfn; 654 655 if (order && order != PMD_ORDER) 656 return VM_FAULT_FALLBACK; 657 658 dma_resv_lock(obj->resv, NULL); 659 660 if (page_offset >= num_pages || drm_WARN_ON_ONCE(dev, !shmem->pages) || 661 shmem->madv < 0) 662 goto out; 663 664 page = pages[page_offset]; 665 if (drm_WARN_ON_ONCE(dev, !page)) 666 goto out; 667 folio = page_folio(page); 668 669 pfn = page_to_pfn(page); 670 671 ret = try_insert_pfn(vmf, order, pfn); 672 if (ret == VM_FAULT_NOPAGE) 673 folio_mark_accessed(folio); 674 675 out: 676 dma_resv_unlock(obj->resv); 677 678 return ret; 679 } 680 681 static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf) 682 { 683 return drm_gem_shmem_any_fault(vmf, 0); 684 } 685 686 static void drm_gem_shmem_vm_open(struct vm_area_struct *vma) 687 { 688 struct drm_gem_object *obj = vma->vm_private_data; 689 struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); 690 691 drm_WARN_ON(obj->dev, drm_gem_is_imported(obj)); 692 693 dma_resv_lock(shmem->base.resv, NULL); 694 695 /* 696 * We should have already pinned the pages when the buffer was first 697 * mmap'd, vm_open() just grabs an additional reference for the new 698 * mm the vma is getting copied into (ie. on fork()). 699 */ 700 drm_WARN_ON_ONCE(obj->dev, 701 !refcount_inc_not_zero(&shmem->pages_use_count)); 702 703 dma_resv_unlock(shmem->base.resv); 704 705 drm_gem_vm_open(vma); 706 } 707 708 static void drm_gem_shmem_vm_close(struct vm_area_struct *vma) 709 { 710 struct drm_gem_object *obj = vma->vm_private_data; 711 struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); 712 713 dma_resv_lock(shmem->base.resv, NULL); 714 drm_gem_shmem_put_pages_locked(shmem); 715 dma_resv_unlock(shmem->base.resv); 716 717 drm_gem_vm_close(vma); 718 } 719 720 static vm_fault_t drm_gem_shmem_pfn_mkwrite(struct vm_fault *vmf) 721 { 722 drm_gem_shmem_record_mkwrite(vmf); 723 return 0; 724 } 725 726 const struct vm_operations_struct drm_gem_shmem_vm_ops = { 727 .fault = drm_gem_shmem_fault, 728 #ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP 729 .huge_fault = drm_gem_shmem_any_fault, 730 #endif 731 .open = drm_gem_shmem_vm_open, 732 .close = drm_gem_shmem_vm_close, 733 .pfn_mkwrite = drm_gem_shmem_pfn_mkwrite, 734 }; 735 EXPORT_SYMBOL_GPL(drm_gem_shmem_vm_ops); 736 737 /** 738 * drm_gem_shmem_mmap - Memory-map a shmem GEM object 739 * @shmem: shmem GEM object 740 * @vma: VMA for the area to be mapped 741 * 742 * This function implements an augmented version of the GEM DRM file mmap 743 * operation for shmem objects. 744 * 745 * Returns: 746 * 0 on success or a negative error code on failure. 747 */ 748 int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct *vma) 749 { 750 struct drm_gem_object *obj = &shmem->base; 751 int ret; 752 753 if (drm_gem_is_imported(obj)) { 754 /* Reset both vm_ops and vm_private_data, so we don't end up with 755 * vm_ops pointing to our implementation if the dma-buf backend 756 * doesn't set those fields. 757 */ 758 vma->vm_private_data = NULL; 759 vma->vm_ops = NULL; 760 761 ret = dma_buf_mmap(obj->dma_buf, vma, 0); 762 763 /* Drop the reference drm_gem_mmap_obj() acquired.*/ 764 if (!ret) 765 drm_gem_object_put(obj); 766 767 return ret; 768 } 769 770 if (is_cow_mapping(vma->vm_flags)) 771 return -EINVAL; 772 773 dma_resv_lock(shmem->base.resv, NULL); 774 ret = drm_gem_shmem_get_pages_locked(shmem); 775 dma_resv_unlock(shmem->base.resv); 776 777 if (ret) 778 return ret; 779 780 vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP); 781 vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); 782 if (shmem->map_wc) 783 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); 784 785 return 0; 786 } 787 EXPORT_SYMBOL_GPL(drm_gem_shmem_mmap); 788 789 /** 790 * drm_gem_shmem_print_info() - Print &drm_gem_shmem_object info for debugfs 791 * @shmem: shmem GEM object 792 * @p: DRM printer 793 * @indent: Tab indentation level 794 */ 795 void drm_gem_shmem_print_info(const struct drm_gem_shmem_object *shmem, 796 struct drm_printer *p, unsigned int indent) 797 { 798 if (drm_gem_is_imported(&shmem->base)) 799 return; 800 801 drm_printf_indent(p, indent, "pages_pin_count=%u\n", refcount_read(&shmem->pages_pin_count)); 802 drm_printf_indent(p, indent, "pages_use_count=%u\n", refcount_read(&shmem->pages_use_count)); 803 drm_printf_indent(p, indent, "vmap_use_count=%u\n", refcount_read(&shmem->vmap_use_count)); 804 drm_printf_indent(p, indent, "vaddr=%p\n", shmem->vaddr); 805 } 806 EXPORT_SYMBOL_GPL(drm_gem_shmem_print_info); 807 808 /** 809 * drm_gem_shmem_get_sg_table - Provide a scatter/gather table of pinned 810 * pages for a shmem GEM object 811 * @shmem: shmem GEM object 812 * 813 * This function exports a scatter/gather table suitable for PRIME usage by 814 * calling the standard DMA mapping API. 815 * 816 * Drivers who need to acquire an scatter/gather table for objects need to call 817 * drm_gem_shmem_get_pages_sgt() instead. 818 * 819 * Returns: 820 * A pointer to the scatter/gather table of pinned pages or error pointer on failure. 821 */ 822 struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *shmem) 823 { 824 struct drm_gem_object *obj = &shmem->base; 825 826 drm_WARN_ON(obj->dev, drm_gem_is_imported(obj)); 827 828 return drm_prime_pages_to_sg(obj->dev, shmem->pages, obj->size >> PAGE_SHIFT); 829 } 830 EXPORT_SYMBOL_GPL(drm_gem_shmem_get_sg_table); 831 832 static struct sg_table *drm_gem_shmem_get_pages_sgt_locked(struct drm_gem_shmem_object *shmem) 833 { 834 struct drm_gem_object *obj = &shmem->base; 835 int ret; 836 struct sg_table *sgt; 837 838 if (shmem->sgt) 839 return shmem->sgt; 840 841 drm_WARN_ON(obj->dev, drm_gem_is_imported(obj)); 842 843 ret = drm_gem_shmem_get_pages_locked(shmem); 844 if (ret) 845 return ERR_PTR(ret); 846 847 sgt = drm_gem_shmem_get_sg_table(shmem); 848 if (IS_ERR(sgt)) { 849 ret = PTR_ERR(sgt); 850 goto err_put_pages; 851 } 852 /* Map the pages for use by the h/w. */ 853 ret = dma_map_sgtable(obj->dev->dev, sgt, DMA_BIDIRECTIONAL, 0); 854 if (ret) 855 goto err_free_sgt; 856 857 shmem->sgt = sgt; 858 859 return sgt; 860 861 err_free_sgt: 862 sg_free_table(sgt); 863 kfree(sgt); 864 err_put_pages: 865 drm_gem_shmem_put_pages_locked(shmem); 866 return ERR_PTR(ret); 867 } 868 869 /** 870 * drm_gem_shmem_get_pages_sgt - Pin pages, dma map them, and return a 871 * scatter/gather table for a shmem GEM object. 872 * @shmem: shmem GEM object 873 * 874 * This function returns a scatter/gather table suitable for driver usage. If 875 * the sg table doesn't exist, the pages are pinned, dma-mapped, and a sg 876 * table created. 877 * 878 * This is the main function for drivers to get at backing storage, and it hides 879 * and difference between dma-buf imported and natively allocated objects. 880 * drm_gem_shmem_get_sg_table() should not be directly called by drivers. 881 * 882 * Returns: 883 * A pointer to the scatter/gather table of pinned pages or errno on failure. 884 */ 885 struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem) 886 { 887 int ret; 888 struct sg_table *sgt; 889 890 ret = dma_resv_lock_interruptible(shmem->base.resv, NULL); 891 if (ret) 892 return ERR_PTR(ret); 893 sgt = drm_gem_shmem_get_pages_sgt_locked(shmem); 894 dma_resv_unlock(shmem->base.resv); 895 896 return sgt; 897 } 898 EXPORT_SYMBOL_GPL(drm_gem_shmem_get_pages_sgt); 899 900 /** 901 * drm_gem_shmem_prime_import_sg_table - Produce a shmem GEM object from 902 * another driver's scatter/gather table of pinned pages 903 * @dev: Device to import into 904 * @attach: DMA-BUF attachment 905 * @sgt: Scatter/gather table of pinned pages 906 * 907 * This function imports a scatter/gather table exported via DMA-BUF by 908 * another driver. Drivers that use the shmem helpers should set this as their 909 * &drm_driver.gem_prime_import_sg_table callback. 910 * 911 * Returns: 912 * A pointer to a newly created GEM object or an ERR_PTR-encoded negative 913 * error code on failure. 914 */ 915 struct drm_gem_object * 916 drm_gem_shmem_prime_import_sg_table(struct drm_device *dev, 917 struct dma_buf_attachment *attach, 918 struct sg_table *sgt) 919 { 920 size_t size = PAGE_ALIGN(attach->dmabuf->size); 921 struct drm_gem_shmem_object *shmem; 922 923 shmem = __drm_gem_shmem_create(dev, size, true); 924 if (IS_ERR(shmem)) 925 return ERR_CAST(shmem); 926 927 shmem->sgt = sgt; 928 929 drm_dbg_prime(dev, "size = %zu\n", size); 930 931 return &shmem->base; 932 } 933 EXPORT_SYMBOL_GPL(drm_gem_shmem_prime_import_sg_table); 934 935 /** 936 * drm_gem_shmem_prime_import_no_map - Import dmabuf without mapping its sg_table 937 * @dev: Device to import into 938 * @dma_buf: dma-buf object to import 939 * 940 * Drivers that use the shmem helpers but also wants to import dmabuf without 941 * mapping its sg_table can use this as their &drm_driver.gem_prime_import 942 * implementation. 943 */ 944 struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev, 945 struct dma_buf *dma_buf) 946 { 947 struct dma_buf_attachment *attach; 948 struct drm_gem_shmem_object *shmem; 949 struct drm_gem_object *obj; 950 size_t size; 951 int ret; 952 953 if (drm_gem_is_prime_exported_dma_buf(dev, dma_buf)) { 954 /* 955 * Importing dmabuf exported from our own gem increases 956 * refcount on gem itself instead of f_count of dmabuf. 957 */ 958 obj = dma_buf->priv; 959 drm_gem_object_get(obj); 960 return obj; 961 } 962 963 attach = dma_buf_attach(dma_buf, dev->dev); 964 if (IS_ERR(attach)) 965 return ERR_CAST(attach); 966 967 get_dma_buf(dma_buf); 968 969 size = PAGE_ALIGN(attach->dmabuf->size); 970 971 shmem = __drm_gem_shmem_create(dev, size, true); 972 if (IS_ERR(shmem)) { 973 ret = PTR_ERR(shmem); 974 goto fail_detach; 975 } 976 977 drm_dbg_prime(dev, "size = %zu\n", size); 978 979 shmem->base.import_attach = attach; 980 shmem->base.resv = dma_buf->resv; 981 982 return &shmem->base; 983 984 fail_detach: 985 dma_buf_detach(dma_buf, attach); 986 dma_buf_put(dma_buf); 987 988 return ERR_PTR(ret); 989 } 990 EXPORT_SYMBOL_GPL(drm_gem_shmem_prime_import_no_map); 991 992 /* 993 * Kunit helpers 994 */ 995 996 #if IS_ENABLED(CONFIG_KUNIT) 997 int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map) 998 { 999 struct drm_gem_object *obj = &shmem->base; 1000 int ret; 1001 1002 ret = dma_resv_lock_interruptible(obj->resv, NULL); 1003 if (ret) 1004 return ret; 1005 ret = drm_gem_shmem_vmap_locked(shmem, map); 1006 dma_resv_unlock(obj->resv); 1007 1008 return ret; 1009 } 1010 EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_vmap); 1011 1012 void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map) 1013 { 1014 struct drm_gem_object *obj = &shmem->base; 1015 1016 dma_resv_lock_interruptible(obj->resv, NULL); 1017 drm_gem_shmem_vunmap_locked(shmem, map); 1018 dma_resv_unlock(obj->resv); 1019 } 1020 EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_vunmap); 1021 1022 int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv) 1023 { 1024 struct drm_gem_object *obj = &shmem->base; 1025 int ret; 1026 1027 ret = dma_resv_lock_interruptible(obj->resv, NULL); 1028 if (ret) 1029 return ret; 1030 ret = drm_gem_shmem_madvise_locked(shmem, madv); 1031 dma_resv_unlock(obj->resv); 1032 1033 return ret; 1034 } 1035 EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_madvise); 1036 1037 int drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem) 1038 { 1039 struct drm_gem_object *obj = &shmem->base; 1040 int ret; 1041 1042 ret = dma_resv_lock_interruptible(obj->resv, NULL); 1043 if (ret) 1044 return ret; 1045 drm_gem_shmem_purge_locked(shmem); 1046 dma_resv_unlock(obj->resv); 1047 1048 return 0; 1049 } 1050 EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_purge); 1051 #endif 1052 1053 MODULE_DESCRIPTION("DRM SHMEM memory-management helpers"); 1054 MODULE_IMPORT_NS("DMA_BUF"); 1055 MODULE_LICENSE("GPL"); 1056