unnecessarily complicated and probably done this way because event
   delivery itself was expensive.
 
-Unified hierarchy implements an interface file "cgroup.populated"
-which can be used to monitor whether the cgroup's subhierarchy has
-tasks in it or not.  Its value is 0 if there is no task in the cgroup
-and its descendants; otherwise, 1.  poll and [id]notify events are
-triggered when the value changes.
+Unified hierarchy implements "populated" field in "cgroup.events"
+interface file which can be used to monitor whether the cgroup's
+subhierarchy has tasks in it or not.  Its value is 0 if there is no
+task in the cgroup and its descendants; otherwise, 1.  poll and
+[id]notify events are triggered when the value changes.
 
 This is significantly lighter and simpler and trivially allows
 delegating management of subhierarchy - subhierarchy monitoring can
   the first entry in the file.  Specific entries can use "default" as
   its value to indicate inheritance of the default value.
 
+- For events which are not very high frequency, an interface file
+  "events" should be created which lists event key value pairs.
+  Whenever a notifiable event happens, file modified event should be
+  generated on the file.
+
 
 5-4. Per-Controller Changes
 
 
 
        struct kernfs_node *kn;         /* cgroup kernfs entry */
        struct kernfs_node *procs_kn;   /* kn for "cgroup.procs" */
-       struct kernfs_node *populated_kn; /* kn for "cgroup.subtree_populated" */
+       struct kernfs_node *events_kn;  /* kn for "cgroup.events" */
 
        /*
         * The bitmask of subsystems enabled on the child cgroups.
 
                if (!trigger)
                        break;
 
-               if (cgrp->populated_kn)
-                       kernfs_notify(cgrp->populated_kn);
+               if (cgrp->events_kn)
+                       kernfs_notify(cgrp->events_kn);
                cgrp = cgroup_parent(cgrp);
        } while (cgrp);
 }
        goto out_unlock;
 }
 
-static int cgroup_populated_show(struct seq_file *seq, void *v)
+static int cgroup_events_show(struct seq_file *seq, void *v)
 {
-       seq_printf(seq, "%d\n", (bool)seq_css(seq)->cgroup->populated_cnt);
+       seq_printf(seq, "populated %d\n",
+                  (bool)seq_css(seq)->cgroup->populated_cnt);
        return 0;
 }
 
 
        if (cft->write == cgroup_procs_write)
                cgrp->procs_kn = kn;
-       else if (cft->seq_show == cgroup_populated_show)
-               cgrp->populated_kn = kn;
+       else if (cft->seq_show == cgroup_events_show)
+               cgrp->events_kn = kn;
        return 0;
 }
 
                .write = cgroup_subtree_control_write,
        },
        {
-               .name = "cgroup.populated",
+               .name = "cgroup.events",
                .flags = CFTYPE_NOT_ON_ROOT,
-               .seq_show = cgroup_populated_show,
+               .seq_show = cgroup_events_show,
        },
        { }     /* terminate */
 };