Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP2:GA
libcpuset
libcpuset-handle-cgroup-mount.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libcpuset-handle-cgroup-mount.diff of Package libcpuset
Subject: libcpuset1, make it handle cpuset mounted as a cgroup controller From Mike Galbraith <mgalbraith@suse.de> Date: Tue Sep 3 15:45:02 CEST 2013 References: bnc#625079, bnc#834223 Signed-off-by: Mike Galbraith <mgalbraith@suse.de> --- libcpuset.c | 166 ++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 124 insertions(+), 42 deletions(-) --- a/libcpuset.c +++ b/libcpuset.c @@ -107,6 +107,69 @@ struct cpuset { /* Discovered cpuset file system mount point */ static char cpusetmnt[PATH_MAX]; +/* Is cpuset mounted as a cgroup controller? */ +static int cpusetmnt_is_cgroup; + +enum { + IDX_TASKS = 0, + IDX_CPUS, + IDX_CPU_EXCLUSIVE, + IDX_MEMS, + IDX_MEM_EXCLUSIVE, + IDX_MEM_HARDWALL, + IDX_MEMORY_MIGRATE, + IDX_MEMORY_PRESSURE, + IDX_MEMORY_PRESSURE_ENABLED, + IDX_MEMORY_SPREAD_PAGE, + IDX_MEMORY_SPREAD_SLAB, + IDX_SCHED_LOAD_BALANCE, + IDX_SCHED_RELAX_DOMAIN_LEVEL, + IDX_NOTIFY_ON_RELEASE, + IDX_RELEASE_AGENT, + IDX_NR_CPUSET_FILES, +}; + +static const char *cpuset_filenames[] = +{ + [IDX_TASKS] = "tasks", + [IDX_CPUS] = "cpus", + [IDX_CPU_EXCLUSIVE] = "cpu_exclusive", + [IDX_MEMS] = "mems", + [IDX_MEM_EXCLUSIVE] = "mem_exclusive", + [IDX_MEM_HARDWALL] = "mem_hardwall", + [IDX_MEMORY_MIGRATE] = "memory_migrate", + [IDX_MEMORY_PRESSURE] = "memory_pressure", + [IDX_MEMORY_PRESSURE_ENABLED] = "memory_pressure_enabled", + [IDX_MEMORY_SPREAD_PAGE] = "memory_spread_page", + [IDX_MEMORY_SPREAD_SLAB] = "memory_spread_slab", + [IDX_SCHED_LOAD_BALANCE] = "sched_load_balance", + [IDX_SCHED_RELAX_DOMAIN_LEVEL] = "sched_relax_domain_level", + [IDX_NOTIFY_ON_RELEASE] = "notify_on_release", + [IDX_RELEASE_AGENT] = "release_agent", +}; + +static const char *cgroup_filenames[] = +{ + [IDX_TASKS] = "tasks", + [IDX_CPUS] = "cpuset.cpus", + [IDX_CPU_EXCLUSIVE] = "cpuset.cpu_exclusive", + [IDX_MEMS] = "cpuset.mems", + [IDX_MEM_EXCLUSIVE] = "cpuset.mem_exclusive", + [IDX_MEM_HARDWALL] = "cpuset.mem_hardwall", + [IDX_MEMORY_MIGRATE] = "cpuset.memory_migrate", + [IDX_MEMORY_PRESSURE] = "cpuset.memory_pressure", + [IDX_MEMORY_PRESSURE_ENABLED] = "cpuset.memory_pressure_enabled", + [IDX_MEMORY_SPREAD_PAGE] = "cpuset.memory_spread_page", + [IDX_MEMORY_SPREAD_SLAB] = "cpuset.memory_spread_slab", + [IDX_SCHED_LOAD_BALANCE] = "cpuset.sched_load_balance", + [IDX_SCHED_RELAX_DOMAIN_LEVEL] = "cpuset.sched_relax_domain_level", + [IDX_NOTIFY_ON_RELEASE] = "notify_on_release", + [IDX_RELEASE_AGENT] = "release_agent", +}; + +/* Pointer to cpuset/cgroup_filenames, depending on detected mount type */ +static const char **filenames = &cpuset_filenames[0]; + /* Stashed copy of cpunodemap[], mapping each cpu to its node. */ static const char *mapfile = "/var/run/cpunodemap"; @@ -234,6 +297,25 @@ static int check() end = strstr(start, " "); *end = '\0'; strcpy(cpusetmnt, start); + /* + * Now check for a -t cgroup vs -t cpuset mount, + * a cgroup mount prefixes files with "cpuset.". + * If neither is found, something is whacky, skip + * this mountpoint. + */ + strcpy(buf, cpusetmnt); + strcat(buf, "/cpuset.cpus"); + if (stat(buf, &statbuf) == 0) { + cpusetmnt_is_cgroup = 1; + filenames = cgroup_filenames; + } else { + strcpy(buf, cpusetmnt); + strcat(buf, "/cpus"); + if (stat(buf, &statbuf) != 0) { + *cpusetmnt = '\0'; + continue; + } + } found = 1; break; } @@ -1664,48 +1746,48 @@ int cpuset_cpu2node(int cpu) static int apply_cpuset_settings(const char *path, const struct cpuset *cp) { if (cp->cpu_exclusive_valid && - store_flag(path, "cpu_exclusive", cp->cpu_exclusive) < 0) + store_flag(path, filenames[IDX_CPU_EXCLUSIVE], cp->cpu_exclusive) < 0) goto err; if (cp->mem_exclusive_valid && - store_flag(path, "mem_exclusive", cp->mem_exclusive) < 0) + store_flag(path, filenames[IDX_MEM_EXCLUSIVE], cp->mem_exclusive) < 0) goto err; if (cp->notify_on_release_valid && - store_flag(path, "notify_on_release", cp->notify_on_release) < 0) + store_flag(path, filenames[IDX_NOTIFY_ON_RELEASE], cp->notify_on_release) < 0) goto err; if (cp->memory_migrate_valid && - exists_flag(path, "memory_migrate")) { - if (store_flag(path, "memory_migrate", cp->memory_migrate) < 0) + exists_flag(path, filenames[IDX_MEMORY_MIGRATE])) { + if (store_flag(path, filenames[IDX_MEMORY_MIGRATE], cp->memory_migrate) < 0) goto err; } if (cp->mem_hardwall_valid && - exists_flag(path, "mem_hardwall")) { - if (store_flag(path, "mem_hardwall", cp->mem_hardwall) < 0) + exists_flag(path, filenames[IDX_MEM_HARDWALL])) { + if (store_flag(path, filenames[IDX_MEM_HARDWALL], cp->mem_hardwall) < 0) goto err; } if (cp->memory_pressure_enabled_valid && - exists_flag(path, "memory_pressure_enabled")) { - if (store_flag(path, "memory_pressure_enabled", cp->memory_pressure_enabled) < 0) + exists_flag(path, filenames[IDX_MEMORY_PRESSURE_ENABLED])) { + if (store_flag(path, filenames[IDX_MEMORY_PRESSURE_ENABLED], cp->memory_pressure_enabled) < 0) goto err; } if (cp->memory_spread_page_valid && - exists_flag(path, "memory_spread_page")) { - if (store_flag(path, "memory_spread_page", cp->memory_spread_page) < 0) + exists_flag(path, filenames[IDX_MEMORY_SPREAD_PAGE])) { + if (store_flag(path, filenames[IDX_MEMORY_SPREAD_PAGE], cp->memory_spread_page) < 0) goto err; } if (cp->memory_spread_slab_valid && - exists_flag(path, "memory_spread_slab")) { - if (store_flag(path, "memory_spread_slab", cp->memory_spread_slab) < 0) + exists_flag(path, filenames[IDX_MEMORY_SPREAD_SLAB])) { + if (store_flag(path, filenames[IDX_MEMORY_SPREAD_SLAB], cp->memory_spread_slab) < 0) goto err; } if (cp->sched_load_balance_valid && - exists_flag(path, "sched_load_balance")) { - if (store_flag(path, "sched_load_balance", cp->sched_load_balance) < 0) + exists_flag(path, filenames[IDX_SCHED_LOAD_BALANCE])) { + if (store_flag(path, filenames[IDX_SCHED_LOAD_BALANCE], cp->sched_load_balance) < 0) goto err; } - if (cp->cpus_valid && store_mask(path, "cpus", cp->cpus) < 0) + if (cp->cpus_valid && store_mask(path, filenames[IDX_CPUS], cp->cpus) < 0) goto err; - if (cp->mems_valid && store_mask(path, "mems", cp->mems) < 0) + if (cp->mems_valid && store_mask(path, filenames[IDX_MEMS], cp->mems) < 0) goto err; return 0; err: @@ -1940,59 +2022,59 @@ int cpuset_query(struct cpuset *cp, cons fullpath(buf, sizeof(buf), relpath); - if (load_flag(buf, &cp->cpu_exclusive, "cpu_exclusive") < 0) + if (load_flag(buf, &cp->cpu_exclusive, filenames[IDX_CPU_EXCLUSIVE]) < 0) goto err; cp->cpu_exclusive_valid = 1; - if (load_flag(buf, &cp->mem_exclusive, "mem_exclusive") < 0) + if (load_flag(buf, &cp->mem_exclusive, filenames[IDX_MEM_EXCLUSIVE]) < 0) goto err; cp->mem_exclusive_valid = 1; - if (load_flag(buf, &cp->notify_on_release, "notify_on_release") < 0) + if (load_flag(buf, &cp->notify_on_release, filenames[IDX_NOTIFY_ON_RELEASE]) < 0) goto err; cp->notify_on_release_valid = 1; - if (exists_flag(buf, "memory_migrate")) { - if (load_flag(buf, &cp->memory_migrate, "memory_migrate") < 0) + if (exists_flag(buf, filenames[IDX_MEMORY_MIGRATE])) { + if (load_flag(buf, &cp->memory_migrate, filenames[IDX_MEMORY_MIGRATE]) < 0) goto err; cp->memory_migrate_valid = 1; } - if (exists_flag(buf, "mem_hardwall")) { - if (load_flag(buf, &cp->mem_hardwall, "mem_hardwall") < 0) + if (exists_flag(buf, filenames[IDX_MEM_HARDWALL])) { + if (load_flag(buf, &cp->mem_hardwall, filenames[IDX_MEM_HARDWALL]) < 0) goto err; cp->mem_hardwall_valid = 1; } - if (exists_flag(buf, "memory_pressure_enabled")) { - if (load_flag(buf, &cp->memory_pressure_enabled, "memory_pressure_enabled") < 0) + if (exists_flag(buf, filenames[IDX_MEMORY_PRESSURE_ENABLED])) { + if (load_flag(buf, &cp->memory_pressure_enabled, filenames[IDX_MEMORY_PRESSURE_ENABLED]) < 0) goto err; cp->memory_pressure_enabled_valid = 1; } - if (exists_flag(buf, "memory_spread_page")) { - if (load_flag(buf, &cp->memory_spread_page, "memory_spread_page") < 0) + if (exists_flag(buf, filenames[IDX_MEMORY_SPREAD_PAGE])) { + if (load_flag(buf, &cp->memory_spread_page, filenames[IDX_MEMORY_SPREAD_PAGE]) < 0) goto err; cp->memory_spread_page_valid = 1; } - if (exists_flag(buf, "memory_spread_slab")) { - if (load_flag(buf, &cp->memory_spread_slab, "memory_spread_slab") < 0) + if (exists_flag(buf, filenames[IDX_MEMORY_SPREAD_SLAB])) { + if (load_flag(buf, &cp->memory_spread_slab, filenames[IDX_MEMORY_SPREAD_SLAB]) < 0) goto err; cp->memory_spread_slab_valid = 1; } - if (exists_flag(buf, "sched_load_balance")) { - if (load_flag(buf, &cp->sched_load_balance, "sched_load_balance") < 0) + if (exists_flag(buf, filenames[IDX_SCHED_LOAD_BALANCE])) { + if (load_flag(buf, &cp->sched_load_balance, filenames[IDX_SCHED_LOAD_BALANCE]) < 0) goto err; cp->sched_load_balance_valid = 1; } - if (load_mask(buf, &cp->cpus, cpuset_cpus_nbits(), "cpus") < 0) + if (load_mask(buf, &cp->cpus, cpuset_cpus_nbits(), filenames[IDX_CPUS]) < 0) goto err; cp->cpus_valid = 1; - if (load_mask(buf, &cp->mems, cpuset_mems_nbits(), "mems") < 0) + if (load_mask(buf, &cp->mems, cpuset_mems_nbits(), filenames[IDX_MEMS]) < 0) goto err; cp->mems_valid = 1; @@ -2724,16 +2806,16 @@ int cpuset_migrate(pid_t pid, const char fullpath(buf2, sizeof(buf2), relpath); - if (load_flag(buf2, &memory_migrate_flag, "memory_migrate") < 0) + if (load_flag(buf2, &memory_migrate_flag, filenames[IDX_MEMORY_MIGRATE]) < 0) return -1; - if (store_flag(buf2, "memory_migrate", 1) < 0) + if (store_flag(buf2, filenames[IDX_MEMORY_MIGRATE], 1) < 0) return -1; - fullpath2(buf, sizeof(buf), relpath, "tasks"); + fullpath2(buf, sizeof(buf), relpath, filenames[IDX_TASKS]); r = __cpuset_move(pid, buf); - store_flag(buf2, "memory_migrate", memory_migrate_flag); + store_flag(buf2, filenames[IDX_MEMORY_MIGRATE], memory_migrate_flag); return r; } @@ -2751,19 +2833,19 @@ int cpuset_migrate_all(struct cpuset_pid fullpath(buf2, sizeof(buf2), relpath); - if (load_flag(buf2, &memory_migrate_flag, "memory_migrate") < 0) + if (load_flag(buf2, &memory_migrate_flag, filenames[IDX_MEMORY_MIGRATE]) < 0) return -1; - if (store_flag(buf2, "memory_migrate", 1) < 0) + if (store_flag(buf2, filenames[IDX_MEMORY_MIGRATE], 1) < 0) return -1; - fullpath2(buf, sizeof(buf), relpath, "tasks"); + fullpath2(buf, sizeof(buf), relpath, filenames[IDX_TASKS]); ret = 0; for (i = 0; i < pl->npids; i++) if (__cpuset_move(pl->pids[i], buf) < 0) ret = -1; - if (store_flag(buf2, "memory_migrate", memory_migrate_flag) < 0) + if (store_flag(buf2, filenames[IDX_MEMORY_MIGRATE], memory_migrate_flag) < 0) ret = -1; return ret; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor