@@ -772,27 +772,12 @@ static void psi_group_change(struct psi_group *group, int cpu,
772
772
schedule_delayed_work (& group -> avgs_work , PSI_FREQ );
773
773
}
774
774
775
- static struct psi_group * iterate_groups (struct task_struct * task , void * * iter )
775
+ static inline struct psi_group * task_psi_group (struct task_struct * task )
776
776
{
777
- if (* iter == & psi_system )
778
- return NULL ;
779
-
780
777
#ifdef CONFIG_CGROUPS
781
- if (static_branch_likely (& psi_cgroups_enabled )) {
782
- struct cgroup * cgroup = NULL ;
783
-
784
- if (!* iter )
785
- cgroup = task -> cgroups -> dfl_cgrp ;
786
- else
787
- cgroup = cgroup_parent (* iter );
788
-
789
- if (cgroup && cgroup_parent (cgroup )) {
790
- * iter = cgroup ;
791
- return cgroup_psi (cgroup );
792
- }
793
- }
778
+ if (static_branch_likely (& psi_cgroups_enabled ))
779
+ return cgroup_psi (task_dfl_cgroup (task ));
794
780
#endif
795
- * iter = & psi_system ;
796
781
return & psi_system ;
797
782
}
798
783
@@ -815,7 +800,6 @@ void psi_task_change(struct task_struct *task, int clear, int set)
815
800
{
816
801
int cpu = task_cpu (task );
817
802
struct psi_group * group ;
818
- void * iter = NULL ;
819
803
u64 now ;
820
804
821
805
if (!task -> pid )
@@ -825,16 +809,17 @@ void psi_task_change(struct task_struct *task, int clear, int set)
825
809
826
810
now = cpu_clock (cpu );
827
811
828
- while ((group = iterate_groups (task , & iter )))
812
+ group = task_psi_group (task );
813
+ do {
829
814
psi_group_change (group , cpu , clear , set , now , true);
815
+ } while ((group = group -> parent ));
830
816
}
831
817
832
818
void psi_task_switch (struct task_struct * prev , struct task_struct * next ,
833
819
bool sleep )
834
820
{
835
821
struct psi_group * group , * common = NULL ;
836
822
int cpu = task_cpu (prev );
837
- void * iter ;
838
823
u64 now = cpu_clock (cpu );
839
824
840
825
if (next -> pid ) {
@@ -844,16 +829,16 @@ void psi_task_switch(struct task_struct *prev, struct task_struct *next,
844
829
* ancestors with @prev, those will already have @prev's
845
830
* TSK_ONCPU bit set, and we can stop the iteration there.
846
831
*/
847
- iter = NULL ;
848
- while (( group = iterate_groups ( next , & iter ))) {
832
+ group = task_psi_group ( next ) ;
833
+ do {
849
834
if (per_cpu_ptr (group -> pcpu , cpu )-> state_mask &
850
835
PSI_ONCPU ) {
851
836
common = group ;
852
837
break ;
853
838
}
854
839
855
840
psi_group_change (group , cpu , 0 , TSK_ONCPU , now , true);
856
- }
841
+ } while (( group = group -> parent ));
857
842
}
858
843
859
844
if (prev -> pid ) {
@@ -886,9 +871,12 @@ void psi_task_switch(struct task_struct *prev, struct task_struct *next,
886
871
887
872
psi_flags_change (prev , clear , set );
888
873
889
- iter = NULL ;
890
- while ((group = iterate_groups (prev , & iter )) && group != common )
874
+ group = task_psi_group (prev );
875
+ do {
876
+ if (group == common )
877
+ break ;
891
878
psi_group_change (group , cpu , clear , set , now , wake_clock );
879
+ } while ((group = group -> parent ));
892
880
893
881
/*
894
882
* TSK_ONCPU is handled up to the common ancestor. If there are
@@ -898,7 +886,7 @@ void psi_task_switch(struct task_struct *prev, struct task_struct *next,
898
886
*/
899
887
if ((prev -> psi_flags ^ next -> psi_flags ) & ~TSK_ONCPU ) {
900
888
clear &= ~TSK_ONCPU ;
901
- for (; group ; group = iterate_groups ( prev , & iter ) )
889
+ for (; group ; group = group -> parent )
902
890
psi_group_change (group , cpu , clear , set , now , wake_clock );
903
891
}
904
892
}
@@ -908,7 +896,6 @@ void psi_task_switch(struct task_struct *prev, struct task_struct *next,
908
896
void psi_account_irqtime (struct task_struct * task , u32 delta )
909
897
{
910
898
int cpu = task_cpu (task );
911
- void * iter = NULL ;
912
899
struct psi_group * group ;
913
900
struct psi_group_cpu * groupc ;
914
901
u64 now ;
@@ -918,7 +905,8 @@ void psi_account_irqtime(struct task_struct *task, u32 delta)
918
905
919
906
now = cpu_clock (cpu );
920
907
921
- while ((group = iterate_groups (task , & iter ))) {
908
+ group = task_psi_group (task );
909
+ do {
922
910
groupc = per_cpu_ptr (group -> pcpu , cpu );
923
911
924
912
write_seqcount_begin (& groupc -> seq );
@@ -930,7 +918,7 @@ void psi_account_irqtime(struct task_struct *task, u32 delta)
930
918
931
919
if (group -> poll_states & (1 << PSI_IRQ_FULL ))
932
920
psi_schedule_poll_work (group , 1 );
933
- }
921
+ } while (( group = group -> parent ));
934
922
}
935
923
#endif
936
924
@@ -1010,6 +998,7 @@ int psi_cgroup_alloc(struct cgroup *cgroup)
1010
998
return - ENOMEM ;
1011
999
}
1012
1000
group_init (cgroup -> psi );
1001
+ cgroup -> psi -> parent = cgroup_psi (cgroup_parent (cgroup ));
1013
1002
return 0 ;
1014
1003
}
1015
1004
0 commit comments