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;
}

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
ckrm-tech mailing list
https://lists.sourceforge.net/lists/listinfo/ckrm-tech

Reply via email to