@@ -3698,27 +3698,27 @@ static int cpu_stat_show(struct seq_file *seq, void *v)
36983698static int cgroup_io_pressure_show (struct seq_file * seq , void * v )
36993699{
37003700 struct cgroup * cgrp = seq_css (seq )-> cgroup ;
3701- struct psi_group * psi = cgroup_ino (cgrp ) == 1 ? & psi_system : cgrp -> psi ;
3701+ struct psi_group * psi = cgroup_psi (cgrp );
37023702
37033703 return psi_show (seq , psi , PSI_IO );
37043704}
37053705static int cgroup_memory_pressure_show (struct seq_file * seq , void * v )
37063706{
37073707 struct cgroup * cgrp = seq_css (seq )-> cgroup ;
3708- struct psi_group * psi = cgroup_ino (cgrp ) == 1 ? & psi_system : cgrp -> psi ;
3708+ struct psi_group * psi = cgroup_psi (cgrp );
37093709
37103710 return psi_show (seq , psi , PSI_MEM );
37113711}
37123712static int cgroup_cpu_pressure_show (struct seq_file * seq , void * v )
37133713{
37143714 struct cgroup * cgrp = seq_css (seq )-> cgroup ;
3715- struct psi_group * psi = cgroup_ino (cgrp ) == 1 ? & psi_system : cgrp -> psi ;
3715+ struct psi_group * psi = cgroup_psi (cgrp );
37163716
37173717 return psi_show (seq , psi , PSI_CPU );
37183718}
37193719
3720- static ssize_t cgroup_pressure_write (struct kernfs_open_file * of , char * buf ,
3721- size_t nbytes , enum psi_res res )
3720+ static ssize_t pressure_write (struct kernfs_open_file * of , char * buf ,
3721+ size_t nbytes , enum psi_res res )
37223722{
37233723 struct cgroup_file_ctx * ctx = of -> priv ;
37243724 struct psi_trigger * new ;
@@ -3738,7 +3738,7 @@ static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
37383738 return - EBUSY ;
37393739 }
37403740
3741- psi = cgroup_ino (cgrp ) == 1 ? & psi_system : cgrp -> psi ;
3741+ psi = cgroup_psi (cgrp );
37423742 new = psi_trigger_create (psi , buf , res );
37433743 if (IS_ERR (new )) {
37443744 cgroup_put (cgrp );
@@ -3755,21 +3755,86 @@ static ssize_t cgroup_io_pressure_write(struct kernfs_open_file *of,
37553755 char * buf , size_t nbytes ,
37563756 loff_t off )
37573757{
3758- return cgroup_pressure_write (of , buf , nbytes , PSI_IO );
3758+ return pressure_write (of , buf , nbytes , PSI_IO );
37593759}
37603760
37613761static ssize_t cgroup_memory_pressure_write (struct kernfs_open_file * of ,
37623762 char * buf , size_t nbytes ,
37633763 loff_t off )
37643764{
3765- return cgroup_pressure_write (of , buf , nbytes , PSI_MEM );
3765+ return pressure_write (of , buf , nbytes , PSI_MEM );
37663766}
37673767
37683768static ssize_t cgroup_cpu_pressure_write (struct kernfs_open_file * of ,
37693769 char * buf , size_t nbytes ,
37703770 loff_t off )
37713771{
3772- return cgroup_pressure_write (of , buf , nbytes , PSI_CPU );
3772+ return pressure_write (of , buf , nbytes , PSI_CPU );
3773+ }
3774+
3775+ #ifdef CONFIG_IRQ_TIME_ACCOUNTING
3776+ static int cgroup_irq_pressure_show (struct seq_file * seq , void * v )
3777+ {
3778+ struct cgroup * cgrp = seq_css (seq )-> cgroup ;
3779+ struct psi_group * psi = cgroup_psi (cgrp );
3780+
3781+ return psi_show (seq , psi , PSI_IRQ );
3782+ }
3783+
3784+ static ssize_t cgroup_irq_pressure_write (struct kernfs_open_file * of ,
3785+ char * buf , size_t nbytes ,
3786+ loff_t off )
3787+ {
3788+ return pressure_write (of , buf , nbytes , PSI_IRQ );
3789+ }
3790+ #endif
3791+
3792+ static int cgroup_pressure_show (struct seq_file * seq , void * v )
3793+ {
3794+ struct cgroup * cgrp = seq_css (seq )-> cgroup ;
3795+ struct psi_group * psi = cgroup_psi (cgrp );
3796+
3797+ seq_printf (seq , "%d\n" , psi -> enabled );
3798+
3799+ return 0 ;
3800+ }
3801+
3802+ static ssize_t cgroup_pressure_write (struct kernfs_open_file * of ,
3803+ char * buf , size_t nbytes ,
3804+ loff_t off )
3805+ {
3806+ ssize_t ret ;
3807+ int enable ;
3808+ struct cgroup * cgrp ;
3809+ struct psi_group * psi ;
3810+
3811+ ret = kstrtoint (strstrip (buf ), 0 , & enable );
3812+ if (ret )
3813+ return ret ;
3814+
3815+ if (enable < 0 || enable > 1 )
3816+ return - ERANGE ;
3817+
3818+ cgrp = cgroup_kn_lock_live (of -> kn , false);
3819+ if (!cgrp )
3820+ return - ENOENT ;
3821+
3822+ psi = cgroup_psi (cgrp );
3823+ if (psi -> enabled != enable ) {
3824+ int i ;
3825+
3826+ /* show or hide {cpu,memory,io,irq}.pressure files */
3827+ for (i = 0 ; i < NR_PSI_RESOURCES ; i ++ )
3828+ cgroup_file_show (& cgrp -> psi_files [i ], enable );
3829+
3830+ psi -> enabled = enable ;
3831+ if (enable )
3832+ psi_cgroup_restart (psi );
3833+ }
3834+
3835+ cgroup_kn_unlock (of -> kn );
3836+
3837+ return nbytes ;
37733838}
37743839
37753840static __poll_t cgroup_pressure_poll (struct kernfs_open_file * of ,
@@ -3789,6 +3854,9 @@ static void cgroup_pressure_release(struct kernfs_open_file *of)
37893854
37903855bool cgroup_psi_enabled (void )
37913856{
3857+ if (static_branch_likely (& psi_disabled ))
3858+ return false;
3859+
37923860 return (cgroup_feature_disable_mask & (1 << OPT_FEATURE_PRESSURE )) == 0 ;
37933861}
37943862
@@ -5175,25 +5243,43 @@ static struct cftype cgroup_psi_files[] = {
51755243#ifdef CONFIG_PSI
51765244 {
51775245 .name = "io.pressure" ,
5246+ .file_offset = offsetof(struct cgroup , psi_files [PSI_IO ]),
51785247 .seq_show = cgroup_io_pressure_show ,
51795248 .write = cgroup_io_pressure_write ,
51805249 .poll = cgroup_pressure_poll ,
51815250 .release = cgroup_pressure_release ,
51825251 },
51835252 {
51845253 .name = "memory.pressure" ,
5254+ .file_offset = offsetof(struct cgroup , psi_files [PSI_MEM ]),
51855255 .seq_show = cgroup_memory_pressure_show ,
51865256 .write = cgroup_memory_pressure_write ,
51875257 .poll = cgroup_pressure_poll ,
51885258 .release = cgroup_pressure_release ,
51895259 },
51905260 {
51915261 .name = "cpu.pressure" ,
5262+ .file_offset = offsetof(struct cgroup , psi_files [PSI_CPU ]),
51925263 .seq_show = cgroup_cpu_pressure_show ,
51935264 .write = cgroup_cpu_pressure_write ,
51945265 .poll = cgroup_pressure_poll ,
51955266 .release = cgroup_pressure_release ,
51965267 },
5268+ #ifdef CONFIG_IRQ_TIME_ACCOUNTING
5269+ {
5270+ .name = "irq.pressure" ,
5271+ .file_offset = offsetof(struct cgroup , psi_files [PSI_IRQ ]),
5272+ .seq_show = cgroup_irq_pressure_show ,
5273+ .write = cgroup_irq_pressure_write ,
5274+ .poll = cgroup_pressure_poll ,
5275+ .release = cgroup_pressure_release ,
5276+ },
5277+ #endif
5278+ {
5279+ .name = "cgroup.pressure" ,
5280+ .seq_show = cgroup_pressure_show ,
5281+ .write = cgroup_pressure_write ,
5282+ },
51975283#endif /* CONFIG_PSI */
51985284 { } /* terminate */
51995285};
0 commit comments