static u_int64_t total_memory;
static long jiffy;
+static int taskstat_support = -1;
static int process_group_get_pid_list(struct resource *res,
const struct resource_attribute *attr,
return 0;
}
+static bool process_group_check_taskstat_support(struct resource *resource,
+ const struct resource_attribute *attr)
+{
+ return !!taskstat_support;
+}
+
static bool process_group_check_gpu_support(struct resource *resource,
const struct resource_attribute *attr)
{
- return kernel_check_gpu_support();
+ return !!taskstat_support && kernel_check_gpu_support();
}
static const struct resource_attribute process_group_attrs[] = {
.type = DATA_TYPE_ARRAY,
.ops = {
.get = process_group_get_pid_list,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_NAME_LIST",
.type = DATA_TYPE_ARRAY,
.ops = {
.get = process_group_get_name_list,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_CPU_UTIL",
.type = DATA_TYPE_DOUBLE,
.ops = {
.get = process_group_get_cpu_util,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_DISK_READ_PER_SEC",
.type = DATA_TYPE_DOUBLE,
.ops = {
.get = process_group_get_disk_attrs,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_DISK_WRITE_PER_SEC",
.type = DATA_TYPE_DOUBLE,
.ops = {
.get = process_group_get_disk_attrs,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_MEM_VIRT",
.type = DATA_TYPE_UINT64,
.ops = {
.get = process_group_get_mem,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_MEM_RSS",
.type = DATA_TYPE_UINT64,
.ops = {
.get = process_group_get_mem,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_MEM_PSS",
.type = DATA_TYPE_UINT64,
.ops = {
.get = process_group_get_mem,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_MEM_SWAP",
.type = DATA_TYPE_UINT64,
.ops = {
.get = process_group_get_mem,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_MEM_SWAP_PSS",
.type = DATA_TYPE_UINT64,
.ops = {
.get = process_group_get_mem,
- .is_supported = resource_attr_supported_always,
+ .is_supported = process_group_check_taskstat_support,
},
}, {
.name = "PROCESS_GROUP_ATTR_MEM_GPU",
target_pid = (int)(intptr_t)data;
- if (target_pid < 0) {
+ if (target_pid < 0 || !taskstat_support) {
ctx->pid = -1;
return 0;
}
if (!ctx)
return -EINVAL;
+ if (!taskstat_support)
+ return 0;
+
task_dir = opendir(PROC_DIR_PATH);
if (!task_dir)
return -ESRCH;
struct process_group_context *ctx;
int ret;
+ if (taskstat_support < 0)
+ taskstat_support = (int)kernel_check_taskstat_support();
+
if (jiffy == 0) {
/* get system USER_HZ at once */
jiffy = sysconf(_SC_CLK_TCK);