@@ -318,29 +318,6 @@ static int remove_queue_mes(struct device_queue_manager *dqm, struct queue *q,
318
318
return r ;
319
319
}
320
320
321
- static void set_perfcount (struct device_queue_manager * dqm , int enable )
322
- {
323
- struct device_process_node * cur ;
324
- struct qcm_process_device * qpd ;
325
- struct queue * q ;
326
- struct mqd_update_info minfo = { 0 };
327
-
328
- if (!dqm )
329
- return ;
330
-
331
- minfo .update_flag = (enable == 1 ? UPDATE_FLAG_PERFCOUNT_ENABLE :
332
- UPDATE_FLAG_PERFCOUNT_DISABLE );
333
- dqm_lock (dqm );
334
- list_for_each_entry (cur , & dqm -> queues , list ) {
335
- qpd = cur -> qpd ;
336
- list_for_each_entry (q , & qpd -> queues_list , list ) {
337
- pqm_update_mqd (qpd -> pqm , q -> properties .queue_id ,
338
- & minfo );
339
- }
340
- }
341
- dqm_unlock (dqm );
342
- }
343
-
344
321
static int remove_all_queues_mes (struct device_queue_manager * dqm )
345
322
{
346
323
struct device_process_node * cur ;
@@ -952,7 +929,7 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
952
929
return retval ;
953
930
}
954
931
955
- static int update_queue (struct device_queue_manager * dqm , struct queue * q ,
932
+ static int update_queue_locked (struct device_queue_manager * dqm , struct queue * q ,
956
933
struct mqd_update_info * minfo )
957
934
{
958
935
int retval = 0 ;
@@ -961,11 +938,9 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,
961
938
struct kfd_process_device * pdd ;
962
939
bool prev_active = false;
963
940
964
- dqm_lock (dqm );
965
941
pdd = kfd_get_process_device_data (q -> device , q -> process );
966
942
if (!pdd ) {
967
- retval = - ENODEV ;
968
- goto out_unlock ;
943
+ return - ENODEV ;
969
944
}
970
945
mqd_mgr = dqm -> mqd_mgrs [get_mqd_type_from_queue_type (
971
946
q -> properties .type )];
@@ -983,13 +958,12 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,
983
958
984
959
/* queue is reset so inaccessable */
985
960
if (pdd -> has_reset_queue ) {
986
- retval = - EACCES ;
987
- goto out_unlock ;
961
+ return - EACCES ;
988
962
}
989
963
990
964
if (retval ) {
991
965
dev_err (dev , "unmap queue failed\n" );
992
- goto out_unlock ;
966
+ return retval ;
993
967
}
994
968
} else if (prev_active &&
995
969
(q -> properties .type == KFD_QUEUE_TYPE_COMPUTE ||
@@ -998,7 +972,7 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,
998
972
999
973
if (!dqm -> sched_running ) {
1000
974
WARN_ONCE (1 , "Update non-HWS queue while stopped\n" );
1001
- goto out_unlock ;
975
+ return retval ;
1002
976
}
1003
977
1004
978
retval = mqd_mgr -> destroy_mqd (mqd_mgr , q -> mqd ,
@@ -1008,7 +982,7 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,
1008
982
KFD_UNMAP_LATENCY_MS , q -> pipe , q -> queue );
1009
983
if (retval ) {
1010
984
dev_err (dev , "destroy mqd failed\n" );
1011
- goto out_unlock ;
985
+ return retval ;
1012
986
}
1013
987
}
1014
988
@@ -1056,11 +1030,43 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,
1056
1030
& q -> properties , current -> mm );
1057
1031
}
1058
1032
1059
- out_unlock :
1033
+ return retval ;
1034
+ }
1035
+
1036
+ static int update_queue (struct device_queue_manager * dqm , struct queue * q ,
1037
+ struct mqd_update_info * minfo )
1038
+ {
1039
+ int retval ;
1040
+
1041
+ dqm_lock (dqm );
1042
+ retval = update_queue_locked (dqm , q , minfo );
1060
1043
dqm_unlock (dqm );
1044
+
1061
1045
return retval ;
1062
1046
}
1063
1047
1048
+ static void set_perfcount (struct device_queue_manager * dqm , int enable )
1049
+ {
1050
+ struct device_process_node * cur ;
1051
+ struct qcm_process_device * qpd ;
1052
+ struct queue * q ;
1053
+ struct mqd_update_info minfo = { 0 };
1054
+
1055
+ if (!dqm )
1056
+ return ;
1057
+
1058
+ minfo .update_flag = (enable == 1 ? UPDATE_FLAG_PERFCOUNT_ENABLE :
1059
+ UPDATE_FLAG_PERFCOUNT_DISABLE );
1060
+ dqm_lock (dqm );
1061
+ list_for_each_entry (cur , & dqm -> queues , list ) {
1062
+ qpd = cur -> qpd ;
1063
+ list_for_each_entry (q , & qpd -> queues_list , list ) {
1064
+ update_queue_locked (dqm , q , & minfo );
1065
+ }
1066
+ }
1067
+ dqm_unlock (dqm );
1068
+ }
1069
+
1064
1070
/* suspend_single_queue does not lock the dqm like the
1065
1071
* evict_process_queues_cpsch or evict_process_queues_nocpsch. You should
1066
1072
* lock the dqm before calling, and unlock after calling.
0 commit comments