summaryrefslogtreecommitdiffstats
path: root/libcgroup.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcgroup.h')
-rw-r--r--libcgroup.h179
1 files changed, 179 insertions, 0 deletions
diff --git a/libcgroup.h b/libcgroup.h
new file mode 100644
index 0000000..0913623
--- /dev/null
+++ b/libcgroup.h
@@ -0,0 +1,179 @@
+/*
+ * Copyright IBM Corporation. 2007
+ *
+ * Author: Balbir Singh <balbir@linux.vnet.ibm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2.1 of the GNU Lesser General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#ifndef _LIBCG_H
+#define _LIBCG_H
+
+#include <features.h>
+
+__BEGIN_DECLS
+
+#include <grp.h>
+#include <linux/types.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#ifndef __USE_GNU
+#define __USE_GNU
+#endif
+
+/* Maximum number of mount points/controllers */
+#define MAX_MNT_ELEMENTS 8
+/* Estimated number of groups created */
+#define MAX_GROUP_ELEMENTS 128
+
+#ifdef DEBUG
+#define dbg(x...) printf(x)
+#else
+#define dbg(x...) do {} while(0)
+#endif
+
+/*
+ * NOTE: Wide characters are not supported at the moment. Wide character support
+ * would require us to use a scanner/parser that can parse beyond ASCII
+ */
+
+/*
+ * These data structures are heavily controller dependent, which means
+ * any changes (additions/removal) of configuration items would have to
+ * be reflected in this library. We might implement a plugin
+ * infrastructure, so that we can deal with such changes with ease.
+ */
+
+struct cpu_controller {
+ /*TODO: Add the cpu.usage file here, also need to automate this.*/
+ char *shares; /* Having strings helps us write them to files */
+ /*
+ * XX: No it does not make a difference. It requires a fprintf anyway
+ * so it needs the qualifier.
+ */
+};
+
+struct cg_group {
+ char *name;
+ uid_t tasks_uid;
+ gid_t tasks_gid;
+ uid_t admin_uid;
+ gid_t admin_gid;
+ struct cpu_controller cpu_config;
+};
+
+/*
+ * A singly linked list suffices since we don't expect too many mount points
+ */
+struct mount_table {
+ char *options; /* Name(s) of the controller */
+ char *mount_point; /* The place where the controller is mounted */
+ struct mount_table *next;
+};
+
+/*
+ * Maintain a list of all group names. These will be used during cleanup
+ */
+struct list_of_names {
+ char *name;
+ struct list_of_names *next;
+};
+
+enum cg_msg_type {
+ CG_MSG_LOAD_FILE,
+ CG_MSG_UNLOAD_FILE,
+ CG_MSG_ERR,
+ CG_MSG_DONE,
+};
+
+enum cgroup_errors {
+ ECGROUPNOTCOMPILED=50000,
+ ECGROUPNOTMOUNTED,
+ ECGROUPNOTEXIST,
+ ECGROUPNOTCREATED,
+ ECGROUPSUBSYSNOTMOUNTED,
+ ECGROUPNOTOWNER,
+ ECGROUPMULTIMOUNTED,/* Controllers bound to different mount points */
+ ECGROUPNOTALLOWED, /* This is the stock error. Default error. */
+ ECGMAXVALUESEXCEEDED,
+ ECGCONTROLLEREXISTS,
+ ECGVALUEEXISTS,
+ ECGINVAL,
+ ECGCONTROLLERCREATEFAILED,
+};
+
+#define CG_MAX_MSG_SIZE 256
+#define CG_SERVER_MSG_PATH "/tmp/control_group"
+#define CG_BACKLOG 5
+
+/* Message's exchanged between server and client */
+struct cg_msg {
+ enum cg_msg_type type;
+ char buf[CG_MAX_MSG_SIZE];
+};
+
+/* Function Prototypes start here */
+int cg_init_group_and_mount_info(void);
+int cg_insert_into_mount_table(const char *name, const char *mount_point);
+void cg_cleanup_mount_table(void);
+int cg_group_admin_perm(char *perm_type, char *value);
+int cg_group_task_perm(char *perm_type, char *value);
+int cg_parse_controller_options(char *controller, char *name_value);
+int cg_insert_group(const char *group_name);
+int chown_recursive(const char* path, uid_t owner, gid_t group);
+int cg_make_directory(struct cg_group *cg_group, const char *group_path);
+char *cg_build_group_path(struct cg_group *cg_group,
+ struct mount_table *mount_info);
+int cg_mount_controllers(void);
+int cg_unmount_controllers(void);
+int cg_load_config(const char *pathname);
+void cg_unload_current_config(void);
+
+#define CG_NV_MAX 100
+#define CG_CONTROLLER_MAX 100
+#define CG_VALUE_MAX 100
+/* Functions and structures that can be used by the application*/
+struct cgroup;
+struct cgroup_controller;
+
+int cgroup_init(void);
+int cgroup_attach_task(struct cgroup *cgroup);
+int cgroup_modify_cgroup(struct cgroup *cgroup);
+int cgroup_create_cgroup(struct cgroup *cgroup, int ignore_ownership);
+int cgroup_delete_cgroup(struct cgroup *cgroup, int ignore_migration);
+int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid);
+
+/* The wrappers for filling libcg structures */
+
+struct cgroup *cgroup_new_cgroup(const char *name, uid_t tasks_uid,
+ gid_t tasks_gid, uid_t control_uid, gid_t control_gid);
+struct cgroup_controller *cgroup_add_controller(struct cgroup *cgroup,
+ const char *name);
+void cgroup_free(struct cgroup **cgroup);
+int cgroup_add_value_string(struct cgroup_controller *controller,
+ const char *name, const char *value);
+int cgroup_add_value_int64(struct cgroup_controller *controller,
+ const char *name, int64_t value);
+int cgroup_add_value_uint64(struct cgroup_controller *controller,
+ const char *name, u_int64_t value);
+int cgroup_add_value_bool(struct cgroup_controller *controller,
+ const char *name, bool value);
+
+__END_DECLS
+
+#endif /* _LIBCG_H */