summaryrefslogtreecommitdiff
path: root/cgroup.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgroup.c')
-rw-r--r--cgroup.c209
1 files changed, 0 insertions, 209 deletions
diff --git a/cgroup.c b/cgroup.c
deleted file mode 100644
index a297e2ac..00000000
--- a/cgroup.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Code related to setting up a blkio cgroup
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <mntent.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include "fio.h"
-#include "flist.h"
-#include "cgroup.h"
-#include "smalloc.h"
-
-static struct fio_mutex *lock;
-
-struct cgroup_member {
- struct flist_head list;
- char *root;
- unsigned int cgroup_nodelete;
-};
-
-static char *find_cgroup_mnt(struct thread_data *td)
-{
- char *mntpoint = NULL;
- struct mntent *mnt, dummy;
- char buf[256] = {0};
- FILE *f;
-
- f = setmntent("/proc/mounts", "r");
- if (!f) {
- td_verror(td, errno, "setmntent /proc/mounts");
- return NULL;
- }
-
- while ((mnt = getmntent_r(f, &dummy, buf, sizeof(buf))) != NULL) {
- if (!strcmp(mnt->mnt_type, "cgroup") &&
- strstr(mnt->mnt_opts, "blkio"))
- break;
- }
-
- if (mnt)
- mntpoint = smalloc_strdup(mnt->mnt_dir);
- else
- log_err("fio: cgroup blkio does not appear to be mounted\n");
-
- endmntent(f);
- return mntpoint;
-}
-
-static void add_cgroup(struct thread_data *td, const char *name,
- struct flist_head *clist)
-{
- struct cgroup_member *cm;
-
- if (!lock)
- return;
-
- cm = smalloc(sizeof(*cm));
- if (!cm) {
-err:
- log_err("fio: failed to allocate cgroup member\n");
- return;
- }
-
- INIT_FLIST_HEAD(&cm->list);
- cm->root = smalloc_strdup(name);
- if (!cm->root) {
- sfree(cm);
- goto err;
- }
- if (td->o.cgroup_nodelete)
- cm->cgroup_nodelete = 1;
- fio_mutex_down(lock);
- flist_add_tail(&cm->list, clist);
- fio_mutex_up(lock);
-}
-
-void cgroup_kill(struct flist_head *clist)
-{
- struct flist_head *n, *tmp;
- struct cgroup_member *cm;
-
- if (!lock)
- return;
-
- fio_mutex_down(lock);
-
- flist_for_each_safe(n, tmp, clist) {
- cm = flist_entry(n, struct cgroup_member, list);
- if (!cm->cgroup_nodelete)
- rmdir(cm->root);
- flist_del(&cm->list);
- sfree(cm->root);
- sfree(cm);
- }
-
- fio_mutex_up(lock);
-}
-
-static char *get_cgroup_root(struct thread_data *td, char *mnt)
-{
- char *str = malloc(64);
-
- if (td->o.cgroup)
- sprintf(str, "%s/%s", mnt, td->o.cgroup);
- else
- sprintf(str, "%s/%s", mnt, td->o.name);
-
- return str;
-}
-
-static int write_int_to_file(struct thread_data *td, const char *path,
- const char *filename, unsigned int val,
- const char *onerr)
-{
- char tmp[256];
- FILE *f;
-
- sprintf(tmp, "%s/%s", path, filename);
- f = fopen(tmp, "w");
- if (!f) {
- td_verror(td, errno, onerr);
- return 1;
- }
-
- fprintf(f, "%u", val);
- fclose(f);
- return 0;
-
-}
-
-static int cgroup_write_pid(struct thread_data *td, const char *root)
-{
- unsigned int val = td->pid;
-
- return write_int_to_file(td, root, "tasks", val, "cgroup write pid");
-}
-
-/*
- * Move pid to root class
- */
-static int cgroup_del_pid(struct thread_data *td, char *mnt)
-{
- return cgroup_write_pid(td, mnt);
-}
-
-int cgroup_setup(struct thread_data *td, struct flist_head *clist, char **mnt)
-{
- char *root;
-
- if (!*mnt) {
- *mnt = find_cgroup_mnt(td);
- if (!*mnt)
- return 1;
- }
-
- /*
- * Create container, if it doesn't exist
- */
- root = get_cgroup_root(td, *mnt);
- if (mkdir(root, 0755) < 0) {
- int __e = errno;
-
- if (__e != EEXIST) {
- td_verror(td, __e, "cgroup mkdir");
- log_err("fio: path %s\n", root);
- goto err;
- }
- } else
- add_cgroup(td, root, clist);
-
- if (td->o.cgroup_weight) {
- if (write_int_to_file(td, root, "blkio.weight",
- td->o.cgroup_weight,
- "cgroup open weight"))
- goto err;
- }
-
- if (!cgroup_write_pid(td, root)) {
- free(root);
- return 0;
- }
-
-err:
- free(root);
- return 1;
-}
-
-void cgroup_shutdown(struct thread_data *td, char **mnt)
-{
- if (*mnt == NULL)
- return;
- if (!td->o.cgroup_weight && !td->o.cgroup)
- return;
-
- cgroup_del_pid(td, *mnt);
-}
-
-static void fio_init cgroup_init(void)
-{
- lock = fio_mutex_init(FIO_MUTEX_UNLOCKED);
- if (!lock)
- log_err("fio: failed to allocate cgroup lock\n");
-}
-
-static void fio_exit cgroup_exit(void)
-{
- fio_mutex_remove(lock);
-}