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

Configure Feed

Select the types of activity you want to include in your feed.

drm/xe: Make xe_ggtt_node_insert return a node

This extra step is easier to handle inside xe_ggtt.c and makes
xe_ggtt_node_allocated a simple null check instead, as the intermediate
state 'allocated but not inserted' is no longer used.

Privatize xe_ggtt_node_fini() and init() as they're no longer used
outside of xe_ggtt.c

Reviewed-by: Matthew Brost <matthew.brost@intel.com> #v1
Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Link: https://patch.msgid.link/20260206112108.1453809-11-dev@lankhorst.se
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>

+48 -88
+1 -1
drivers/gpu/drm/xe/display/xe_fb_pin.c
··· 256 256 size = intel_rotation_info_size(&view->rotated) * XE_PAGE_SIZE; 257 257 258 258 pte = xe_ggtt_encode_pte_flags(ggtt, bo, xe->pat.idx[XE_CACHE_NONE]); 259 - vma->node = xe_ggtt_node_insert_transform(ggtt, bo, pte, 259 + vma->node = xe_ggtt_insert_node_transform(ggtt, bo, pte, 260 260 ALIGN(size, align), align, 261 261 view->type == I915_GTT_VIEW_NORMAL ? 262 262 NULL : write_ggtt_rotated_node,
+1 -5
drivers/gpu/drm/xe/tests/xe_guc_buf_kunit.c
··· 38 38 if (flags & XE_BO_FLAG_GGTT) { 39 39 struct xe_ggtt *ggtt = tile->mem.ggtt; 40 40 41 - bo->ggtt_node[tile->id] = xe_ggtt_node_init(ggtt); 41 + bo->ggtt_node[tile->id] = xe_ggtt_insert_node(ggtt, xe_bo_size(bo), SZ_4K); 42 42 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bo->ggtt_node[tile->id]); 43 - 44 - KUNIT_ASSERT_EQ(test, 0, 45 - xe_ggtt_node_insert(bo->ggtt_node[tile->id], 46 - xe_bo_size(bo), SZ_4K)); 47 43 } 48 44 49 45 return bo;
+40 -57
drivers/gpu/drm/xe/xe_ggtt.c
··· 69 69 /** 70 70 * struct xe_ggtt_node - A node in GGTT. 71 71 * 72 - * This struct needs to be initialized (only-once) with xe_ggtt_node_init() before any node 73 - * insertion or reservation. 74 - * It will, then, be finalized by xe_ggtt_node_remove(). 72 + * This struct is allocated with xe_ggtt_insert_node(,_transform) or xe_ggtt_insert_bo(,_at). 73 + * It will be deallocated using xe_ggtt_node_remove(). 75 74 */ 76 75 struct xe_ggtt_node { 77 76 /** @ggtt: Back pointer to xe_ggtt where this region will be inserted at */ ··· 457 458 mutex_unlock(&ggtt->lock); 458 459 } 459 460 461 + static void ggtt_node_fini(struct xe_ggtt_node *node) 462 + { 463 + kfree(node); 464 + } 465 + 460 466 static void ggtt_node_remove(struct xe_ggtt_node *node) 461 467 { 462 468 struct xe_ggtt *ggtt = node->ggtt; ··· 487 483 drm_dev_exit(idx); 488 484 489 485 free_node: 490 - xe_ggtt_node_fini(node); 486 + ggtt_node_fini(node); 491 487 } 492 488 493 489 static void ggtt_node_remove_work_func(struct work_struct *work) ··· 617 613 WRITE_ONCE(ggtt->start, new_start); 618 614 } 619 615 620 - static int xe_ggtt_node_insert_locked(struct xe_ggtt_node *node, 616 + static int xe_ggtt_insert_node_locked(struct xe_ggtt_node *node, 621 617 u32 size, u32 align, u32 mm_flags) 622 618 { 623 619 return drm_mm_insert_node_generic(&node->ggtt->mm, &node->base, size, align, 0, 624 620 mm_flags); 625 621 } 626 622 627 - /** 628 - * xe_ggtt_node_insert - Insert a &xe_ggtt_node into the GGTT 629 - * @node: the &xe_ggtt_node to be inserted 630 - * @size: size of the node 631 - * @align: alignment constrain of the node 632 - * 633 - * It cannot be called without first having called xe_ggtt_init() once. 634 - * 635 - * Return: 0 on success or a negative error code on failure. 636 - */ 637 - int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align) 638 - { 639 - int ret; 640 - 641 - if (!node || !node->ggtt) 642 - return -ENOENT; 643 - 644 - mutex_lock(&node->ggtt->lock); 645 - ret = xe_ggtt_node_insert_locked(node, size, align, 646 - DRM_MM_INSERT_HIGH); 647 - mutex_unlock(&node->ggtt->lock); 648 - 649 - return ret; 650 - } 651 - 652 - /** 653 - * xe_ggtt_node_init - Initialize %xe_ggtt_node struct 654 - * @ggtt: the &xe_ggtt where the new node will later be inserted/reserved. 655 - * 656 - * This function will allocate the struct %xe_ggtt_node and return its pointer. 657 - * This struct will then be freed after the node removal upon xe_ggtt_node_remove() 658 - * Having %xe_ggtt_node struct allocated doesn't mean that the node is already allocated 659 - * in GGTT. Only xe_ggtt_node_insert() will ensure the node is inserted or reserved in GGTT. 660 - * 661 - * Return: A pointer to %xe_ggtt_node struct on success. An ERR_PTR otherwise. 662 - **/ 663 - struct xe_ggtt_node *xe_ggtt_node_init(struct xe_ggtt *ggtt) 623 + static struct xe_ggtt_node *ggtt_node_init(struct xe_ggtt *ggtt) 664 624 { 665 625 struct xe_ggtt_node *node = kzalloc(sizeof(*node), GFP_NOFS); 666 626 ··· 638 670 } 639 671 640 672 /** 641 - * xe_ggtt_node_fini - Forcebly finalize %xe_ggtt_node struct 642 - * @node: the &xe_ggtt_node to be freed 673 + * xe_ggtt_insert_node - Insert a &xe_ggtt_node into the GGTT 674 + * @ggtt: the &xe_ggtt into which the node should be inserted. 675 + * @size: size of the node 676 + * @align: alignment constrain of the node 643 677 * 644 - * If anything went wrong with either xe_ggtt_node_insert() and this @node is 645 - * not going to be reused, then this function needs to be called to free the 646 - * %xe_ggtt_node struct 647 - **/ 648 - void xe_ggtt_node_fini(struct xe_ggtt_node *node) 678 + * Return: &xe_ggtt_node on success or a ERR_PTR on failure. 679 + */ 680 + struct xe_ggtt_node *xe_ggtt_insert_node(struct xe_ggtt *ggtt, u32 size, u32 align) 649 681 { 650 - kfree(node); 682 + struct xe_ggtt_node *node; 683 + int ret; 684 + 685 + node = ggtt_node_init(ggtt); 686 + if (IS_ERR(node)) 687 + return node; 688 + 689 + guard(mutex)(&ggtt->lock); 690 + ret = xe_ggtt_insert_node_locked(node, size, align, 691 + DRM_MM_INSERT_HIGH); 692 + if (ret) { 693 + ggtt_node_fini(node); 694 + return ERR_PTR(ret); 695 + } 696 + 697 + return node; 651 698 } 652 699 653 700 /** ··· 750 767 } 751 768 752 769 /** 753 - * xe_ggtt_node_insert_transform - Insert a newly allocated &xe_ggtt_node into the GGTT 770 + * xe_ggtt_insert_node_transform - Insert a newly allocated &xe_ggtt_node into the GGTT 754 771 * @ggtt: the &xe_ggtt where the node will inserted/reserved. 755 772 * @bo: The bo to be transformed 756 773 * @pte_flags: The extra GGTT flags to add to mapping. ··· 764 781 * 765 782 * Return: A pointer to %xe_ggtt_node struct on success. An ERR_PTR otherwise. 766 783 */ 767 - struct xe_ggtt_node *xe_ggtt_node_insert_transform(struct xe_ggtt *ggtt, 784 + struct xe_ggtt_node *xe_ggtt_insert_node_transform(struct xe_ggtt *ggtt, 768 785 struct xe_bo *bo, u64 pte_flags, 769 786 u64 size, u32 align, 770 787 xe_ggtt_transform_cb transform, void *arg) ··· 772 789 struct xe_ggtt_node *node; 773 790 int ret; 774 791 775 - node = xe_ggtt_node_init(ggtt); 792 + node = ggtt_node_init(ggtt); 776 793 if (IS_ERR(node)) 777 794 return ERR_CAST(node); 778 795 ··· 781 798 goto err; 782 799 } 783 800 784 - ret = xe_ggtt_node_insert_locked(node, size, align, 0); 801 + ret = xe_ggtt_insert_node_locked(node, size, align, 0); 785 802 if (ret) 786 803 goto err_unlock; 787 804 ··· 796 813 err_unlock: 797 814 mutex_unlock(&ggtt->lock); 798 815 err: 799 - xe_ggtt_node_fini(node); 816 + ggtt_node_fini(node); 800 817 return ERR_PTR(ret); 801 818 } 802 819 ··· 822 839 823 840 xe_pm_runtime_get_noresume(tile_to_xe(ggtt->tile)); 824 841 825 - bo->ggtt_node[tile_id] = xe_ggtt_node_init(ggtt); 842 + bo->ggtt_node[tile_id] = ggtt_node_init(ggtt); 826 843 if (IS_ERR(bo->ggtt_node[tile_id])) { 827 844 err = PTR_ERR(bo->ggtt_node[tile_id]); 828 845 bo->ggtt_node[tile_id] = NULL; ··· 853 870 err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node[tile_id]->base, 854 871 xe_bo_size(bo), alignment, 0, start, end, 0); 855 872 if (err) { 856 - xe_ggtt_node_fini(bo->ggtt_node[tile_id]); 873 + ggtt_node_fini(bo->ggtt_node[tile_id]); 857 874 bo->ggtt_node[tile_id] = NULL; 858 875 } else { 859 876 u16 cache_mode = bo->flags & XE_BO_FLAG_NEEDS_UC ? XE_CACHE_NONE : XE_CACHE_WB;
+3 -4
drivers/gpu/drm/xe/xe_ggtt.h
··· 18 18 int xe_ggtt_init_kunit(struct xe_ggtt *ggtt, u32 reserved, u32 size); 19 19 int xe_ggtt_init(struct xe_ggtt *ggtt); 20 20 21 - struct xe_ggtt_node *xe_ggtt_node_init(struct xe_ggtt *ggtt); 22 - void xe_ggtt_node_fini(struct xe_ggtt_node *node); 23 21 void xe_ggtt_shift_nodes(struct xe_ggtt *ggtt, u64 new_base); 24 22 u64 xe_ggtt_start(struct xe_ggtt *ggtt); 25 23 u64 xe_ggtt_size(struct xe_ggtt *ggtt); 26 24 27 - int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align); 28 25 struct xe_ggtt_node * 29 - xe_ggtt_node_insert_transform(struct xe_ggtt *ggtt, 26 + xe_ggtt_insert_node(struct xe_ggtt *ggtt, u32 size, u32 align); 27 + struct xe_ggtt_node * 28 + xe_ggtt_insert_node_transform(struct xe_ggtt *ggtt, 30 29 struct xe_bo *bo, u64 pte, 31 30 u64 size, u32 align, 32 31 xe_ggtt_transform_cb transform, void *arg);
+3 -21
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
··· 482 482 return err ?: err2; 483 483 } 484 484 485 - static void pf_release_ggtt(struct xe_tile *tile, struct xe_ggtt_node *node) 486 - { 487 - if (xe_ggtt_node_allocated(node)) { 488 - /* 489 - * explicit GGTT PTE assignment to the PF using xe_ggtt_assign() 490 - * is redundant, as PTE will be implicitly re-assigned to PF by 491 - * the xe_ggtt_clear() called by below xe_ggtt_remove_node(). 492 - */ 493 - xe_ggtt_node_remove(node, false); 494 - } else { 495 - xe_ggtt_node_fini(node); 496 - } 497 - } 498 - 499 485 static void pf_release_vf_config_ggtt(struct xe_gt *gt, struct xe_gt_sriov_config *config) 500 486 { 501 - pf_release_ggtt(gt_to_tile(gt), config->ggtt_region); 487 + xe_ggtt_node_remove(config->ggtt_region, false); 502 488 config->ggtt_region = NULL; 503 489 } 504 490 ··· 519 533 if (!size) 520 534 return 0; 521 535 522 - node = xe_ggtt_node_init(ggtt); 536 + node = xe_ggtt_insert_node(ggtt, size, alignment); 523 537 if (IS_ERR(node)) 524 538 return PTR_ERR(node); 525 - 526 - err = xe_ggtt_node_insert(node, size, alignment); 527 - if (unlikely(err)) 528 - goto err; 529 539 530 540 xe_ggtt_assign(node, vfid); 531 541 xe_gt_sriov_dbg_verbose(gt, "VF%u assigned GGTT %llx-%llx\n", ··· 534 552 config->ggtt_region = node; 535 553 return 0; 536 554 err: 537 - pf_release_ggtt(tile, node); 555 + xe_ggtt_node_remove(node, false); 538 556 return err; 539 557 } 540 558