Hello Dave,
There are some changes in cgroups of kernel 3.7 and 3.8, so I
made this patch to support them.
The main changes are in subsystem memory and devices. Here is
this patch.
Thanks,
Zhang Xiaohe
--- ../crash/extensions/cgget.c 2013-03-08 14:22:56.902931000 +0800
+++ extensions/cgget.c 2013-03-08 14:29:21.434098147 +0800
@@ -36,6 +36,7 @@
#define ACC_MKNOD 1
#define ACC_READ 2
#define ACC_WRITE 4
+#define ACC_MASK (ACC_MKNOD|ACC_READ|ACC_WRITE)
#define LRU_BASE 0
#define LRU_ACTIVE 1
@@ -110,6 +111,8 @@
struct memory_offset_table {
long memory_res;
long memory_memsw;
+ long memory_kmem;
+ long memory_tcp_mem;
long memory_info;
long memory_stat;
long memory_oom_kill_disable;
@@ -127,6 +130,12 @@
struct devices_offset_table {
long devices_whitelist;
+ long devices_behavior;
+ long item_major;
+ long item_minor;
+ long item_type;
+ long item_access;
+ long item_list;
};
struct freezer_offset_table {
@@ -242,6 +251,14 @@
};
enum memory_param_id {
+ MEM_TMEM_FAILCNT,
+ MEM_TMEM_LIMIT,
+ MEM_TMEM_MAX_USAGE,
+ MEM_TMEM_USAGE,
+ MEM_KMEM_FAILCNT,
+ MEM_KMEM_LIMIT,
+ MEM_KMEM_MAX_USAGE,
+ MEM_KMEM_USAGE,
MEM_MEMSW_FAILCNT,
MEM_MEMSW_LIMIT,
MEM_MEMSW_MAX_USAGE,
@@ -262,6 +279,14 @@
};
static const char *memory_params[] = {
+ "kmem.tcp.failcnt",
+ "kmem.tcp.limit_in_bytes",
+ "kmem.tcp.max_usage_in_bytes",
+ "kmem.tcp.usage_in_bytes",
+ "kmem.failcnt",
+ "kmem.limit_in_bytes",
+ "kmem.max_usage_in_bytes",
+ "kmem.usage_in_bytes",
"memsw.failcnt",
"memsw.limit_in_bytes",
"memsw.max_usage_in_bytes",
@@ -517,7 +542,7 @@
static void netprio_offset_table_init();
/* printing-assisted functions */
-static int read_whitelist(struct cgroup_spec *, ulong);
+static int read_whitelist(struct cgroup_spec *, ulong, int);
static char *hugepage_fmt(char *, uint64_t);
static inline int is_root_mem_cgroup(ulong);
static uint64_t read_res_counter(ulong, long, char *);
@@ -876,41 +901,48 @@
}
static int
-read_whitelist(struct cgroup_spec *group_list, ulong whitelist_addr)
+read_whitelist(struct cgroup_spec *group_list, ulong whitelist_addr, int behavior)
{
- int ret = 0;
uint32_t major, minor;
short type, access;
char maj[MAJMINLEN], min[MAJMINLEN], acc[ACCLEN];
if (!whitelist_addr)
return -1;
- if (!readmem(whitelist_addr + MEMBER_OFFSET("dev_whitelist_item", "major"),
- KVADDR, &major, sizeof(uint32_t), "whitelist_item_major",
- FAULT_ON_ERROR))
- return -1;
- set_majmin(maj, major);
+ if (behavior == 0) {
+ set_majmin(maj, ~0);
+ set_majmin(min, ~0);
+ set_access(acc, ACC_MASK);
+ fprintf(fp, "%s.list: %c %s:%s %s\n", group_list->subsys_str,
+ type_to_char(DEV_ALL), maj, min, acc);
+ } else {
+ if (!readmem(whitelist_addr + devices_offset_table.item_major,
+ KVADDR, &major, sizeof(uint32_t), "item_major",
+ FAULT_ON_ERROR))
+ return -1;
+ set_majmin(maj, major);
- if (!readmem(whitelist_addr + MEMBER_OFFSET("dev_whitelist_item", "minor"),
- KVADDR, &minor, sizeof(uint32_t), "whitelist_item_minor",
- FAULT_ON_ERROR))
- return -1;
- set_majmin(min, minor);
+ if (!readmem(whitelist_addr + devices_offset_table.item_minor,
+ KVADDR, &minor, sizeof(uint32_t), "item_minor",
+ FAULT_ON_ERROR))
+ return -1;
+ set_majmin(min, minor);
- if (!readmem(whitelist_addr + MEMBER_OFFSET("dev_whitelist_item", "access"),
- KVADDR, &access, sizeof(short), "whitelist_item_access",
- FAULT_ON_ERROR))
- return -1;
- set_access(acc, access);
+ if (!readmem(whitelist_addr + devices_offset_table.item_access,
+ KVADDR, &access, sizeof(short), "item_access",
+ FAULT_ON_ERROR))
+ return -1;
+ set_access(acc, access);
- if (!readmem(whitelist_addr + MEMBER_OFFSET("dev_whitelist_item", "type"),
- KVADDR, &type, sizeof(short), "whitelist_item_type",
- FAULT_ON_ERROR))
- return -1;
- fprintf(fp, "%s.list: %c %s:%s %s\n", group_list->subsys_str,
- type_to_char(type), maj, min, acc);
+ if (!readmem(whitelist_addr + devices_offset_table.item_type,
+ KVADDR, &type, sizeof(short), "item_type",
+ FAULT_ON_ERROR))
+ return -1;
+ fprintf(fp, "%s.list: %c %s:%s %s\n", group_list->subsys_str,
+ type_to_char(type), maj, min, acc);
+ }
- return ret;
+ return 0;
}
/*
@@ -2554,7 +2586,7 @@
cmd_cgget(void)
{
int c;
- int ret = 0;
+ int ret = 0, help_flag = 0;
int idx, i = 0, j = 0, k = 0;
int dis_all_param = 0, group_flag = 0, var_flag = 0;
struct cgroup_spec *group_list[CGROUP_HIER_MAX] = {NULL};
@@ -2595,9 +2627,10 @@
dis_all_param = 1;
break;
case 'h':
+ help_flag = 1;
default:
argerrs++;
- break;
+ goto err;
}
}
@@ -2647,8 +2680,11 @@
free(subsys_str[j]);
while (--k >= 0)
free(path[k]);
- if (argerrs)
+ if (argerrs) {
+ if (!help_flag)
+ fprintf(stderr, "Invalid commandline specified.\n");
cmd_usage(pc->curcmd, SYNOPSIS);
+ }
}
/* strip off the same string */
@@ -2850,7 +2886,7 @@
for (i = 0; i < var_num[subsys_id]; i++) {
if (!test_bit(i, found))
- fprintf(pc->saved_fp, "Can not find param '%s'.\n",
+ fprintf(pc->saved_fp, "Cannot find param '%s'.\n",
variable_str[subsys_id][i]);
}
if (linebuf) {
@@ -3032,7 +3068,7 @@
css_addr = get_css_addr(group_list, subsys_id, root_addr);
if (!css_addr) {
if (!disp_flag)
- fprintf(fp, "%s: can not find controller '%s' "
+ fprintf(fp, "%s: Cannot find controller '%s' "
"in group '%s'\n", cmd_name,
group_list->subsys_str,
group_list->path);
@@ -3066,7 +3102,7 @@
else if (0 == strcmp(group_list->subsys_str, subsys_name[net_prio_subsys_id]))
print_net_prio(group_list, subsys_id, css_addr);
else
- fprintf(fp, "not supported controller %s.\n",
+ fprintf(fp, "Not supported controller %s.\n",
group_list->subsys_str);
}
@@ -3334,7 +3370,8 @@
static void
print_memory(struct cgroup_spec *group_list, int subsys_id, ulong subsys_addr)
{
- ulong mem_res_addr, mem_memsw_addr, ptr;
+ ulong mem_res_addr, mem_memsw_addr, mem_kmem_addr,
+ mem_tmem_addr, ptr;
uint64_t val64 = 0, usage = 0, mem_limit, memsw_limit;
int i, j, val32 = 0, do_swap_account = 0;
int64_t lstats[NR_MCS_STAT] = {0}, tstats[NR_MCS_STAT] = {0};
@@ -3362,20 +3399,70 @@
return;
}
- /* address of memsw and res */
+ /* address of memsw, res, kmem and tcp_mem */
if(memory_offset_table.memory_memsw != -1)
mem_memsw_addr = subsys_addr + memory_offset_table.memory_memsw;
else
mem_memsw_addr = -1;
+ if(memory_offset_table.memory_kmem != -1)
+ mem_kmem_addr = subsys_addr + memory_offset_table.memory_kmem;
+ else
+ mem_kmem_addr = -1;
+ if(memory_offset_table.memory_tcp_mem != -1)
+ mem_tmem_addr = subsys_addr + memory_offset_table.memory_tcp_mem +
+ MEMBER_OFFSET("tcp_memcontrol",
+ "tcp_memory_allocated");
+ else
+ mem_tmem_addr = -1;
mem_res_addr = subsys_addr + memory_offset_table.memory_res;
- for (i = MEM_MEMSW_FAILCNT; i < MEM_NR_PARAMS; i++) {
+ for (i = MEM_TMEM_FAILCNT; i < MEM_NR_PARAMS; i++) {
/* format string of the parameter */
memset(buf, 0, FILENAME_MAX);
sprintf(buf, "%s.%s", group_list->subsys_str,
memory_params[i]);
switch (i)
{
+ case MEM_TMEM_FAILCNT:
+ read_res_counter(mem_tmem_addr,
+ memory_offset_table.counter_failcnt,
+ buf);
+ break;
+ case MEM_TMEM_LIMIT:
+ read_res_counter(mem_tmem_addr,
+ memory_offset_table.counter_limit,
+ buf);
+ break;
+ case MEM_TMEM_MAX_USAGE:
+ read_res_counter(mem_tmem_addr,
+ memory_offset_table.counter_max_usage,
+ buf);
+ break;
+ case MEM_TMEM_USAGE:
+ read_res_counter(mem_tmem_addr,
+ memory_offset_table.counter_usage,
+ buf);
+ break;
+ case MEM_KMEM_FAILCNT:
+ read_res_counter(mem_kmem_addr,
+ memory_offset_table.counter_failcnt,
+ buf);
+ break;
+ case MEM_KMEM_LIMIT:
+ read_res_counter(mem_kmem_addr,
+ memory_offset_table.counter_limit,
+ buf);
+ break;
+ case MEM_KMEM_MAX_USAGE:
+ read_res_counter(mem_kmem_addr,
+ memory_offset_table.counter_max_usage,
+ buf);
+ break;
+ case MEM_KMEM_USAGE:
+ read_res_counter(mem_kmem_addr,
+ memory_offset_table.counter_usage,
+ buf);
+ break;
case MEM_MEMSW_FAILCNT:
read_res_counter(mem_memsw_addr,
memory_offset_table.counter_failcnt,
@@ -3513,6 +3600,7 @@
print_devices(struct cgroup_spec *group_list, int subsys_id, ulong subsys_addr)
{
ulong whitelist_addr, list_head;
+ int behavior = -1;
fprintf(fp, "%s:\n", group_list->path);
@@ -3522,18 +3610,24 @@
list_head = subsys_addr + devices_offset_table.devices_whitelist;
whitelist_addr = (ulong)list_next((void *)list_head, NULL,
- MEMBER_OFFSET("dev_whitelist_item", "list"));
+ devices_offset_table.item_list);
+
+ if (devices_offset_table.devices_behavior != -1)
+ readmem(subsys_addr + devices_offset_table.devices_behavior,
+ KVADDR, &behavior, sizeof(int), "dev_cgroup behavior",
+ FAULT_ON_ERROR);
+
do {
- if (0 != read_whitelist(group_list, whitelist_addr)) {
+ if (0 != read_whitelist(group_list, whitelist_addr, behavior)) {
fprintf(fp, "get parameters failed.\n");
- return;
+ break;
}
fprintf(fp, "%s.deny: \n", group_list->subsys_str);
fprintf(fp, "%s.allow: \n", group_list->subsys_str);
whitelist_addr = (ulong)list_next(NULL, (void *)whitelist_addr,
- MEMBER_OFFSET("dev_whitelist_item", "list"));
+ devices_offset_table.item_list);
} while (list_head != whitelist_addr +
- MEMBER_OFFSET("dev_whitelist_item", "list"));
+ devices_offset_table.item_list);
/* second, output the needed param */
if (test_bit(devices_subsys_id, variable_flag)) {
@@ -3613,6 +3707,9 @@
fprintf(fp, "%s:\n", group_list->path);
+ if (netprio_offset_table.netprio_prioidx == -1)
+ return;
+
/* if some param is specified, first output all into a tmpfile. */
if (test_bit(net_prio_subsys_id, variable_flag))
open_tmpfile();
@@ -3738,7 +3835,7 @@
}
if (!found && !disp_flag) {
- fprintf(fp, "%s: can not find controller '%s' "
+ fprintf(fp, "%s: Cannot find controller '%s' "
"in group '%s'\n", cmd_name,
group_list[j]->subsys_str,
group_list[j]->path);
@@ -3872,12 +3969,15 @@
{
CGGET_MEMBER_OFFSET_INIT(memory_offset_table, memory_res,
"mem_cgroup", "res");
- if (MEMBER_EXISTS("mem_cgroup", "tcp_mem"))
+ if (MEMBER_EXISTS("mem_cgroup", "swappiness"))
memory_offset_table.memory_memsw = memory_offset_table.memory_res +
STRUCT_SIZE("res_counter");
else
- CGGET_MEMBER_OFFSET_INIT(memory_offset_table, memory_memsw,
- "mem_cgroup", "memsw");
+ memory_offset_table.memory_memsw = -1;
+ CGGET_MEMBER_OFFSET_INIT(memory_offset_table, memory_tcp_mem,
+ "mem_cgroup", "tcp_mem");
+ CGGET_MEMBER_OFFSET_INIT(memory_offset_table, memory_kmem,
+ "mem_cgroup", "kmem");
CGGET_MEMBER_OFFSET_INIT(memory_offset_table, memory_info,
"mem_cgroup", "info");
CGGET_MEMBER_OFFSET_INIT(memory_offset_table, memory_stat,
@@ -3908,7 +4008,7 @@
"res_counter", "failcnt");
CGGET_MEMBER_OFFSET_INIT(memory_offset_table, perzone_count,
"mem_cgroup_per_zone", "count");
- if(memory_offset_table.perzone_count == -1)
+ if (memory_offset_table.perzone_count == -1)
CGGET_MEMBER_OFFSET_INIT(memory_offset_table, perzone_count,
"mem_cgroup_per_zone", "lru_size");
}
@@ -3916,8 +4016,37 @@
static void
devices_offset_table_init()
{
- CGGET_MEMBER_OFFSET_INIT(devices_offset_table, devices_whitelist,
- "dev_cgroup", "whitelist");
+ if (STRUCT_EXISTS("dev_whitelist_item")) {
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, devices_whitelist,
+ "dev_cgroup", "whitelist");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, devices_behavior,
+ "dev_cgroup", "behavior");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_major,
+ "dev_whitelist_item", "major");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_minor,
+ "dev_whitelist_item", "minor");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_type,
+ "dev_whitelist_item", "type");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_access,
+ "dev_whitelist_item", "access");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_list,
+ "dev_whitelist_item", "list");
+ } else if (STRUCT_EXISTS("dev_exception_item")) {
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, devices_whitelist,
+ "dev_cgroup", "exceptions");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, devices_behavior,
+ "dev_cgroup", "behavior");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_major,
+ "dev_exception_item", "major");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_minor,
+ "dev_exception_item", "minor");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_type,
+ "dev_exception_item", "type");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_access,
+ "dev_exception_item", "access");
+ CGGET_MEMBER_OFFSET_INIT(devices_offset_table, item_list,
+ "dev_exception_item", "list");
+ }
}
static void
--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility