From 56ae6acdf5d4811473269328a0814d4c24626ebc Mon Sep 17 00:00:00 2001 From: zhouhaifeng Date: Fri, 15 Sep 2023 11:46:20 +0800 Subject: [PATCH] add unified collection driver Signed-off-by: zhouhaifeng --- LICENSE | 1 + OAT.xml | 3 + ucollection/Kconfig | 6 + ucollection/Makefile | 3 + ucollection/README_zh.md | 32 ++++ ucollection/apply_ucollection.sh | 31 ++++ ucollection/figures/collector_framework.png | Bin 0 -> 20539 bytes ucollection/ucollection_process_cpu.c | 194 ++++++++++++++++++++ ucollection/ucollection_process_cpu.h | 9 + ucollection/unified_collection_data.h | 47 +++++ ucollection/unified_collection_driver.c | 90 +++++++++ 11 files changed, 416 insertions(+) create mode 100644 ucollection/Kconfig create mode 100644 ucollection/Makefile create mode 100644 ucollection/README_zh.md create mode 100755 ucollection/apply_ucollection.sh create mode 100644 ucollection/figures/collector_framework.png create mode 100644 ucollection/ucollection_process_cpu.c create mode 100644 ucollection/ucollection_process_cpu.h create mode 100644 ucollection/unified_collection_data.h create mode 100644 ucollection/unified_collection_driver.c diff --git a/LICENSE b/LICENSE index fc48fd2..97c58d4 100644 --- a/LICENSE +++ b/LICENSE @@ -2,5 +2,6 @@ ./newip/ ./xpm/ ./qos_auth/ + ./ucollection/ As for the specific use of the licenses, please refer to the relevant description in the documents. diff --git a/OAT.xml b/OAT.xml index 9de7aac..55a93aa 100644 --- a/OAT.xml +++ b/OAT.xml @@ -60,9 +60,11 @@ Note:If the text contains special characters, please escape them according to th + + @@ -81,6 +83,7 @@ Note:If the text contains special characters, please escape them according to th + diff --git a/ucollection/Kconfig b/ucollection/Kconfig new file mode 100644 index 0000000..d60e708 --- /dev/null +++ b/ucollection/Kconfig @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 +config UNIFIED_COLLECTION + def_bool $(success,$(srctree)/scripts/ohos-check-dir.sh $(srctree)/drivers/staging/ucollection) + tristate "Enable unified collection" + help + unified collection \ No newline at end of file diff --git a/ucollection/Makefile b/ucollection/Makefile new file mode 100644 index 0000000..5d1b45e --- /dev/null +++ b/ucollection/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_UNIFIED_COLLECTION) += ucollection_process_cpu.o +obj-$(CONFIG_UNIFIED_COLLECTION) += unified_collection_driver.o \ No newline at end of file diff --git a/ucollection/README_zh.md b/ucollection/README_zh.md new file mode 100644 index 0000000..3b94e8e --- /dev/null +++ b/ucollection/README_zh.md @@ -0,0 +1,32 @@ +## 背景 +当前系统需要获取进程的CPU维测数据,支持开发者性能问题分析,通过遍例所有进程的结点虽然可以获取所有进程的CPU使用率,但是该方法性能相对较差,为了提升获取效率,因此开僻了内核的设备结点,通过结点可能快速获取CPU的数据。 + +## ucollection(unified collection)模块 +通过ioctl的方式向设备结点/dev/uncollection发送命令,内核根据不同的命令做不同的处理,返回相应的维测数据。 +![framework](figures/collector_framework.png) + +## 目录 +统一采集设备的主要代码目录结构如下: + +``` +# 代码路径 /kernel/linux/common_modules/xpm +├── apply_ucollection.sh # XPM 头文件 +├── figures # ReadMe 内嵌图例 +├── Konfig +├── Makefile +├── README_zh.md +├── ucollection_process_cpu.c # 获取进程CPU数据 +├── ucollection_process_cpu.h +├── unified_collection_data.h +├── unified_collection_driver.c # 注册/dev/ucollection设备 +``` + +## 相关仓 + +[内核子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E5%86%85%E6%A0%B8%E5%AD%90%E7%B3%BB%E7%BB%9F.md) + +[kernel_linux_5.10](https://gitee.com/openharmony/kernel_linux_5.10) + +[kernel_linux_config](https://gitee.com/openharmony/kernel_linux_config) + +[kernel_linux_build](https://gitee.com/openharmony/kernel_linux_build) diff --git a/ucollection/apply_ucollection.sh b/ucollection/apply_ucollection.sh new file mode 100755 index 0000000..96af21c --- /dev/null +++ b/ucollection/apply_ucollection.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2023 Huawei Device Co., Ltd. +# +# Description: Create a symbolic link for Unified Collection Driver in Linux 5.10 +# + +set -e + +OHOS_SOURCE_ROOT=$1 +KERNEL_BUILD_ROOT=$2 +PRODUCT_NAME=$3 +KERNEL_VERSION=$4 +UNIFIED_COLLECTION_SOURCE_ROOT=$OHOS_SOURCE_ROOT/kernel/linux/common_modules/ucollection + +function main() +{ + pushd . + + echo "create link $KERNEL_BUILD_ROOT/drivers/staging/ucollection/" + if [ ! -d "$KERNEL_BUILD_ROOT/drivers/staging/ucollection" ]; then + mkdir $KERNEL_BUILD_ROOT/drivers/staging/ucollection + fi + + cd $KERNEL_BUILD_ROOT/drivers/staging/ucollection/ + ln -s -f $(realpath --relative-to=$KERNEL_BUILD_ROOT/drivers/staging/ucollection/ $UNIFIED_COLLECTION_SOURCE_ROOT)/* ./ + + popd +} + +main diff --git a/ucollection/figures/collector_framework.png b/ucollection/figures/collector_framework.png new file mode 100644 index 0000000000000000000000000000000000000000..b56e1ac3d383eaca42505e38f48e7bbe01215ad9 GIT binary patch literal 20539 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 Wms;pgH}Amv5t3qZsPrfLum2mIb;GLw literal 0 HcmV?d00001 diff --git a/ucollection/ucollection_process_cpu.c b/ucollection/ucollection_process_cpu.c new file mode 100644 index 0000000..bba8422 --- /dev/null +++ b/ucollection/ucollection_process_cpu.c @@ -0,0 +1,194 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2023 Huawei Device Co., Ltd. + */ +#include "ucollection_process_cpu.h" + +#include +#ifdef CONFIG_CPU_FREQ_TIMES +#include +#endif // CONFIG_CPU_FREQ_TIMES +#include +#include +#include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)) +#include +#include +#include +#endif // LINUX_VERSION_CODE +#ifdef CONFIG_SMT_MODE_GOV +#include +#endif // CONFIG_SMT_MODE_GOV + +#include "unified_collection_data.h" + +#define NS_TO_MS 1000000 +static char dmips_values[DMIPS_NUM]; + +unsigned long long __attribute__((weak)) get_proc_cpu_load(struct task_struct *task, char dmips[], + unsigned int dmips_num) +{ + return 0; +} + +static int get_cpu_num(void) +{ + int core_num = 0; + int i = 0; + for_each_possible_cpu(i) + core_num++; + return core_num; +} + +static unsigned long long get_process_load_cputime(struct task_struct *task) +{ + unsigned long long proc_load_cputime = 0; + proc_load_cputime = get_proc_cpu_load(task, dmips_values, DMIPS_NUM); + return proc_load_cputime; +} + +static void get_process_usage_cputime(struct task_struct *task, unsigned long long *ut, unsigned long long *st) +{ + unsigned long long utime, stime; + + thread_group_cputime_adjusted(task, &utime, &stime); + utime = utime + task->signal->cutime; + stime = stime + task->signal->cstime; + do_div(utime, NS_TO_MS); + do_div(stime, NS_TO_MS); + *ut = utime; + *st = stime; +} + +static void get_process_load(struct task_struct *task, int cpu_num, int cur_count, + struct ucollection_process_cpu_entry __user *entry) +{ + struct ucollection_process_cpu_item proc_cpu_entry; + memset(&proc_cpu_entry, 0, sizeof(struct ucollection_process_cpu_item)); + proc_cpu_entry.pid = task->pid; + proc_cpu_entry.cpu_load_time = get_process_load_cputime(task); + get_process_usage_cputime(task, &proc_cpu_entry.cpu_usage_utime, &proc_cpu_entry.cpu_usage_stime); + (void)copy_to_user(&entry->datas[cur_count], &proc_cpu_entry, sizeof(struct ucollection_process_cpu_item)); +} + +static long ioctrl_collect_process_cpu(void __user *argp) +{ + int cpu_num = 0; + struct task_struct *task = NULL; + struct ucollection_process_cpu_entry kentry; + struct ucollection_process_cpu_entry __user *entry = argp; + if (entry == NULL) { + pr_err("cpu entry is null"); + return -EINVAL; + } + + memset(&kentry, 0, sizeof(struct ucollection_process_cpu_entry)); + (void)copy_from_user(&kentry, entry, sizeof(struct ucollection_process_cpu_entry)); + + cpu_num = get_cpu_num(); + rcu_read_lock(); + task = &init_task; + for_each_process(task) { + if (task->pid != task->tgid) + continue; + + if (kentry.cur_count >= kentry.total_count) { + pr_err("process over total count"); + break; + } + + get_process_load(task, cpu_num, kentry.cur_count, entry); + kentry.cur_count++; + } + put_user(kentry.cur_count, &entry->cur_count); + rcu_read_unlock(); + return 0; +} + +static bool is_pid_alive(int pid) +{ + struct task_struct *task = NULL; + task = pid_task(find_vpid(pid), PIDTYPE_PID); + if (task == NULL) + return false; + + return pid_alive(task); +} + +static long ioctrl_collect_the_process_cpu(void __user *argp) +{ + int cpu_num = 0; + struct task_struct *task = NULL; + struct ucollection_process_cpu_entry kentry; + struct ucollection_process_cpu_entry __user *entry = argp; + if (entry == NULL) { + pr_err("cpu entry is null"); + return -EINVAL; + } + + memset(&kentry, 0, sizeof(struct ucollection_process_cpu_entry)); + (void)copy_from_user(&kentry, entry, sizeof(struct ucollection_process_cpu_entry)); + + if (kentry.cur_count >= kentry.total_count) { + pr_err("current count over total count"); + return -EINVAL; + } + + rcu_read_lock(); + if (!is_pid_alive(kentry.filter.pid)) { + pr_err("pid=%d is not alive", kentry.filter.pid); + rcu_read_unlock(); + return -EINVAL; + } + + task = find_task_by_vpid(kentry.filter.pid); + if (task == NULL) { + pr_err("can not get pid=%d", task->pid); + rcu_read_unlock(); + return -EINVAL; + } + + cpu_num = get_cpu_num(); + get_process_load(task, cpu_num, kentry.cur_count, entry); + kentry.cur_count++; + put_user(kentry.cur_count, &entry->cur_count); + rcu_read_unlock(); + return 0; +} + +static long ioctrl_set_cpu_dmips(void __user *argp) +{ + int i; + struct ucollection_cpu_dmips kentry; + struct ucollection_cpu_dmips __user *entry = argp; + memset(&kentry, 0, sizeof(struct ucollection_cpu_dmips)); + (void)copy_from_user(&kentry, entry, sizeof(struct ucollection_cpu_dmips)); + pr_info("set dimps %d cpus\n", kentry.total_count); + for (i = 0; i < DMIPS_NUM; i++) { + if (i >= kentry.total_count) + break; + get_user(dmips_values[i], &entry->dmips[i]); + pr_info("set dimps cpu[%d]=%d\n", i, dmips_values[i]); + } + return 0; +} + +long unified_collection_collect_process_cpu(unsigned int cmd, void __user *argp) +{ + long ret = 0; + switch(cmd) { + case IOCTRL_COLLECT_ALL_PROC_CPU: + ret = ioctrl_collect_process_cpu(argp); + break; + case IOCTRL_COLLECT_THE_PROC_CPU: + ret = ioctrl_collect_the_process_cpu(argp); + break; + case IOCTRL_SET_CPU_DMIPS: + ret = ioctrl_set_cpu_dmips(argp); + break; + default: + pr_err("handle ioctrl cmd %u, _IOC_TYPE(cmd)=%d", cmd, _IOC_TYPE(cmd)); + ret = 0; + } + return ret; +} \ No newline at end of file diff --git a/ucollection/ucollection_process_cpu.h b/ucollection/ucollection_process_cpu.h new file mode 100644 index 0000000..09076aa --- /dev/null +++ b/ucollection/ucollection_process_cpu.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2023 Huawei Device Co., Ltd. + */ +#ifndef __UCOLLECTION_PROCESS_CPU__ +#define __UCOLLECTION_PROCESS_CPU__ + +long unified_collection_collect_process_cpu(unsigned int cmd, void __user *argp); +#endif // __UCOLLECTION_PROCESS_CPU__ diff --git a/ucollection/unified_collection_data.h b/ucollection/unified_collection_data.h new file mode 100644 index 0000000..ddd2050 --- /dev/null +++ b/ucollection/unified_collection_data.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2023 Huawei Device Co., Ltd. + */ +#ifndef __UNIFIED_COLLECTION_DATA__ +#define __UNIFIED_COLLECTION_DATA__ + +#include + +// kernel struct, modify at the same time +struct ucollection_process_cpu_item { + int pid; + unsigned long long cpu_usage_utime; + unsigned long long cpu_usage_stime; + unsigned long long cpu_load_time; +}; + +struct ucollection_process_filter { + int uid; + int pid; + int tid; +}; + +struct ucollection_process_cpu_entry { + int magic; + int total_count; + int cur_count; + struct ucollection_process_filter filter; + struct ucollection_process_cpu_item datas[]; +}; + +struct ucollection_cpu_dmips { + int magic; + int total_count; + char dmips[]; +}; + +#define IOCTRL_COLLECT_ALL_PROC_CPU_MAGIC 1 +#define IOCTRL_COLLECT_THE_PROC_CPU_MAGIC 1 +#define IOCTRL_SET_CPU_DMIPS_MAGIC 1 +#define DMIPS_NUM 128 + +#define IOCTRL_COLLECT_CPU_BASE 0 +#define IOCTRL_COLLECT_ALL_PROC_CPU _IOR(IOCTRL_COLLECT_CPU_BASE, 1, struct ucollection_process_cpu_entry) +#define IOCTRL_COLLECT_THE_PROC_CPU _IOR(IOCTRL_COLLECT_CPU_BASE, 2, struct ucollection_process_cpu_entry) +#define IOCTRL_SET_CPU_DMIPS _IOW(IOCTRL_COLLECT_CPU_BASE, 3, struct ucollection_cpu_dmips) +#endif // __UNIFIED_COLLECTION_DATA__ \ No newline at end of file diff --git a/ucollection/unified_collection_driver.c b/ucollection/unified_collection_driver.c new file mode 100644 index 0000000..be70a17 --- /dev/null +++ b/ucollection/unified_collection_driver.c @@ -0,0 +1,90 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2023 Huawei Device Co., Ltd. + */ +#include +#include +#include +#include + +#ifdef CONFIG_COMPAT +#include +#endif // CONFIG_COMPAT + +#include "ucollection_process_cpu.h" + +static long (*unified_collection_ioctl_cb[])(unsigned int cmd, void __user *argp) = { + unified_collection_collect_process_cpu /* IOCTRL_COLLECT_CPU */ +}; + +static long unified_collection_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + void __user *argp = u64_to_user_ptr(arg); + const char *comm = NULL; + + if ((_IOC_TYPE(cmd) >= ARRAY_SIZE(unified_collection_ioctl_cb)) || + (unified_collection_ioctl_cb[_IOC_TYPE(cmd)] == NULL)) { + pr_err("invalid ioctrl cmd %u, _IOC_TYPE(cmd)=%d", cmd, _IOC_TYPE(cmd)); + return -EINVAL; + } + + return unified_collection_ioctl_cb[_IOC_TYPE(cmd)](cmd, argp); +} + +#ifdef CONFIG_COMPAT +static long unified_collection_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + return unified_collection_ioctl(filp, cmd, (unsigned long) compat_ptr(arg)); +} +#endif // CONFIG_COMPAT + +static int unified_collection_open(struct inode *inode, struct file *filp) +{ + return 0; +} + +static int unified_collection_release(struct inode *inode, struct file *filp) +{ + return 0; +} + +static const struct file_operations unified_collection_device_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = unified_collection_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = unified_collection_compat_ioctl, +#endif // CONFIG_COMPAT + .open = unified_collection_open, + .release = unified_collection_release, +}; + +static struct miscdevice unified_collection_device = { + .name = "ucollection", + .fops = &unified_collection_device_fops, + .minor = MISC_DYNAMIC_MINOR, +}; + +static int __init unified_collection_init(void) +{ + int ret = misc_register(&unified_collection_device); + if (ret) { + pr_err("failed to register unified collection device"); + return ret; + } + + pr_info("register unified collection device successful"); + return 0; +} + +static void __exit unified_collection_exit(void) +{ + pr_info("deregister unified collection device successful"); + misc_deregister(&unified_collection_device); +} + +module_init(unified_collection_init); +module_exit(unified_collection_exit); + +MODULE_AUTHOR("OHOS"); +MODULE_DESCRIPTION("Unified Collection Driver"); +MODULE_LICENSE("GPL"); \ No newline at end of file -- Gitee