From ffcc41a59335e8ebf0399dffe985abb0d44c2192 Mon Sep 17 00:00:00 2001 From: Charan Teja Kalla Date: Tue, 12 Jul 2022 16:31:29 +0530 Subject: [PATCH] msm_sysstats: define callback to get the kgsl memory stats Define a callback filled that will be registered by the kgsl driver which will be called by the msm-systats to know about the kgsl allocated memory in the system or for a process. Change-Id: I557213800a73ff73d5852a6db7e655013cf025e1 Signed-off-by: Charan Teja Kalla --- include/linux/msm_sysstats.h | 23 +++++++++++++++++++++++ kernel/msm_sysstats.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 include/linux/msm_sysstats.h diff --git a/include/linux/msm_sysstats.h b/include/linux/msm_sysstats.h new file mode 100644 index 000000000000..fef798a42a16 --- /dev/null +++ b/include/linux/msm_sysstats.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#ifndef _MSM_SYSSTATS_H_ +#define _MSM_SYSSTATS_H_ + +#include + +#if IS_ENABLED(CONFIG_MSM_SYSSTATS) +extern void sysstats_register_kgsl_stats_cb(u64 (*cb)(pid_t pid)); +extern void sysstats_unregister_kgsl_stats_cb(void); +#else +static inline void sysstats_register_kgsl_stats_cb(u64 (*cb)(pid_t pid)) +{ +} +static inline void sysstats_unregister_kgsl_stats_cb(void) +{ +} +#endif +#endif /* _MSM_SYSSTATS_H_ */ + diff --git a/kernel/msm_sysstats.c b/kernel/msm_sysstats.c index 4753fc352246..e5daa450ca23 100644 --- a/kernel/msm_sysstats.c +++ b/kernel/msm_sysstats.c @@ -27,12 +27,34 @@ struct tgid_iter { static struct genl_family family; +static u64 (*sysstats_kgsl_get_stats)(pid_t pid); + static DEFINE_PER_CPU(__u32, sysstats_seqnum); #define SYSSTATS_CMD_ATTR_MAX 3 static const struct nla_policy sysstats_cmd_get_policy[SYSSTATS_CMD_ATTR_MAX + 1] = { [SYSSTATS_TASK_CMD_ATTR_PID] = { .type = NLA_U32 }, [SYSSTATS_TASK_CMD_ATTR_FOREACH] = { .type = NLA_U32 }, [SYSSTATS_TASK_CMD_ATTR_PIDS_OF_NAME] = { .type = NLA_NUL_STRING}}; +/* + * The below dummy function is a means to get rid of calling + * callbacks with out any external sync. + */ +static u64 sysstats_kgsl_stats(pid_t pid) +{ + return 0; +} + +void sysstats_register_kgsl_stats_cb(u64 (*cb)(pid_t pid)) +{ + sysstats_kgsl_get_stats = cb; +} +EXPORT_SYMBOL(sysstats_register_kgsl_stats_cb); + +void sysstats_unregister_kgsl_stats_cb(void) +{ + sysstats_kgsl_get_stats = sysstats_kgsl_stats; +} +EXPORT_SYMBOL(sysstats_unregister_kgsl_stats_cb); static int sysstats_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, struct genl_info *info) @@ -191,6 +213,9 @@ static unsigned long get_system_unreclaimble_info(void) } rcu_read_unlock(); + /* Account the kgsl information. */ + size += sysstats_kgsl_get_stats(-1) >> PAGE_SHIFT; + return size; } static char *nla_strdup_cust(const struct nlattr *nla, gfp_t flags) @@ -267,6 +292,8 @@ static int sysstats_task_cmd_attr_pid(struct genl_info *info) task_unlock(p); } + stats->unreclaimable += sysstats_kgsl_get_stats(stats->pid) >> 10; + task_cputime(tsk, &utime, &stime); stats->utime = div_u64(utime, NSEC_PER_USEC); stats->stime = div_u64(stime, NSEC_PER_USEC); @@ -639,6 +666,7 @@ static int __init sysstats_init(void) if (rc) return rc; + sysstats_register_kgsl_stats_cb(sysstats_kgsl_stats); pr_info("registered sysstats version %d\n", SYSSTATS_GENL_VERSION); return 0; }