@@ -258,6 +258,63 @@ static struct kobj_type damon_sysfs_stats_ktype = {
258258 .default_groups = damon_sysfs_stats_groups ,
259259};
260260
261+ /*
262+ * filters directory
263+ */
264+
265+ struct damon_sysfs_scheme_filters {
266+ struct kobject kobj ;
267+ int nr ;
268+ };
269+
270+ static struct damon_sysfs_scheme_filters *
271+ damon_sysfs_scheme_filters_alloc (void )
272+ {
273+ return kzalloc (sizeof (struct damon_sysfs_scheme_filters ), GFP_KERNEL );
274+ }
275+
276+ static ssize_t nr_filters_show (struct kobject * kobj ,
277+ struct kobj_attribute * attr , char * buf )
278+ {
279+ struct damon_sysfs_scheme_filters * filters = container_of (kobj ,
280+ struct damon_sysfs_scheme_filters , kobj );
281+
282+ return sysfs_emit (buf , "%d\n" , filters -> nr );
283+ }
284+
285+ static ssize_t nr_filters_store (struct kobject * kobj ,
286+ struct kobj_attribute * attr , const char * buf , size_t count )
287+ {
288+ int nr , err = kstrtoint (buf , 0 , & nr );
289+
290+ if (err )
291+ return err ;
292+ if (nr < 0 )
293+ return - EINVAL ;
294+
295+ return count ;
296+ }
297+
298+ static void damon_sysfs_scheme_filters_release (struct kobject * kobj )
299+ {
300+ kfree (container_of (kobj , struct damon_sysfs_scheme_filters , kobj ));
301+ }
302+
303+ static struct kobj_attribute damon_sysfs_scheme_filters_nr_attr =
304+ __ATTR_RW_MODE (nr_filters , 0600 );
305+
306+ static struct attribute * damon_sysfs_scheme_filters_attrs [] = {
307+ & damon_sysfs_scheme_filters_nr_attr .attr ,
308+ NULL ,
309+ };
310+ ATTRIBUTE_GROUPS (damon_sysfs_scheme_filters );
311+
312+ static struct kobj_type damon_sysfs_scheme_filters_ktype = {
313+ .release = damon_sysfs_scheme_filters_release ,
314+ .sysfs_ops = & kobj_sysfs_ops ,
315+ .default_groups = damon_sysfs_scheme_filters_groups ,
316+ };
317+
261318/*
262319 * watermarks directory
263320 */
@@ -784,6 +841,7 @@ struct damon_sysfs_scheme {
784841 struct damon_sysfs_access_pattern * access_pattern ;
785842 struct damon_sysfs_quotas * quotas ;
786843 struct damon_sysfs_watermarks * watermarks ;
844+ struct damon_sysfs_scheme_filters * filters ;
787845 struct damon_sysfs_stats * stats ;
788846 struct damon_sysfs_scheme_regions * tried_regions ;
789847};
@@ -878,6 +936,24 @@ static int damon_sysfs_scheme_set_watermarks(struct damon_sysfs_scheme *scheme)
878936 return err ;
879937}
880938
939+ static int damon_sysfs_scheme_set_filters (struct damon_sysfs_scheme * scheme )
940+ {
941+ struct damon_sysfs_scheme_filters * filters =
942+ damon_sysfs_scheme_filters_alloc ();
943+ int err ;
944+
945+ if (!filters )
946+ return - ENOMEM ;
947+ err = kobject_init_and_add (& filters -> kobj ,
948+ & damon_sysfs_scheme_filters_ktype , & scheme -> kobj ,
949+ "filters" );
950+ if (err )
951+ kobject_put (& filters -> kobj );
952+ else
953+ scheme -> filters = filters ;
954+ return err ;
955+ }
956+
881957static int damon_sysfs_scheme_set_stats (struct damon_sysfs_scheme * scheme )
882958{
883959 struct damon_sysfs_stats * stats = damon_sysfs_stats_alloc ();
@@ -926,9 +1002,12 @@ static int damon_sysfs_scheme_add_dirs(struct damon_sysfs_scheme *scheme)
9261002 err = damon_sysfs_scheme_set_watermarks (scheme );
9271003 if (err )
9281004 goto put_quotas_access_pattern_out ;
929- err = damon_sysfs_scheme_set_stats (scheme );
1005+ err = damon_sysfs_scheme_set_filters (scheme );
9301006 if (err )
9311007 goto put_watermarks_quotas_access_pattern_out ;
1008+ err = damon_sysfs_scheme_set_stats (scheme );
1009+ if (err )
1010+ goto put_filters_watermarks_quotas_access_pattern_out ;
9321011 err = damon_sysfs_scheme_set_tried_regions (scheme );
9331012 if (err )
9341013 goto put_tried_regions_out ;
@@ -937,6 +1016,9 @@ static int damon_sysfs_scheme_add_dirs(struct damon_sysfs_scheme *scheme)
9371016put_tried_regions_out :
9381017 kobject_put (& scheme -> tried_regions -> kobj );
9391018 scheme -> tried_regions = NULL ;
1019+ put_filters_watermarks_quotas_access_pattern_out :
1020+ kobject_put (& scheme -> filters -> kobj );
1021+ scheme -> filters = NULL ;
9401022put_watermarks_quotas_access_pattern_out :
9411023 kobject_put (& scheme -> watermarks -> kobj );
9421024 scheme -> watermarks = NULL ;
@@ -956,6 +1038,7 @@ static void damon_sysfs_scheme_rm_dirs(struct damon_sysfs_scheme *scheme)
9561038 damon_sysfs_quotas_rm_dirs (scheme -> quotas );
9571039 kobject_put (& scheme -> quotas -> kobj );
9581040 kobject_put (& scheme -> watermarks -> kobj );
1041+ kobject_put (& scheme -> filters -> kobj );
9591042 kobject_put (& scheme -> stats -> kobj );
9601043 damon_sysfs_scheme_regions_rm_dirs (scheme -> tried_regions );
9611044 kobject_put (& scheme -> tried_regions -> kobj );
0 commit comments