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

drm/i915/region: convert object_create into object_init

Give more flexibility to the caller, if they already have an allocated
object, in case they wish to apply some transformation to the object
prior to handing it over to the region specific initialisation step,
like in gem_create_ext where we would like to first apply the extensions
to the object.

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20210114182402.840247-3-matthew.auld@intel.com

authored by

Matthew Auld and committed by
Chris Wilson
97d55396 7d58fef2

+72 -84
+5 -10
drivers/gpu/drm/i915/gem/i915_gem_lmem.c
··· 31 31 size, flags); 32 32 } 33 33 34 - struct drm_i915_gem_object * 35 - __i915_gem_lmem_object_create(struct intel_memory_region *mem, 36 - resource_size_t size, 37 - unsigned int flags) 34 + int __i915_gem_lmem_object_init(struct intel_memory_region *mem, 35 + struct drm_i915_gem_object *obj, 36 + resource_size_t size, 37 + unsigned int flags) 38 38 { 39 39 static struct lock_class_key lock_class; 40 40 struct drm_i915_private *i915 = mem->i915; 41 - struct drm_i915_gem_object *obj; 42 - 43 - obj = i915_gem_object_alloc(); 44 - if (!obj) 45 - return ERR_PTR(-ENOMEM); 46 41 47 42 drm_gem_private_object_init(&i915->drm, &obj->base, size); 48 43 i915_gem_object_init(obj, &i915_gem_lmem_obj_ops, &lock_class); ··· 48 53 49 54 i915_gem_object_init_memory_region(obj, mem, flags); 50 55 51 - return obj; 56 + return 0; 52 57 }
+4 -4
drivers/gpu/drm/i915/gem/i915_gem_lmem.h
··· 21 21 resource_size_t size, 22 22 unsigned int flags); 23 23 24 - struct drm_i915_gem_object * 25 - __i915_gem_lmem_object_create(struct intel_memory_region *mem, 26 - resource_size_t size, 27 - unsigned int flags); 24 + int __i915_gem_lmem_object_init(struct intel_memory_region *mem, 25 + struct drm_i915_gem_object *obj, 26 + resource_size_t size, 27 + unsigned int flags); 28 28 29 29 #endif /* !__I915_GEM_LMEM_H */
+13 -3
drivers/gpu/drm/i915/gem/i915_gem_region.c
··· 143 143 unsigned int flags) 144 144 { 145 145 struct drm_i915_gem_object *obj; 146 + int err; 146 147 147 148 /* 148 149 * NB: Our use of resource_size_t for the size stems from using struct ··· 161 160 GEM_BUG_ON(!size); 162 161 GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_MIN_ALIGNMENT)); 163 162 163 + obj = i915_gem_object_alloc(); 164 + if (!obj) 165 + return ERR_PTR(-ENOMEM); 166 + 164 167 /* 165 168 * XXX: There is a prevalence of the assumption that we fit the 166 169 * object's page count inside a 32bit _signed_ variable. Let's document ··· 178 173 if (overflows_type(size, obj->base.size)) 179 174 return ERR_PTR(-E2BIG); 180 175 181 - obj = mem->ops->create_object(mem, size, flags); 182 - if (!IS_ERR(obj)) 183 - trace_i915_gem_object_create(obj); 176 + err = mem->ops->init_object(mem, obj, size, flags); 177 + if (err) 178 + goto err_object_free; 184 179 180 + trace_i915_gem_object_create(obj); 185 181 return obj; 182 + 183 + err_object_free: 184 + i915_gem_object_free(obj); 185 + return ERR_PTR(err); 186 186 }
+7 -16
drivers/gpu/drm/i915/gem/i915_gem_shmem.c
··· 464 464 return 0; 465 465 } 466 466 467 - static struct drm_i915_gem_object * 468 - create_shmem(struct intel_memory_region *mem, 469 - resource_size_t size, 470 - unsigned int flags) 467 + static int shmem_object_init(struct intel_memory_region *mem, 468 + struct drm_i915_gem_object *obj, 469 + resource_size_t size, 470 + unsigned int flags) 471 471 { 472 472 static struct lock_class_key lock_class; 473 473 struct drm_i915_private *i915 = mem->i915; 474 - struct drm_i915_gem_object *obj; 475 474 struct address_space *mapping; 476 475 unsigned int cache_level; 477 476 gfp_t mask; 478 477 int ret; 479 478 480 - obj = i915_gem_object_alloc(); 481 - if (!obj) 482 - return ERR_PTR(-ENOMEM); 483 - 484 479 ret = __create_shmem(i915, &obj->base, size); 485 480 if (ret) 486 - goto fail; 481 + return ret; 487 482 488 483 mask = GFP_HIGHUSER | __GFP_RECLAIMABLE; 489 484 if (IS_I965GM(i915) || IS_I965G(i915)) { ··· 517 522 518 523 i915_gem_object_init_memory_region(obj, mem, 0); 519 524 520 - return obj; 521 - 522 - fail: 523 - i915_gem_object_free(obj); 524 - return ERR_PTR(ret); 525 + return 0; 525 526 } 526 527 527 528 struct drm_i915_gem_object * ··· 602 611 static const struct intel_memory_region_ops shmem_region_ops = { 603 612 .init = init_shmem, 604 613 .release = release_shmem, 605 - .create_object = create_shmem, 614 + .init_object = shmem_object_init, 606 615 }; 607 616 608 617 struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915)
+31 -34
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
··· 621 621 .release = i915_gem_object_release_stolen, 622 622 }; 623 623 624 - static struct drm_i915_gem_object * 625 - __i915_gem_object_create_stolen(struct intel_memory_region *mem, 626 - struct drm_mm_node *stolen) 624 + int __i915_gem_object_create_stolen(struct intel_memory_region *mem, 625 + struct drm_i915_gem_object *obj, 626 + struct drm_mm_node *stolen) 627 627 { 628 628 static struct lock_class_key lock_class; 629 - struct drm_i915_gem_object *obj; 630 629 unsigned int cache_level; 631 - int err = -ENOMEM; 632 - 633 - obj = i915_gem_object_alloc(); 634 - if (!obj) 635 - goto err; 630 + int err; 636 631 637 632 drm_gem_private_object_init(&mem->i915->drm, &obj->base, stolen->size); 638 633 i915_gem_object_init(obj, &i915_gem_object_stolen_ops, &lock_class); ··· 639 644 640 645 err = i915_gem_object_pin_pages(obj); 641 646 if (err) 642 - goto cleanup; 647 + return err; 643 648 644 649 i915_gem_object_init_memory_region(obj, mem, 0); 645 650 646 - return obj; 647 - 648 - cleanup: 649 - i915_gem_object_free(obj); 650 - err: 651 - return ERR_PTR(err); 651 + return 0; 652 652 } 653 653 654 - static struct drm_i915_gem_object * 655 - _i915_gem_object_create_stolen(struct intel_memory_region *mem, 656 - resource_size_t size, 657 - unsigned int flags) 654 + int _i915_gem_object_stolen_init(struct intel_memory_region *mem, 655 + struct drm_i915_gem_object *obj, 656 + resource_size_t size, 657 + unsigned int flags) 658 658 { 659 659 struct drm_i915_private *i915 = mem->i915; 660 - struct drm_i915_gem_object *obj; 661 660 struct drm_mm_node *stolen; 662 661 int ret; 663 662 664 663 if (!drm_mm_initialized(&i915->mm.stolen)) 665 - return ERR_PTR(-ENODEV); 664 + return -ENODEV; 666 665 667 666 if (size == 0) 668 - return ERR_PTR(-EINVAL); 667 + return -EINVAL; 669 668 670 669 stolen = kzalloc(sizeof(*stolen), GFP_KERNEL); 671 670 if (!stolen) 672 - return ERR_PTR(-ENOMEM); 671 + return -ENOMEM; 673 672 674 673 ret = i915_gem_stolen_insert_node(i915, stolen, size, 4096); 675 - if (ret) { 676 - obj = ERR_PTR(ret); 674 + if (ret) 677 675 goto err_free; 678 - } 679 676 680 - obj = __i915_gem_object_create_stolen(mem, stolen); 681 - if (IS_ERR(obj)) 677 + ret = __i915_gem_object_create_stolen(mem, obj, stolen); 678 + if (ret) 682 679 goto err_remove; 683 680 684 - return obj; 681 + return 0; 685 682 686 683 err_remove: 687 684 i915_gem_stolen_remove_node(i915, stolen); 688 685 err_free: 689 686 kfree(stolen); 690 - return obj; 687 + return ret; 691 688 } 692 689 693 690 struct drm_i915_gem_object * ··· 709 722 static const struct intel_memory_region_ops i915_region_stolen_ops = { 710 723 .init = init_stolen, 711 724 .release = release_stolen, 712 - .create_object = _i915_gem_object_create_stolen, 725 + .init_object = _i915_gem_object_stolen_init, 713 726 }; 714 727 715 728 struct intel_memory_region *i915_gem_stolen_setup(struct drm_i915_private *i915) ··· 758 771 goto err_free; 759 772 } 760 773 761 - obj = __i915_gem_object_create_stolen(mem, stolen); 762 - if (IS_ERR(obj)) 774 + obj = i915_gem_object_alloc(); 775 + if (!obj) { 776 + obj = ERR_PTR(-ENOMEM); 763 777 goto err_stolen; 778 + } 779 + 780 + ret = __i915_gem_object_create_stolen(mem, obj, stolen); 781 + if (ret) { 782 + obj = ERR_PTR(ret); 783 + goto err_object_free; 784 + } 764 785 765 786 i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE); 766 787 return obj; 767 788 789 + err_object_free: 790 + i915_gem_object_free(obj); 768 791 err_stolen: 769 792 i915_gem_stolen_remove_node(i915, stolen); 770 793 err_free:
+1 -1
drivers/gpu/drm/i915/gt/intel_region_lmem.c
··· 98 98 static const struct intel_memory_region_ops intel_region_lmem_ops = { 99 99 .init = region_lmem_init, 100 100 .release = region_lmem_release, 101 - .create_object = __i915_gem_lmem_object_create, 101 + .init_object = __i915_gem_lmem_object_init, 102 102 }; 103 103 104 104 struct intel_memory_region *
+4 -4
drivers/gpu/drm/i915/intel_memory_region.h
··· 57 57 int (*init)(struct intel_memory_region *mem); 58 58 void (*release)(struct intel_memory_region *mem); 59 59 60 - struct drm_i915_gem_object * 61 - (*create_object)(struct intel_memory_region *mem, 62 - resource_size_t size, 63 - unsigned int flags); 60 + int (*init_object)(struct intel_memory_region *mem, 61 + struct drm_i915_gem_object *obj, 62 + resource_size_t size, 63 + unsigned int flags); 64 64 }; 65 65 66 66 struct intel_memory_region {
+7 -12
drivers/gpu/drm/i915/selftests/mock_region.c
··· 15 15 .release = i915_gem_object_release_memory_region, 16 16 }; 17 17 18 - static struct drm_i915_gem_object * 19 - mock_object_create(struct intel_memory_region *mem, 20 - resource_size_t size, 21 - unsigned int flags) 18 + static int mock_object_init(struct intel_memory_region *mem, 19 + struct drm_i915_gem_object *obj, 20 + resource_size_t size, 21 + unsigned int flags) 22 22 { 23 23 static struct lock_class_key lock_class; 24 24 struct drm_i915_private *i915 = mem->i915; 25 - struct drm_i915_gem_object *obj; 26 25 27 26 if (size > mem->mm.size) 28 - return ERR_PTR(-E2BIG); 29 - 30 - obj = i915_gem_object_alloc(); 31 - if (!obj) 32 - return ERR_PTR(-ENOMEM); 27 + return -E2BIG; 33 28 34 29 drm_gem_private_object_init(&i915->drm, &obj->base, size); 35 30 i915_gem_object_init(obj, &mock_region_obj_ops, &lock_class); ··· 35 40 36 41 i915_gem_object_init_memory_region(obj, mem, flags); 37 42 38 - return obj; 43 + return 0; 39 44 } 40 45 41 46 static const struct intel_memory_region_ops mock_region_ops = { 42 47 .init = intel_memory_region_init_buddy, 43 48 .release = intel_memory_region_release_buddy, 44 - .create_object = mock_object_create, 49 + .init_object = mock_object_init, 45 50 }; 46 51 47 52 struct intel_memory_region *