@@ -811,8 +811,63 @@ static void intel_svm_drain_prq(struct device *dev, int pasid)
811
811
}
812
812
}
813
813
814
+ static int prq_to_iommu_prot (struct page_req_dsc * req )
815
+ {
816
+ int prot = 0 ;
817
+
818
+ if (req -> rd_req )
819
+ prot |= IOMMU_FAULT_PERM_READ ;
820
+ if (req -> wr_req )
821
+ prot |= IOMMU_FAULT_PERM_WRITE ;
822
+ if (req -> exe_req )
823
+ prot |= IOMMU_FAULT_PERM_EXEC ;
824
+ if (req -> pm_req )
825
+ prot |= IOMMU_FAULT_PERM_PRIV ;
826
+
827
+ return prot ;
828
+ }
829
+
830
+ static int
831
+ intel_svm_prq_report (struct device * dev , struct page_req_dsc * desc )
832
+ {
833
+ struct iommu_fault_event event ;
834
+
835
+ if (!dev || !dev_is_pci (dev ))
836
+ return - ENODEV ;
837
+
838
+ /* Fill in event data for device specific processing */
839
+ memset (& event , 0 , sizeof (struct iommu_fault_event ));
840
+ event .fault .type = IOMMU_FAULT_PAGE_REQ ;
841
+ event .fault .prm .addr = desc -> addr ;
842
+ event .fault .prm .pasid = desc -> pasid ;
843
+ event .fault .prm .grpid = desc -> prg_index ;
844
+ event .fault .prm .perm = prq_to_iommu_prot (desc );
845
+
846
+ if (desc -> lpig )
847
+ event .fault .prm .flags |= IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE ;
848
+ if (desc -> pasid_present ) {
849
+ event .fault .prm .flags |= IOMMU_FAULT_PAGE_REQUEST_PASID_VALID ;
850
+ event .fault .prm .flags |= IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID ;
851
+ }
852
+ if (desc -> priv_data_present ) {
853
+ /*
854
+ * Set last page in group bit if private data is present,
855
+ * page response is required as it does for LPIG.
856
+ * iommu_report_device_fault() doesn't understand this vendor
857
+ * specific requirement thus we set last_page as a workaround.
858
+ */
859
+ event .fault .prm .flags |= IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE ;
860
+ event .fault .prm .flags |= IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA ;
861
+ memcpy (event .fault .prm .private_data , desc -> priv_data ,
862
+ sizeof (desc -> priv_data ));
863
+ }
864
+
865
+ return iommu_report_device_fault (dev , & event );
866
+ }
867
+
814
868
static irqreturn_t prq_event_thread (int irq , void * d )
815
869
{
870
+ struct intel_svm_dev * sdev = NULL ;
816
871
struct intel_iommu * iommu = d ;
817
872
struct intel_svm * svm = NULL ;
818
873
int head , tail , handled = 0 ;
@@ -824,7 +879,6 @@ static irqreturn_t prq_event_thread(int irq, void *d)
824
879
tail = dmar_readq (iommu -> reg + DMAR_PQT_REG ) & PRQ_RING_MASK ;
825
880
head = dmar_readq (iommu -> reg + DMAR_PQH_REG ) & PRQ_RING_MASK ;
826
881
while (head != tail ) {
827
- struct intel_svm_dev * sdev ;
828
882
struct vm_area_struct * vma ;
829
883
struct page_req_dsc * req ;
830
884
struct qi_desc resp ;
@@ -860,6 +914,20 @@ static irqreturn_t prq_event_thread(int irq, void *d)
860
914
}
861
915
}
862
916
917
+ if (!sdev || sdev -> sid != req -> rid ) {
918
+ struct intel_svm_dev * t ;
919
+
920
+ sdev = NULL ;
921
+ rcu_read_lock ();
922
+ list_for_each_entry_rcu (t , & svm -> devs , list ) {
923
+ if (t -> sid == req -> rid ) {
924
+ sdev = t ;
925
+ break ;
926
+ }
927
+ }
928
+ rcu_read_unlock ();
929
+ }
930
+
863
931
result = QI_RESP_INVALID ;
864
932
/* Since we're using init_mm.pgd directly, we should never take
865
933
* any faults on kernel addresses. */
@@ -870,6 +938,17 @@ static irqreturn_t prq_event_thread(int irq, void *d)
870
938
if (!is_canonical_address (address ))
871
939
goto bad_req ;
872
940
941
+ /*
942
+ * If prq is to be handled outside iommu driver via receiver of
943
+ * the fault notifiers, we skip the page response here.
944
+ */
945
+ if (svm -> flags & SVM_FLAG_GUEST_MODE ) {
946
+ if (sdev && !intel_svm_prq_report (sdev -> dev , req ))
947
+ goto prq_advance ;
948
+ else
949
+ goto bad_req ;
950
+ }
951
+
873
952
/* If the mm is already defunct, don't handle faults. */
874
953
if (!mmget_not_zero (svm -> mm ))
875
954
goto bad_req ;
@@ -888,24 +967,11 @@ static irqreturn_t prq_event_thread(int irq, void *d)
888
967
goto invalid ;
889
968
890
969
result = QI_RESP_SUCCESS ;
891
- invalid :
970
+ invalid :
892
971
mmap_read_unlock (svm -> mm );
893
972
mmput (svm -> mm );
894
- bad_req :
895
- /* Accounting for major/minor faults? */
896
- rcu_read_lock ();
897
- list_for_each_entry_rcu (sdev , & svm -> devs , list ) {
898
- if (sdev -> sid == req -> rid )
899
- break ;
900
- }
901
- /* Other devices can go away, but the drivers are not permitted
902
- * to unbind while any page faults might be in flight. So it's
903
- * OK to drop the 'lock' here now we have it. */
904
- rcu_read_unlock ();
905
-
906
- if (WARN_ON (& sdev -> list == & svm -> devs ))
907
- sdev = NULL ;
908
-
973
+ bad_req :
974
+ WARN_ON (!sdev );
909
975
if (sdev && sdev -> ops && sdev -> ops -> fault_cb ) {
910
976
int rwxp = (req -> rd_req << 3 ) | (req -> wr_req << 2 ) |
911
977
(req -> exe_req << 1 ) | (req -> pm_req );
@@ -916,7 +982,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
916
982
and these can be NULL. Do not use them below this point! */
917
983
sdev = NULL ;
918
984
svm = NULL ;
919
- no_pasid :
985
+ no_pasid :
920
986
if (req -> lpig || req -> priv_data_present ) {
921
987
/*
922
988
* Per VT-d spec. v3.0 ch7.7, system software must
@@ -941,6 +1007,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
941
1007
resp .qw3 = 0 ;
942
1008
qi_submit_sync (iommu , & resp , 1 , 0 );
943
1009
}
1010
+ prq_advance :
944
1011
head = (head + sizeof (* req )) & PRQ_RING_MASK ;
945
1012
}
946
1013
0 commit comments