On 01.12.20 09:21, Juergen Gross wrote: > Add /cpupool/ directories to hypfs. Those are completely > dynamic, so the related hypfs access functions need to be implemented. > > Signed-off-by: Juergen Gross > --- > V2: > - added const (Jan Beulich) > - call hypfs_add_dir() in helper (Dario Faggioli) > - switch locking to enter/exit callbacks > --- > docs/misc/hypfs-paths.pandoc | 9 +++ > xen/common/sched/cpupool.c | 122 +++++++++++++++++++++++++++++++++++ > 2 files changed, 131 insertions(+) > > diff --git a/docs/misc/hypfs-paths.pandoc b/docs/misc/hypfs-paths.pandoc > index 6c7b2f7ee3..aaca1cdf92 100644 > --- a/docs/misc/hypfs-paths.pandoc > +++ b/docs/misc/hypfs-paths.pandoc > @@ -175,6 +175,15 @@ The major version of Xen. > > The minor version of Xen. > > +#### /cpupool/ > + > +A directory of all current cpupools. > + > +#### /cpupool/*/ > + > +The individual cpupools. Each entry is a directory with the name being the > +cpupool-id (e.g. /cpupool/0/). > + > #### /params/ > > A directory of runtime parameters. > diff --git a/xen/common/sched/cpupool.c b/xen/common/sched/cpupool.c > index 0db7d77219..3e17fdf95b 100644 > --- a/xen/common/sched/cpupool.c > +++ b/xen/common/sched/cpupool.c > @@ -13,6 +13,8 @@ > > #include > #include > +#include > +#include > #include > #include > #include > @@ -33,6 +35,7 @@ static int cpupool_moving_cpu = -1; > static struct cpupool *cpupool_cpu_moving = NULL; > static cpumask_t cpupool_locked_cpus; > > +/* This lock nests inside sysctl or hypfs lock. */ > static DEFINE_SPINLOCK(cpupool_lock); > > static enum sched_gran __read_mostly opt_sched_granularity = SCHED_GRAN_cpu; > @@ -1003,12 +1006,131 @@ static struct notifier_block cpu_nfb = { > .notifier_call = cpu_callback > }; > > +#ifdef CONFIG_HYPFS > +static const struct hypfs_entry *cpupool_pooldir_enter( > + const struct hypfs_entry *entry); > + > +static struct hypfs_funcs cpupool_pooldir_funcs = { > + .enter = cpupool_pooldir_enter, > + .exit = hypfs_node_exit, > + .read = hypfs_read_dir, > + .write = hypfs_write_deny, > + .getsize = hypfs_getsize, > + .findentry = hypfs_dir_findentry, > +}; > + > +static HYPFS_VARDIR_INIT(cpupool_pooldir, "%u", &cpupool_pooldir_funcs); > + > +static const struct hypfs_entry *cpupool_pooldir_enter( > + const struct hypfs_entry *entry) > +{ > + return &cpupool_pooldir.e; > +} I have found a more generic way to handle entering a dyndir node, resulting in no need to have cpupool_pooldir_enter() and cpupool_pooldir_funcs. This will add some more lines to the previous patch, but less than saved here. Juergen