@@ -3260,57 +3260,65 @@ static void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
32603260 }
32613261}
32623262
3263- static int mon_add_all_files (struct kernfs_node * kn , struct rdt_domain_hdr * hdr ,
3264- struct rdt_resource * r , struct rdtgroup * prgrp ,
3265- bool do_sum )
3263+ /*
3264+ * Create a directory for a domain and populate it with monitor files. Create
3265+ * summing monitors when @hdr is NULL. No need to initialize summing monitors.
3266+ */
3267+ static struct kernfs_node * _mkdir_mondata_subdir (struct kernfs_node * parent_kn , char * name ,
3268+ struct rdt_domain_hdr * hdr ,
3269+ struct rdt_resource * r ,
3270+ struct rdtgroup * prgrp , int domid )
32663271{
3267- struct rdt_l3_mon_domain * d ;
32683272 struct rmid_read rr = {0 };
3273+ struct kernfs_node * kn ;
32693274 struct mon_data * priv ;
32703275 struct mon_evt * mevt ;
3271- int ret , domid ;
3276+ int ret ;
32723277
3273- if (!domain_header_is_valid (hdr , RESCTRL_MON_DOMAIN , RDT_RESOURCE_L3 ))
3274- return - EINVAL ;
3278+ kn = kernfs_create_dir (parent_kn , name , parent_kn -> mode , prgrp );
3279+ if (IS_ERR (kn ))
3280+ return kn ;
3281+
3282+ ret = rdtgroup_kn_set_ugid (kn );
3283+ if (ret )
3284+ goto out_destroy ;
32753285
3276- d = container_of (hdr , struct rdt_l3_mon_domain , hdr );
32773286 for_each_mon_event (mevt ) {
32783287 if (mevt -> rid != r -> rid || !mevt -> enabled )
32793288 continue ;
3280- domid = do_sum ? d -> ci_id : d -> hdr .id ;
3281- priv = mon_get_kn_priv (r -> rid , domid , mevt , do_sum );
3282- if (WARN_ON_ONCE (!priv ))
3283- return - EINVAL ;
3289+ priv = mon_get_kn_priv (r -> rid , domid , mevt , !hdr );
3290+ if (WARN_ON_ONCE (!priv )) {
3291+ ret = - EINVAL ;
3292+ goto out_destroy ;
3293+ }
32843294
32853295 ret = mon_addfile (kn , mevt -> name , priv );
32863296 if (ret )
3287- return ret ;
3297+ goto out_destroy ;
32883298
3289- if (! do_sum && resctrl_is_mbm_event (mevt -> evtid ))
3299+ if (hdr && resctrl_is_mbm_event (mevt -> evtid ))
32903300 mon_event_read (& rr , r , hdr , prgrp , & hdr -> cpu_mask , mevt , true);
32913301 }
32923302
3293- return 0 ;
3303+ return kn ;
3304+ out_destroy :
3305+ kernfs_remove (kn );
3306+ return ERR_PTR (ret );
32943307}
32953308
3296- static int mkdir_mondata_subdir (struct kernfs_node * parent_kn ,
3297- struct rdt_domain_hdr * hdr ,
3298- struct rdt_resource * r , struct rdtgroup * prgrp )
3309+ static int mkdir_mondata_subdir_snc (struct kernfs_node * parent_kn ,
3310+ struct rdt_domain_hdr * hdr ,
3311+ struct rdt_resource * r , struct rdtgroup * prgrp )
32993312{
3300- struct kernfs_node * kn , * ckn ;
3313+ struct kernfs_node * ckn , * kn ;
33013314 struct rdt_l3_mon_domain * d ;
33023315 char name [32 ];
3303- bool snc_mode ;
3304- int ret = 0 ;
3305-
3306- lockdep_assert_held (& rdtgroup_mutex );
33073316
33083317 if (!domain_header_is_valid (hdr , RESCTRL_MON_DOMAIN , RDT_RESOURCE_L3 ))
33093318 return - EINVAL ;
33103319
33113320 d = container_of (hdr , struct rdt_l3_mon_domain , hdr );
3312- snc_mode = r -> mon_scope == RESCTRL_L3_NODE ;
3313- sprintf (name , "mon_%s_%02d" , r -> name , snc_mode ? d -> ci_id : d -> hdr .id );
3321+ sprintf (name , "mon_%s_%02d" , r -> name , d -> ci_id );
33143322 kn = kernfs_find_and_get (parent_kn , name );
33153323 if (kn ) {
33163324 /*
@@ -3319,41 +3327,41 @@ static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
33193327 */
33203328 kernfs_put (kn );
33213329 } else {
3322- kn = kernfs_create_dir (parent_kn , name , parent_kn -> mode , prgrp );
3330+ kn = _mkdir_mondata_subdir (parent_kn , name , NULL , r , prgrp , d -> ci_id );
33233331 if (IS_ERR (kn ))
33243332 return PTR_ERR (kn );
3333+ }
33253334
3326- ret = rdtgroup_kn_set_ugid (kn );
3327- if (ret )
3328- goto out_destroy ;
3329- ret = mon_add_all_files (kn , hdr , r , prgrp , snc_mode );
3330- if (ret )
3331- goto out_destroy ;
3335+ sprintf (name , "mon_sub_%s_%02d" , r -> name , hdr -> id );
3336+ ckn = _mkdir_mondata_subdir (kn , name , hdr , r , prgrp , hdr -> id );
3337+ if (IS_ERR (ckn )) {
3338+ kernfs_remove (kn );
3339+ return PTR_ERR (ckn );
33323340 }
33333341
3334- if (snc_mode ) {
3335- sprintf (name , "mon_sub_%s_%02d" , r -> name , hdr -> id );
3336- ckn = kernfs_create_dir (kn , name , parent_kn -> mode , prgrp );
3337- if (IS_ERR (ckn )) {
3338- ret = - EINVAL ;
3339- goto out_destroy ;
3340- }
3342+ kernfs_activate (kn );
3343+ return 0 ;
3344+ }
33413345
3342- ret = rdtgroup_kn_set_ugid (ckn );
3343- if (ret )
3344- goto out_destroy ;
3346+ static int mkdir_mondata_subdir (struct kernfs_node * parent_kn ,
3347+ struct rdt_domain_hdr * hdr ,
3348+ struct rdt_resource * r , struct rdtgroup * prgrp )
3349+ {
3350+ struct kernfs_node * kn ;
3351+ char name [32 ];
33453352
3346- ret = mon_add_all_files (ckn , hdr , r , prgrp , false);
3347- if (ret )
3348- goto out_destroy ;
3349- }
3353+ lockdep_assert_held (& rdtgroup_mutex );
3354+
3355+ if (r -> rid == RDT_RESOURCE_L3 && r -> mon_scope == RESCTRL_L3_NODE )
3356+ return mkdir_mondata_subdir_snc (parent_kn , hdr , r , prgrp );
3357+
3358+ sprintf (name , "mon_%s_%02d" , r -> name , hdr -> id );
3359+ kn = _mkdir_mondata_subdir (parent_kn , name , hdr , r , prgrp , hdr -> id );
3360+ if (IS_ERR (kn ))
3361+ return PTR_ERR (kn );
33503362
33513363 kernfs_activate (kn );
33523364 return 0 ;
3353-
3354- out_destroy :
3355- kernfs_remove (kn );
3356- return ret ;
33573365}
33583366
33593367/*
0 commit comments