From: Pavel Emelianov <xemul@sw.ru>
To: Andrew Morton <akpm@osdl.org>, Paul Menage <menage@google.com>,
Srivatsa Vaddagiri <vatsa@in.ibm.com>,
Balbir Singh <balbir@in.ibm.com>
Cc: devel@openvz.org,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
containers@lists.osdl.org, Kirill Korotaev <dev@sw.ru>
Subject: [RFC][PATCH 2/7] RSS controller core
Date: Tue, 06 Mar 2007 17:55:29 +0300 [thread overview]
Message-ID: <45ED80E1.7030406@sw.ru> (raw)
In-Reply-To: <45ED7DEC.7010403@sw.ru>
[-- Attachment #1: Type: text/plain, Size: 159 bytes --]
This includes setup of RSS container within generic
process containers, all the declarations used in RSS
accounting, and core code responsible for accounting.
[-- Attachment #2: diff-rss-container-core --]
[-- Type: text/plain, Size: 9872 bytes --]
diff -upr linux-2.6.20.orig/include/linux/rss_container.h linux-2.6.20-0/include/linux/rss_container.h
--- linux-2.6.20.orig/include/linux/rss_container.h 2007-03-06 13:39:17.000000000 +0300
+++ linux-2.6.20-0/include/linux/rss_container.h 2007-03-06 13:33:28.000000000 +0300
@@ -0,0 +1,68 @@
+#ifndef __RSS_CONTAINER_H__
+#define __RSS_CONTAINER_H__
+/*
+ * RSS container
+ *
+ * Copyright 2007 OpenVZ SWsoft Inc
+ *
+ * Author: Pavel Emelianov <xemul@openvz.org>
+ *
+ */
+
+struct page_container;
+struct rss_container;
+
+#ifdef CONFIG_RSS_CONTAINER
+int container_rss_prepare(struct page *, struct vm_area_struct *vma,
+ struct page_container **);
+
+void container_rss_add(struct page_container *);
+void container_rss_del(struct page_container *);
+void container_rss_release(struct page_container *);
+
+int mm_init_container(struct mm_struct *mm, struct task_struct *tsk);
+void mm_free_container(struct mm_struct *mm);
+
+unsigned long container_isolate_pages(unsigned long nr_to_scan,
+ struct rss_container *rss, struct list_head *dst,
+ int active, unsigned long *scanned);
+unsigned long container_nr_physpages(struct rss_container *rss);
+
+unsigned long container_try_to_free_pages(struct rss_container *);
+void container_out_of_memory(struct rss_container *);
+
+void container_rss_init_early(void);
+#else
+static inline int container_rss_prepare(struct page *pg,
+ struct vm_area_struct *vma, struct page_container **pc)
+{
+ *pc = NULL; /* to make gcc happy */
+ return 0;
+}
+
+static inline void container_rss_add(struct page_container *pc)
+{
+}
+
+static inline void container_rss_del(struct page_container *pc)
+{
+}
+
+static inline void container_rss_release(struct page_container *pc)
+{
+}
+
+static inline int mm_init_container(struct mm_struct *mm, struct task_struct *t)
+{
+ return 0;
+}
+
+static inline void mm_free_container(struct mm_struct *mm)
+{
+}
+
+static inline void container_rss_init_early(void)
+{
+}
+#endif
+#endif
diff -upr linux-2.6.20.orig/init/Kconfig linux-2.6.20-0/init/Kconfig
--- linux-2.6.20.orig/init/Kconfig 2007-03-06 13:33:28.000000000 +0300
+++ linux-2.6.20-0/init/Kconfig 2007-03-06 13:33:28.000000000 +0300
@@ -265,6 +265,13 @@ config CPUSETS
bool
select CONTAINERS
+config RSS_CONTAINER
+ bool "RSS accounting container"
+ select RESOURCE_COUNTERS
+ help
+ Provides a simple Resource Controller for monitoring and
+ controlling the total Resident Set Size of the tasks in a container
+
config SYSFS_DEPRECATED
bool "Create deprecated sysfs files"
default y
diff -upr linux-2.6.20.orig/mm/Makefile linux-2.6.20-0/mm/Makefile
--- linux-2.6.20.orig/mm/Makefile 2007-02-04 21:44:54.000000000 +0300
+++ linux-2.6.20-0/mm/Makefile 2007-03-06 13:33:28.000000000 +0300
@@ -29,3 +29,5 @@ obj-$(CONFIG_MEMORY_HOTPLUG) += memory_h
obj-$(CONFIG_FS_XIP) += filemap_xip.o
obj-$(CONFIG_MIGRATION) += migrate.o
obj-$(CONFIG_SMP) += allocpercpu.o
+
+obj-$(CONFIG_RSS_CONTAINER) += rss_container.o
diff -upr linux-2.6.20.orig/mm/rss_container.c linux-2.6.20-0/mm/rss_container.c
--- linux-2.6.20.orig/mm/rss_container.c 2007-03-06 13:39:17.000000000 +0300
+++ linux-2.6.20-0/mm/rss_container.c 2007-03-06 13:33:28.000000000 +0300
@@ -0,0 +1,307 @@
+/*
+ * RSS accounting container
+ *
+ * Copyright 2007 OpenVZ SWsoft Inc
+ *
+ * Author: Pavel Emelianov <xemul@openvz.org>
+ *
+ */
+
+#include <linux/list.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/res_counter.h>
+#include <linux/rss_container.h>
+
+static struct container_subsys rss_subsys;
+
+struct rss_container {
+ struct res_counter res;
+ struct list_head page_list;
+ struct container_subsys_state css;
+};
+
+struct page_container {
+ struct page *page;
+ struct rss_container *cnt;
+ struct list_head list;
+};
+
+static inline struct rss_container *rss_from_cont(struct container *cnt)
+{
+ return container_of(container_subsys_state(cnt, &rss_subsys),
+ struct rss_container, css);
+}
+
+int mm_init_container(struct mm_struct *mm, struct task_struct *tsk)
+{
+ struct rss_container *cnt;
+
+ cnt = rss_from_cont(task_container(tsk, &rss_subsys));
+ if (css_get(&cnt->css))
+ return -EBUSY;
+
+ mm->rss_container = cnt;
+ return 0;
+}
+
+void mm_free_container(struct mm_struct *mm)
+{
+ css_put(&mm->rss_container->css);
+}
+
+int container_rss_prepare(struct page *page, struct vm_area_struct *vma,
+ struct page_container **ppc)
+{
+ struct rss_container *rss;
+ struct page_container *pc;
+
+ rcu_read_lock();
+ rss = rcu_dereference(vma->vm_mm->rss_container);
+ css_get_current(&rss->css);
+ rcu_read_unlock();
+
+ pc = kmalloc(sizeof(struct page_container), GFP_KERNEL);
+ if (pc == NULL)
+ goto out_nomem;
+
+ while (res_counter_charge(&rss->res, 1)) {
+ if (container_try_to_free_pages(rss))
+ continue;
+
+ container_out_of_memory(rss);
+ if (test_thread_flag(TIF_MEMDIE))
+ goto out_charge;
+ }
+
+ pc->page = page;
+ pc->cnt = rss;
+ *ppc = pc;
+ return 0;
+
+out_charge:
+ kfree(pc);
+out_nomem:
+ css_put(&rss->css);
+ return -ENOMEM;
+}
+
+void container_rss_release(struct page_container *pc)
+{
+ struct rss_container *rss;
+
+ rss = pc->cnt;
+ res_counter_uncharge(&rss->res, 1);
+ css_put(&rss->css);
+ kfree(pc);
+}
+
+void container_rss_add(struct page_container *pc)
+{
+ struct page *pg;
+ struct rss_container *rss;
+
+ pg = pc->page;
+ rss = pc->cnt;
+
+ spin_lock(&rss->res.lock);
+ list_add(&pc->list, &rss->page_list);
+ spin_unlock(&rss->res.lock);
+
+ page_container(pg) = pc;
+}
+
+void container_rss_del(struct page_container *pc)
+{
+ struct page *page;
+ struct rss_container *rss;
+
+ page = pc->page;
+ rss = pc->cnt;
+
+ spin_lock(&rss->res.lock);
+ list_del(&pc->list);
+ res_counter_uncharge_locked(&rss->res, 1);
+ spin_unlock(&rss->res.lock);
+
+ css_put(&rss->css);
+ kfree(pc);
+}
+
+unsigned long container_isolate_pages(unsigned long nr_to_scan,
+ struct rss_container *rss, struct list_head *dst,
+ int active, unsigned long *scanned)
+{
+ unsigned long nr_taken = 0;
+ struct page *page;
+ struct page_container *pc;
+ unsigned long scan;
+ struct list_head *src;
+ LIST_HEAD(pc_list);
+ struct zone *z;
+
+ spin_lock_irq(&rss->res.lock);
+ src = &rss->page_list;
+
+ for (scan = 0; scan < nr_to_scan && !list_empty(src); scan++) {
+ pc = list_entry(src->prev, struct page_container, list);
+ page = pc->page;
+ z = page_zone(page);
+
+ list_move(&pc->list, &pc_list);
+
+ spin_lock(&z->lru_lock);
+ if (PageLRU(page)) {
+ if ((active && PageActive(page)) ||
+ (!active && !PageActive(page))) {
+ if (likely(get_page_unless_zero(page))) {
+ ClearPageLRU(page);
+ nr_taken++;
+ list_move(&page->lru, dst);
+ }
+ }
+ }
+ spin_unlock(&z->lru_lock);
+ }
+
+ list_splice(&pc_list, src);
+ spin_unlock_irq(&rss->res.lock);
+
+ *scanned = scan;
+ return nr_taken;
+}
+
+unsigned long container_nr_physpages(struct rss_container *rss)
+{
+ return rss->res.usage;
+}
+
+static void rss_move_task(struct container_subsys *ss,
+ struct container *cont,
+ struct container *old_cont,
+ struct task_struct *p)
+{
+ struct mm_struct *mm;
+ struct rss_container *rss, *old_rss;
+
+ mm = get_task_mm(p);
+ if (mm == NULL)
+ goto out;
+
+ rss = rss_from_cont(cont);
+ old_rss = rss_from_cont(old_cont);
+ if (old_rss != mm->rss_container)
+ goto out_put;
+
+ css_get_current(&rss->css);
+ rcu_assign_pointer(mm->rss_container, rss);
+ css_put(&old_rss->css);
+
+out_put:
+ mmput(mm);
+out:
+ return;
+}
+
+static int rss_create(struct container_subsys *ss, struct container *cont)
+{
+ struct rss_container *rss;
+
+ rss = kzalloc(sizeof(struct rss_container), GFP_KERNEL);
+ if (rss == NULL)
+ return -ENOMEM;
+
+ res_counter_init(&rss->res);
+ INIT_LIST_HEAD(&rss->page_list);
+ cont->subsys[rss_subsys.subsys_id] = &rss->css;
+ return 0;
+}
+
+static void rss_destroy(struct container_subsys *ss,
+ struct container *cont)
+{
+ kfree(rss_from_cont(cont));
+}
+
+
+static ssize_t rss_read(struct container *cont, struct cftype *cft,
+ struct file *file, char __user *userbuf,
+ size_t nbytes, loff_t *ppos)
+{
+ return res_counter_read(&rss_from_cont(cont)->res, cft->private,
+ userbuf, nbytes, ppos);
+}
+
+static ssize_t rss_write(struct container *cont, struct cftype *cft,
+ struct file *file, const char __user *userbuf,
+ size_t nbytes, loff_t *ppos)
+{
+ return res_counter_write(&rss_from_cont(cont)->res, cft->private,
+ userbuf, nbytes, ppos);
+}
+
+
+static struct cftype rss_usage = {
+ .name = "rss_usage",
+ .private = RES_USAGE,
+ .read = rss_read,
+};
+
+static struct cftype rss_limit = {
+ .name = "rss_limit",
+ .private = RES_LIMIT,
+ .read = rss_read,
+ .write = rss_write,
+};
+
+static struct cftype rss_failcnt = {
+ .name = "rss_failcnt",
+ .private = RES_FAILCNT,
+ .read = rss_read,
+};
+
+static int rss_populate(struct container_subsys *ss,
+ struct container *cont)
+{
+ int rc;
+
+ if ((rc = container_add_file(cont, &rss_usage)) < 0)
+ return rc;
+ if ((rc = container_add_file(cont, &rss_failcnt)) < 0)
+ return rc;
+ if ((rc = container_add_file(cont, &rss_limit)) < 0)
+ return rc;
+
+ return 0;
+}
+
+static struct rss_container init_rss_container;
+
+static __init int rss_create_early(struct container_subsys *ss,
+ struct container *cont)
+{
+ struct rss_container *rss;
+
+ rss = &init_rss_container;
+ res_counter_init(&rss->res);
+ INIT_LIST_HEAD(&rss->page_list);
+ cont->subsys[rss_subsys.subsys_id] = &rss->css;
+ ss->create = rss_create;
+ return 0;
+}
+
+static struct container_subsys rss_subsys = {
+ .name = "rss",
+ .create = rss_create_early,
+ .destroy = rss_destroy,
+ .populate = rss_populate,
+ .attach = rss_move_task,
+};
+
+void __init container_rss_init_early(void)
+{
+ container_register_subsys(&rss_subsys);
+ init_mm.rss_container = rss_from_cont(
+ task_container(&init_task, &rss_subsys));
+ css_get_current(&init_mm.rss_container->css);
+}
next prev parent reply other threads:[~2007-03-06 14:52 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-06 14:42 [RFC][PATCH 0/7] Resource controllers based on process containers Pavel Emelianov
2007-03-06 14:49 ` [RFC][PATCH 1/7] Resource counters Pavel Emelianov
2007-03-07 4:03 ` Balbir Singh
2007-03-07 7:19 ` Pavel Emelianov
2007-03-09 16:37 ` Herbert Poetzl
2007-03-11 9:01 ` Pavel Emelianov
2007-03-11 19:00 ` Eric W. Biederman
2007-03-12 1:16 ` Herbert Poetzl
2007-03-13 9:09 ` Eric W. Biederman
2007-03-13 9:27 ` Pavel Emelianov
2007-03-13 9:49 ` [Devel] " Kirill Korotaev
2007-03-13 15:21 ` Herbert Poetzl
2007-03-13 15:41 ` Pavel Emelianov
2007-03-13 16:07 ` Srivatsa Vaddagiri
2007-03-14 7:12 ` Pavel Emelianov
2007-03-15 16:51 ` Eric W. Biederman
2007-03-13 16:32 ` Herbert Poetzl
2007-03-06 14:55 ` Pavel Emelianov [this message]
2007-03-06 22:00 ` [RFC][PATCH 2/7] RSS controller core Andrew Morton
2007-03-09 16:48 ` Herbert Poetzl
2007-03-11 9:08 ` Pavel Emelianov
2007-03-11 14:32 ` Herbert Poetzl
2007-03-11 15:04 ` Pavel Emelianov
2007-03-12 0:41 ` Herbert Poetzl
2007-03-12 8:31 ` Pavel Emelianov
2007-03-12 9:55 ` Balbir Singh
2007-03-12 23:43 ` Herbert Poetzl
2007-03-13 1:57 ` Balbir Singh
2007-03-13 2:24 ` Srivatsa Vaddagiri
2007-03-13 16:06 ` Herbert Poetzl
2007-03-11 12:26 ` Kirill Korotaev
2007-03-11 12:51 ` Andrew Morton
2007-03-11 15:51 ` Balbir Singh
2007-03-11 19:34 ` Eric W. Biederman
2007-03-12 9:23 ` [Devel] " Kirill Korotaev
2007-03-13 9:26 ` Eric W. Biederman
2007-03-13 15:43 ` Kirill Korotaev
2007-03-12 1:00 ` Herbert Poetzl
2007-03-12 9:02 ` Pavel Emelianov
2007-03-12 21:11 ` Herbert Poetzl
2007-03-13 7:17 ` Pavel Emelianov
2007-03-13 15:05 ` Herbert Poetzl
2007-03-13 15:32 ` Pavel Emelianov
2007-03-13 15:10 ` Kirill Korotaev
2007-03-13 15:11 ` Herbert Poetzl
2007-03-13 15:54 ` Kirill Korotaev
2007-03-12 18:42 ` Dave Hansen
2007-03-12 22:41 ` Herbert Poetzl
2007-03-12 23:02 ` Dave Hansen
2007-03-18 16:58 ` Eric W. Biederman
2007-03-13 6:04 ` Andrew Morton
2007-03-13 10:19 ` [Devel] " Kirill Korotaev
2007-03-13 11:48 ` Andrew Morton
2007-03-13 14:59 ` Herbert Poetzl
2007-03-13 17:05 ` Dave Hansen
2007-03-14 15:38 ` Mel Gorman
2007-03-14 20:42 ` Dave Hansen
2007-03-20 18:57 ` Mel Gorman
2007-03-18 22:44 ` [Devel] " Paul Menage
2007-03-19 17:41 ` Eric W. Biederman
2007-03-13 17:26 ` Dave Hansen
2007-03-13 19:09 ` Alan Cox
2007-03-13 20:28 ` Dave Hansen
2007-03-16 0:55 ` Eric W. Biederman
2007-03-16 16:31 ` Dave Hansen
2007-03-16 18:54 ` Eric W. Biederman
2007-03-16 19:46 ` Dave Hansen
2007-03-18 17:42 ` Eric W. Biederman
2007-03-19 15:48 ` Herbert Poetzl
2007-03-20 16:15 ` controlling mmap()'d vs read/write() pages Dave Hansen
2007-03-20 21:19 ` Eric W. Biederman
2007-03-23 0:51 ` Herbert Poetzl
2007-03-23 5:57 ` Nick Piggin
2007-03-23 10:12 ` Eric W. Biederman
2007-03-23 10:47 ` Nick Piggin
2007-03-23 12:21 ` Eric W. Biederman
2007-03-28 7:33 ` Nick Piggin
2007-03-23 16:41 ` Dave Hansen
2007-03-23 18:16 ` Herbert Poetzl
2007-03-28 9:18 ` Balbir Singh
2007-03-14 16:47 ` [RFC][PATCH 2/7] RSS controller core Mel Gorman
2007-03-07 5:37 ` Balbir Singh
2007-03-07 7:27 ` Pavel Emelianov
2007-03-06 14:58 ` [RFC][PATCH 3/7] Data structures changes for RSS accounting Pavel Emelianov
2007-03-11 19:13 ` Eric W. Biederman
2007-03-12 16:16 ` Kirill Korotaev
2007-03-12 16:48 ` Dave Hansen
2007-03-12 17:19 ` Pavel Emelianov
2007-03-12 17:27 ` Dave Hansen
2007-03-13 7:10 ` Pavel Emelianov
2007-03-12 17:21 ` Balbir Singh
2007-03-06 15:00 ` [RFC][PATCH 4/7] RSS accounting hooks over the code Pavel Emelianov
2007-03-11 19:14 ` Eric W. Biederman
2007-03-12 16:23 ` Kirill Korotaev
2007-03-12 16:50 ` Dave Hansen
2007-03-12 17:07 ` Kirill Korotaev
2007-03-12 17:33 ` Dave Hansen
2007-03-13 9:43 ` Eric W. Biederman
2007-03-12 23:54 ` Herbert Poetzl
2007-03-13 9:58 ` Eric W. Biederman
2007-03-13 10:25 ` Nick Piggin
2007-03-13 16:01 ` Eric W. Biederman
2007-03-14 3:51 ` Nick Piggin
2007-03-14 6:42 ` Balbir Singh
2007-03-14 6:57 ` Nick Piggin
2007-03-14 7:48 ` Balbir Singh
2007-03-14 13:25 ` Vaidyanathan Srinivasan
2007-03-14 13:49 ` Nick Piggin
2007-03-14 14:43 ` Vaidyanathan Srinivasan
2007-03-14 16:16 ` Kirill Korotaev
2007-03-15 5:01 ` Nick Piggin
2007-03-15 5:44 ` Balbir Singh
2007-03-28 20:15 ` Ethan Solomita
2007-03-14 15:37 ` Cedric Le Goater
2007-03-14 15:45 ` Pavel Emelianov
2007-03-06 15:03 ` [RFC][PATCH 5/7] Per-container OOM killer and page reclamation Pavel Emelianov
2007-03-09 21:21 ` Balbir Singh
2007-03-11 8:41 ` Pavel Emelianov
2007-03-06 15:04 ` [RFC][PATCH 6/7] Account for the number of tasks within container Pavel Emelianov
2007-03-07 2:00 ` Paul Menage
2007-03-07 7:13 ` Pavel Emelianov
2007-03-08 13:49 ` Paul Menage
2007-03-11 8:36 ` Pavel Emelianov
2007-03-06 15:07 ` [RFC][PATCH 7/7] Account for the number of files opened " Pavel Emelianov
2007-03-07 2:02 ` [RFC][PATCH 0/7] Resource controllers based on process containers Paul Menage
2007-03-07 7:30 ` Pavel Emelianov
2007-03-07 6:52 ` Balbir Singh
2007-03-07 7:32 ` Pavel Emelianov
2007-03-07 9:43 ` Kirill Korotaev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45ED80E1.7030406@sw.ru \
--to=xemul@sw.ru \
--cc=akpm@osdl.org \
--cc=balbir@in.ibm.com \
--cc=containers@lists.osdl.org \
--cc=dev@sw.ru \
--cc=devel@openvz.org \
--cc=linux-kernel@vger.kernel.org \
--cc=menage@google.com \
--cc=vatsa@in.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.