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/v3d: Move part of copying of reset/copy performance extension to a helper

The loop which looks up the syncobj and copies the kperfmon ids is
identical so lets move it to a helper.

The only change is replacing copy_from_user with get_user when copying a
scalar.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Reviewed-by: Maíra Canal <mcanal@igalia.com>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240711135340.84617-7-tursulin@igalia.com

authored by

Tvrtko Ursulin and committed by
Maíra Canal
4bd75a81 a546b7e4

+68 -84
+68 -84
drivers/gpu/drm/v3d/v3d_submit.c
··· 645 645 } 646 646 647 647 static int 648 + v3d_copy_query_info(struct v3d_performance_query_info *query_info, 649 + unsigned int count, 650 + unsigned int nperfmons, 651 + u32 __user *syncs, 652 + u64 __user *kperfmon_ids, 653 + struct drm_file *file_priv) 654 + { 655 + unsigned int i, j; 656 + int err; 657 + 658 + for (i = 0; i < count; i++) { 659 + struct v3d_performance_query *query = &query_info->queries[i]; 660 + u32 __user *ids_pointer; 661 + u32 sync, id; 662 + u64 ids; 663 + 664 + if (get_user(sync, syncs++)) { 665 + err = -EFAULT; 666 + goto error; 667 + } 668 + 669 + if (get_user(ids, kperfmon_ids++)) { 670 + err = -EFAULT; 671 + goto error; 672 + } 673 + 674 + ids_pointer = u64_to_user_ptr(ids); 675 + 676 + for (j = 0; j < nperfmons; j++) { 677 + if (get_user(id, ids_pointer++)) { 678 + err = -EFAULT; 679 + goto error; 680 + } 681 + 682 + query->kperfmon_ids[j] = id; 683 + } 684 + 685 + query->syncobj = drm_syncobj_find(file_priv, sync); 686 + if (!query->syncobj) { 687 + err = -ENOENT; 688 + goto error; 689 + } 690 + } 691 + 692 + return 0; 693 + 694 + error: 695 + v3d_performance_query_info_free(query_info, i); 696 + return err; 697 + } 698 + 699 + static int 648 700 v3d_get_cpu_reset_performance_params(struct drm_file *file_priv, 649 701 struct drm_v3d_extension __user *ext, 650 702 struct v3d_cpu_job *job) 651 703 { 652 - u32 __user *syncs; 653 - u64 __user *kperfmon_ids; 654 704 struct drm_v3d_reset_performance_query reset; 655 - unsigned int i, j; 656 705 int err; 657 706 658 707 if (!job) { ··· 728 679 if (!job->performance_query.queries) 729 680 return -ENOMEM; 730 681 731 - syncs = u64_to_user_ptr(reset.syncs); 732 - kperfmon_ids = u64_to_user_ptr(reset.kperfmon_ids); 682 + err = v3d_copy_query_info(&job->performance_query, 683 + reset.count, 684 + reset.nperfmons, 685 + u64_to_user_ptr(reset.syncs), 686 + u64_to_user_ptr(reset.kperfmon_ids), 687 + file_priv); 688 + if (err) 689 + return err; 733 690 734 - for (i = 0; i < reset.count; i++) { 735 - u32 sync; 736 - u64 ids; 737 - u32 __user *ids_pointer; 738 - u32 id; 739 - 740 - if (copy_from_user(&sync, syncs++, sizeof(sync))) { 741 - err = -EFAULT; 742 - goto error; 743 - } 744 - 745 - if (copy_from_user(&ids, kperfmon_ids++, sizeof(ids))) { 746 - err = -EFAULT; 747 - goto error; 748 - } 749 - 750 - ids_pointer = u64_to_user_ptr(ids); 751 - 752 - for (j = 0; j < reset.nperfmons; j++) { 753 - if (copy_from_user(&id, ids_pointer++, sizeof(id))) { 754 - err = -EFAULT; 755 - goto error; 756 - } 757 - 758 - job->performance_query.queries[i].kperfmon_ids[j] = id; 759 - } 760 - 761 - job->performance_query.queries[i].syncobj = drm_syncobj_find(file_priv, sync); 762 - if (!job->performance_query.queries[i].syncobj) { 763 - err = -ENOENT; 764 - goto error; 765 - } 766 - } 767 691 job->performance_query.count = reset.count; 768 692 job->performance_query.nperfmons = reset.nperfmons; 769 693 770 694 return 0; 771 - 772 - error: 773 - v3d_performance_query_info_free(&job->performance_query, i); 774 - return err; 775 695 } 776 696 777 697 static int ··· 748 730 struct drm_v3d_extension __user *ext, 749 731 struct v3d_cpu_job *job) 750 732 { 751 - u32 __user *syncs; 752 - u64 __user *kperfmon_ids; 753 733 struct drm_v3d_copy_performance_query copy; 754 - unsigned int i, j; 755 734 int err; 756 735 757 736 if (!job) { ··· 778 763 if (!job->performance_query.queries) 779 764 return -ENOMEM; 780 765 781 - syncs = u64_to_user_ptr(copy.syncs); 782 - kperfmon_ids = u64_to_user_ptr(copy.kperfmon_ids); 766 + err = v3d_copy_query_info(&job->performance_query, 767 + copy.count, 768 + copy.nperfmons, 769 + u64_to_user_ptr(copy.syncs), 770 + u64_to_user_ptr(copy.kperfmon_ids), 771 + file_priv); 772 + if (err) 773 + return err; 783 774 784 - for (i = 0; i < copy.count; i++) { 785 - u32 sync; 786 - u64 ids; 787 - u32 __user *ids_pointer; 788 - u32 id; 789 - 790 - if (copy_from_user(&sync, syncs++, sizeof(sync))) { 791 - err = -EFAULT; 792 - goto error; 793 - } 794 - 795 - if (copy_from_user(&ids, kperfmon_ids++, sizeof(ids))) { 796 - err = -EFAULT; 797 - goto error; 798 - } 799 - 800 - ids_pointer = u64_to_user_ptr(ids); 801 - 802 - for (j = 0; j < copy.nperfmons; j++) { 803 - if (copy_from_user(&id, ids_pointer++, sizeof(id))) { 804 - err = -EFAULT; 805 - goto error; 806 - } 807 - 808 - job->performance_query.queries[i].kperfmon_ids[j] = id; 809 - } 810 - 811 - job->performance_query.queries[i].syncobj = drm_syncobj_find(file_priv, sync); 812 - if (!job->performance_query.queries[i].syncobj) { 813 - err = -ENOENT; 814 - goto error; 815 - } 816 - } 817 775 job->performance_query.count = copy.count; 818 776 job->performance_query.nperfmons = copy.nperfmons; 819 777 job->performance_query.ncounters = copy.ncounters; ··· 798 810 job->copy.stride = copy.stride; 799 811 800 812 return 0; 801 - 802 - error: 803 - v3d_performance_query_info_free(&job->performance_query, i); 804 - return err; 805 813 } 806 814 807 815 /* Whenever userspace sets ioctl extensions, v3d_get_extensions parses data