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.

selftests: ntsync: Add some tests for wakeup signaling with events.

Expand the contended wait tests, which previously only covered events and
semaphores, to cover events as well.

Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
Link: https://lore.kernel.org/r/20241213193511.457338-25-zfigura@codeweavers.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Elizabeth Figura and committed by
Greg Kroah-Hartman
a2e5a8ce b4e4dd5d

+141 -4
+141 -4
tools/testing/selftests/drivers/ntsync/ntsync.c
··· 598 598 599 599 TEST(test_wait_all) 600 600 { 601 + struct ntsync_event_args event_args = {0}; 601 602 struct ntsync_mutex_args mutex_args = {0}; 602 603 struct ntsync_sem_args sem_args = {0}; 603 604 __u32 owner, index, count; ··· 664 663 665 664 close(objs[1]); 666 665 666 + event_args.manual = true; 667 + event_args.signaled = true; 668 + objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); 669 + EXPECT_LE(0, objs[1]); 670 + 671 + ret = wait_all(fd, 2, objs, 123, &index); 672 + EXPECT_EQ(0, ret); 673 + EXPECT_EQ(0, index); 674 + check_sem_state(objs[0], 0, 3); 675 + check_event_state(objs[1], 1, 1); 676 + 677 + close(objs[1]); 678 + 667 679 /* test waiting on the same object twice */ 668 680 objs[1] = objs[0]; 669 681 ret = wait_all(fd, 2, objs, 123, &index); ··· 730 716 731 717 TEST(wake_any) 732 718 { 719 + struct ntsync_event_args event_args = {0}; 733 720 struct ntsync_mutex_args mutex_args = {0}; 734 721 struct ntsync_wait_args wait_args = {0}; 735 722 struct ntsync_sem_args sem_args = {0}; 736 723 struct wait_args thread_args; 724 + __u32 count, index, signaled; 737 725 int objs[2], fd, ret; 738 - __u32 count, index; 739 726 pthread_t thread; 740 727 741 728 fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ··· 811 796 EXPECT_EQ(0, thread_args.ret); 812 797 EXPECT_EQ(1, wait_args.index); 813 798 799 + close(objs[1]); 800 + 801 + /* test waking events */ 802 + 803 + event_args.manual = false; 804 + event_args.signaled = false; 805 + objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); 806 + EXPECT_LE(0, objs[1]); 807 + 808 + wait_args.timeout = get_abs_timeout(1000); 809 + ret = pthread_create(&thread, NULL, wait_thread, &thread_args); 810 + EXPECT_EQ(0, ret); 811 + 812 + ret = wait_for_thread(thread, 100); 813 + EXPECT_EQ(ETIMEDOUT, ret); 814 + 815 + ret = ioctl(objs[1], NTSYNC_IOC_EVENT_SET, &signaled); 816 + EXPECT_EQ(0, ret); 817 + EXPECT_EQ(0, signaled); 818 + check_event_state(objs[1], 0, 0); 819 + 820 + ret = wait_for_thread(thread, 100); 821 + EXPECT_EQ(0, ret); 822 + EXPECT_EQ(0, thread_args.ret); 823 + EXPECT_EQ(1, wait_args.index); 824 + 825 + wait_args.timeout = get_abs_timeout(1000); 826 + ret = pthread_create(&thread, NULL, wait_thread, &thread_args); 827 + EXPECT_EQ(0, ret); 828 + 829 + ret = wait_for_thread(thread, 100); 830 + EXPECT_EQ(ETIMEDOUT, ret); 831 + 832 + ret = ioctl(objs[1], NTSYNC_IOC_EVENT_PULSE, &signaled); 833 + EXPECT_EQ(0, ret); 834 + EXPECT_EQ(0, signaled); 835 + check_event_state(objs[1], 0, 0); 836 + 837 + ret = wait_for_thread(thread, 100); 838 + EXPECT_EQ(0, ret); 839 + EXPECT_EQ(0, thread_args.ret); 840 + EXPECT_EQ(1, wait_args.index); 841 + 842 + close(objs[1]); 843 + 844 + event_args.manual = true; 845 + event_args.signaled = false; 846 + objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); 847 + EXPECT_LE(0, objs[1]); 848 + 849 + wait_args.timeout = get_abs_timeout(1000); 850 + ret = pthread_create(&thread, NULL, wait_thread, &thread_args); 851 + EXPECT_EQ(0, ret); 852 + 853 + ret = wait_for_thread(thread, 100); 854 + EXPECT_EQ(ETIMEDOUT, ret); 855 + 856 + ret = ioctl(objs[1], NTSYNC_IOC_EVENT_SET, &signaled); 857 + EXPECT_EQ(0, ret); 858 + EXPECT_EQ(0, signaled); 859 + check_event_state(objs[1], 1, 1); 860 + 861 + ret = wait_for_thread(thread, 100); 862 + EXPECT_EQ(0, ret); 863 + EXPECT_EQ(0, thread_args.ret); 864 + EXPECT_EQ(1, wait_args.index); 865 + 866 + ret = ioctl(objs[1], NTSYNC_IOC_EVENT_RESET, &signaled); 867 + EXPECT_EQ(0, ret); 868 + EXPECT_EQ(1, signaled); 869 + 870 + wait_args.timeout = get_abs_timeout(1000); 871 + ret = pthread_create(&thread, NULL, wait_thread, &thread_args); 872 + EXPECT_EQ(0, ret); 873 + 874 + ret = wait_for_thread(thread, 100); 875 + EXPECT_EQ(ETIMEDOUT, ret); 876 + 877 + ret = ioctl(objs[1], NTSYNC_IOC_EVENT_PULSE, &signaled); 878 + EXPECT_EQ(0, ret); 879 + EXPECT_EQ(0, signaled); 880 + check_event_state(objs[1], 0, 1); 881 + 882 + ret = wait_for_thread(thread, 100); 883 + EXPECT_EQ(0, ret); 884 + EXPECT_EQ(0, thread_args.ret); 885 + EXPECT_EQ(1, wait_args.index); 886 + 814 887 /* delete an object while it's being waited on */ 815 888 816 889 wait_args.timeout = get_abs_timeout(200); ··· 922 819 923 820 TEST(wake_all) 924 821 { 822 + struct ntsync_event_args manual_event_args = {0}; 823 + struct ntsync_event_args auto_event_args = {0}; 925 824 struct ntsync_mutex_args mutex_args = {0}; 926 825 struct ntsync_wait_args wait_args = {0}; 927 826 struct ntsync_sem_args sem_args = {0}; 928 827 struct wait_args thread_args; 929 - int objs[2], fd, ret; 930 - __u32 count, index; 828 + __u32 count, index, signaled; 829 + int objs[4], fd, ret; 931 830 pthread_t thread; 932 831 933 832 fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ··· 945 840 objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); 946 841 EXPECT_LE(0, objs[1]); 947 842 843 + manual_event_args.manual = true; 844 + manual_event_args.signaled = true; 845 + objs[2] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &manual_event_args); 846 + EXPECT_LE(0, objs[2]); 847 + 848 + auto_event_args.manual = false; 849 + auto_event_args.signaled = true; 850 + objs[3] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &auto_event_args); 851 + EXPECT_EQ(0, objs[3]); 852 + 948 853 wait_args.timeout = get_abs_timeout(1000); 949 854 wait_args.objs = (uintptr_t)objs; 950 - wait_args.count = 2; 855 + wait_args.count = 4; 951 856 wait_args.owner = 456; 952 857 thread_args.fd = fd; 953 858 thread_args.args = &wait_args; ··· 991 876 992 877 check_mutex_state(objs[1], 0, 0); 993 878 879 + ret = ioctl(objs[2], NTSYNC_IOC_EVENT_RESET, &signaled); 880 + EXPECT_EQ(0, ret); 881 + EXPECT_EQ(1, signaled); 882 + 994 883 count = 2; 995 884 ret = release_sem(objs[0], &count); 996 885 EXPECT_EQ(0, ret); 997 886 EXPECT_EQ(0, count); 887 + check_sem_state(objs[0], 2, 3); 888 + 889 + ret = ioctl(objs[3], NTSYNC_IOC_EVENT_RESET, &signaled); 890 + EXPECT_EQ(0, ret); 891 + EXPECT_EQ(1, signaled); 892 + 893 + ret = ioctl(objs[2], NTSYNC_IOC_EVENT_SET, &signaled); 894 + EXPECT_EQ(0, ret); 895 + EXPECT_EQ(0, signaled); 896 + 897 + ret = ioctl(objs[3], NTSYNC_IOC_EVENT_SET, &signaled); 898 + EXPECT_EQ(0, ret); 899 + EXPECT_EQ(0, signaled); 900 + 998 901 check_sem_state(objs[0], 1, 3); 999 902 check_mutex_state(objs[1], 1, 456); 903 + check_event_state(objs[2], 1, 1); 904 + check_event_state(objs[3], 0, 0); 1000 905 1001 906 ret = wait_for_thread(thread, 100); 1002 907 EXPECT_EQ(0, ret); ··· 1034 899 1035 900 close(objs[0]); 1036 901 close(objs[1]); 902 + close(objs[2]); 903 + close(objs[3]); 1037 904 1038 905 ret = wait_for_thread(thread, 200); 1039 906 EXPECT_EQ(0, ret);