From: Kirill Korotaev <dev@openvz.org>
To: Andrew Morton <akpm@osdl.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Alan Cox <alan@lxorguk.ukuu.org.uk>,
Christoph Hellwig <hch@infradead.org>,
xemul@openvz.org, Andrey Savochkin <saw@sw.ru>,
devel@openvz.org, Rik van Riel <riel@redhat.com>,
Andi Kleen <ak@suse.de>, Oleg Nesterov <oleg@tv-sign.ru>,
Matt Helsley <matthltc@us.ibm.com>,
CKRM-Tech <ckrm-tech@lists.sourceforge.net>,
Hugh Dickins <hugh@veritas.com>, Srivatsa <vatsa@in.ibm.com>,
Balbir Singh <balbir@in.ibm.com>,
haveblue@us.ibm.com
Subject: [TOOL] BC: bcctl.c
Date: Thu, 05 Oct 2006 20:04:37 +0400 [thread overview]
Message-ID: <45252D15.1000503@openvz.org> (raw)
In-Reply-To: <4525257A.4040609@openvz.org>
Utility (bcctl) usage and examples:
Usage: bcctl <cmd> [args...]
Commands:
get
gets current bc id
enter <id> [<pid>]
moves task into bc.
if no pid - moves parent task
stat <id> [<resource>]
prints stats for bc's resource.
if no resource - prints all resources
set <id> <resource> <barrier> [<limit>]
sets barrier/limit for bc's resource
if no limit - it is set equal to barrier
Resources:
kmemsize
privvmpages
physpages
Examples:
Move shell into beancounter
$ bcctl enter 1
Look statistics
$ bcctl stat 1
resource held minheld maxheld barrier limit failcnt
kmemsize 824 0 1056 65536 65536 0
privvmpages 100 0 304 2147483647 2147483647 0
physpages 40 0 150 2147483647 2147483647 0
See how reclamation work
$ bcctl set 1 physpages 200
$ memeat
$ bcctl stat 1 physpages
resource held minheld maxheld barrier limit failcnt
physpages 40 0 200 200 200 0
Now turn swap off and run memeater again
$ swapoff -a
$ memeat
Killed
$ bcctl stat 1 physpages
resource held minheld maxheld barrier limit failcnt
physpages 41 0 200 200 200 1
---
#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int bcid_t;
#include "bc/beancounter.h"
#define get_bcid() (syscall(__NR_get_bcid))
#define set_bcid(id, pid) (syscall(__NR_set_bcid, id, pid))
#define set_bclimit(id, res, l) (syscall(__NR_set_bclimit, id, res, l))
#define get_bcstat(id, res, s) (syscall(__NR_get_bcstat, id, res, s))
static char *res_names[] = {
"kmemsize",
"privvmpages",
"physpages",
NULL,
};
static int bc_get_id(int argc, char **argv)
{
bcid_t id;
id = get_bcid();
printf("%u\n", id);
return 0;
}
static int bc_enter_id(int argc, char **argv)
{
bcid_t id;
pid_t pid;
char *end;
int ret;
if (argc < 1)
return -2;
id = strtol(argv[0], &end, 10);
if (*end != '\0')
return -2;
if (argc > 1) {
pid = strtol(argv[1], &end, 10);
if (*end != '\0')
return -2;
} else
pid = getppid();
ret = set_bcid(id, pid);
if (ret < 0)
perror("Can't set bcid");
return ret;
}
static int bc_set_parms(int argc, char **argv)
{
bcid_t id;
int res;
unsigned long limits[2];
char *end;
int ret;
if (argc < 3)
return -2;
id = strtol(argv[0], &end, 10);
if (*end != '\0')
return -2;
for (res = 0; res_names[res] != NULL; res++)
if (strcmp(res_names[res], argv[1]) == 0)
break;
if (res_names[res] == NULL)
return -2;
limits[0] = strtoul(argv[2], &end, 10);
if (*end != '\0')
return -2;
if (argc > 3) {
limits[1] = strtoul(argv[3], &end, 10);
if (*end != '\0')
return -2;
} else
limits[1] = limits[0];
ret = set_bclimit(id, res, limits);
if (ret < 0)
perror("Can't set limits");
return ret;
}
static void bc_show_stat_hdr(void)
{
printf("%-12s %10s %10s %10s %10s %10s %10s\n",
"resource",
"held",
"minheld",
"maxheld",
"barrier",
"limit",
"failcnt");
}
static int bc_show_stat(bcid_t id, int res)
{
struct bc_resource_parm parm;
int ret;
ret = get_bcstat(id, res, &parm);
if (ret < 0) {
perror("Can't get stat");
return ret;
}
printf("%-12s %10lu %10lu %10lu %10lu %10lu %10lu\n",
res_names[res],
parm.held,
parm.minheld,
parm.maxheld,
parm.barrier,
parm.limit,
parm.failcnt);
return 0;
}
static int bc_get_stat(int argc, char **argv)
{
bcid_t id;
int res, ret;
char *end;
if (argc < 1)
return -2;
id = strtol(argv[0], &end, 10);
if (*end != '\0')
return -2;
if (argc > 1) {
for (res = 0; res_names[res] != NULL; res++)
if (strcmp(res_names[res], argv[1]) == 0)
break;
if (res_names[res] == NULL)
return -2;
bc_show_stat_hdr();
return bc_show_stat(id, res);
}
bc_show_stat_hdr();
for (res = 0; res_names[res] != NULL; res++) {
ret = bc_show_stat(id, res);
if (ret < 0)
return ret;
}
return 0;
}
static struct bc_command {
char *name;
int (*cmd)(int argc, char **argv);
char *args;
char *help;
} bc_commands[] = {
{
.name = "get",
.cmd = bc_get_id,
.args = "",
.help = "gets current bc id",
},
{
.name = "enter",
.cmd = bc_enter_id,
.args = "<id> [<pid>]",
.help = "moves task into bc.\n"
"\t\tif no pid - moves parent task",
},
{
.name = "stat",
.cmd = bc_get_stat,
.args = "<id> [<resource>]",
.help = "prints stats for bc's resource.\n\t\t"
"if no resource - prints all resources",
},
{
.name = "set",
.cmd = bc_set_parms,
.args = "<id> <resource> <barrier> [<limit>]",
.help = "sets barrier/limit for bc's resource\n"
"\t\tif no limit - it is set equal to barrier",
},
{
.name = NULL,
},
};
static void usage(void)
{
int i;
printf("Usage: bcctl <cmd> [args...]\n");
printf("Commands:\n");
for (i = 0; bc_commands[i].name != NULL; i++)
printf("\t%s %s\n\t\t%s\n",
bc_commands[i].name,
bc_commands[i].args,
bc_commands[i].help);
printf("Resources:\n");
for (i = 0; res_names[i] != NULL; i++)
printf("\t%s\n", res_names[i]);
}
int main(int argc, char **argv)
{
int i, ret;
if (argc < 2) {
usage();
return 0;
}
ret = -1;
for (i = 0; bc_commands[i].name != NULL; i++) {
if (strcmp(argv[1], bc_commands[i].name) != 0)
continue;
ret = bc_commands[i].cmd(argc - 2, argv + 2);
}
if (ret < 0)
usage();
return ret;
}
prev parent reply other threads:[~2006-10-05 15:58 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-05 15:32 [PATCH] BC: resource beancounters (v5) (added userpages reclamation) Kirill Korotaev
2006-10-05 15:51 ` [PATCH 1/10] BC: introduce atomic_dec_and_lock_irqsave() Kirill Korotaev
2006-10-05 15:52 ` [PATCH 2/10] BC: kconfig Kirill Korotaev
2006-10-05 15:53 ` [PATCH 3/10] BC: beancounters core (API) Kirill Korotaev
2006-10-05 15:55 ` [PATCH 4/10] BC: context inheriting and changing Kirill Korotaev
2006-10-05 15:56 ` [PATCH 5/10] BC: user interface (syscalls) Kirill Korotaev
2006-10-05 15:57 ` [PATCH 6/10] BC: kernel memory (core) Kirill Korotaev
2006-10-05 15:58 ` [PATCH 7/10] BC: kernel memory (marks) Kirill Korotaev
2006-10-05 15:59 ` [PATCH 8/10] BC: private pages (mappings) accounting (core) Kirill Korotaev
2006-10-05 16:00 ` [PATCH 9/10] BC: physical pages accounting/reclamation (core) Kirill Korotaev
2006-10-05 16:01 ` [PATCH 10/10] BC: user memory accounting (hooks) Kirill Korotaev
2006-10-05 16:04 ` Kirill Korotaev [this message]
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=45252D15.1000503@openvz.org \
--to=dev@openvz.org \
--cc=ak@suse.de \
--cc=akpm@osdl.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=balbir@in.ibm.com \
--cc=ckrm-tech@lists.sourceforge.net \
--cc=devel@openvz.org \
--cc=haveblue@us.ibm.com \
--cc=hch@infradead.org \
--cc=hugh@veritas.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matthltc@us.ibm.com \
--cc=oleg@tv-sign.ru \
--cc=riel@redhat.com \
--cc=saw@sw.ru \
--cc=vatsa@in.ibm.com \
--cc=xemul@openvz.org \
/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.