@@ -2806,35 +2806,32 @@ TEST_F(iommufd_viommu, viommu_alloc_nested_iopf)
2806
2806
uint32_t fault_fd ;
2807
2807
uint32_t vdev_id ;
2808
2808
2809
- if (self -> device_id ) {
2810
- test_ioctl_fault_alloc (& fault_id , & fault_fd );
2811
- test_err_hwpt_alloc_iopf (
2812
- ENOENT , dev_id , viommu_id , UINT32_MAX ,
2813
- IOMMU_HWPT_FAULT_ID_VALID , & iopf_hwpt_id ,
2814
- IOMMU_HWPT_DATA_SELFTEST , & data , sizeof (data ));
2815
- test_err_hwpt_alloc_iopf (
2816
- EOPNOTSUPP , dev_id , viommu_id , fault_id ,
2817
- IOMMU_HWPT_FAULT_ID_VALID | (1 << 31 ), & iopf_hwpt_id ,
2818
- IOMMU_HWPT_DATA_SELFTEST , & data , sizeof (data ));
2819
- test_cmd_hwpt_alloc_iopf (
2820
- dev_id , viommu_id , fault_id , IOMMU_HWPT_FAULT_ID_VALID ,
2821
- & iopf_hwpt_id , IOMMU_HWPT_DATA_SELFTEST , & data ,
2822
- sizeof (data ));
2809
+ if (!dev_id )
2810
+ SKIP (return , "Skipping test for variant no_viommu" );
2823
2811
2824
- /* Must allocate vdevice before attaching to a nested hwpt */
2825
- test_err_mock_domain_replace (ENOENT , self -> stdev_id ,
2826
- iopf_hwpt_id );
2827
- test_cmd_vdevice_alloc (viommu_id , dev_id , 0x99 , & vdev_id );
2828
- test_cmd_mock_domain_replace (self -> stdev_id , iopf_hwpt_id );
2829
- EXPECT_ERRNO (EBUSY ,
2830
- _test_ioctl_destroy (self -> fd , iopf_hwpt_id ));
2831
- test_cmd_trigger_iopf (dev_id , fault_fd );
2812
+ test_ioctl_fault_alloc (& fault_id , & fault_fd );
2813
+ test_err_hwpt_alloc_iopf (ENOENT , dev_id , viommu_id , UINT32_MAX ,
2814
+ IOMMU_HWPT_FAULT_ID_VALID , & iopf_hwpt_id ,
2815
+ IOMMU_HWPT_DATA_SELFTEST , & data , sizeof (data ));
2816
+ test_err_hwpt_alloc_iopf (EOPNOTSUPP , dev_id , viommu_id , fault_id ,
2817
+ IOMMU_HWPT_FAULT_ID_VALID | (1 << 31 ),
2818
+ & iopf_hwpt_id , IOMMU_HWPT_DATA_SELFTEST , & data ,
2819
+ sizeof (data ));
2820
+ test_cmd_hwpt_alloc_iopf (dev_id , viommu_id , fault_id ,
2821
+ IOMMU_HWPT_FAULT_ID_VALID , & iopf_hwpt_id ,
2822
+ IOMMU_HWPT_DATA_SELFTEST , & data , sizeof (data ));
2832
2823
2833
- test_cmd_mock_domain_replace (self -> stdev_id , self -> ioas_id );
2834
- test_ioctl_destroy (iopf_hwpt_id );
2835
- close (fault_fd );
2836
- test_ioctl_destroy (fault_id );
2837
- }
2824
+ /* Must allocate vdevice before attaching to a nested hwpt */
2825
+ test_err_mock_domain_replace (ENOENT , self -> stdev_id , iopf_hwpt_id );
2826
+ test_cmd_vdevice_alloc (viommu_id , dev_id , 0x99 , & vdev_id );
2827
+ test_cmd_mock_domain_replace (self -> stdev_id , iopf_hwpt_id );
2828
+ EXPECT_ERRNO (EBUSY , _test_ioctl_destroy (self -> fd , iopf_hwpt_id ));
2829
+ test_cmd_trigger_iopf (dev_id , fault_fd );
2830
+
2831
+ test_cmd_mock_domain_replace (self -> stdev_id , self -> ioas_id );
2832
+ test_ioctl_destroy (iopf_hwpt_id );
2833
+ close (fault_fd );
2834
+ test_ioctl_destroy (fault_id );
2838
2835
}
2839
2836
2840
2837
TEST_F (iommufd_viommu , viommu_alloc_with_data )
@@ -2929,169 +2926,161 @@ TEST_F(iommufd_viommu, vdevice_cache)
2929
2926
uint32_t vdev_id = 0 ;
2930
2927
uint32_t num_inv ;
2931
2928
2932
- if (dev_id ) {
2933
- test_cmd_vdevice_alloc (viommu_id , dev_id , 0x99 , & vdev_id );
2934
-
2935
- test_cmd_dev_check_cache_all (dev_id ,
2936
- IOMMU_TEST_DEV_CACHE_DEFAULT );
2937
-
2938
- /* Check data_type by passing zero-length array */
2939
- num_inv = 0 ;
2940
- test_cmd_viommu_invalidate (viommu_id , inv_reqs ,
2941
- sizeof (* inv_reqs ), & num_inv );
2942
- assert (!num_inv );
2943
-
2944
- /* Negative test: Invalid data_type */
2945
- num_inv = 1 ;
2946
- test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2947
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST_INVALID ,
2948
- sizeof (* inv_reqs ), & num_inv );
2949
- assert (!num_inv );
2950
-
2951
- /* Negative test: structure size sanity */
2952
- num_inv = 1 ;
2953
- test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2954
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2955
- sizeof (* inv_reqs ) + 1 , & num_inv );
2956
- assert (!num_inv );
2957
-
2958
- num_inv = 1 ;
2959
- test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2960
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2961
- 1 , & num_inv );
2962
- assert (!num_inv );
2963
-
2964
- /* Negative test: invalid flag is passed */
2965
- num_inv = 1 ;
2966
- inv_reqs [0 ].flags = 0xffffffff ;
2967
- inv_reqs [0 ].vdev_id = 0x99 ;
2968
- test_err_viommu_invalidate (EOPNOTSUPP , viommu_id , inv_reqs ,
2969
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2970
- sizeof (* inv_reqs ), & num_inv );
2971
- assert (!num_inv );
2972
-
2973
- /* Negative test: invalid data_uptr when array is not empty */
2974
- num_inv = 1 ;
2975
- inv_reqs [0 ].flags = 0 ;
2976
- inv_reqs [0 ].vdev_id = 0x99 ;
2977
- test_err_viommu_invalidate (EINVAL , viommu_id , NULL ,
2978
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2979
- sizeof (* inv_reqs ), & num_inv );
2980
- assert (!num_inv );
2981
-
2982
- /* Negative test: invalid entry_len when array is not empty */
2983
- num_inv = 1 ;
2984
- inv_reqs [0 ].flags = 0 ;
2985
- inv_reqs [0 ].vdev_id = 0x99 ;
2986
- test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2987
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2988
- 0 , & num_inv );
2989
- assert (!num_inv );
2990
-
2991
- /* Negative test: invalid cache_id */
2992
- num_inv = 1 ;
2993
- inv_reqs [0 ].flags = 0 ;
2994
- inv_reqs [0 ].vdev_id = 0x99 ;
2995
- inv_reqs [0 ].cache_id = MOCK_DEV_CACHE_ID_MAX + 1 ;
2996
- test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2997
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2998
- sizeof (* inv_reqs ), & num_inv );
2999
- assert (!num_inv );
2929
+ if (!dev_id )
2930
+ SKIP (return , "Skipping test for variant no_viommu" );
3000
2931
3001
- /* Negative test: invalid vdev_id */
3002
- num_inv = 1 ;
3003
- inv_reqs [0 ].flags = 0 ;
3004
- inv_reqs [0 ].vdev_id = 0x9 ;
3005
- inv_reqs [0 ].cache_id = 0 ;
3006
- test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
3007
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
3008
- sizeof (* inv_reqs ), & num_inv );
3009
- assert (!num_inv );
2932
+ test_cmd_vdevice_alloc (viommu_id , dev_id , 0x99 , & vdev_id );
2933
+
2934
+ test_cmd_dev_check_cache_all (dev_id , IOMMU_TEST_DEV_CACHE_DEFAULT );
2935
+
2936
+ /* Check data_type by passing zero-length array */
2937
+ num_inv = 0 ;
2938
+ test_cmd_viommu_invalidate (viommu_id , inv_reqs , sizeof (* inv_reqs ),
2939
+ & num_inv );
2940
+ assert (!num_inv );
2941
+
2942
+ /* Negative test: Invalid data_type */
2943
+ num_inv = 1 ;
2944
+ test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2945
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST_INVALID ,
2946
+ sizeof (* inv_reqs ), & num_inv );
2947
+ assert (!num_inv );
2948
+
2949
+ /* Negative test: structure size sanity */
2950
+ num_inv = 1 ;
2951
+ test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2952
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2953
+ sizeof (* inv_reqs ) + 1 , & num_inv );
2954
+ assert (!num_inv );
2955
+
2956
+ num_inv = 1 ;
2957
+ test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2958
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST , 1 ,
2959
+ & num_inv );
2960
+ assert (!num_inv );
2961
+
2962
+ /* Negative test: invalid flag is passed */
2963
+ num_inv = 1 ;
2964
+ inv_reqs [0 ].flags = 0xffffffff ;
2965
+ inv_reqs [0 ].vdev_id = 0x99 ;
2966
+ test_err_viommu_invalidate (EOPNOTSUPP , viommu_id , inv_reqs ,
2967
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2968
+ sizeof (* inv_reqs ), & num_inv );
2969
+ assert (!num_inv );
2970
+
2971
+ /* Negative test: invalid data_uptr when array is not empty */
2972
+ num_inv = 1 ;
2973
+ inv_reqs [0 ].flags = 0 ;
2974
+ inv_reqs [0 ].vdev_id = 0x99 ;
2975
+ test_err_viommu_invalidate (EINVAL , viommu_id , NULL ,
2976
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2977
+ sizeof (* inv_reqs ), & num_inv );
2978
+ assert (!num_inv );
2979
+
2980
+ /* Negative test: invalid entry_len when array is not empty */
2981
+ num_inv = 1 ;
2982
+ inv_reqs [0 ].flags = 0 ;
2983
+ inv_reqs [0 ].vdev_id = 0x99 ;
2984
+ test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2985
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST , 0 ,
2986
+ & num_inv );
2987
+ assert (!num_inv );
2988
+
2989
+ /* Negative test: invalid cache_id */
2990
+ num_inv = 1 ;
2991
+ inv_reqs [0 ].flags = 0 ;
2992
+ inv_reqs [0 ].vdev_id = 0x99 ;
2993
+ inv_reqs [0 ].cache_id = MOCK_DEV_CACHE_ID_MAX + 1 ;
2994
+ test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
2995
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
2996
+ sizeof (* inv_reqs ), & num_inv );
2997
+ assert (!num_inv );
2998
+
2999
+ /* Negative test: invalid vdev_id */
3000
+ num_inv = 1 ;
3001
+ inv_reqs [0 ].flags = 0 ;
3002
+ inv_reqs [0 ].vdev_id = 0x9 ;
3003
+ inv_reqs [0 ].cache_id = 0 ;
3004
+ test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
3005
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
3006
+ sizeof (* inv_reqs ), & num_inv );
3007
+ assert (!num_inv );
3010
3008
3011
- /*
3012
- * Invalidate the 1st cache entry but fail the 2nd request
3013
- * due to invalid flags configuration in the 2nd request.
3014
- */
3015
- num_inv = 2 ;
3016
- inv_reqs [0 ].flags = 0 ;
3017
- inv_reqs [0 ].vdev_id = 0x99 ;
3018
- inv_reqs [0 ].cache_id = 0 ;
3019
- inv_reqs [1 ].flags = 0xffffffff ;
3020
- inv_reqs [1 ].vdev_id = 0x99 ;
3021
- inv_reqs [1 ].cache_id = 1 ;
3022
- test_err_viommu_invalidate (EOPNOTSUPP , viommu_id , inv_reqs ,
3023
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
3024
- sizeof (* inv_reqs ), & num_inv );
3025
- assert (num_inv == 1 );
3026
- test_cmd_dev_check_cache (dev_id , 0 , 0 );
3027
- test_cmd_dev_check_cache (dev_id , 1 ,
3028
- IOMMU_TEST_DEV_CACHE_DEFAULT );
3029
- test_cmd_dev_check_cache (dev_id , 2 ,
3030
- IOMMU_TEST_DEV_CACHE_DEFAULT );
3031
- test_cmd_dev_check_cache (dev_id , 3 ,
3032
- IOMMU_TEST_DEV_CACHE_DEFAULT );
3033
-
3034
- /*
3035
- * Invalidate the 1st cache entry but fail the 2nd request
3036
- * due to invalid cache_id configuration in the 2nd request.
3037
- */
3038
- num_inv = 2 ;
3039
- inv_reqs [0 ].flags = 0 ;
3040
- inv_reqs [0 ].vdev_id = 0x99 ;
3041
- inv_reqs [0 ].cache_id = 0 ;
3042
- inv_reqs [1 ].flags = 0 ;
3043
- inv_reqs [1 ].vdev_id = 0x99 ;
3044
- inv_reqs [1 ].cache_id = MOCK_DEV_CACHE_ID_MAX + 1 ;
3045
- test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
3046
- IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
3047
- sizeof (* inv_reqs ), & num_inv );
3048
- assert (num_inv == 1 );
3049
- test_cmd_dev_check_cache (dev_id , 0 , 0 );
3050
- test_cmd_dev_check_cache (dev_id , 1 ,
3051
- IOMMU_TEST_DEV_CACHE_DEFAULT );
3052
- test_cmd_dev_check_cache (dev_id , 2 ,
3053
- IOMMU_TEST_DEV_CACHE_DEFAULT );
3054
- test_cmd_dev_check_cache (dev_id , 3 ,
3055
- IOMMU_TEST_DEV_CACHE_DEFAULT );
3056
-
3057
- /* Invalidate the 2nd cache entry and verify */
3058
- num_inv = 1 ;
3059
- inv_reqs [0 ].flags = 0 ;
3060
- inv_reqs [0 ].vdev_id = 0x99 ;
3061
- inv_reqs [0 ].cache_id = 1 ;
3062
- test_cmd_viommu_invalidate (viommu_id , inv_reqs ,
3063
- sizeof (* inv_reqs ), & num_inv );
3064
- assert (num_inv == 1 );
3065
- test_cmd_dev_check_cache (dev_id , 0 , 0 );
3066
- test_cmd_dev_check_cache (dev_id , 1 , 0 );
3067
- test_cmd_dev_check_cache (dev_id , 2 ,
3068
- IOMMU_TEST_DEV_CACHE_DEFAULT );
3069
- test_cmd_dev_check_cache (dev_id , 3 ,
3070
- IOMMU_TEST_DEV_CACHE_DEFAULT );
3071
-
3072
- /* Invalidate the 3rd and 4th cache entries and verify */
3073
- num_inv = 2 ;
3074
- inv_reqs [0 ].flags = 0 ;
3075
- inv_reqs [0 ].vdev_id = 0x99 ;
3076
- inv_reqs [0 ].cache_id = 2 ;
3077
- inv_reqs [1 ].flags = 0 ;
3078
- inv_reqs [1 ].vdev_id = 0x99 ;
3079
- inv_reqs [1 ].cache_id = 3 ;
3080
- test_cmd_viommu_invalidate (viommu_id , inv_reqs ,
3081
- sizeof (* inv_reqs ), & num_inv );
3082
- assert (num_inv == 2 );
3083
- test_cmd_dev_check_cache_all (dev_id , 0 );
3009
+ /*
3010
+ * Invalidate the 1st cache entry but fail the 2nd request
3011
+ * due to invalid flags configuration in the 2nd request.
3012
+ */
3013
+ num_inv = 2 ;
3014
+ inv_reqs [0 ].flags = 0 ;
3015
+ inv_reqs [0 ].vdev_id = 0x99 ;
3016
+ inv_reqs [0 ].cache_id = 0 ;
3017
+ inv_reqs [1 ].flags = 0xffffffff ;
3018
+ inv_reqs [1 ].vdev_id = 0x99 ;
3019
+ inv_reqs [1 ].cache_id = 1 ;
3020
+ test_err_viommu_invalidate (EOPNOTSUPP , viommu_id , inv_reqs ,
3021
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
3022
+ sizeof (* inv_reqs ), & num_inv );
3023
+ assert (num_inv == 1 );
3024
+ test_cmd_dev_check_cache (dev_id , 0 , 0 );
3025
+ test_cmd_dev_check_cache (dev_id , 1 , IOMMU_TEST_DEV_CACHE_DEFAULT );
3026
+ test_cmd_dev_check_cache (dev_id , 2 , IOMMU_TEST_DEV_CACHE_DEFAULT );
3027
+ test_cmd_dev_check_cache (dev_id , 3 , IOMMU_TEST_DEV_CACHE_DEFAULT );
3084
3028
3085
- /* Invalidate all cache entries for nested_dev_id[1] and verify */
3086
- num_inv = 1 ;
3087
- inv_reqs [0 ].vdev_id = 0x99 ;
3088
- inv_reqs [0 ].flags = IOMMU_TEST_INVALIDATE_FLAG_ALL ;
3089
- test_cmd_viommu_invalidate (viommu_id , inv_reqs ,
3090
- sizeof (* inv_reqs ), & num_inv );
3091
- assert (num_inv == 1 );
3092
- test_cmd_dev_check_cache_all (dev_id , 0 );
3093
- test_ioctl_destroy (vdev_id );
3094
- }
3029
+ /*
3030
+ * Invalidate the 1st cache entry but fail the 2nd request
3031
+ * due to invalid cache_id configuration in the 2nd request.
3032
+ */
3033
+ num_inv = 2 ;
3034
+ inv_reqs [0 ].flags = 0 ;
3035
+ inv_reqs [0 ].vdev_id = 0x99 ;
3036
+ inv_reqs [0 ].cache_id = 0 ;
3037
+ inv_reqs [1 ].flags = 0 ;
3038
+ inv_reqs [1 ].vdev_id = 0x99 ;
3039
+ inv_reqs [1 ].cache_id = MOCK_DEV_CACHE_ID_MAX + 1 ;
3040
+ test_err_viommu_invalidate (EINVAL , viommu_id , inv_reqs ,
3041
+ IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST ,
3042
+ sizeof (* inv_reqs ), & num_inv );
3043
+ assert (num_inv == 1 );
3044
+ test_cmd_dev_check_cache (dev_id , 0 , 0 );
3045
+ test_cmd_dev_check_cache (dev_id , 1 , IOMMU_TEST_DEV_CACHE_DEFAULT );
3046
+ test_cmd_dev_check_cache (dev_id , 2 , IOMMU_TEST_DEV_CACHE_DEFAULT );
3047
+ test_cmd_dev_check_cache (dev_id , 3 , IOMMU_TEST_DEV_CACHE_DEFAULT );
3048
+
3049
+ /* Invalidate the 2nd cache entry and verify */
3050
+ num_inv = 1 ;
3051
+ inv_reqs [0 ].flags = 0 ;
3052
+ inv_reqs [0 ].vdev_id = 0x99 ;
3053
+ inv_reqs [0 ].cache_id = 1 ;
3054
+ test_cmd_viommu_invalidate (viommu_id , inv_reqs , sizeof (* inv_reqs ),
3055
+ & num_inv );
3056
+ assert (num_inv == 1 );
3057
+ test_cmd_dev_check_cache (dev_id , 0 , 0 );
3058
+ test_cmd_dev_check_cache (dev_id , 1 , 0 );
3059
+ test_cmd_dev_check_cache (dev_id , 2 , IOMMU_TEST_DEV_CACHE_DEFAULT );
3060
+ test_cmd_dev_check_cache (dev_id , 3 , IOMMU_TEST_DEV_CACHE_DEFAULT );
3061
+
3062
+ /* Invalidate the 3rd and 4th cache entries and verify */
3063
+ num_inv = 2 ;
3064
+ inv_reqs [0 ].flags = 0 ;
3065
+ inv_reqs [0 ].vdev_id = 0x99 ;
3066
+ inv_reqs [0 ].cache_id = 2 ;
3067
+ inv_reqs [1 ].flags = 0 ;
3068
+ inv_reqs [1 ].vdev_id = 0x99 ;
3069
+ inv_reqs [1 ].cache_id = 3 ;
3070
+ test_cmd_viommu_invalidate (viommu_id , inv_reqs , sizeof (* inv_reqs ),
3071
+ & num_inv );
3072
+ assert (num_inv == 2 );
3073
+ test_cmd_dev_check_cache_all (dev_id , 0 );
3074
+
3075
+ /* Invalidate all cache entries for nested_dev_id[1] and verify */
3076
+ num_inv = 1 ;
3077
+ inv_reqs [0 ].vdev_id = 0x99 ;
3078
+ inv_reqs [0 ].flags = IOMMU_TEST_INVALIDATE_FLAG_ALL ;
3079
+ test_cmd_viommu_invalidate (viommu_id , inv_reqs , sizeof (* inv_reqs ),
3080
+ & num_inv );
3081
+ assert (num_inv == 1 );
3082
+ test_cmd_dev_check_cache_all (dev_id , 0 );
3083
+ test_ioctl_destroy (vdev_id );
3095
3084
}
3096
3085
3097
3086
TEST_F (iommufd_viommu , hw_queue )
0 commit comments