@@ -152,6 +152,9 @@ struct mock_viommu {
152152 struct mock_iommu_domain * s2_parent ;
153153 struct mock_hw_queue * hw_queue [IOMMU_TEST_HW_QUEUE_MAX ];
154154 struct mutex queue_mutex ;
155+
156+ unsigned long mmap_offset ;
157+ u32 * page ; /* Mmap page to test u32 type of in_data */
155158};
156159
157160static inline struct mock_viommu * to_mock_viommu (struct iommufd_viommu * viommu )
@@ -689,6 +692,10 @@ static void mock_viommu_destroy(struct iommufd_viommu *viommu)
689692
690693 if (refcount_dec_and_test (& mock_iommu -> users ))
691694 complete (& mock_iommu -> complete );
695+ if (mock_viommu -> mmap_offset )
696+ iommufd_viommu_destroy_mmap (& mock_viommu -> core ,
697+ mock_viommu -> mmap_offset );
698+ free_page ((unsigned long )mock_viommu -> page );
692699 mutex_destroy (& mock_viommu -> queue_mutex );
693700
694701 /* iommufd core frees mock_viommu and viommu */
@@ -887,11 +894,28 @@ static int mock_viommu_init(struct iommufd_viommu *viommu,
887894 if (rc )
888895 return rc ;
889896
897+ /* Allocate two pages */
898+ mock_viommu -> page =
899+ (u32 * )__get_free_pages (GFP_KERNEL | __GFP_ZERO , 1 );
900+ if (!mock_viommu -> page )
901+ return - ENOMEM ;
902+
903+ rc = iommufd_viommu_alloc_mmap (& mock_viommu -> core ,
904+ __pa (mock_viommu -> page ),
905+ PAGE_SIZE * 2 ,
906+ & mock_viommu -> mmap_offset );
907+ if (rc )
908+ goto err_free_page ;
909+
910+ /* For loopback tests on both the page and out_data */
911+ * mock_viommu -> page = data .in_data ;
890912 data .out_data = data .in_data ;
913+ data .out_mmap_length = PAGE_SIZE * 2 ;
914+ data .out_mmap_offset = mock_viommu -> mmap_offset ;
891915 rc = iommu_copy_struct_to_user (
892916 user_data , & data , IOMMU_VIOMMU_TYPE_SELFTEST , out_data );
893917 if (rc )
894- return rc ;
918+ goto err_destroy_mmap ;
895919 }
896920
897921 refcount_inc (& mock_iommu -> users );
@@ -900,6 +924,13 @@ static int mock_viommu_init(struct iommufd_viommu *viommu,
900924
901925 viommu -> ops = & mock_viommu_ops ;
902926 return 0 ;
927+
928+ err_destroy_mmap :
929+ iommufd_viommu_destroy_mmap (& mock_viommu -> core ,
930+ mock_viommu -> mmap_offset );
931+ err_free_page :
932+ free_page ((unsigned long )mock_viommu -> page );
933+ return rc ;
903934}
904935
905936static const struct iommu_ops mock_ops = {
0 commit comments